Drawservby Findlan

v0.2.0

Drawserv Lender API

Read and write your Drawserv book from your own systems: projects, draws, inspections, budgets, documents and events. One key per institution, scoped to what your portal already shows.

Status

Reads and writes are live on production and the sandbox: 16 of 21 operations, every one marked P1 or P2 in the reference. Events and webhooks (P3) and Ask Corbin for lenders (P5), plus the command line and the MCP server, are in the reference but not served yet. Keys are issued by Drawserv staff on request.

The read doorWrites and documentsEvents and webhooksAsk Corbin for lenders
Productionhttps://app.drawserv.com/api/v1dsk_live_ keys
Sandboxhttps://staging.app.drawserv.com/api/v1dsk_test_ keys, against a scrubbed copy of the book
ContractOpenAPI 3.1 · lender-v1.yaml · lender-v1.json

What it covers

Projects

Every project in your view: lifecycle, intake stage, budget total, funded to date and percent complete, computed on the server.

Draws

Each draw with its lines, stage stamps, approvals, lien waivers and the reviewed inspection behind it.

Inspections and budgets

Reviewed site visits with progress per budget line. Budget lines, funding sources and totals.

Create projects

Open a project in intake from your LOS or core: address, borrower, builder, contract amount, parties.

Documents

Download released risk reports, draw documents and inspection photos. Upload documents to a project.

Events

Poll an events ledger, or receive the same events at your endpoint as signed webhooks.

Not yet

Scope

The API returns what your portal login shows: the same lender, the same department, the same fields. Underwriting work product (risk score and tier, quality rating, staff notes, the lien mark, company verification, inspector fees) is not in any schema. A record outside your view is a 404, never a 403.

Field names match the Drawserv data model. Money is dollars to the cent, as JSON numbers.

Access

  • Keys. A key acts for your institution, optionally one department, never a person. Drawserv staff issue it, show it once, store a hash and can revoke it. Send it as a bearer token.
  • Scopes. A key carries scopes as its ceiling. A new key starts with the 5 read scopes. IP allowlist and expiry are optional.
  • Request log. Every request is recorded: key, method, path, status, duration, address, request id.
  • Sandbox. dsk_test_ keys run against a scrubbed copy of your book. Nothing there reaches production.

Scopes

ScopeGrants
projects:readRead projects, parties, budgets and released risk reports
draws:readRead draws, their lines, approvals and lien waivers
inspections:readRead reviewed inspections and their progress lines
documents:readRead document metadata and fetch short-lived download links
events:readRead the events ledger
projects:writeCreate projects and update a pre-closing project's intake fields
documents:writeUpload documents to a project
webhooks:manageCreate, list and remove webhook endpoints

First call

GET /me needs no scope. It returns the lender, the department and the key.

curl https://app.drawserv.com/api/v1/me \
  -H "Authorization: Bearer dsk_live_…"

Then GET /projects for the book and GET /draws?scope=working for what is in flight. Lists are paged (page, per_page up to 200). Every response carries an X-Request-Id to quote if something looks wrong.

Then
# the book, newest first
curl "https://app.drawserv.com/api/v1/projects?per_page=100" -H "Authorization: Bearer dsk_live_…"

# draws in flight
curl "https://app.drawserv.com/api/v1/draws?scope=working" -H "Authorization: Bearer dsk_live_…"

# one draw: lines, approvals, lien waivers
curl "https://app.drawserv.com/api/v1/draws/<drawId>" -H "Authorization: Bearer dsk_live_…"

Endpoints

Every operation in the contract, its phase (P1 the read door, P2 writes and documents, P3 events and webhooks, P5 Ask Corbin for lenders), and whether it is served today. The reference has parameters, schemas and an example for each.

MethodPathDoesPhaseServed
Account
GET/meWho am IP1Live
Projects
GET/projectsList projectsP1Live
POST/projectsCreate a projectP2Live
GET/projects/{projectId}Get a projectP1Live
PATCH/projects/{projectId}/intakeUpdate a project's intake fieldsP2Live
GET/projects/{projectId}/partiesList a project's partiesP1Live
GET/projects/{projectId}/budgetGet a project's budgetP1Live
GET/risk-reports/{projectId}Get a project's released risk reportP1Live
POST/projects/{projectId}/askAsk Corbin about a projectP5Not yet
Draws
GET/projects/{projectId}/drawsList a project's drawsP1Live
GET/drawsList drawsP1Live
GET/draws/{drawId}Get a drawP1Live
Inspections
GET/inspectionsList inspectionsP1Live
GET/inspections/{inspectionId}Get an inspectionP1Live
Documents
GET/projects/{projectId}/documentsList a project's documentsP2Live
POST/projects/{projectId}/documentsAsk for an upload slotP2Live
GET/documents/{documentId}Get a documentP2Live
Events
GET/eventsList eventsP3Not yet
Webhook endpoints
GET/webhooksList webhook endpointsP3Not yet
POST/webhooksCreate a webhook endpointP3Not yet
DELETE/webhooks/{endpointId}Remove a webhook endpointP3Not yet

Errors

Every non-2xx response is one object with one of a closed set of codes. The code is the contract; the message is for a person.

Error shape
{
  "error": {
    "code": "forbidden_scope",
    "message": "This key does not carry draws:read.",
    "requestId": "req_…"
  }
}
CodeHTTPMeaning
unauthorizedThe key is missing, malformed, revoked, expired, for the other environment, or a session token was sent
forbidden_scopeThe key lacks the scope the operation needs
not_foundNo such record in the caller's view — a record outside the key's lender or department reads as absent
validation_failedA parameter or body field is missing or malformed
rate_limitedThe key's request budget is spent; Retry-After says when to try again
conflictThe write collides with the record's current state (a project no longer pre-closing, a duplicate endpoint)
internalSomething failed on our side; the requestId names the ledger row to quote

Versioning

/v1 in the path. Changes are additive: a field is never renamed or retyped, an enum value never changes meaning, a retired value stays declared. A breaking change ships as /v2 beside /v1, with twelve months’ notice.

Tools Coming

Thin clients of the same contract, declared in the reference and not served yet. The reference’s appendices list every tool and command.

Command line

drawserv projects list, draws list --scope funded, events tail, every list with --json. Installed from npm.

MCP server

A hosted MCP server for Claude, Copilot, Cursor, ChatGPT or your own assistant. Read-only tools, every call logged, sign-in through the person’s own Drawserv login.

Ask Corbin

One question about one project, answered from the same records the API returns.

Security

Read-only by default. Rows and columns scoped by the portal’s own rules. A hashed secret shown once, scopes, optional IP allowlist and expiry, immediate revocation, a log of every request, and a service identity that cannot sign in. Webhooks are signed with HMAC-SHA256 over a timestamped body. SOC 2 materials are on the Trust Center.

Tell us what you would connect

Rows in a core or an LOS, a file on a schedule, an assistant over the book. The first integrations decide what ships next.