{"openapi":"3.1.0","info":{"title":"Payna Compliance API","version":"1.4.0","description":"The Payna API gives you read access to your company's licensing data: your company licenses, your loan officers and their state licenses, sponsorships, onboarding status, and continuing and pre-licensing education. Payna syncs this data from NMLS several times a day, and from your course provider daily.\n\nThe API is organized around REST. It has predictable resource-oriented URLs, returns JSON-encoded responses, and uses standard HTTP response codes and bearer-token authentication.\n\n**Getting started**\n\n- Request an API key from support@payna.com. Keys start with `pk_live_`.\n- Send the key in the `Authorization` header of every request: `Authorization: Bearer pk_live_...`\n- Call `GET /loan-officers` to list your loan officers.\n\n**Base URL:** https://app.payna.com/api/v1\n\n**Rate limits:** Each key can make 300 requests per 15-minute window. Requests over the limit return `429 Too Many Requests` with a `Retry-After` header giving the number of seconds to wait.\n\n**Errors:** Payna uses conventional HTTP response codes. Codes in the `2xx` range indicate success, `4xx` an error in the request, and `5xx` an error on Payna's side. Every error has the same shape: `{\"error\": {\"code\": \"INVALID_PARAM\", \"message\": \"...\", \"status\": 400}}`, where `message` explains the problem.","contact":{"name":"Payna Support","email":"support@payna.com","url":"https://payna.com"}},"externalDocs":{"description":"Payna API documentation","url":"https://payna.com/docs"},"servers":[{"url":"https://app.payna.com/api/v1","description":"Production"}],"security":[{"BearerAuth":[]}],"tags":[{"name":"Loan officers","description":"Loan officer endpoints return what Payna knows about each of your loan officers: their state licenses, your company's sponsorship of each license, onboarding status, CE hours, and the CE and PE courses they are enrolled in.\n\n- `GET /loan-officers` lists your loan officers with all of their data.\n- `GET /loan-officers/{id}` retrieves one loan officer by NMLS ID.\n- `GET /loan-officers/licenses` lists every license as a flat row. Add `format=csv` to download a CSV file.\n\n**Common use cases**\n\n- Route a Texas lead: `GET /loan-officers?can_originate_in=TX` returns the officers who can originate in Texas today.\n- Track new states: `GET /loan-officers?state=FL` returns officers with a Florida license or PE course, in any status.\n- Track onboarding: `onboarding.status` says where each officer is, and `onboarding.waiting_on` says who acts next.\n- Track PE: courses with `\"type\": \"PE\"` show `percent_complete`, `due_date` and `overdue`.\n- Check readiness: `checks` has their SAFE tests, criminal background checks and credit reports from NMLS.\n\n**Approval dates.** NMLS does not publish an expected approval date, so the API does not return one. For a pending license, `open_items` lists what NMLS still requires.\n\n**How fresh it is.** `meta.synced_at` is when Payna last read NMLS for this data: the oldest read in the response, so everything is at least that fresh. Each officer has `last_synced`, and each license `last_synced_at`.\n\nThese endpoints require the `individuals` capability. Officers who have left your company are excluded unless you pass `include_departed=true`."},{"name":"Licenses","description":"Your company's own licenses, in every state. For licenses held by your loan officers, use **Loan officers**."},{"name":"Individuals","description":"Licensed people at your company, one call per person: loan officers (`?type=mlo`), adjusters (`?type=adjuster`) and others. For loan officers, **Loan officers** gives all of this in one call."}],"components":{"securitySchemes":{"BearerAuth":{"type":"http","scheme":"bearer","description":"Payna authenticates requests with API keys, sent as a bearer token. Keys start with `pk_live_`. Request one from support@payna.com."}},"schemas":{"LoanOfficer":{"type":"object","description":"One loan officer and everything Payna knows about them.","properties":{"id":{"type":"string","format":"uuid","description":"Payna's id for them."},"nmls_id":{"type":"string","nullable":true,"example":"1234567","description":"Their NMLS ID."},"name":{"type":"string","example":"Jane Example"},"first_name":{"type":"string","nullable":true},"last_name":{"type":"string","nullable":true},"email":{"type":"string","nullable":true,"description":"Their work email."},"title":{"type":"string","nullable":true,"description":"Their job title, if your company set one."},"office":{"type":"string","nullable":true,"example":"Irvine, CA","description":"The office NMLS lists them at. \"(Main Office)\" when it is your main office."},"employment_status":{"type":"string","nullable":true,"enum":["active","inactive","terminated","pending"],"description":"`terminated` means they left. Those are only listed with `include_departed=true`."},"can_originate_in":{"type":"array","items":{"type":"string"},"example":["TX","CA"],"description":"States where they can originate for you today: the license is approved at NMLS and your company's sponsorship is accepted. Temporary Authority is not counted. Same rule as each license's `can_originate`, including its one exception."},"onboarding":{"$ref":"#/components/schemas/LoanOfficerOnboarding"},"licenses":{"type":"array","items":{"$ref":"#/components/schemas/LoanOfficerLicense"},"description":"Every license NMLS lists for them, at any company, sorted by state."},"checks":{"$ref":"#/components/schemas/LoanOfficerChecks"},"education":{"type":"object","description":"`ce_hours` is this year's CE from NMLS. `courses` is what they are enrolled in at your course provider (Knowledge Coop).","properties":{"ce_hours":{"$ref":"#/components/schemas/CeHours"},"courses":{"type":"array","items":{"$ref":"#/components/schemas/Course"}}}},"last_synced":{"type":"object","description":"How fresh their data is.","properties":{"nmls":{"type":"string","format":"date-time","nullable":true,"description":"The oldest NMLS read among their licenses, so all of them are at least this fresh. Null when they have no license, or one was never read."},"education":{"type":"string","format":"date-time","nullable":true,"description":"When Payna last read your course provider. Null when they have no account there."}}}}},"LoanOfficerOnboarding":{"type":"object","description":"Where they are in joining your company. The same status your team sees on the People page in Payna.","properties":{"status":{"type":"string","nullable":true,"enum":["sponsored","sponsoring","awaiting_access","missing_info","not_started","deficient"],"description":"- `sponsored`: done. Every license your company set out to sponsor is accepted.\n- `sponsoring`: sponsorship is filed or about to be, for some of their licenses.\n- `awaiting_access`: the officer has to accept your company's access request in NMLS.\n- `missing_info`: Payna needs details from your company to file.\n- `not_started`: your company sponsors none of their licenses and nothing is filed.\n- `deficient`: NMLS marks one of their licenses deficient.\n- `null`: not known yet."},"waiting_on":{"type":"string","nullable":true,"enum":["company","officer","payna","state"],"description":"Who has to act next. `company` is you. `state` is the regulator. Null when nobody needs to."},"start_date":{"type":"string","format":"date","nullable":true,"description":"The day they start with your company, while they are onboarding."},"start_date_confirmed":{"type":"boolean","nullable":true,"description":"`true` when the start date is confirmed, `false` when it is an estimate."},"sponsored_in":{"type":"array","items":{"type":"string"},"description":"States where your sponsorship is accepted."},"sponsorship_pending_in":{"type":"array","items":{"type":"string"},"description":"States where sponsorship is filed and waiting on the state."},"sponsorship_planned_in":{"type":"array","items":{"type":"string"},"description":"States Payna will file sponsorship in next."}}},"LoanOfficerLicense":{"type":"object","description":"One state license.","properties":{"state":{"type":"string","example":"TX"},"license_name":{"type":"string","nullable":true,"example":"Texas-SML Mortgage Loan Originator License"},"license_number":{"type":"string","nullable":true},"nmls_status":{"type":"string","nullable":true,"example":"Approved","description":"The license's status, exactly as NMLS shows it: \"Approved\", \"Approved - Inactive\", \"Pending - Incomplete\", \"Terminated - Expired\"..."},"can_originate":{"type":"boolean","description":"Approved at NMLS and sponsored by your company. Use this for lead routing.\n\nOne exception: when Payna has not yet read an officer's sponsorships from NMLS (`sponsorship` is null on all their licenses), an approved license counts, because \"not read\" is not \"not sponsored\". To require confirmed sponsorship, also check `sponsorship` is `sponsored`."},"temporary_authority":{"type":"boolean","description":"`true` while they work under Temporary Authority. Not counted in `can_originate`."},"sponsorship":{"type":"string","nullable":true,"enum":["sponsored","requested","denied","removed","not_sponsored"],"description":"Your company's sponsorship of this license. `requested` includes a request Payna filed that NMLS has not shown yet. Null when Payna has not read it from NMLS, or cannot tell which of two licenses in a state it belongs to."},"sponsorship_nmls_status":{"type":"string","nullable":true,"example":"Accepted","description":"That sponsorship's status, exactly as NMLS shows it: \"Accepted\", \"Requested\", \"Deficient\", \"Rejected\", \"Removed\". Null when NMLS shows none."},"sponsored_since":{"type":"string","format":"date","nullable":true,"description":"The day NMLS accepted your sponsorship."},"sponsorship_requested_on":{"type":"string","format":"date","nullable":true,"description":"The day sponsorship was requested, kept after it is accepted. Known for sponsorships Payna filed; null for ones filed before Payna, because NMLS does not date them."},"open_items":{"type":"array","items":{"type":"object","properties":{"title":{"type":"string"},"since":{"type":"string","format":"date","nullable":true}}},"description":"What NMLS still wants for this license, oldest first. Empty when nothing is open."},"renewal_due":{"type":"string","format":"date","nullable":true,"description":"When the license must be renewed."},"renewed_through":{"type":"integer","nullable":true,"example":2026,"description":"The last year it is renewed for."},"last_synced_at":{"type":"string","format":"date-time","nullable":true,"description":"When Payna last read this license from NMLS."}}},"LoanOfficerChecks":{"type":"object","nullable":true,"description":"Their SAFE tests, criminal background checks and credit reports, as their NMLS record shows them. Null until Payna has read them. Within it, a list that is null was not read, and an empty list was read and has nothing. Newest first.","properties":{"safe_tests":{"type":"array","nullable":true,"items":{"type":"object","properties":{"test":{"type":"string"},"date":{"type":"string","format":"date","nullable":true},"result":{"type":"string","example":"Passed"}}},"description":"Every SAFE test NMLS lists. Results only, never scores."},"background_checks":{"type":"array","nullable":true,"items":{"type":"object","properties":{"status":{"type":"string","example":"Completed"},"status_date":{"type":"string","format":"date","nullable":true},"reason_closed":{"type":"string","nullable":true},"method":{"type":"string","nullable":true,"example":"Electronic"},"fingerprints_taken":{"type":"string","format":"date","nullable":true}}},"description":"Every criminal background check NMLS lists."},"fingerprints_expire":{"type":"string","nullable":true,"example":"2027-01-30","description":"When their fingerprint record expires: a date, or `expired`. Null when NMLS shows none."},"credit_reports":{"type":"array","nullable":true,"items":{"type":"string","format":"date"},"description":"When each credit report was pulled."},"as_of":{"type":"string","format":"date","description":"When Payna last read them from NMLS."}}},"Course":{"type":"object","description":"A CE or PE course they are enrolled in at your course provider.","properties":{"type":{"type":"string","enum":["PE","CE"],"description":"`PE` is pre-licensing education, for a state they are getting licensed in. `CE` is continuing education."},"state":{"type":"string","nullable":true,"example":"FL","description":"Null for the federal 7-hour core."},"jurisdiction":{"type":"string","nullable":true,"example":"CA-DFPI","description":"Set when NMLS splits the state: `CA-DFPI`, `TX-SML`, `UT-DRE`."},"year":{"type":"integer","nullable":true,"description":"The CE year. Null for PE."},"title":{"type":"string","example":"2 Hour Florida SAFE PE"},"provider":{"type":"string","example":"Knowledge Coop"},"status":{"type":"string","enum":["not_started","in_progress","completed"]},"percent_complete":{"type":"integer","nullable":true,"example":50,"description":"0 to 100. Null when the provider does not say."},"due_date":{"type":"string","format":"date","nullable":true,"description":"When the provider says it is due."},"overdue":{"type":"boolean","description":"Past `due_date` and not completed."},"completed_on":{"type":"string","format":"date","nullable":true,"description":"The day they passed it."}}},"CeHours":{"type":"object","nullable":true,"description":"This year's CE hours from their NMLS transcript. Null when none of their licenses needs CE.","properties":{"year":{"type":"integer","example":2026},"hours_required":{"type":"number","example":9},"hours_completed":{"type":"number","example":7},"complete":{"type":"boolean","description":"`true` when nothing is left."},"still_needed":{"type":"array","description":"What is left, and by when.","items":{"type":"object","properties":{"for":{"type":"string","example":"TX","description":"`Core`, `Elective`, or a state like `TX` or `CA-DFPI`."},"hours":{"type":"number"},"due_date":{"type":"string","format":"date","nullable":true}}}}}},"LoanOfficerLicenseRow":{"type":"object","description":"One license with its officer, flat. The CSV has these columns in this order.","properties":{"officer_id":{"type":"string","format":"uuid"},"officer_nmls_id":{"type":"string","nullable":true},"officer_name":{"type":"string"},"officer_email":{"type":"string","nullable":true},"employment_status":{"type":"string","nullable":true},"state":{"type":"string"},"license_name":{"type":"string","nullable":true},"license_number":{"type":"string","nullable":true},"nmls_status":{"type":"string","nullable":true},"can_originate":{"type":"boolean"},"temporary_authority":{"type":"boolean"},"sponsorship":{"type":"string","nullable":true},"sponsorship_nmls_status":{"type":"string","nullable":true},"sponsored_since":{"type":"string","format":"date","nullable":true},"sponsorship_requested_on":{"type":"string","format":"date","nullable":true},"open_items":{"type":"integer","description":"How many items NMLS still wants for this license."},"renewal_due":{"type":"string","format":"date","nullable":true},"last_synced_at":{"type":"string","format":"date-time","nullable":true,"description":"When Payna last read this license from NMLS."}}},"License":{"type":"object","required":["id","state_code","license_type","activity_type","status","verified","updated_at","status_detail"],"properties":{"id":{"type":"string","format":"uuid","description":"Unique license record ID."},"state_code":{"type":"string","example":"CA","description":"Two-letter US state code."},"license_type":{"type":"string","example":"California - DFPI Debt Collection License"},"activity_type":{"type":"string","enum":["lending","debt_collection","money_transmission","mortgage","other"],"example":"debt_collection"},"license_number":{"type":"string","nullable":true,"example":"CCA-2671499"},"nmls_id":{"type":"string","nullable":true,"example":"2671499"},"regulator":{"type":"string","nullable":true,"example":"DFPI"},"status":{"type":"string","enum":["active","deficient","pending","applying","not_licensed"],"description":"Core license status (5-value model). For accurate display, prefer status_detail.category and status_detail.code — the top-level status can say \"applying\" for abandoned applications or \"pending\" for withdrawal-requested licenses; status_detail resolves those correctly."},"sub_status":{"type":"string","nullable":true,"example":"withdrawn","description":"Detailed sub-status within the core status category. Known values: expired, suspended, nmls_deficiency, inactive (licence granted but not usable: no sponsorship / not authorised), no_license_needed, in_state_office_required, withdrawn, rejected (the regulator rejected the request), denied (the regulator denied the licence), surety_bond_only (bond-only states: compliance is a surety bond on file, no license exists)."},"raw_status":{"type":"string","nullable":true,"example":"Approved-Active","description":"Verbatim status string from the regulator."},"issued_date":{"type":"string","format":"date","nullable":true,"example":"2023-06-15"},"renewal_date":{"type":"string","format":"date","nullable":true,"example":"2026-12-31","description":"Deadline to file the renewal — the single \"act-by\" date for the license. NMLS licenses run on a renewal cycle (not a hard expiry); state-portal licenses may use the same field."},"days_until_renewal":{"type":"integer","nullable":true,"example":168,"description":"Days until the renewal date from today. Negative means the renewal date has passed without a recorded renewal."},"verified":{"type":"boolean","description":"Whether Payna has verified this license record with the regulator."},"verified_at":{"type":"string","format":"date-time","nullable":true},"jurisdiction_level":{"type":"string","nullable":true,"example":"state"},"filing_method":{"type":"string","nullable":true,"example":"nmls"},"updated_at":{"type":"string","format":"date-time","description":"Last time this record was updated in Payna."},"status_detail":{"$ref":"#/components/schemas/StatusDetail"}}},"StatusDetail":{"type":"object","description":"Derived, machine-stable descriptor of the license status. Render per-state nuance off `code`/`category` instead of parsing `raw_status`. Always present and well-formed.","required":["code","label","category","intentional","is_nmls","portal","source_text"],"properties":{"code":{"type":"string","example":"voluntary_withdrawal","description":"Stable machine slug — safe to branch on.","enum":["licensed","conditional_approval","surety_bond_only","deficient","revoked","suspended","terminated_for_cause","expired","inactive","application","application_deficient","application_incomplete","under_review","pending","withdrawal_requested","application_abandoned","voluntary_withdrawal","withdrawn","surrendered","terminated","rejected","denied","no_license_needed","in_state_office_required","not_licensed","unknown"]},"label":{"type":"string","example":"Withdrawn — voluntary","description":"Human-readable label."},"category":{"type":"string","enum":["active","in_progress","deficient","exited","not_pursued","needs_review"],"description":"Color bucket: active→green, in_progress→blue/amber, deficient→red, exited/not_pursued→gray, needs_review→amber."},"intentional":{"type":"boolean","description":"True when the unlicensed posture is deliberate (voluntary withdrawal / no-license-needed / in-state-office / surety-bond-only) — i.e. not a problem."},"is_nmls":{"type":"boolean","description":"False for state-portal (non-NMLS) jurisdictions such as TX/DE debt collection."},"portal":{"type":"object","nullable":true,"description":"State portal for non-NMLS jurisdictions; null for NMLS or when there is no online portal.","properties":{"name":{"type":"string","example":"Delaware One Stop"},"url":{"type":"string","nullable":true,"example":"https://onestop.delaware.gov/Account_SignIn"},"type":{"type":"string","nullable":true}}},"source_text":{"type":"string","nullable":true,"example":"Withdrawn - Voluntary Without Licensure","description":"Passthrough of the underlying raw_status."}}},"LicenseSummary":{"type":"object","properties":{"total":{"type":"integer","example":37},"by_status":{"type":"object","additionalProperties":{"type":"integer"},"description":"Count per core status.","example":{"active":13,"deficient":2,"pending":3,"applying":13,"not_licensed":6}},"renewing_soon":{"type":"integer","description":"Active licenses with a renewal date within 90 days.","example":3},"renewing_30_days":{"type":"integer","description":"Active licenses with a renewal date within 30 days.","example":1},"expired":{"type":"integer","description":"Licenses with status=deficient and sub_status=expired.","example":0},"verified":{"type":"integer","description":"Licenses that Payna has verified with the regulator.","example":0}}},"Meta":{"type":"object","properties":{"total":{"type":"integer","example":18},"page":{"type":"integer","example":1},"limit":{"type":"integer","example":50},"synced_at":{"type":"string","format":"date-time","nullable":true}}},"Error":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","example":"UNAUTHORIZED"},"message":{"type":"string","example":"Missing or invalid API key."},"status":{"type":"integer","example":401}}}}},"Individual":{"type":"object","required":["individual_id","individual_type","full_name","company_id","updated_at"],"properties":{"individual_id":{"type":"string","format":"uuid","description":"Payna internal ID for this person. Use in all sub-resource endpoints."},"individual_type":{"type":"string","example":"mlo","description":"Regulated vertical: mlo (mortgage loan officer), adjuster (insurance adjuster), or any future type."},"full_name":{"type":"string","example":"Jane Smith"},"work_email":{"type":"string","format":"email","nullable":true,"example":"jane@company.com"},"nmls_id":{"type":"string","nullable":true,"example":"1234567","description":"NMLS individual identifier, when applicable."},"employment_status":{"type":"string","nullable":true,"enum":["active","inactive","terminated","pending"],"description":"Employment/sponsorship status at this company. An individual can be active at one company and terminated at another."},"company_id":{"type":"string","format":"uuid"},"updated_at":{"type":"string","format":"date-time"}}},"IndividualLicense":{"type":"object","required":["id","state","license_type","status","source","updated_at"],"properties":{"id":{"type":"string","format":"uuid"},"state":{"type":"string","example":"CA","description":"2-letter US state code, or US for federal/national registrations."},"license_type":{"type":"string","example":"Mortgage Loan Originator"},"status":{"type":"string","enum":["active","deficient","pending","applying","not_licensed"],"description":"Core license status (5-value model) — the same vocabulary as company licenses."},"sub_status":{"type":"string","nullable":true,"example":"inactive","description":"Detailed sub-status within the core status category. Known values: expired, suspended, nmls_deficiency, inactive (licence granted but not usable: no sponsorship / not authorised), no_license_needed, in_state_office_required, withdrawn, rejected (the regulator rejected the request), denied (the regulator denied the licence), surety_bond_only (bond-only states: compliance is a surety bond on file, no license exists)."},"license_number":{"type":"string","nullable":true,"example":"MLO-12345"},"effective_date":{"type":"string","format":"date","nullable":true,"description":"Date the license was issued or became effective."},"renewal_date":{"type":"string","format":"date","nullable":true,"description":"Date by which the license must be renewed."},"source":{"type":"string","example":"nmls","description":"Where this record originated: nmls, nipr, manual, etc."},"updated_at":{"type":"string","format":"date-time"}}},"LicenseCondition":{"type":"object","required":["item_id","individual_id","description","action_required","status","source","updated_at"],"properties":{"item_id":{"type":"string","format":"uuid","description":"Unique condition ID."},"individual_id":{"type":"string","format":"uuid"},"state":{"type":"string","nullable":true,"example":"TX"},"condition_type":{"type":"string","nullable":true,"example":"education","description":"Type of condition (e.g. education, disclosure, background_check). Null when not yet classified."},"description":{"type":"string","description":"Full condition text from the regulator."},"action_required":{"type":"string","description":"Short title describing what needs to happen."},"status":{"type":"string","enum":["open","in_progress","submitted","cleared"]},"due_date":{"type":"string","format":"date","nullable":true},"source":{"type":"string","enum":["nmls_sync","manual"],"description":"How this condition was recorded."},"first_seen_at":{"type":"string","format":"date-time","nullable":true},"updated_at":{"type":"string","format":"date-time"}}},"CeStatus":{"type":"object","description":"Continuing education tracking for a single state license. Returns one record per state license that has CE hour data tracked.","properties":{"state":{"type":"string","example":"CA"},"license_type":{"type":"string","example":"Mortgage Loan Originator"},"year":{"type":"integer","nullable":true,"example":2026,"description":"CE cycle year, derived from the deadline date."},"required_hours":{"type":"number","nullable":true,"example":8},"completed_hours":{"type":"number","nullable":true,"example":5.5},"remaining_hours":{"type":"number","nullable":true,"example":2.5,"description":"Computed: max(0, required - completed). Null when required or completed is unknown."},"status":{"type":"string","nullable":true,"enum":["compliant","pending","deficient"],"description":"compliant = CE complete; pending = in progress; deficient = overdue."},"deadline":{"type":"string","format":"date","nullable":true,"description":"Date by which CE must be completed for the current cycle."}}},"Attestation":{"type":"object","properties":{"attestation_id":{"type":"string","format":"uuid","description":"Attestation request ID, or individual_id for synthetic records derived from NMLS sync data."},"attestation_type":{"type":"string","example":"mu2","description":"Type of attestation. Currently: mu2 (NMLS MU2 filing attestation)."},"status":{"type":"string","example":"pending","description":"Current status: pending, paused, attested, cancelled, superseded."},"last_completed_at":{"type":"string","format":"date-time","nullable":true,"description":"Most recent timestamp this person attested."},"next_due_at":{"type":"string","format":"date","nullable":true,"description":"Deadline for the current open attestation request, when applicable."}}},"IndividualTask":{"type":"object","properties":{"task_id":{"type":"string","format":"uuid"},"individual_id":{"type":"string","format":"uuid"},"title":{"type":"string","example":"Complete 2026 CE — CA"},"description":{"type":"string","nullable":true},"category":{"type":"string","enum":["people","state","general"],"description":"people = person-level work; state = license/deficiency work; general = other."},"priority":{"type":"string","nullable":true,"example":"high","description":"Task priority (pass-through from Payna internal value)."},"status":{"type":"string","example":"open","description":"Task-level status (pass-through from Payna internal value)."},"assignment_status":{"type":"string","enum":["open","completed"],"example":"open","description":"This person's assignment status. Authoritative for this individual."},"due_date":{"type":"string","format":"date","nullable":true},"completed_at":{"type":"string","format":"date-time","nullable":true},"completion_url":{"type":"string","nullable":true,"description":"Deep link to this specific task in the Payna portal. Format: https://app.payna.com/portal?taskId=<uuid>."}}}}},"paths":{"/loan-officers":{"get":{"tags":["Loan officers"],"operationId":"listLoanOfficers","summary":"List loan officers","description":"Returns a list of your loan officers, sorted by name. Each loan officer includes their licenses, sponsorships, onboarding status, CE hours and courses. See the **LoanOfficer** schema for every field.\n\nResults are paginated, up to 200 per page (default 100). Use `meta.total` and the `page` parameter to fetch the rest.","parameters":[{"name":"can_originate_in","in":"query","required":false,"schema":{"type":"string","example":"TX","description":"Only officers who can originate in this state today."},"description":"Only officers who can originate in this state today. Example: `TX`"},{"name":"state","in":"query","required":false,"schema":{"type":"string"},"description":"Only officers with a license or a PE course in this state, in any status. Example: `FL`"},{"name":"include_departed","in":"query","required":false,"schema":{"type":"boolean","default":false},"description":"`true` to include people who left your company."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","default":1},"description":"Page number, from 1."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"maximum":200},"description":"Officers per page. Max 200."}],"responses":{"200":{"description":"A page of loan officers.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/LoanOfficer"}},"meta":{"$ref":"#/components/schemas/Meta"}}},"example":{"data":[{"id":"c1d2e3f4-0000-0000-0000-aabbccddeeff","nmls_id":"1234567","name":"Jane Example","first_name":"Jane","last_name":"Example","email":"jane@examplemortgage.com","title":"Loan Officer","office":"Irvine, CA","employment_status":"active","can_originate_in":["TX"],"onboarding":{"status":"sponsoring","waiting_on":"state","start_date":"2026-10-15","start_date_confirmed":true,"sponsored_in":["TX"],"sponsorship_pending_in":["FL"],"sponsorship_planned_in":[]},"licenses":[{"state":"FL","license_name":"Florida Loan Originator License","license_number":null,"nmls_status":"Pending - Incomplete","can_originate":false,"temporary_authority":false,"sponsorship":"requested","sponsorship_nmls_status":"Requested","sponsored_since":null,"sponsorship_requested_on":"2026-10-20","open_items":[{"title":"State Criminal Background Check Required","since":"2026-10-21"}],"renewal_due":null,"renewed_through":null,"last_synced_at":"2026-10-30T17:17:28Z"},{"state":"TX","license_name":"Texas-SML Mortgage Loan Originator License","license_number":"1234567","nmls_status":"Approved","can_originate":true,"temporary_authority":false,"sponsorship":"sponsored","sponsorship_nmls_status":"Accepted","sponsored_since":"2026-09-10","sponsorship_requested_on":"2026-09-02","open_items":[],"renewal_due":"2026-12-31","renewed_through":2026,"last_synced_at":"2026-10-30T17:17:28Z"}],"checks":{"safe_tests":[{"test":"SAFE MLO Test - National Component with Uniform State Content","date":"2024-03-02","result":"Passed"}],"background_checks":[{"status":"Completed","status_date":"2024-02-01","reason_closed":null,"method":"Electronic","fingerprints_taken":"2024-01-30"}],"fingerprints_expire":"2027-01-30","credit_reports":["2026-02-11"],"as_of":"2026-10-30"},"education":{"ce_hours":{"year":2026,"hours_required":9,"hours_completed":7,"complete":false,"still_needed":[{"for":"TX","hours":2,"due_date":"2026-12-31"}]},"courses":[{"type":"PE","state":"FL","jurisdiction":null,"year":null,"title":"2 Hour Florida SAFE PE","provider":"Knowledge Coop","status":"in_progress","percent_complete":50,"due_date":"2026-11-07","overdue":false,"completed_on":null},{"type":"CE","state":"TX","jurisdiction":"TX-SML","year":2026,"title":"2 Hour Texas SML SAFE CE","provider":"Knowledge Coop","status":"not_started","percent_complete":0,"due_date":"2026-12-31","overdue":false,"completed_on":null}]},"last_synced":{"nmls":"2026-10-30T17:17:28Z","education":"2026-10-30T07:00:00Z"}}],"meta":{"total":104,"page":1,"limit":100,"synced_at":"2026-10-30T17:17:28Z"}}}}},"400":{"description":"Invalid query parameter. The message names it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key lacks the `individuals` capability.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded. Retry after the seconds in `Retry-After`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error on Payna's side. Retry the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/loan-officers/{id}":{"get":{"tags":["Loan officers"],"operationId":"getLoanOfficer","summary":"Get one loan officer","description":"Retrieves one loan officer by NMLS ID, or by the `id` returned in the list. Officers who have left your company are included.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","example":"1234567"},"description":"Their NMLS ID, like `1234567`."}],"responses":{"200":{"description":"The loan officer.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/LoanOfficer"},"meta":{"type":"object","properties":{"synced_at":{"type":"string","format":"date-time","nullable":true,"description":"The same as `last_synced.nmls`."}}}}},"example":{"data":{"id":"c1d2e3f4-0000-0000-0000-aabbccddeeff","nmls_id":"1234567","name":"Jane Example","first_name":"Jane","last_name":"Example","email":"jane@examplemortgage.com","title":"Loan Officer","office":"Irvine, CA","employment_status":"active","can_originate_in":["TX"],"onboarding":{"status":"sponsoring","waiting_on":"state","start_date":"2026-10-15","start_date_confirmed":true,"sponsored_in":["TX"],"sponsorship_pending_in":["FL"],"sponsorship_planned_in":[]},"licenses":[{"state":"FL","license_name":"Florida Loan Originator License","license_number":null,"nmls_status":"Pending - Incomplete","can_originate":false,"temporary_authority":false,"sponsorship":"requested","sponsorship_nmls_status":"Requested","sponsored_since":null,"sponsorship_requested_on":"2026-10-20","open_items":[{"title":"State Criminal Background Check Required","since":"2026-10-21"}],"renewal_due":null,"renewed_through":null,"last_synced_at":"2026-10-30T17:17:28Z"},{"state":"TX","license_name":"Texas-SML Mortgage Loan Originator License","license_number":"1234567","nmls_status":"Approved","can_originate":true,"temporary_authority":false,"sponsorship":"sponsored","sponsorship_nmls_status":"Accepted","sponsored_since":"2026-09-10","sponsorship_requested_on":"2026-09-02","open_items":[],"renewal_due":"2026-12-31","renewed_through":2026,"last_synced_at":"2026-10-30T17:17:28Z"}],"checks":{"safe_tests":[{"test":"SAFE MLO Test - National Component with Uniform State Content","date":"2024-03-02","result":"Passed"}],"background_checks":[{"status":"Completed","status_date":"2024-02-01","reason_closed":null,"method":"Electronic","fingerprints_taken":"2024-01-30"}],"fingerprints_expire":"2027-01-30","credit_reports":["2026-02-11"],"as_of":"2026-10-30"},"education":{"ce_hours":{"year":2026,"hours_required":9,"hours_completed":7,"complete":false,"still_needed":[{"for":"TX","hours":2,"due_date":"2026-12-31"}]},"courses":[{"type":"PE","state":"FL","jurisdiction":null,"year":null,"title":"2 Hour Florida SAFE PE","provider":"Knowledge Coop","status":"in_progress","percent_complete":50,"due_date":"2026-11-07","overdue":false,"completed_on":null},{"type":"CE","state":"TX","jurisdiction":"TX-SML","year":2026,"title":"2 Hour Texas SML SAFE CE","provider":"Knowledge Coop","status":"not_started","percent_complete":0,"due_date":"2026-12-31","overdue":false,"completed_on":null}]},"last_synced":{"nmls":"2026-10-30T17:17:28Z","education":"2026-10-30T07:00:00Z"}},"meta":{"synced_at":"2026-10-30T17:17:28Z"}}}}},"400":{"description":"Invalid query parameter. The message names it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key lacks the `individuals` capability.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No loan officer with that NMLS ID at your company.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded. Retry after the seconds in `Retry-After`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error on Payna's side. Retry the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/loan-officers/licenses":{"get":{"tags":["Loan officers"],"operationId":"listLoanOfficerLicenses","summary":"List licenses, one row each","description":"Returns every loan officer license as a flat row that includes the officer, for loading into a spreadsheet or BI tool. This endpoint is not paginated: one call returns every row.\n\nPass `format=csv` to receive a CSV file instead of JSON.","parameters":[{"name":"state","in":"query","required":false,"schema":{"type":"string"},"description":"Only licenses in this state. Example: `TX`"},{"name":"can_originate","in":"query","required":false,"schema":{"type":"boolean"},"description":"`true` for licenses they can originate on today, `false` for the rest."},{"name":"include_departed","in":"query","required":false,"schema":{"type":"boolean","default":false},"description":"`true` to include people who left your company."},{"name":"format","in":"query","required":false,"schema":{"type":"string","enum":["json","csv"],"default":"json"},"description":"`csv` for a CSV file."}],"responses":{"200":{"description":"Every license row.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/LoanOfficerLicenseRow"}},"meta":{"$ref":"#/components/schemas/Meta"}}},"example":{"data":[{"officer_id":"c1d2e3f4-0000-0000-0000-aabbccddeeff","officer_nmls_id":"1234567","officer_name":"Jane Example","officer_email":"jane@examplemortgage.com","employment_status":"active","state":"TX","license_name":"Texas-SML Mortgage Loan Originator License","license_number":"1234567","nmls_status":"Approved","can_originate":true,"temporary_authority":false,"sponsorship":"sponsored","sponsorship_nmls_status":"Accepted","sponsored_since":"2026-09-10","sponsorship_requested_on":"2026-09-02","open_items":0,"renewal_due":"2026-12-31","last_synced_at":"2026-10-30T17:17:28Z"}],"meta":{"total":1376,"page":1,"limit":1376,"synced_at":"2026-10-30T17:17:28Z"}}},"text/csv":{"schema":{"type":"string"},"example":"officer_id,officer_nmls_id,officer_name,..."}}},"400":{"description":"Invalid query parameter. The message names it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The API key lacks the `individuals` capability.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded. Retry after the seconds in `Retry-After`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Error on Payna's side. Retry the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/licenses":{"get":{"tags":["Licenses"],"operationId":"listLicenses","summary":"List all licenses","description":"Returns a paginated list of all license records for your company. Use the `state`, `status`, `license_type`, and `verified` query parameters to filter results. Results are ordered by state code ascending.","parameters":[{"name":"state","in":"query","required":false,"schema":{"type":"string"},"description":"Comma-separated 2-letter state codes. Example: `CA,NY,TX`"},{"name":"status","in":"query","required":false,"schema":{"type":"string"},"description":"Comma-separated status values. Example: `active,pending`"},{"name":"license_type","in":"query","required":false,"schema":{"type":"string"},"description":"Filter by license type (partial match). Example: `Money Transmission`"},{"name":"verified","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter by verification status. `true` or `false`."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","default":1},"description":"Page number. Starts at 1."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"maximum":200},"description":"Results per page. Max 200."}],"responses":{"200":{"description":"Successful response.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/License"}},"meta":{"$ref":"#/components/schemas/Meta"}}},"example":{"data":[{"id":"a1b2c3d4-e5f6-7890-abcd-ef1234567890","state_code":"CA","license_type":"California - DFPI Debt Collection License","activity_type":"debt_collection","license_number":"11622-99","nmls_id":"2671499","regulator":"DFPI","status":"active","sub_status":null,"raw_status":"Approved","issued_date":"2025-07-17","renewal_date":"2026-12-31","days_until_renewal":168,"verified":false,"verified_at":null,"jurisdiction_level":null,"filing_method":null,"updated_at":"2026-07-16T18:36:49Z","status_detail":{"code":"licensed","label":"Licensed","category":"active","intentional":false,"is_nmls":true,"portal":null,"source_text":"Approved"}}],"meta":{"total":37,"page":1,"limit":50,"synced_at":"2026-07-16T18:36:49Z"}}}}},"400":{"description":"Invalid query parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds until rate limit resets."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/licenses/summary":{"get":{"tags":["Licenses"],"operationId":"getLicenseSummary","summary":"Get license summary","description":"Returns aggregate counts for all licenses. Lightweight endpoint suitable for health checks, dashboards, and startup checks. Use `renewing_30_days` to drive collection-blocking logic.","responses":{"200":{"description":"Successful response.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/LicenseSummary"},"meta":{"$ref":"#/components/schemas/Meta"}}},"example":{"data":{"total":37,"by_status":{"active":13,"deficient":2,"pending":3,"applying":10,"not_licensed":9},"renewing_soon":3,"renewing_30_days":1,"expired":0,"verified":0},"meta":{"total":37,"synced_at":null}}}}},"401":{"description":"Unauthorized.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/licenses/{state}":{"get":{"tags":["Licenses"],"operationId":"getLicenseByState","summary":"Get license for a specific state","description":"Returns a single license record for a US state. A state can hold more than one license (different activity types, or state-level plus city-level entries); when that happens this endpoint returns the most recently updated one and reports the count in `meta.total` — use `GET /licenses?state=XX` to retrieve all of them. State codes are case-insensitive.","parameters":[{"name":"state","in":"path","required":true,"schema":{"type":"string"},"description":"2-letter US state code. Example: `CA`"}],"responses":{"200":{"description":"License found.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/License"},"meta":{"type":"object","properties":{"total":{"type":"integer","example":1,"description":"Number of licenses held in the state; >1 means more are available via the list endpoint."},"synced_at":{"type":"string","format":"date-time"}}}}}}}},"400":{"description":"Invalid state code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No license record found for this state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/individuals":{"get":{"tags":["Individuals"],"operationId":"listIndividuals","summary":"List regulated individuals","description":"Returns a paginated list of all regulated individuals (loan officers, insurance adjusters, etc.) for your company. Use `?type=mlo` to filter to loan officers, `?type=adjuster` for adjusters, or omit `type` to list all regulated persons regardless of vertical. Filter further by `employment_status` to surface only active or terminated individuals.","parameters":[{"name":"type","in":"query","required":false,"schema":{"type":"string"},"description":"Vertical filter. Examples: `mlo`, `adjuster`. Omit to return all individual types."},{"name":"employment_status","in":"query","required":false,"schema":{"type":"string","enum":["active","inactive","terminated","pending"]},"description":"Filter by employment/sponsorship status."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","default":1}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"maximum":200}}],"responses":{"200":{"description":"Paginated list of individuals.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Individual"}},"meta":{"$ref":"#/components/schemas/Meta"}}},"example":{"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"}}}}},"400":{"description":"Invalid query parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/individuals/{id}/licenses":{"get":{"tags":["Individuals"],"operationId":"getIndividualLicenses","summary":"Get individual's licenses","description":"Returns all state licenses held by a regulated individual. For MLOs this reflects their NMLS individual license record per state. For other verticals, licenses come from the relevant source system (NIPR for adjusters, etc.).","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"},"description":"Individual ID from `GET /individuals`."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","default":1}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"maximum":200}}],"responses":{"200":{"description":"List of licenses.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/IndividualLicense"}},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"401":{"description":"Unauthorized.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Individual not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/individuals/{id}/license-conditions":{"get":{"tags":["Individuals"],"operationId":"getIndividualLicenseConditions","summary":"Get outstanding license conditions","description":"Returns open conditions and deficiencies on an individual's licenses — the items blocking transfers, causing delays, or requiring action before a state can go active. Filter by `?status=open` to see only unresolved items.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"status","in":"query","required":false,"schema":{"type":"string","enum":["open","in_progress","submitted","cleared"]},"description":"Filter by condition status."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","default":1}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"maximum":200}}],"responses":{"200":{"description":"List of license conditions.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/LicenseCondition"}},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"401":{"description":"Unauthorized.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Individual not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/individuals/{id}/ce-status":{"get":{"tags":["Individuals"],"operationId":"getIndividualCeStatus","summary":"Get continuing education status","description":"Returns CE tracking data for each state license where hours are recorded. One record per state. Use `remaining_hours` and `deadline` to drive reminder logic. Records only appear when `required_hours` has been entered — states without CE data are omitted.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","default":1}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"maximum":200}}],"responses":{"200":{"description":"CE records per state license.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/CeStatus"}},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"401":{"description":"Unauthorized.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Individual not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/individuals/{id}/attestations":{"get":{"tags":["Individuals"],"operationId":"getIndividualAttestations","summary":"Get attestation / disclosure status","description":"Returns attestation and disclosure records for an individual. For MLOs, this surfaces MU2 attestation requests. Use `last_completed_at` to check when they last attested and `next_due_at` to see pending deadlines. When no formal attestation round has been initiated, a synthetic record derived from NMLS sync data is returned with `status: attested` and the observed attestation timestamp.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","default":1}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"maximum":200}}],"responses":{"200":{"description":"Attestation records.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Attestation"}},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"401":{"description":"Unauthorized.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Individual not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/individuals/{id}/tasks":{"get":{"tags":["Individuals"],"operationId":"getIndividualTasks","summary":"Get tasks / action feed","description":"Returns a normalized feed of actionable work assigned to this individual. Use `?status=open` to drive a \"things to do\" view. `assignment_status` is authoritative for this person's progress — it can differ from the overall `status` when a task has multiple assignees. `completion_url` links the individual to the Payna portal where they can act.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"status","in":"query","required":false,"schema":{"type":"string","enum":["open","completed"]},"description":"Filter by assignment status. `open` = not yet done; `completed` = finished."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","default":1}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"maximum":200}}],"responses":{"200":{"description":"Task feed.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/IndividualTask"}},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"401":{"description":"Unauthorized.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Individual not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}