NewsKita raised $4.5M led by BoxGroup.Read more
Underwriter API · v1

Kita Underwriter

Push borrower documents from your core banking system or LOS, read fraud-checked and fully-traceable credit signals, and generate cited credit memos, all over a REST API. Kita recommends; your team decides. The API never approves a loan.

Base URLhttps://underwriter.kita.ai/api/v1AuthApiKey kita_uw_...ContractOpenAPI 3.1 · 152 operations
End-to-end examples on GitHub

Overview

The Kita Platform API exposes the same three product layers as the dashboard: Kita Capture for document extraction and fraud signals, AI Credit Officer for borrower communication, and AI Underwriter for deterministic analysis, policy evaluation, and cited credit memos. A typical LOS integration does three things:

  1. Write: push a borrower application and its documents in one call (POST /intake).
  2. Read: poll the deterministic credit picture as extraction tightens (GET …/credit).
  3. Generate: trigger and pull back the cited credit memo (POST …/memoGET …/memo).

Processing is continuous: every accepted document immediately updates the assessment. There is no “100% complete” gate before underwriting starts.

Lender endpoints use /api/v1; the separate borrower-safe surface uses /api/borrower/v1. JSON success responses use a { "data": ... } envelope, with optional pagination. Every response includes X-Request-ID and X-Kita-API-Version; binary export routes return their native file type.

Base URL

https://underwriter.kita.ai/api/v1

MCP Server

kita-docs-mcp exposes the core Underwriter workflow to Claude Code, Claude Desktop, and Codex: intake borrower files, upload documents, read the credit picture, generate memos, sync borrower conversations, and export workbooks or PDFs. Use the REST API or OpenAPI contract for the complete platform surface documented below.

Claude Code

claude mcp add kita-docs --env KITA_UNDERWRITER_API_KEY=kita_uw_xxxxxxxxxxxx -- npx -y kita-docs-mcp

environment

FieldTypeDescription
KITA_UNDERWRITER_API_KEYrequiredsecretUnderwriter API key beginning with kita_uw_. Required for every underwriter_* tool.
KITA_UNDERWRITER_API_BASEurlOptional. Defaults to https://underwriter.kita.ai/api/v1. Include /api/v1 when overriding.
KITA_API_KEYsecretOptional. Enables the same MCP server’s Kita Capture tools.

Use server-side keys only

MCP execution tools can read and write borrower data. Register the server only in trusted developer environments and keep KITA_UNDERWRITER_API_KEY out of browser code and public repos.

Authentication

Authenticate lender requests with a member-bound organization API key. Mint keys in Settings → API keys. A key looks like kita_uw_… and is shown exactly once at creation. Kita stores only a SHA-256 hash, so it cannot be recovered. Keys can expire, be rotated, or be revoked independently.

Pass the key in the Authorization header in either form:

Authorization header

Authorization: ApiKey kita_uw_xxxxxxxxxxxx
# or
Authorization: Bearer kita_uw_xxxxxxxxxxxx

Keep keys server-side

Never embed a lender key in a browser, mobile app, or public repository. Store it in your secrets manager and call Kita from your backend. A key is bounded by its scopes, its bound member’s live permissions, and that member’s application-level access.

Scopes & permissions

New keys use resource-specific permissions. Scope is enforced per endpoint, then intersected with the bound member’s live role, approval authority, and per-application access. A valid key without sufficient access receives 403.

FieldTypeDescription
applicationsapplications:read · applications:write · applications:assign · applications:archiveApplication records, controls, assignment, access, lifecycle, archive, and restore.
borrowersborrowers:read · borrowers:writeBorrower profiles and guarantors.
documentsdocuments:read · documents:writeKita Capture documents, evidence, transcripts, review, reprocessing, and exports.
underwritingunderwriting:read · underwriting:run · underwriting:writeAssessments, financials, adjustments, scorecards, projections, policy evaluations, and review actions.
memosmemos:read · memos:writeCredit memo generation, sections, revisions, conditions, status, and exports.
decisionsdecisions:read · decisions:writeLender decisions and reason codes.
messagesmessages:read · messages:writeBorrower conversations and message drafts.
portfolioportfolio:readOrganization or assigned-file portfolio statistics.
operationsoperations:readDurable operation status and result polling.
assistantsassistants:useLender assistant requests over authorized application context.
organizationorganization:read · organization:writeOrganization settings.
membersmembers:read · members:writeMembers, invitations, roles, and permission settings.
productsproducts:read · products:writeLoan products, policy rules, and memo-section configuration.
integrationsintegrations:read · integrations:write · integrations:runConnections, configuration, and provider execution.
API keysapi_keys:manageCreate, list, rotate, and revoke API keys.
webhookswebhooks:manageWebhook endpoints, event types, delivery history, and retries.

Least privilege

Grant only the named resources an integration needs. For example, a reporting integration may need applications:read, underwriting:read, and memos:read, while an intake connector may need applications:write and documents:write.

Errors

Errors use a consistent envelope and standard HTTP status codes:

Error envelope

{ "message": "This API key lacks the 'documents:write' scope required for this endpoint." }

Status codes

FieldTypeDescription
200 / 201okSuccess. 201 on resource creation.
400clientMalformed body, missing required field, or bad parameter.
401authMissing, malformed, unknown, or revoked API key.
403authValid key, but it lacks the scope this endpoint requires.
404clientApplication or document not found in your org (cross-org access is indistinguishable from not-found).
409clientMutation conflict, including an idempotency key reused with a different request.
429clientRate limit exceeded. Honor Retry-After and the X-RateLimit-* headers.
500serverUnexpected server-side failure. Provide X-Request-ID when contacting Kita.
503serverA required dependency or the idempotency/authentication layer is temporarily unavailable.

Rate limits are enforced by operation category. Use Retry-After and the X-RateLimit-Limit, X-RateLimit-Remaining, and X-RateLimit-Reset response headers. Send your own X-Request-ID when you need end-to-end correlation.

Quickstart

Push a borrower and a tax return in one call, then read the credit picture. Replace the key and file path:

1. Intake an application with a document

curl -X POST https://underwriter.kita.ai/api/v1/intake \
  -H "Authorization: ApiKey kita_uw_xxxxxxxxxxxx" \
  -F 'application={
        "business_name": "Rivera Family Bakery LLC",
        "borrower_email": "maria@riverabakery.com",
        "loan_type": "SBA 7(a)",
        "loan_amount": 250000,
        "external_ref": "LOS-44821"
      };type=application/json' \
  -F "file=@./2023_form_1120s.pdf"

Response · 201 Created

{
  "data": {
    "id": "b1e7c9a4-...-...",
    "app_id": "APP-1042",
    "external_ref": "LOS-44821",
    "business_name": "Rivera Family Bakery LLC",
    "borrower_email": "maria@riverabakery.com",
    "loan_type": "SBA 7(a)",
    "loan_amount": 250000,
    "status": "submitted",
    "file_completeness": 0,
    "documents": [
      { "id": "9f2...", "doc_name": "2023_form_1120s.pdf", "status": "awaiting" }
    ]
  }
}

2. Read the credit picture (poll as docs process)

curl https://underwriter.kita.ai/api/v1/applications/APP-1042/credit \
  -H "Authorization: ApiKey kita_uw_xxxxxxxxxxxx"

End-to-end workflow

The canonical loop a lender integration runs:

  1. Intake. POST /intake with the borrower, loan terms, and document files. Pass external_ref (your LOS/loan id) so retries are idempotent.
  2. Wait for extraction. Each document moves awaiting → processing → verified (or low_confidence). Poll GET …/documents or a single GET …/documents/{docId}.
  3. Read the assessment. GET …/credit returns the spread (adjusted EBITDA/DSCR/ratios with per-metric provenance), the normalization adjustments, and the policy decision. It tightens as more documents land.
  4. Generate the memo. POST …/memo synthesizes the cited credit memo, then poll GET …/memo/status until synthesis settles and read it with GET …/memo.
  5. Sync back. Pull …/conversation for the borrower thread and …/export for the extraction workbook into your system of record.

Human-in-the-loop by design

Routing defaults to human review. The API surfaces the policy engine’s recommendation and every rule’s pass/fail, but the credit officer makes the final call.

Idempotency

Send Idempotency-Key on lender-side mutations. Synchronous mutations replay the stored response for 24 hours. Durable mutations reuse the same operation record, so a retry cannot start duplicate underwriting work. Reusing a key with a different method, path, actor, or request payload returns 409.

POST /intake also supports resource-level deduplication with external_ref, your LOS or core-banking record ID. API-key creation/rotation and webhook creation return secrets and intentionally reject Idempotency-Key.

Automated integrations

Use both a stable external_ref for the loan and a unique Idempotency-Key for each mutation attempt.

Async & polling

Long-running endpoints return 202 Accepted. Durable operations include a status object and Location URL; poll that URL with operations:read. Document processing and the compatibility memo trigger are request-owned background work:

  • Documents: after POST …/documents or /intake, poll a document until status leaves awaiting/processing.
  • Memo: after POST …/memo, poll GET …/memo/status until synthesis_in_progress is false and is_stale is false.
  • Durable work: assessment runs, provider calls, document review/reprocessing, memo generation, projections, research, normalization, decisions, and assistant requests can be polled through GET /operations/{id}.

Use exponential backoff starting around 2–3 seconds. For event-driven integrations, register a signed endpoint with POST /webhooks, inspect delivery history, and retry failed deliveries through the webhook-delivery API.

POST/intakeapplications:write

Single-call application intake for a core banking system or LOS. Create the borrower + loan and push every document file in one request; Kita stores each file and kicks off extraction immediately. The file appears in the dashboard right away.

Body: two shapes

multipart/form-data: an application part holding the JSON metadata below, plus repeated file/files parts. Or application/json: the metadata object alone (no documents).

application metadata

FieldTypeDescription
business_namerequiredstringBorrower business / legal name.
borrower_emailrequiredstringBorrower contact email.
borrower_phonestringBorrower contact phone.
loan_typestringe.g. "SBA 7(a)", "Term loan".
loan_amountnumberRequested amount in dollars.
application_contextstringLoan purpose / free-text context for the file.
external_refstringYour unique loan/record id. Enables idempotent retries.
send_outreachbooleanDefault false. If true, Kita emails the borrower for missing docs.

Request

curl -X POST https://underwriter.kita.ai/api/v1/intake \
  -H "Authorization: ApiKey kita_uw_xxxxxxxxxxxx" \
  -F 'application={"business_name":"Rivera Family Bakery LLC","borrower_email":"maria@riverabakery.com","loan_type":"SBA 7(a)","loan_amount":250000,"external_ref":"LOS-44821"};type=application/json' \
  -F "file=@./2023_form_1120s.pdf" \
  -F "file=@./jan_bank_statement.pdf"

Response · 201 (or 200 on idempotent retry)

{
  "data": {
    "id": "b1e7c9a4-...",
    "app_id": "APP-1042",
    "external_ref": "LOS-44821",
    "business_name": "Rivera Family Bakery LLC",
    "borrower_name": null,
    "borrower_email": "maria@riverabakery.com",
    "borrower_phone": null,
    "loan_type": "SBA 7(a)",
    "loan_amount": 250000,
    "status": "submitted",
    "file_completeness": 0,
    "application_context": null,
    "submitted_at": "2026-06-17T18:04:11.000Z",
    "last_activity_at": "2026-06-17T18:04:11.000Z",
    "documents": [
      { "id": "9f2...", "doc_name": "2023_form_1120s.pdf", "doc_type": null, "classified_type": null, "status": "awaiting", "flag_message": null, "source": "API upload", "storage_path": "org/app/2023_form_1120s.pdf" }
    ]
  }
}
POST/applicationsapplications:write

Create an application without files. Same metadata as intake, minus external_ref (use /intake when you need idempotency). Add documents afterwards with the upload endpoint.

body (application/json)

FieldTypeDescription
business_namerequiredstringBorrower business / legal name.
borrower_emailrequiredstringBorrower contact email.
borrower_phonestringBorrower contact phone.
loan_typestringLoan product.
loan_amountnumberRequested amount.
application_contextstringLoan purpose / context.
send_outreachbooleanDefault false.

Request

curl -X POST https://underwriter.kita.ai/api/v1/applications \
  -H "Authorization: ApiKey kita_uw_xxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{
    "business_name": "Rivera Family Bakery LLC",
    "borrower_email": "maria@riverabakery.com",
    "loan_type": "SBA 7(a)",
    "loan_amount": 250000
  }'
GET/applicationsapplications:read

List applications in your org, most-recently-active first.

query parameters

FieldTypeDescription
statusstringFilter to one status value (see Status reference).
limitnumberDefault 50, clamped to 1–200.
offsetnumberDefault 0. Use with limit to page.

Request

curl "https://underwriter.kita.ai/api/v1/applications?status=underwriting&limit=25" \
  -H "Authorization: ApiKey kita_uw_xxxxxxxxxxxx"

Response · 200

{
  "data": [ { "id": "...", "app_id": "APP-1042", "status": "underwriting", "...": "..." } ],
  "pagination": { "total": 137, "limit": 25, "offset": 0 }
}
GET/applications/{id}applications:read

Fetch one application by UUID or by human app_id (e.g. APP-1042). Includes a live document_count.

Request

curl https://underwriter.kita.ai/api/v1/applications/APP-1042 \
  -H "Authorization: ApiKey kita_uw_xxxxxxxxxxxx"
PATCH/applications/{id}applications:write

Update mutable fields. All fields optional; omit to leave unchanged.

body (application/json)

FieldTypeDescription
business_namestringNon-empty. Applies only if the app has a linked borrower.
loan_typestringNon-empty.
loan_amountnumberMust be > 0.
application_contextstring | nullLoan purpose / context.
statusstringOne of the 7 status values (see Status reference).

Request

curl -X PATCH https://underwriter.kita.ai/api/v1/applications/APP-1042 \
  -H "Authorization: ApiKey kita_uw_xxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{ "status": "approved" }'
DELETE/applications/{id}applications:archive

Permanently delete an application, its documents (files + storage), and any orphaned borrower record. Returns { "data": { "deleted": true } }.

Request

curl -X DELETE https://underwriter.kita.ai/api/v1/applications/APP-1042 \
  -H "Authorization: ApiKey kita_uw_xxxxxxxxxxxx"
POST/applications/{id}/documentsdocuments:write

Upload one or more files to an existing application as multipart/form-data. Accepts a single file field or repeated file/files fields (a whole package in one call). Each file’s pipeline (prescreen → classify → extract) runs after the response.

Request

curl -X POST https://underwriter.kita.ai/api/v1/applications/APP-1042/documents \
  -H "Authorization: ApiKey kita_uw_xxxxxxxxxxxx" \
  -F "file=@./941_q1.pdf" \
  -F "file=@./balance_sheet.pdf"

Single vs. multiple

A single-file upload returns one document object; multiple files return an array under data. Poll the document(s) for pipeline progress.
GET/applications/{id}/documentsdocuments:read

List an application’s documents. Add ?include=download_url to attach a signed download URL (1-hour expiry) to each.

Request

curl "https://underwriter.kita.ai/api/v1/applications/APP-1042/documents?include=download_url" \
  -H "Authorization: ApiKey kita_uw_xxxxxxxxxxxx"

Response · 200

{
  "data": [
    {
      "id": "9f2...",
      "doc_name": "2023_form_1120s.pdf",
      "doc_type": "Tax Return",
      "classified_type": "form_1120s",
      "status": "verified",
      "flag_message": null,
      "source": "API upload",
      "storage_path": "org/app/2023_form_1120s.pdf",
      "download_url": "https://...signed...&expires=3600"
    }
  ]
}
GET/applications/{id}/documents/{docId}documents:read

Fetch a single document including the full extraction result. Poll this endpoint for pipeline progress: status transitions awaiting → processing → verified / low_confidence.

additional fields (vs. list)

FieldTypeDescription
kita_rawobject | nullFull grounded extraction result (shape varies by document type).
recommendationsarray | nullSystem/AI recommendations for the document.
inconsistenciesarray | nullDetected inconsistencies / fraud signals.

Request

curl https://underwriter.kita.ai/api/v1/applications/APP-1042/documents/9f2... \
  -H "Authorization: ApiKey kita_uw_xxxxxxxxxxxx"
DELETE/applications/{id}/documents/{docId}documents:write

Delete a document (row + storage file) and recompute file completeness. Returns { "data": { "deleted": true } }.

Request

curl -X DELETE https://underwriter.kita.ai/api/v1/applications/APP-1042/documents/9f2... \
  -H "Authorization: ApiKey kita_uw_xxxxxxxxxxxx"
GET/applications/{id}/creditunderwriting:read

The deterministic credit picture: the numbers the dashboard shows, minus the memo narrative. Three layers, each null until computed (the assessment is continuous):

FieldTypeDescription
spreadobject | nullAdjusted EBITDA/net income, normalized ratios (DSCR, margins, debt-to-worth, current ratio, reserve months, LTV), the DSCR sensitivity table, and per-metric provenance (formula, version, inputs, threshold). No LLM math.
adjustmentsarrayNormalization line items applied to this borrower's own reported numbers (owner-comp add-backs, non-recurring items), each tagged ai or lo.
decisionobject | nullPolicy engine routing recommendation, whether it auto-routed, and every rule's pass/fail with observed vs. expected.

Response · 200 (abridged)

{
  "data": {
    "application_id": "b1e7c9a4-...",
    "app_id": "APP-1042",
    "spread": {
      "adjusted_ebitda": 412000,
      "adjusted_net_income": 188500,
      "ratios": { "dscr": 1.42, "global_dscr": 1.31, "debt_to_worth": 2.1, "current_ratio": 1.6, "ltv": 0.74 },
      "sensitivity": [ /* DSCR at revenue stress levels */ ],
      "metric_results": [ /* per-metric provenance */ ],
      "engine_version": "biz-v3"
    },
    "adjustments": [ { "line_item": "owner_comp_addback", "label": "Owner compensation to market", "amount": 60000, "source": "ai" } ],
    "decision": {
      "routing": "human_review",
      "auto_routed": false,
      "rules": [ { "label": "Min DSCR 1.25x", "outcome": "pass", "actual": 1.42, "expected": 1.25 } ]
    }
  }
}
POST/applications/{id}/memomemos:write

Synthesize the credit memo: promote verified extractions into the memo tables, refresh deterministic metrics + policy routing, then start request-owned background synthesis. The route returns 202; poll …/memo/status, then read …/memo. For a durable operation record, use POST …/memo/generate instead.

Request

curl -X POST https://underwriter.kita.ai/api/v1/applications/APP-1042/memo \
  -H "Authorization: ApiKey kita_uw_xxxxxxxxxxxx"
GET/applications/{id}/memomemos:read

Read the memo sections in order. Bodies are plain text with internal [Cn] citation markers stripped.

Response · 200

{
  "data": {
    "last_synthesis_at": "2026-06-17T18:22:09.000Z",
    "sections": [
      { "section_number": 1, "title": "Deal Summary", "body": "Rivera Family Bakery...", "locked_by_lo": false, "updated_at": "2026-06-17T18:22:09.000Z" }
    ]
  }
}
GET/applications/{id}/memo/statusmemos:read

Freshness + synthesis progress. Poll after POST …/memo until synthesis_in_progress is false.

FieldTypeDescription
synthesis_in_progressbooleanA synthesis run is currently underway.
is_stalebooleanMemo is out of date vs. current docs/messages.
stale_reasonsstring[]Why it's stale.
new_doc_countnumberDocuments added since last synthesis.
new_message_countnumberMessages added since last synthesis.
last_run_statusstring | nullcompleted | failed.
last_synthesis_atstring | nullTimestamp of last successful synthesis.
GET/applications/{id}/conversationmessages:read

The borrower-facing thread, ordered by display_order. Pass ?after={display_order} to fetch only newer messages for incremental sync.

Request

curl "https://underwriter.kita.ai/api/v1/applications/APP-1042/conversation?after=12" \
  -H "Authorization: ApiKey kita_uw_xxxxxxxxxxxx"
GET/applications/{id}/exportdocuments:read

Download the extraction workbook (a Summary sheet plus one sheet per file area) as .xlsx. Returns 404 if no document has extraction data yet.

Request

curl https://underwriter.kita.ai/api/v1/applications/APP-1042/export \
  -H "Authorization: ApiKey kita_uw_xxxxxxxxxxxx" \
  -o "rivera-extractions.xlsx"

Complete API reference

The catalog below lists all 152 operations in the current contract. The machine-readable OpenAPI 3.1 document is the source of truth for request bodies, query parameters, response codes, async behavior, and idempotency metadata.

OpenAPI 3.1

curl https://underwriter.kita.ai/api/v1/openapi

Two authentication boundaries

Lender routes under /api/v1 use a member-bound organization API key. Borrower routes under /api/borrower/v1 use short-lived borrower bearer tokens and expose only borrower-safe application data.

Applications & borrowers

Create, assign, archive, restore, and inspect lender-side borrower files.

GET/api/v1/applications/{id}/accessapplications:read
PATCH/api/v1/applications/{id}/accessapplications:assign
GET/api/v1/applications/{id}/activityapplications:read
PATCH/api/v1/applications/{id}/assigneeapplications:assign
GET/api/v1/applications/{id}/borrowerborrowers:read
PATCH/api/v1/applications/{id}/borrowerborrowers:write
GET/api/v1/applications/{id}/controlsapplications:read
PATCH/api/v1/applications/{id}/controlsapplications:write
PATCH/api/v1/applications/{id}/guarantors/{guarantorId}borrowers:write
DELETE/api/v1/applications/{id}/guarantors/{guarantorId}borrowers:write
GET/api/v1/applications/{id}/guarantorsborrowers:read
POST/api/v1/applications/{id}/guarantorsborrowers:write
GET/api/v1/applications/{id}/lifecycleapplications:read
PATCH/api/v1/applications/{id}/lifecycleapplications:write
GET/api/v1/applications/{id}applications:read
PATCH/api/v1/applications/{id}applications:write
DELETE/api/v1/applications/{id}applications:archive
POST/api/v1/applications/archived/{id}/restoreapplications:archive
GET/api/v1/applications/archivedapplications:archive
POST/api/v1/applicationsapplications:write
GET/api/v1/applicationsapplications:read
GET/api/v1/borrowers/{id}borrowers:read
PATCH/api/v1/borrowers/{id}borrowers:write
GET/api/v1/borrowersborrowers:read
POST/api/v1/intakeapplications:write

Kita Capture

Upload, classify, review, reprocess, extract, transcribe, and export borrower documents.

GET/api/v1/applications/{id}/checklistdocuments:read
GET/api/v1/applications/{id}/documents/{docId}/extractiondocuments:read
PATCH/api/v1/applications/{id}/documents/{docId}/extractiondocuments:write
PATCH/api/v1/applications/{id}/documents/{docId}/metadatadocuments:write
POST/api/v1/applications/{id}/documents/{docId}/reprocessdocuments:write
POST/api/v1/applications/{id}/documents/{docId}/reviewdocuments:write
GET/api/v1/applications/{id}/documents/{docId}documents:read
DELETE/api/v1/applications/{id}/documents/{docId}documents:write
GET/api/v1/applications/{id}/documents/{docId}/transcriptdocuments:read
POST/api/v1/applications/{id}/documentsdocuments:write
GET/api/v1/applications/{id}/documentsdocuments:read
GET/api/v1/applications/{id}/exportdocuments:read
GET/api/v1/applications/{id}/transcriptsdocuments:read

AI Underwriter

Assessments, financials, policy decisions, adjustments, scorecards, projections, providers, and review actions.

GET/api/v1/applications/{id}/assessmentunderwriting:read
POST/api/v1/applications/{id}/assessment/rununderwriting:run
GET/api/v1/applications/{id}/creditunderwriting:read
GET/api/v1/applications/{id}/decision-inputunderwriting:read
GET/api/v1/applications/{id}/decisions/causesdecisions:read
GET/api/v1/applications/{id}/decisionsdecisions:read
POST/api/v1/applications/{id}/decisionsdecisions:write
PATCH/api/v1/applications/{id}/discrepancies/{discrepancyId}underwriting:write
GET/api/v1/applications/{id}/discrepanciesunderwriting:read
GET/api/v1/applications/{id}/financialsunderwriting:read
GET/api/v1/applications/{id}/intake-answersunderwriting:read
PATCH/api/v1/applications/{id}/intake-answersunderwriting:write
PATCH/api/v1/applications/{id}/items/{itemId}underwriting:write
GET/api/v1/applications/{id}/itemsunderwriting:read
PATCH/api/v1/applications/{id}/normalization-adjustments/{adjustmentId}underwriting:write
DELETE/api/v1/applications/{id}/normalization-adjustments/{adjustmentId}underwriting:write
POST/api/v1/applications/{id}/normalization-adjustmentsunderwriting:write
POST/api/v1/applications/{id}/normalization-adjustments/proposeunderwriting:run
GET/api/v1/applications/{id}/policy-evaluationsunderwriting:read
GET/api/v1/applications/{id}/projectionsunderwriting:read
PUT/api/v1/applications/{id}/projectionsunderwriting:write
POST/api/v1/applications/{id}/projections/generateunderwriting:run
GET/api/v1/applications/{id}/providersunderwriting:read
POST/api/v1/applications/{id}/providers/runintegrations:run
GET/api/v1/applications/{id}/review-actionsunderwriting:read
POST/api/v1/applications/{id}/review-actionsunderwriting:write
GET/api/v1/applications/{id}/scorecard-inputsunderwriting:read
PATCH/api/v1/applications/{id}/scorecard-inputsunderwriting:write
GET/api/v1/applications/{id}/scorecardunderwriting:read
GET/api/v1/applications/{id}/web-researchunderwriting:read
POST/api/v1/applications/{id}/web-researchunderwriting:run

Credit memos

Generate, poll, revise, edit, condition, and export credit memos.

GET/api/v1/applications/{id}/memo/conditionsmemos:read
PATCH/api/v1/applications/{id}/memo/conditionsmemos:write
GET/api/v1/applications/{id}/memo/exportmemos:read
POST/api/v1/applications/{id}/memo/generatememos:write
GET/api/v1/applications/{id}/memo/revisionsmemos:read
POST/api/v1/applications/{id}/memomemos:write
GET/api/v1/applications/{id}/memomemos:read
PATCH/api/v1/applications/{id}/memo/sections/{sectionNumber}memos:write
GET/api/v1/applications/{id}/memo/sectionsmemos:read
GET/api/v1/applications/{id}/memo/statusmemos:read

AI Credit Officer

Borrower conversations, message drafts, lender assistant calls, and portfolio intelligence.

GET/api/v1/applications/{id}/conversationmessages:read
POST/api/v1/applications/{id}/conversationmessages:write
GET/api/v1/applications/{id}/message-draftmessages:read
POST/api/v1/applications/{id}/message-draftmessages:write
PATCH/api/v1/applications/{id}/message-draftmessages:write
DELETE/api/v1/applications/{id}/message-draftmessages:write
POST/api/v1/assistantassistants:use
GET/api/v1/portfolio/statsportfolio:read

Platform administration

Organization, members, products, policy, integrations, operations, API keys, audit events, and webhooks.

GET/api/v1/openapipublic
POST/api/v1/api-keys/{keyId}/rotateapi_keys:manage
DELETE/api/v1/api-keys/{keyId}api_keys:manage
GET/api/v1/api-keysapi_keys:manage
POST/api/v1/api-keysapi_keys:manage
GET/api/v1/audit-eventsorganization:read
POST/api/v1/integrations/{provider}/runintegrations:run
GET/api/v1/integrations/plaidintegrations:read
PUT/api/v1/integrations/plaidintegrations:write
DELETE/api/v1/integrations/plaidintegrations:write
GET/api/v1/integrationsintegrations:read
GET/api/v1/integrations/salesforceintegrations:read
PUT/api/v1/integrations/salesforceintegrations:write
DELETE/api/v1/integrations/salesforceintegrations:write
GET/api/v1/integrations/submittableintegrations:read
PUT/api/v1/integrations/submittableintegrations:write
DELETE/api/v1/integrations/submittableintegrations:write
PUT/api/v1/integrations/underwriting/{provider}integrations:write
DELETE/api/v1/integrations/underwriting/{provider}integrations:write
GET/api/v1/operations/{id}operations:read
GET/api/v1/operationsoperations:read
DELETE/api/v1/organization/invites/{inviteId}members:write
PATCH/api/v1/organization/members/{userId}members:write
DELETE/api/v1/organization/members/{userId}members:write
GET/api/v1/organization/membersmembers:read
POST/api/v1/organization/membersmembers:write
GET/api/v1/organization/permissionsmembers:read
PATCH/api/v1/organization/permissionsmembers:write
GET/api/v1/organizationorganization:read
PATCH/api/v1/organizationorganization:write
PATCH/api/v1/policy-rules/{ruleId}products:write
DELETE/api/v1/policy-rules/{ruleId}products:write
GET/api/v1/policy-rulesproducts:read
POST/api/v1/policy-rulesproducts:write
DELETE/api/v1/products/{productId}/memo-sections/{sectionKey}products:write
GET/api/v1/products/{productId}/memo-sectionsproducts:read
PUT/api/v1/products/{productId}/memo-sectionsproducts:write
PATCH/api/v1/products/{productId}/memo-sectionsproducts:write
GET/api/v1/products/{productId}products:read
PATCH/api/v1/products/{productId}products:write
DELETE/api/v1/products/{productId}products:write
GET/api/v1/productsproducts:read
POST/api/v1/productsproducts:write
POST/api/v1/webhook-deliveries/{id}/retrywebhooks:manage
GET/api/v1/webhook-deliverieswebhooks:manage
GET/api/v1/webhooks/{id}webhooks:manage
PATCH/api/v1/webhooks/{id}webhooks:manage
DELETE/api/v1/webhooks/{id}webhooks:manage
GET/api/v1/webhooks/event-typeswebhooks:manage
GET/api/v1/webhookswebhooks:manage
POST/api/v1/webhookswebhooks:manage

Borrower API

A separate borrower-safe surface authenticated with short-lived borrower access tokens.

POST/api/borrower/v1/applications/{id}/assistantborrower
PATCH/api/borrower/v1/applications/{id}/documents/{documentId}borrower
GET/api/borrower/v1/applications/{id}/documentsborrower
POST/api/borrower/v1/applications/{id}/documentsborrower
GET/api/borrower/v1/applications/{id}/messagesborrower
POST/api/borrower/v1/applications/{id}/messagesborrower
PATCH/api/borrower/v1/applications/{id}/profileborrower
POST/api/borrower/v1/applications/{id}/questions/{questionId}/answerborrower
GET/api/borrower/v1/applications/{id}borrower
GET/api/borrower/v1/applicationsborrower
POST/api/borrower/v1/auth/passwordpublic
POST/api/borrower/v1/auth/refreshpublic
GET/api/borrower/v1/auth/sessionborrower
DELETE/api/borrower/v1/auth/sessionborrower

Status reference

Application status: the lifecycle value on every application:

FieldTypeDescription
submittedstatusCreated; intake received.
awaiting_docsstatusWaiting on borrower documents.
underwritingstatusAssessment in progress as docs process.
question_raisedstatusAn open question / escalation on the file.
memo_draftedstatusA credit memo has been synthesized.
approvedstatusMarked approved by the lender.
declinedstatusMarked declined by the lender.

Document status: the extraction state of each file:

FieldTypeDescription
awaitingstatusQueued; pipeline not started.
processingstatusPrescreen / parse / extraction running.
verifiedstatusExtracted and grounded with high confidence.
low_confidencestatusExtracted but flagged for review.
missingstatusA required document not yet provided.

Need help?

Reach out to your Kita contact for higher-volume access, custom deployments (VPC / on-prem), or provider allowlisting.