openapi: 3.0.3
info:
title: 'Prelien Pro API Documentation'
description: 'A developer-first infrastructure layer for construction payment compliance. Manage organizations, projects, notices, waivers, pay applications, documents, and delivery orders through a versioned REST API.'
version: 1.0.0
servers:
-
url: 'https://api.prelienpro.com/api/v1'
tags:
-
name: 'Audit Logs'
description: 'Read-only record of who changed what.'
-
name: Billing
description: 'Subscription plans and Stripe billing.'
-
name: Contacts
description: 'People attached to organizations and parties.'
-
name: Credits
description: 'Balance, price previews and ad-hoc credit purchases.'
-
name: Divisions
description: 'Claimant identities. Every generated document is attributed to a division; the per-tier claimant cap applies here.'
-
name: 'Document Orders'
description: 'Fulfillment orders (mail, filing, research, recording) with server-authoritative pricing.'
-
name: Documents
description: 'Generated PDFs: list, generate, download and revert.'
-
name: 'Entity Meta'
description: 'Polymorphic key-value store attachable to any entity.'
-
name: Escalations
description: 'Demand and escalation documents, with transitions and mail orders.'
-
name: 'Fulfillment Requests'
description: 'Hand research to CLS staff, who fill in the blanks and materialise the records.'
-
name: Jobsites
description: 'Physical work locations for a project.'
-
name: Notices
description: 'Preliminary notices, amendments, state transitions and accountable mail orders.'
-
name: Organizations
description: 'Tenant accounts and directory records for counterparties (owner, GC, lender).'
-
name: Parties
description: 'Project participants (owner, GC, subs) in the CLS role vocabulary.'
-
name: 'Pay Applications'
description: 'AIA G702/G703 pay applications and their status lifecycle.'
-
name: Projects
description: 'Construction projects. A claimant division and role are required on create.'
-
name: 'Provider Auth'
description: 'Stored credentials for downstream service providers.'
-
name: SOVs
description: 'Schedules of values, including CSV import.'
-
name: Sandbox
description: 'Inspect the API key mode and reset disposable sandbox data.'
-
name: Search
description: 'Cross-resource search.'
-
name: 'Shipper Auth'
description: 'Stored credentials for shipping and mail carriers.'
-
name: Support
description: 'Health, credit and usage summaries.'
-
name: Waivers
description: 'Conditional and unconditional lien waivers, including signing.'
-
name: Webhooks
description: 'Outbound subscriptions and inbound provider callbacks.'
components:
securitySchemes:
default:
type: http
scheme: bearer
description: "Authenticate using a Sanctum personal access token. Include it as Authorization: Bearer <token>. Most endpoints also require organization context, supplied via the X-Organization-UUID header, which tells the API which organization's credits to draw from and which organization's data to scope the request to. Organization context is resolved in this order: (1) the org:<uuid> ability on the token, if the token was restricted to a single organization when it was created, (2) the X-Organization-UUID header, (3) the requesting user's first organization membership. If none of these resolve to an organization the user belongs to, the API returns a 422 error."
security:
-
default: []
paths:
/api/v1/audit-logs:
get:
summary: 'List audit log entries'
operationId: listAuditLogEntries
description: 'Paginated record of who changed what, newest first.'
parameters:
-
in: query
name: organization_id
description: 'Filter to this organization (UUID).'
example: 9b7e0e2a-1c3d-4f5a-8b6c-2d4e6f8a0b1c
required: true
schema:
type: string
description: 'Filter to this organization (UUID).'
example: 9b7e0e2a-1c3d-4f5a-8b6c-2d4e6f8a0b1c
-
in: query
name: action
description: 'Filter by action (created, updated, deleted, ...).'
example: updated
required: true
schema:
type: string
description: 'Filter by action (created, updated, deleted, ...).'
example: updated
-
in: query
name: auditable_type
description: 'Filter by the changed record type.'
example: notice
required: true
schema:
type: string
description: 'Filter by the changed record type.'
example: notice
-
in: query
name: auditable_id
description: 'Filter by the changed record UUID.'
example: 9b7e0e2a-1c3d-4f5a-8b6c-2d4e6f8a0b1c
required: true
schema:
type: string
description: 'Filter by the changed record UUID.'
example: 9b7e0e2a-1c3d-4f5a-8b6c-2d4e6f8a0b1c
-
in: query
name: per_page
description: 'Results per page. Clamped to 1-100; defaults to 15.'
example: 15
required: true
schema:
type: integer
description: 'Results per page. Clamped to 1-100; defaults to 15.'
example: 15
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
data:
-
id: 6d60b779-947b-4d7f-80e5-fe876825f03f
organization_id: 4946c450-68b3-4330-918c-96c3142cb979
user_id: null
action: created
auditable_type: App\Domain\Organizations\Models\Organization
auditable_id: 681
old_values: null
new_values:
name: 'Cronin, Dare and Hauck'
ip_address: 153.39.9.254
user_agent: 'Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_8_5) AppleWebKit/532.2 (KHTML, like Gecko) Chrome/83.0.4512.11 Safari/532.2 Edg/83.01091.24'
created_at: '2026-10-05T15:49:20+00:00'
updated_at: '2026-10-05T15:49:20+00:00'
-
id: 0442801b-3b2a-4ac2-96a0-ba7bdba05709
organization_id: 37d6e971-b726-40ef-a5d0-a8cd28bbfbbc
user_id: null
action: deleted
auditable_type: App\Domain\Organizations\Models\Organization
auditable_id: 482
old_values: null
new_values:
name: 'Dibbert Inc'
ip_address: 27.135.245.109
user_agent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_7 rv:6.0) Gecko/20210106 Firefox/35.0'
created_at: '2026-10-05T15:49:20+00:00'
updated_at: '2026-10-05T15:49:20+00:00'
links:
first: '/?page=1'
last: '/?page=1'
prev: null
next: null
meta:
current_page: 1
from: 1
last_page: 1
links:
-
url: null
label: '« Previous'
page: null
active: false
-
url: '/?page=1'
label: '1'
page: 1
active: true
-
url: null
label: 'Next »'
page: null
active: false
path: /
per_page: 15
to: 2
total: 2
properties:
data:
type: array
example:
-
id: 6d60b779-947b-4d7f-80e5-fe876825f03f
organization_id: 4946c450-68b3-4330-918c-96c3142cb979
user_id: null
action: created
auditable_type: App\Domain\Organizations\Models\Organization
auditable_id: 681
old_values: null
new_values:
name: 'Cronin, Dare and Hauck'
ip_address: 153.39.9.254
user_agent: 'Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_8_5) AppleWebKit/532.2 (KHTML, like Gecko) Chrome/83.0.4512.11 Safari/532.2 Edg/83.01091.24'
created_at: '2026-10-05T15:49:20+00:00'
updated_at: '2026-10-05T15:49:20+00:00'
-
id: 0442801b-3b2a-4ac2-96a0-ba7bdba05709
organization_id: 37d6e971-b726-40ef-a5d0-a8cd28bbfbbc
user_id: null
action: deleted
auditable_type: App\Domain\Organizations\Models\Organization
auditable_id: 482
old_values: null
new_values:
name: 'Dibbert Inc'
ip_address: 27.135.245.109
user_agent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_7 rv:6.0) Gecko/20210106 Firefox/35.0'
created_at: '2026-10-05T15:49:20+00:00'
updated_at: '2026-10-05T15:49:20+00:00'
items:
type: object
properties:
id:
type: string
example: 6d60b779-947b-4d7f-80e5-fe876825f03f
organization_id:
type: string
example: 4946c450-68b3-4330-918c-96c3142cb979
user_id:
type: string
example: null
nullable: true
action:
type: string
example: created
auditable_type:
type: string
example: App\Domain\Organizations\Models\Organization
auditable_id:
type: integer
example: 681
old_values:
type: string
example: null
nullable: true
new_values:
type: object
properties:
name:
type: string
example: 'Cronin, Dare and Hauck'
ip_address:
type: string
example: 153.39.9.254
user_agent:
type: string
example: 'Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_8_5) AppleWebKit/532.2 (KHTML, like Gecko) Chrome/83.0.4512.11 Safari/532.2 Edg/83.01091.24'
created_at:
type: string
example: '2026-10-05T15:49:20+00:00'
updated_at:
type: string
example: '2026-10-05T15:49:20+00:00'
links:
type: object
properties:
first:
type: string
example: '/?page=1'
last:
type: string
example: '/?page=1'
prev:
type: string
example: null
nullable: true
next:
type: string
example: null
nullable: true
meta:
type: object
properties:
current_page:
type: integer
example: 1
from:
type: integer
example: 1
last_page:
type: integer
example: 1
links:
type: array
example:
-
url: null
label: '« Previous'
page: null
active: false
-
url: '/?page=1'
label: '1'
page: 1
active: true
-
url: null
label: 'Next »'
page: null
active: false
items:
type: object
properties:
url:
type: string
example: null
nullable: true
label:
type: string
example: '« Previous'
page:
type: string
example: null
nullable: true
active:
type: boolean
example: false
path:
type: string
example: /
per_page:
type: integer
example: 15
to:
type: integer
example: 2
total:
type: integer
example: 2
tags:
- 'Audit Logs'
'/api/v1/audit-logs/{uuid}':
get:
summary: 'Retrieve an audit log entry'
operationId: retrieveAnAuditLogEntry
description: 'Returns a single audit entry by UUID.'
parameters:
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
data:
id: 2cc86c0b-23cd-44bc-a1fb-626296daba7b
organization_id: b8cf1083-8a52-4447-ae92-644c348c4e57
user_id: null
action: created
auditable_type: App\Domain\Organizations\Models\Organization
auditable_id: 681
old_values: null
new_values:
name: 'Cronin, Dare and Hauck'
ip_address: 153.39.9.254
user_agent: 'Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_8_5) AppleWebKit/532.2 (KHTML, like Gecko) Chrome/83.0.4512.11 Safari/532.2 Edg/83.01091.24'
created_at: '2026-10-05T15:49:20+00:00'
updated_at: '2026-10-05T15:49:20+00:00'
properties:
data:
type: object
properties:
id:
type: string
example: 2cc86c0b-23cd-44bc-a1fb-626296daba7b
organization_id:
type: string
example: b8cf1083-8a52-4447-ae92-644c348c4e57
user_id:
type: string
example: null
nullable: true
action:
type: string
example: created
auditable_type:
type: string
example: App\Domain\Organizations\Models\Organization
auditable_id:
type: integer
example: 681
old_values:
type: string
example: null
nullable: true
new_values:
type: object
properties:
name:
type: string
example: 'Cronin, Dare and Hauck'
ip_address:
type: string
example: 153.39.9.254
user_agent:
type: string
example: 'Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_8_5) AppleWebKit/532.2 (KHTML, like Gecko) Chrome/83.0.4512.11 Safari/532.2 Edg/83.01091.24'
created_at:
type: string
example: '2026-10-05T15:49:20+00:00'
updated_at:
type: string
example: '2026-10-05T15:49:20+00:00'
tags:
- 'Audit Logs'
parameters:
-
in: path
name: uuid
description: ''
example: 6ff8f7f6-1eb3-3525-be4a-3932c805afed
required: true
schema:
type: string
/api/v1/billing/plans:
get:
summary: 'List billing plans'
operationId: listBillingPlans
description: 'Available subscription plans with pricing and monthly credit grants.'
parameters:
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
plans:
-
key: growth
label: Growth
monthly_credits: 250.0
cls_eligible: true
properties:
plans:
type: array
example:
-
key: growth
label: Growth
monthly_credits: 250
cls_eligible: true
items:
type: object
properties:
key:
type: string
example: growth
label:
type: string
example: Growth
monthly_credits:
type: number
example: 250.0
cls_eligible:
type: boolean
example: true
tags:
- Billing
/api/v1/billing/setup-intent:
get:
summary: 'Create a billing setup intent'
operationId: createABillingSetupIntent
description: 'Returns a Stripe SetupIntent client secret so the client can save a card via Stripe Elements.'
parameters:
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
organization_uuid: 9b7e0e2a-1c3d-4f5a-8b6c-2d4e6f8a0b1c
client_secret: seti_..._secret_...
publishable_key: pk_...
properties:
organization_uuid:
type: string
example: 9b7e0e2a-1c3d-4f5a-8b6c-2d4e6f8a0b1c
client_secret:
type: string
example: seti_..._secret_...
publishable_key:
type: string
example: pk_...
tags:
- Billing
/api/v1/billing/subscribe:
post:
summary: 'Subscribe to a plan'
operationId: subscribeToAPlan
description: 'Subscribes the organization to a monthly plan using a saved or supplied payment method.'
parameters:
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
201:
description: ''
content:
application/json:
schema:
type: object
example:
organization_uuid: 9b7e0e2a-1c3d-4f5a-8b6c-2d4e6f8a0b1c
plan: growth
status: active
active: true
properties:
organization_uuid:
type: string
example: 9b7e0e2a-1c3d-4f5a-8b6c-2d4e6f8a0b1c
plan:
type: string
example: growth
status:
type: string
example: active
active:
type: boolean
example: true
tags:
- Billing
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
plan:
type: string
description: 'Plan key to subscribe the organization to (e.g. starter, growth, scale).'
example: growth
enum:
- starter
- growth
- scale
interval:
type: string
description: 'Billing interval. Defaults to monthly.'
example: monthly
enum:
- monthly
- annual
nullable: true
payment_method:
type: string
description: 'Optional Stripe PaymentMethod id from Stripe Elements. Omit to use the org default payment method.'
example: pm_1Q1abcXyz
nullable: true
required:
- plan
/api/v1/billing/cancel:
post:
summary: 'Cancel the subscription'
operationId: cancelTheSubscription
description: 'Cancels the active subscription at period end.'
parameters:
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
organization_uuid: 9b7e0e2a-1c3d-4f5a-8b6c-2d4e6f8a0b1c
cancelled: true
ends_at: '2026-10-01T00:00:00+00:00'
properties:
organization_uuid:
type: string
example: 9b7e0e2a-1c3d-4f5a-8b6c-2d4e6f8a0b1c
cancelled:
type: boolean
example: true
ends_at:
type: string
example: '2026-10-01T00:00:00+00:00'
tags:
- Billing
/api/v1/webhooks/stripe:
post:
summary: 'Stripe billing callback'
operationId: stripeBillingCallback
description: 'Inbound Stripe webhook. Signature-verified; not called by API clients.'
parameters:
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
received: true
properties:
received:
type: boolean
example: true
tags:
- Billing
security: []
/api/v1/contacts:
get:
summary: 'List contacts'
operationId: listContacts
description: 'Paginated contacts visible to the caller, newest first.'
parameters:
-
in: query
name: organization_id
description: 'Filter to this organization (UUID).'
example: 9b7e0e2a-1c3d-4f5a-8b6c-2d4e6f8a0b1c
required: true
schema:
type: string
description: 'Filter to this organization (UUID).'
example: 9b7e0e2a-1c3d-4f5a-8b6c-2d4e6f8a0b1c
-
in: query
name: division_id
description: 'Filter to this division (UUID).'
example: 9b7e0e2a-1c3d-4f5a-8b6c-2d4e6f8a0b1c
required: true
schema:
type: string
description: 'Filter to this division (UUID).'
example: 9b7e0e2a-1c3d-4f5a-8b6c-2d4e6f8a0b1c
-
in: query
name: is_active
description: 'Filter by active state.'
example: true
required: true
schema:
type: boolean
description: 'Filter by active state.'
example: true
-
in: query
name: search
description: 'Case-insensitive partial match on first name, last name and email.'
example: architecto
required: true
schema:
type: string
description: 'Case-insensitive partial match on first name, last name and email.'
example: architecto
-
in: query
name: per_page
description: 'Results per page. Clamped to 1-100; defaults to 15.'
example: 15
required: true
schema:
type: integer
description: 'Results per page. Clamped to 1-100; defaults to 15.'
example: 15
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
data:
-
id: 00557cfc-01e0-4325-a697-7756508b6a8b
organization_id: f0be03f8-988d-4347-9272-c9794db598b7
division_id: null
first_name: Audra
last_name: Crooks
email: gulgowski.asia@example.com
phone: '6469808414'
title: null
type: null
is_active: true
metadata: null
created_at: '2026-10-05T15:49:19+00:00'
updated_at: '2026-10-05T15:49:19+00:00'
-
id: 54be3bea-f359-4953-86e5-63c2c631add6
organization_id: 840b95ec-4bdb-4dbb-901b-01d6aa1f5713
division_id: null
first_name: Roderick
last_name: Leffler
email: schultz.audrey@example.org
phone: null
title: null
type: null
is_active: true
metadata: null
created_at: '2026-10-05T15:49:19+00:00'
updated_at: '2026-10-05T15:49:19+00:00'
links:
first: '/?page=1'
last: '/?page=1'
prev: null
next: null
meta:
current_page: 1
from: 1
last_page: 1
links:
-
url: null
label: '« Previous'
page: null
active: false
-
url: '/?page=1'
label: '1'
page: 1
active: true
-
url: null
label: 'Next »'
page: null
active: false
path: /
per_page: 15
to: 2
total: 2
properties:
data:
type: array
example:
-
id: 00557cfc-01e0-4325-a697-7756508b6a8b
organization_id: f0be03f8-988d-4347-9272-c9794db598b7
division_id: null
first_name: Audra
last_name: Crooks
email: gulgowski.asia@example.com
phone: '6469808414'
title: null
type: null
is_active: true
metadata: null
created_at: '2026-10-05T15:49:19+00:00'
updated_at: '2026-10-05T15:49:19+00:00'
-
id: 54be3bea-f359-4953-86e5-63c2c631add6
organization_id: 840b95ec-4bdb-4dbb-901b-01d6aa1f5713
division_id: null
first_name: Roderick
last_name: Leffler
email: schultz.audrey@example.org
phone: null
title: null
type: null
is_active: true
metadata: null
created_at: '2026-10-05T15:49:19+00:00'
updated_at: '2026-10-05T15:49:19+00:00'
items:
type: object
properties:
id:
type: string
example: 00557cfc-01e0-4325-a697-7756508b6a8b
organization_id:
type: string
example: f0be03f8-988d-4347-9272-c9794db598b7
division_id:
type: string
example: null
nullable: true
first_name:
type: string
example: Audra
last_name:
type: string
example: Crooks
email:
type: string
example: gulgowski.asia@example.com
phone:
type: string
example: '6469808414'
title:
type: string
example: null
nullable: true
type:
type: string
example: null
nullable: true
is_active:
type: boolean
example: true
metadata:
type: string
example: null
nullable: true
created_at:
type: string
example: '2026-10-05T15:49:19+00:00'
updated_at:
type: string
example: '2026-10-05T15:49:19+00:00'
links:
type: object
properties:
first:
type: string
example: '/?page=1'
last:
type: string
example: '/?page=1'
prev:
type: string
example: null
nullable: true
next:
type: string
example: null
nullable: true
meta:
type: object
properties:
current_page:
type: integer
example: 1
from:
type: integer
example: 1
last_page:
type: integer
example: 1
links:
type: array
example:
-
url: null
label: '« Previous'
page: null
active: false
-
url: '/?page=1'
label: '1'
page: 1
active: true
-
url: null
label: 'Next »'
page: null
active: false
items:
type: object
properties:
url:
type: string
example: null
nullable: true
label:
type: string
example: '« Previous'
page:
type: string
example: null
nullable: true
active:
type: boolean
example: false
path:
type: string
example: /
per_page:
type: integer
example: 15
to:
type: integer
example: 2
total:
type: integer
example: 2
tags:
- Contacts
post:
summary: 'Create a contact'
operationId: createAContact
description: 'Creates a contact and returns it.'
parameters:
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
201:
description: ''
content:
application/json:
schema:
type: object
example:
data:
id: 95b40a09-7be2-4fa7-b8ba-215e3f299ad5
organization_id: 82164c53-36c8-44a1-800f-3e60f9730490
division_id: null
first_name: Christelle
last_name: Bailey
email: null
phone: '6290005642'
title: Geographer
type: primary
is_active: true
metadata: null
created_at: '2026-10-05T15:49:19+00:00'
updated_at: '2026-10-05T15:49:19+00:00'
properties:
data:
type: object
properties:
id:
type: string
example: 95b40a09-7be2-4fa7-b8ba-215e3f299ad5
organization_id:
type: string
example: 82164c53-36c8-44a1-800f-3e60f9730490
division_id:
type: string
example: null
nullable: true
first_name:
type: string
example: Christelle
last_name:
type: string
example: Bailey
email:
type: string
example: null
nullable: true
phone:
type: string
example: '6290005642'
title:
type: string
example: Geographer
type:
type: string
example: primary
is_active:
type: boolean
example: true
metadata:
type: string
example: null
nullable: true
created_at:
type: string
example: '2026-10-05T15:49:19+00:00'
updated_at:
type: string
example: '2026-10-05T15:49:19+00:00'
tags:
- Contacts
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
organization_id:
type: string
description: 'UUID of the organization this record belongs to. Must be one the API key can access. Must match an existing stored value.'
example: 9b7e0e2a-1c3d-4f5a-8b6c-2d4e6f8a0b1c
division_id:
type: string
description: 'Optional UUID of a division to scope this contact to. Must match an existing stored value.'
example: 9b7e0e2a-1c3d-4f5a-8b6c-2d4e6f8a0b1c
nullable: true
first_name:
type: string
description: 'Contact first name. Must not be greater than 255 characters.'
example: Jane
last_name:
type: string
description: 'Contact last name. Must not be greater than 255 characters.'
example: Smith
email:
type: string
description: 'Contact email address. Must be a valid email address. Must not be greater than 255 characters.'
example: ops@example.com
nullable: true
phone:
type: string
description: 'Contact phone number. Must not be greater than 255 characters.'
example: 512-555-0100
nullable: true
title:
type: string
description: 'Job title. Must not be greater than 255 characters.'
example: 'Project Manager'
nullable: true
type:
type: string
description: 'Contact role for routing correspondence.'
example: primary
enum:
- primary
- billing
- legal
nullable: true
is_active:
type: boolean
description: 'Whether the record is active. Defaults to true.'
example: true
nullable: true
metadata:
type: object
description: 'Free-form keyvalue bag stored alongside the record (max 32 KB, depth 6, 500 items).'
example: null
properties: {}
nullable: true
required:
- organization_id
- first_name
- last_name
'/api/v1/contacts/{uuid}':
get:
summary: 'Retrieve a contact'
operationId: retrieveAContact
description: 'Returns a single contact by UUID.'
parameters:
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
data:
id: 63004088-008e-4d17-923e-698133e66c64
organization_id: d517c34c-8020-48e3-a529-612d95b509d7
division_id: null
first_name: Morgan
last_name: Hirthe
email: emelie.baumbach@example.net
phone: '1607257447'
title: null
type: null
is_active: true
metadata: null
created_at: '2026-10-05T15:49:19+00:00'
updated_at: '2026-10-05T15:49:19+00:00'
properties:
data:
type: object
properties:
id:
type: string
example: 63004088-008e-4d17-923e-698133e66c64
organization_id:
type: string
example: d517c34c-8020-48e3-a529-612d95b509d7
division_id:
type: string
example: null
nullable: true
first_name:
type: string
example: Morgan
last_name:
type: string
example: Hirthe
email:
type: string
example: emelie.baumbach@example.net
phone:
type: string
example: '1607257447'
title:
type: string
example: null
nullable: true
type:
type: string
example: null
nullable: true
is_active:
type: boolean
example: true
metadata:
type: string
example: null
nullable: true
created_at:
type: string
example: '2026-10-05T15:49:19+00:00'
updated_at:
type: string
example: '2026-10-05T15:49:19+00:00'
tags:
- Contacts
put:
summary: 'Update a contact'
operationId: updateAContact
description: 'Applies a partial update to a contact and returns it.'
parameters:
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
data:
id: 08a8a183-f686-4b63-b0e2-12037e76a415
organization_id: 4ea63b38-5f87-4001-8dcb-d34cd3557b0a
division_id: null
first_name: Christelle
last_name: Bailey
email: null
phone: '6290005642'
title: Geographer
type: primary
is_active: true
metadata: null
created_at: '2026-10-05T15:49:19+00:00'
updated_at: '2026-10-05T15:49:19+00:00'
properties:
data:
type: object
properties:
id:
type: string
example: 08a8a183-f686-4b63-b0e2-12037e76a415
organization_id:
type: string
example: 4ea63b38-5f87-4001-8dcb-d34cd3557b0a
division_id:
type: string
example: null
nullable: true
first_name:
type: string
example: Christelle
last_name:
type: string
example: Bailey
email:
type: string
example: null
nullable: true
phone:
type: string
example: '6290005642'
title:
type: string
example: Geographer
type:
type: string
example: primary
is_active:
type: boolean
example: true
metadata:
type: string
example: null
nullable: true
created_at:
type: string
example: '2026-10-05T15:49:19+00:00'
updated_at:
type: string
example: '2026-10-05T15:49:19+00:00'
tags:
- Contacts
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
division_id:
type: string
description: 'Optional UUID of a division to scope this contact to. Must match an existing stored value.'
example: 9b7e0e2a-1c3d-4f5a-8b6c-2d4e6f8a0b1c
nullable: true
first_name:
type: string
description: 'Contact first name. Must not be greater than 255 characters.'
example: Jane
last_name:
type: string
description: 'Contact last name. Must not be greater than 255 characters.'
example: Smith
email:
type: string
description: 'Contact email address. Must be a valid email address. Must not be greater than 255 characters.'
example: ops@example.com
nullable: true
phone:
type: string
description: 'Contact phone number. Must not be greater than 255 characters.'
example: 512-555-0100
nullable: true
title:
type: string
description: 'Job title. Must not be greater than 255 characters.'
example: 'Project Manager'
nullable: true
type:
type: string
description: 'Contact role for routing correspondence.'
example: primary
enum:
- primary
- billing
- legal
nullable: true
is_active:
type: boolean
description: 'Whether the record is active. Defaults to true.'
example: true
nullable: true
metadata:
type: object
description: 'Free-form keyvalue bag stored alongside the record (max 32 KB, depth 6, 500 items).'
example: null
properties: {}
nullable: true
delete:
summary: 'Delete a contact'
operationId: deleteAContact
description: 'Soft-deletes the contact.'
parameters:
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
message: 'Contact deleted.'
properties:
message:
type: string
example: 'Contact deleted.'
tags:
- Contacts
parameters:
-
in: path
name: uuid
description: ''
example: 6ff8f7f6-1eb3-3525-be4a-3932c805afed
required: true
schema:
type: string
/api/v1/credits/balance:
get:
summary: 'Get credit balance'
operationId: getCreditBalance
description: 'Spendable balances (free, CLS-eligible) plus credits on hold -- set aside for a charge whose final amount is not known yet, such as full-service postage -- and what each hold is for. Held credits are not spendable; they are charged or returned when the work completes.'
parameters:
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
organization_uuid: 9b7e0e2a-1c3d-4f5a-8b6c-2d4e6f8a0b1c
balance:
total: 4.0
free: 0.0
cls_eligible: 4.0
held: 36.0
holds:
-
id: 5c1d…
amount: 36.0
description: 'Postage for 3 recipients — Riverbend Medical Office'
event_type: fulfillment_postage
for:
type: fulfillment_request
id: 7c9de01e-29ee-4814-a9c8-25527412f041
created_at: '2026-10-04T20:00:00+00:00'
properties:
organization_uuid:
type: string
example: 9b7e0e2a-1c3d-4f5a-8b6c-2d4e6f8a0b1c
balance:
type: object
properties:
total:
type: number
example: 4.0
free:
type: number
example: 0.0
cls_eligible:
type: number
example: 4.0
held:
type: number
example: 36.0
holds:
type: array
example:
-
id: 5c1d…
amount: 36
description: 'Postage for 3 recipients — Riverbend Medical Office'
event_type: fulfillment_postage
for:
type: fulfillment_request
id: 7c9de01e-29ee-4814-a9c8-25527412f041
created_at: '2026-10-04T20:00:00+00:00'
items:
type: object
properties:
id:
type: string
example: 5c1d…
amount:
type: number
example: 36.0
description:
type: string
example: 'Postage for 3 recipients — Riverbend Medical Office'
event_type:
type: string
example: fulfillment_postage
for:
type: object
properties:
type:
type: string
example: fulfillment_request
id:
type: string
example: 7c9de01e-29ee-4814-a9c8-25527412f041
created_at:
type: string
example: '2026-10-04T20:00:00+00:00'
tags:
- Credits
/api/v1/credits/price:
post:
summary: 'Preview an event price'
operationId: previewAnEventPrice
description: 'Returns the credit cost of a billable event without charging it.'
parameters:
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
event_type: mail_sending
credits: 2.0
cls_billable: true
properties:
event_type:
type: string
example: mail_sending
credits:
type: number
example: 2.0
cls_billable:
type: boolean
example: true
tags:
- Credits
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
event_type:
type: string
description: 'The billable event to price (e.g. document_generation, mail_sending, notice_research, document_order). Must not be greater than 100 characters.'
example: mail_sending
state:
type: string
description: 'Optional two-letter state code, for state-dependent pricing. Must be 2 characters.'
example: CA
nullable: true
recipients:
type: integer
description: 'Number of recipients, for per-recipient pricing (1 to 10000). Must be at least 1. Must not be greater than 10000.'
example: 1
nullable: true
document_type:
type: string
description: 'Optional document type, for type-dependent pricing. Must not be greater than 100 characters.'
example: notice
nullable: true
fulfillment_scope:
type: string
description: 'Optional fulfillment scope (e.g. research, full_service), for notice_research / fulfillment_notice_research pricing. Must not be greater than 50 characters.'
example: research
nullable: true
order_type:
type: string
description: 'Optional document order type (defaults to mail), for document_order pricing. Must not be greater than 50 characters.'
example: mail
nullable: true
mail_class:
type: string
description: 'Optional mail class (defaults to first_class), for mailed document_order pricing. Must not be greater than 50 characters.'
example: certified
nullable: true
required:
- event_type
/api/v1/credits/purchase:
post:
summary: 'Purchase credits'
operationId: purchaseCredits
description: 'Buys ad-hoc CLS-eligible credits (USD 1 = 1 credit) against the org default payment method.'
parameters:
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
201:
description: ''
content:
application/json:
schema:
type: object
example:
purchased: 100
balance: 350.0
properties:
purchased:
type: integer
example: 100
balance:
type: number
example: 350.0
tags:
- Credits
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
credits:
type: integer
description: 'Number of credits to buy. Sold in whole-dollar increments (USD 1 = 1 credit). Must be at least 1. Must not be greater than 1000000.'
example: 100
required:
- credits
/api/v1/divisions:
get:
summary: 'List divisions'
operationId: listDivisions
description: 'Paginated divisions visible to the caller, newest first.'
parameters:
-
in: query
name: organization_id
description: 'Filter to this organization (UUID).'
example: 9b7e0e2a-1c3d-4f5a-8b6c-2d4e6f8a0b1c
required: true
schema:
type: string
description: 'Filter to this organization (UUID).'
example: 9b7e0e2a-1c3d-4f5a-8b6c-2d4e6f8a0b1c
-
in: query
name: is_active
description: 'Filter by active state.'
example: true
required: true
schema:
type: boolean
description: 'Filter by active state.'
example: true
-
in: query
name: search
description: 'Case-insensitive partial match on name and code.'
example: architecto
required: true
schema:
type: string
description: 'Case-insensitive partial match on name and code.'
example: architecto
-
in: query
name: per_page
description: 'Results per page. Clamped to 1-100; defaults to 15.'
example: 15
required: true
schema:
type: integer
description: 'Results per page. Clamped to 1-100; defaults to 15.'
example: 15
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
data:
-
id: fd897fec-58cf-46c7-b86a-82815e3a521e
organization_id: 93943636-6427-426d-bc67-14600fdf8da1
name: 'eius et'
code: null
description: 'Et fugiat sunt nihil accusantium.'
address_line_1: '1582 Lexus Mount Apt. 498'
address_line_2: 'Apt. 724'
city: 'Lake Haven'
state: LA
zip: '19279'
zip_plus_4: '5744'
country_code: US
phone: '0591350525'
email: null
license_number: LIC-915066
is_active: true
metadata: null
created_at: '2026-10-05T15:49:19+00:00'
updated_at: '2026-10-05T15:49:19+00:00'
-
id: 20df3f9e-f1ec-4165-8dd7-df4de2ba2ca6
organization_id: 43095bdf-93d1-4081-a123-b7e411e4e5ad
name: 'est dignissimos'
code: null
description: null
address_line_1: '11084 Palma Stream Apt. 368'
address_line_2: null
city: Artborough
state: NV
zip: 18607-5439
zip_plus_4: null
country_code: US
phone: '8474860372'
email: null
license_number: null
is_active: true
metadata: null
created_at: '2026-10-05T15:49:19+00:00'
updated_at: '2026-10-05T15:49:19+00:00'
links:
first: '/?page=1'
last: '/?page=1'
prev: null
next: null
meta:
current_page: 1
from: 1
last_page: 1
links:
-
url: null
label: '« Previous'
page: null
active: false
-
url: '/?page=1'
label: '1'
page: 1
active: true
-
url: null
label: 'Next »'
page: null
active: false
path: /
per_page: 15
to: 2
total: 2
properties:
data:
type: array
example:
-
id: fd897fec-58cf-46c7-b86a-82815e3a521e
organization_id: 93943636-6427-426d-bc67-14600fdf8da1
name: 'eius et'
code: null
description: 'Et fugiat sunt nihil accusantium.'
address_line_1: '1582 Lexus Mount Apt. 498'
address_line_2: 'Apt. 724'
city: 'Lake Haven'
state: LA
zip: '19279'
zip_plus_4: '5744'
country_code: US
phone: '0591350525'
email: null
license_number: LIC-915066
is_active: true
metadata: null
created_at: '2026-10-05T15:49:19+00:00'
updated_at: '2026-10-05T15:49:19+00:00'
-
id: 20df3f9e-f1ec-4165-8dd7-df4de2ba2ca6
organization_id: 43095bdf-93d1-4081-a123-b7e411e4e5ad
name: 'est dignissimos'
code: null
description: null
address_line_1: '11084 Palma Stream Apt. 368'
address_line_2: null
city: Artborough
state: NV
zip: 18607-5439
zip_plus_4: null
country_code: US
phone: '8474860372'
email: null
license_number: null
is_active: true
metadata: null
created_at: '2026-10-05T15:49:19+00:00'
updated_at: '2026-10-05T15:49:19+00:00'
items:
type: object
properties:
id:
type: string
example: fd897fec-58cf-46c7-b86a-82815e3a521e
organization_id:
type: string
example: 93943636-6427-426d-bc67-14600fdf8da1
name:
type: string
example: 'eius et'
code:
type: string
example: null
nullable: true
description:
type: string
example: 'Et fugiat sunt nihil accusantium.'
address_line_1:
type: string
example: '1582 Lexus Mount Apt. 498'
address_line_2:
type: string
example: 'Apt. 724'
city:
type: string
example: 'Lake Haven'
state:
type: string
example: LA
zip:
type: string
example: '19279'
zip_plus_4:
type: string
example: '5744'
country_code:
type: string
example: US
phone:
type: string
example: '0591350525'
email:
type: string
example: null
nullable: true
license_number:
type: string
example: LIC-915066
is_active:
type: boolean
example: true
metadata:
type: string
example: null
nullable: true
created_at:
type: string
example: '2026-10-05T15:49:19+00:00'
updated_at:
type: string
example: '2026-10-05T15:49:19+00:00'
links:
type: object
properties:
first:
type: string
example: '/?page=1'
last:
type: string
example: '/?page=1'
prev:
type: string
example: null
nullable: true
next:
type: string
example: null
nullable: true
meta:
type: object
properties:
current_page:
type: integer
example: 1
from:
type: integer
example: 1
last_page:
type: integer
example: 1
links:
type: array
example:
-
url: null
label: '« Previous'
page: null
active: false
-
url: '/?page=1'
label: '1'
page: 1
active: true
-
url: null
label: 'Next »'
page: null
active: false
items:
type: object
properties:
url:
type: string
example: null
nullable: true
label:
type: string
example: '« Previous'
page:
type: string
example: null
nullable: true
active:
type: boolean
example: false
path:
type: string
example: /
per_page:
type: integer
example: 15
to:
type: integer
example: 2
total:
type: integer
example: 2
tags:
- Divisions
post:
summary: 'Create a division'
operationId: createADivision
description: 'Creates a division and returns it.'
parameters:
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
201:
description: ''
content:
application/json:
schema:
type: object
example:
data:
id: 1c8fda6d-3b76-4986-9c31-a7ae9474ad55
organization_id: 54f60b87-43dc-4960-80b9-a0c9b66ec1f8
name: 'sunt nihil'
code: DIV-841
description: null
address_line_1: '78142 Nick Field'
address_line_2: 'Apt. 724'
city: 'Lake Haven'
state: LA
zip: '19279'
zip_plus_4: '5744'
country_code: US
phone: '0591350525'
email: null
license_number: LIC-915066
is_active: true
metadata: null
created_at: '2026-10-05T15:49:19+00:00'
updated_at: '2026-10-05T15:49:19+00:00'
properties:
data:
type: object
properties:
id:
type: string
example: 1c8fda6d-3b76-4986-9c31-a7ae9474ad55
organization_id:
type: string
example: 54f60b87-43dc-4960-80b9-a0c9b66ec1f8
name:
type: string
example: 'sunt nihil'
code:
type: string
example: DIV-841
description:
type: string
example: null
nullable: true
address_line_1:
type: string
example: '78142 Nick Field'
address_line_2:
type: string
example: 'Apt. 724'
city:
type: string
example: 'Lake Haven'
state:
type: string
example: LA
zip:
type: string
example: '19279'
zip_plus_4:
type: string
example: '5744'
country_code:
type: string
example: US
phone:
type: string
example: '0591350525'
email:
type: string
example: null
nullable: true
license_number:
type: string
example: LIC-915066
is_active:
type: boolean
example: true
metadata:
type: string
example: null
nullable: true
created_at:
type: string
example: '2026-10-05T15:49:19+00:00'
updated_at:
type: string
example: '2026-10-05T15:49:19+00:00'
tags:
- Divisions
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
organization_id:
type: string
description: 'UUID of the organization this record belongs to. Must be one the API key can access. Must match an existing stored value.'
example: 9b7e0e2a-1c3d-4f5a-8b6c-2d4e6f8a0b1c
name:
type: string
description: 'Division / claimant legal name as it should appear on documents. Must not be greater than 255 characters.'
example: 'Acme Mechanical, Northwest Division'
code:
type: string
description: 'Optional short internal code for the division. Must not be greater than 255 characters.'
example: NW
nullable: true
description:
type: string
description: 'Optional internal description. Must not be greater than 10000 characters.'
example: 'Eius et animi quos velit et.'
nullable: true
address_line_1:
type: string
description: 'Street address, line 1. Must not be greater than 255 characters.'
example: '100 Commerce Blvd'
address_line_2:
type: string
description: 'Street address, line 2 (suite, unit). Must not be greater than 255 characters.'
example: v
nullable: true
city:
type: string
description: 'City. Must not be greater than 100 characters.'
example: Austin
state:
type: string
description: 'Two-letter US state code. Must be 2 characters.'
example: CA
zip:
type: string
description: 'Postal code (5 or 9 digit). Must not be greater than 10 characters.'
example: '78701'
zip_plus_4:
type: string
description: 'Optional 4-digit ZIP+4 extension. Must not be greater than 4 characters.'
example: '1234'
nullable: true
country_code:
type: string
description: 'Two-letter ISO country code. Defaults to US. Must be 2 characters.'
example: US
nullable: true
phone:
type: string
description: 'Contact phone number. Must not be greater than 20 characters.'
example: 512-555-0100
nullable: true
email:
type: string
description: 'Contact email address. Must be a valid email address. Must not be greater than 255 characters.'
example: ops@example.com
nullable: true
license_number:
type: string
description: 'Contractor license number for this claimant. Rendered on documents; cannot be overridden per-document. Must not be greater than 255 characters.'
example: LIC-558231
nullable: true
is_active:
type: boolean
description: 'Whether the record is active. Defaults to true.'
example: true
nullable: true
metadata:
type: object
description: 'Free-form keyvalue bag stored alongside the record (max 32 KB, depth 6, 500 items).'
example: null
properties: {}
nullable: true
required:
- organization_id
- name
- address_line_1
- city
- state
- zip
'/api/v1/divisions/{uuid}':
get:
summary: 'Retrieve a division'
operationId: retrieveADivision
description: 'Returns a single division by UUID.'
parameters:
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
data:
id: 44084e8c-b20c-42a3-95ab-03e83396d28b
organization_id: 05fb656b-74f5-4a48-bdeb-54096eba65ac
name: 'aut adipisci'
code: DIV-432
description: null
address_line_1: '38862 Ferne Locks Suite 058'
address_line_2: 'Apt. 067'
city: Lefflerhaven
state: TX
zip: 58408-7043
zip_plus_4: null
country_code: US
phone: '6912823169'
email: kconsidine@kshlerin.com
license_number: null
is_active: true
metadata: null
created_at: '2026-10-05T15:49:19+00:00'
updated_at: '2026-10-05T15:49:19+00:00'
properties:
data:
type: object
properties:
id:
type: string
example: 44084e8c-b20c-42a3-95ab-03e83396d28b
organization_id:
type: string
example: 05fb656b-74f5-4a48-bdeb-54096eba65ac
name:
type: string
example: 'aut adipisci'
code:
type: string
example: DIV-432
description:
type: string
example: null
nullable: true
address_line_1:
type: string
example: '38862 Ferne Locks Suite 058'
address_line_2:
type: string
example: 'Apt. 067'
city:
type: string
example: Lefflerhaven
state:
type: string
example: TX
zip:
type: string
example: 58408-7043
zip_plus_4:
type: string
example: null
nullable: true
country_code:
type: string
example: US
phone:
type: string
example: '6912823169'
email:
type: string
example: kconsidine@kshlerin.com
license_number:
type: string
example: null
nullable: true
is_active:
type: boolean
example: true
metadata:
type: string
example: null
nullable: true
created_at:
type: string
example: '2026-10-05T15:49:19+00:00'
updated_at:
type: string
example: '2026-10-05T15:49:19+00:00'
tags:
- Divisions
put:
summary: 'Update a division'
operationId: updateADivision
description: 'Applies a partial update to a division and returns it.'
parameters:
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
data:
id: 9e15853d-e4e0-418e-b0a6-a2f05a10055d
organization_id: a351b06e-881f-42ce-a061-c5bc3905a1c3
name: 'sunt nihil'
code: DIV-841
description: null
address_line_1: '78142 Nick Field'
address_line_2: 'Apt. 724'
city: 'Lake Haven'
state: LA
zip: '19279'
zip_plus_4: '5744'
country_code: US
phone: '0591350525'
email: null
license_number: LIC-915066
is_active: true
metadata: null
created_at: '2026-10-05T15:49:19+00:00'
updated_at: '2026-10-05T15:49:19+00:00'
properties:
data:
type: object
properties:
id:
type: string
example: 9e15853d-e4e0-418e-b0a6-a2f05a10055d
organization_id:
type: string
example: a351b06e-881f-42ce-a061-c5bc3905a1c3
name:
type: string
example: 'sunt nihil'
code:
type: string
example: DIV-841
description:
type: string
example: null
nullable: true
address_line_1:
type: string
example: '78142 Nick Field'
address_line_2:
type: string
example: 'Apt. 724'
city:
type: string
example: 'Lake Haven'
state:
type: string
example: LA
zip:
type: string
example: '19279'
zip_plus_4:
type: string
example: '5744'
country_code:
type: string
example: US
phone:
type: string
example: '0591350525'
email:
type: string
example: null
nullable: true
license_number:
type: string
example: LIC-915066
is_active:
type: boolean
example: true
metadata:
type: string
example: null
nullable: true
created_at:
type: string
example: '2026-10-05T15:49:19+00:00'
updated_at:
type: string
example: '2026-10-05T15:49:19+00:00'
tags:
- Divisions
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
name:
type: string
description: 'Division / claimant legal name as it should appear on documents. Must not be greater than 255 characters.'
example: 'Acme Mechanical, Northwest Division'
code:
type: string
description: 'Optional short internal code for the division. Must not be greater than 255 characters.'
example: NW
nullable: true
description:
type: string
description: 'Optional internal description. Must not be greater than 10000 characters.'
example: 'Eius et animi quos velit et.'
nullable: true
address_line_1:
type: string
description: 'Street address, line 1. Must not be greater than 255 characters.'
example: '100 Commerce Blvd'
address_line_2:
type: string
description: 'Street address, line 2 (suite, unit). Must not be greater than 255 characters.'
example: v
nullable: true
city:
type: string
description: 'City. Must not be greater than 100 characters.'
example: Austin
state:
type: string
description: 'Two-letter US state code. Must be 2 characters.'
example: CA
zip:
type: string
description: 'Postal code (5 or 9 digit). Must not be greater than 10 characters.'
example: '78701'
zip_plus_4:
type: string
description: 'Optional 4-digit ZIP+4 extension. Must not be greater than 4 characters.'
example: '1234'
nullable: true
country_code:
type: string
description: 'Two-letter ISO country code. Defaults to US. Must be 2 characters.'
example: US
nullable: true
phone:
type: string
description: 'Contact phone number. Must not be greater than 20 characters.'
example: 512-555-0100
nullable: true
email:
type: string
description: 'Contact email address. Must be a valid email address. Must not be greater than 255 characters.'
example: ops@example.com
nullable: true
license_number:
type: string
description: 'Contractor license number for this claimant. Rendered on documents; cannot be overridden per-document. Must not be greater than 255 characters.'
example: LIC-558231
nullable: true
is_active:
type: boolean
description: 'Whether the record is active. Defaults to true.'
example: true
nullable: true
metadata:
type: object
description: 'Free-form keyvalue bag stored alongside the record (max 32 KB, depth 6, 500 items).'
example: null
properties: {}
nullable: true
delete:
summary: 'Delete a division'
operationId: deleteADivision
description: 'Deletes the division. A division that is a project claimant cannot be deleted (422).'
parameters:
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
message: 'Division deleted.'
properties:
message:
type: string
example: 'Division deleted.'
tags:
- Divisions
parameters:
-
in: path
name: uuid
description: ''
example: 6ff8f7f6-1eb3-3525-be4a-3932c805afed
required: true
schema:
type: string
/api/v1/document-orders:
get:
summary: 'List document orders'
operationId: listDocumentOrders
description: 'Paginated fulfillment orders visible to the caller.'
parameters:
-
in: query
name: status
description: 'Filter by lifecycle status.'
example: architecto
required: true
schema:
type: string
description: 'Filter by lifecycle status.'
example: architecto
-
in: query
name: billing_status
description: 'Filter by billing status.'
example: architecto
required: true
schema:
type: string
description: 'Filter by billing status.'
example: architecto
-
in: query
name: order_type
description: 'Filter by order type: mail, filing, research or recording.'
example: mail
required: true
schema:
type: string
description: 'Filter by order type: mail, filing, research or recording.'
example: mail
-
in: query
name: per_page
description: 'Results per page. Clamped to 1-100; defaults to 15.'
example: 15
required: true
schema:
type: integer
description: 'Results per page. Clamped to 1-100; defaults to 15.'
example: 15
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
data:
-
id: f0f775ca-33d3-4d8e-8709-07ddbc456431
status: pending
order_type: mail
billing:
status: pending
method: credit_balance
amount_cents: 1288
invoiced_at: null
paid_at: null
invoice_reference: null
payment_reference: null
tracking_number: null
carrier: null
mail_class: first_class
recipient:
name: 'Macey Rempel PhD'
address_line_1: '4529 Tillman Ridges Suite 142'
address_line_2: null
city: 'East Nickshire'
state: MO
zip: '33724'
external_provider_id: null
shipped_at: null
delivered_at: null
metadata: null
created_at: '2026-10-05T15:49:20+00:00'
updated_at: '2026-10-05T15:49:20+00:00'
-
id: 1d8d3a1f-d666-490a-a3a1-805aaa81fbdd
status: pending
order_type: mail
billing:
status: pending
method: credit_balance
amount_cents: 1392
invoiced_at: null
paid_at: null
invoice_reference: null
payment_reference: null
tracking_number: null
carrier: null
mail_class: first_class
recipient:
name: "Prof. Juvenal O'Kon"
address_line_1: '6750 Alfonso Causeway'
address_line_2: null
city: 'East Danielaborough'
state: DE
zip: '95083'
external_provider_id: null
shipped_at: null
delivered_at: null
metadata: null
created_at: '2026-10-05T15:49:20+00:00'
updated_at: '2026-10-05T15:49:20+00:00'
links:
first: '/?page=1'
last: '/?page=1'
prev: null
next: null
meta:
current_page: 1
from: 1
last_page: 1
links:
-
url: null
label: '« Previous'
page: null
active: false
-
url: '/?page=1'
label: '1'
page: 1
active: true
-
url: null
label: 'Next »'
page: null
active: false
path: /
per_page: 15
to: 2
total: 2
properties:
data:
type: array
example:
-
id: f0f775ca-33d3-4d8e-8709-07ddbc456431
status: pending
order_type: mail
billing:
status: pending
method: credit_balance
amount_cents: 1288
invoiced_at: null
paid_at: null
invoice_reference: null
payment_reference: null
tracking_number: null
carrier: null
mail_class: first_class
recipient:
name: 'Macey Rempel PhD'
address_line_1: '4529 Tillman Ridges Suite 142'
address_line_2: null
city: 'East Nickshire'
state: MO
zip: '33724'
external_provider_id: null
shipped_at: null
delivered_at: null
metadata: null
created_at: '2026-10-05T15:49:20+00:00'
updated_at: '2026-10-05T15:49:20+00:00'
-
id: 1d8d3a1f-d666-490a-a3a1-805aaa81fbdd
status: pending
order_type: mail
billing:
status: pending
method: credit_balance
amount_cents: 1392
invoiced_at: null
paid_at: null
invoice_reference: null
payment_reference: null
tracking_number: null
carrier: null
mail_class: first_class
recipient:
name: "Prof. Juvenal O'Kon"
address_line_1: '6750 Alfonso Causeway'
address_line_2: null
city: 'East Danielaborough'
state: DE
zip: '95083'
external_provider_id: null
shipped_at: null
delivered_at: null
metadata: null
created_at: '2026-10-05T15:49:20+00:00'
updated_at: '2026-10-05T15:49:20+00:00'
items:
type: object
properties:
id:
type: string
example: f0f775ca-33d3-4d8e-8709-07ddbc456431
status:
type: string
example: pending
order_type:
type: string
example: mail
billing:
type: object
properties:
status:
type: string
example: pending
method:
type: string
example: credit_balance
amount_cents:
type: integer
example: 1288
invoiced_at:
type: string
example: null
nullable: true
paid_at:
type: string
example: null
nullable: true
invoice_reference:
type: string
example: null
nullable: true
payment_reference:
type: string
example: null
nullable: true
tracking_number:
type: string
example: null
nullable: true
carrier:
type: string
example: null
nullable: true
mail_class:
type: string
example: first_class
recipient:
type: object
properties:
name:
type: string
example: 'Macey Rempel PhD'
address_line_1:
type: string
example: '4529 Tillman Ridges Suite 142'
address_line_2:
type: string
example: null
nullable: true
city:
type: string
example: 'East Nickshire'
state:
type: string
example: MO
zip:
type: string
example: '33724'
external_provider_id:
type: string
example: null
nullable: true
shipped_at:
type: string
example: null
nullable: true
delivered_at:
type: string
example: null
nullable: true
metadata:
type: string
example: null
nullable: true
created_at:
type: string
example: '2026-10-05T15:49:20+00:00'
updated_at:
type: string
example: '2026-10-05T15:49:20+00:00'
links:
type: object
properties:
first:
type: string
example: '/?page=1'
last:
type: string
example: '/?page=1'
prev:
type: string
example: null
nullable: true
next:
type: string
example: null
nullable: true
meta:
type: object
properties:
current_page:
type: integer
example: 1
from:
type: integer
example: 1
last_page:
type: integer
example: 1
links:
type: array
example:
-
url: null
label: '« Previous'
page: null
active: false
-
url: '/?page=1'
label: '1'
page: 1
active: true
-
url: null
label: 'Next »'
page: null
active: false
items:
type: object
properties:
url:
type: string
example: null
nullable: true
label:
type: string
example: '« Previous'
page:
type: string
example: null
nullable: true
active:
type: boolean
example: false
path:
type: string
example: /
per_page:
type: integer
example: 15
to:
type: integer
example: 2
total:
type: integer
example: 2
tags:
- 'Document Orders'
post:
summary: 'Create a document order'
operationId: createADocumentOrder
description: 'Orders fulfillment (mail / filing / research / recording) for a generated document. Price is computed server-side.'
parameters:
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
201:
description: ''
content:
application/json:
schema:
type: object
example:
data:
id: dddaac1e-8a19-4a13-9a07-8b74f4a33096
status: pending
order_type: mail
billing:
status: pending
method: credit_balance
amount_cents: 1288
invoiced_at: null
paid_at: null
invoice_reference: null
payment_reference: null
tracking_number: null
carrier: null
mail_class: first_class
recipient:
name: 'Macey Rempel PhD'
address_line_1: '4529 Tillman Ridges Suite 142'
address_line_2: null
city: 'East Nickshire'
state: MO
zip: '33724'
external_provider_id: null
shipped_at: null
delivered_at: null
metadata: null
created_at: '2026-10-05T15:49:20+00:00'
updated_at: '2026-10-05T15:49:20+00:00'
properties:
data:
type: object
properties:
id:
type: string
example: dddaac1e-8a19-4a13-9a07-8b74f4a33096
status:
type: string
example: pending
order_type:
type: string
example: mail
billing:
type: object
properties:
status:
type: string
example: pending
method:
type: string
example: credit_balance
amount_cents:
type: integer
example: 1288
invoiced_at:
type: string
example: null
nullable: true
paid_at:
type: string
example: null
nullable: true
invoice_reference:
type: string
example: null
nullable: true
payment_reference:
type: string
example: null
nullable: true
tracking_number:
type: string
example: null
nullable: true
carrier:
type: string
example: null
nullable: true
mail_class:
type: string
example: first_class
recipient:
type: object
properties:
name:
type: string
example: 'Macey Rempel PhD'
address_line_1:
type: string
example: '4529 Tillman Ridges Suite 142'
address_line_2:
type: string
example: null
nullable: true
city:
type: string
example: 'East Nickshire'
state:
type: string
example: MO
zip:
type: string
example: '33724'
external_provider_id:
type: string
example: null
nullable: true
shipped_at:
type: string
example: null
nullable: true
delivered_at:
type: string
example: null
nullable: true
metadata:
type: string
example: null
nullable: true
created_at:
type: string
example: '2026-10-05T15:49:20+00:00'
updated_at:
type: string
example: '2026-10-05T15:49:20+00:00'
tags:
- 'Document Orders'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
document_id:
type: string
description: 'UUID of the generated document to fulfill. Must match an existing stored value.'
example: 9b7e0e2a-1c3d-4f5a-8b6c-2d4e6f8a0b1c
organization_id:
type: string
description: 'Optional UUID of the organization to bill. Defaults to the document organization. Must match an existing stored value.'
example: 9b7e0e2a-1c3d-4f5a-8b6c-2d4e6f8a0b1c
nullable: true
order_type:
type: string
description: 'Fulfillment channel.'
example: mail
enum:
- mail
- filing
- research
- recording
nullable: true
billing_method:
type: string
description: 'How the order is paid for.'
example: credit_balance
enum:
- prepay
- invoice
- credit_balance
nullable: true
mail_class:
type: string
description: 'USPS mail class (mailed orders only).'
example: certified
enum:
- first_class
- certified
- priority
nullable: true
recipient_name:
type: string
description: 'Name of the party the document is sent to. Must not be greater than 255 characters.'
example: 'Property Owner LLC'
recipient_address_line_1:
type: string
description: 'Recipient street address, line 1. Must not be greater than 255 characters.'
example: '200 Main Street'
recipient_address_line_2:
type: string
description: 'Recipient street address, line 2. Must not be greater than 255 characters.'
example: b
nullable: true
recipient_city:
type: string
description: 'Recipient city. Must not be greater than 255 characters.'
example: Austin
recipient_state:
type: string
description: 'Recipient two-letter US state code. Must be 2 characters.'
example: TX
recipient_zip:
type: string
description: 'Recipient postal code. Must not be greater than 10 characters.'
example: '78702'
metadata:
type: object
description: 'Free-form keyvalue bag stored alongside the record (max 32 KB, depth 6, 500 items).'
example: null
properties: {}
nullable: true
required:
- document_id
- recipient_name
- recipient_address_line_1
- recipient_city
- recipient_state
- recipient_zip
'/api/v1/document-orders/{uuid}':
get:
summary: 'Retrieve a document order'
operationId: retrieveADocumentOrder
description: 'Returns a single order by UUID.'
parameters:
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
data:
id: dc59e141-1854-4a8a-a966-e87b18d6c188
status: pending
order_type: mail
billing:
status: pending
method: credit_balance
amount_cents: 1118
invoiced_at: null
paid_at: null
invoice_reference: null
payment_reference: null
tracking_number: null
carrier: null
mail_class: first_class
recipient:
name: 'Miss Pearl Hauck'
address_line_1: '99279 Kenyatta Knoll'
address_line_2: null
city: Careymouth
state: IA
zip: 64310-6432
external_provider_id: null
shipped_at: null
delivered_at: null
metadata: null
created_at: '2026-10-05T15:49:20+00:00'
updated_at: '2026-10-05T15:49:20+00:00'
properties:
data:
type: object
properties:
id:
type: string
example: dc59e141-1854-4a8a-a966-e87b18d6c188
status:
type: string
example: pending
order_type:
type: string
example: mail
billing:
type: object
properties:
status:
type: string
example: pending
method:
type: string
example: credit_balance
amount_cents:
type: integer
example: 1118
invoiced_at:
type: string
example: null
nullable: true
paid_at:
type: string
example: null
nullable: true
invoice_reference:
type: string
example: null
nullable: true
payment_reference:
type: string
example: null
nullable: true
tracking_number:
type: string
example: null
nullable: true
carrier:
type: string
example: null
nullable: true
mail_class:
type: string
example: first_class
recipient:
type: object
properties:
name:
type: string
example: 'Miss Pearl Hauck'
address_line_1:
type: string
example: '99279 Kenyatta Knoll'
address_line_2:
type: string
example: null
nullable: true
city:
type: string
example: Careymouth
state:
type: string
example: IA
zip:
type: string
example: 64310-6432
external_provider_id:
type: string
example: null
nullable: true
shipped_at:
type: string
example: null
nullable: true
delivered_at:
type: string
example: null
nullable: true
metadata:
type: string
example: null
nullable: true
created_at:
type: string
example: '2026-10-05T15:49:20+00:00'
updated_at:
type: string
example: '2026-10-05T15:49:20+00:00'
tags:
- 'Document Orders'
patch:
summary: 'Update a document order'
operationId: updateADocumentOrder
description: 'Edits recipient / mail-class details while the order is still editable.'
parameters:
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
data:
id: e9f1593a-3ad8-48e6-b32b-393e3c0d91d3
status: pending
order_type: mail
billing:
status: pending
method: credit_balance
amount_cents: 1288
invoiced_at: null
paid_at: null
invoice_reference: null
payment_reference: null
tracking_number: null
carrier: null
mail_class: first_class
recipient:
name: 'Macey Rempel PhD'
address_line_1: '4529 Tillman Ridges Suite 142'
address_line_2: null
city: 'East Nickshire'
state: MO
zip: '33724'
external_provider_id: null
shipped_at: null
delivered_at: null
metadata: null
created_at: '2026-10-05T15:49:20+00:00'
updated_at: '2026-10-05T15:49:20+00:00'
properties:
data:
type: object
properties:
id:
type: string
example: e9f1593a-3ad8-48e6-b32b-393e3c0d91d3
status:
type: string
example: pending
order_type:
type: string
example: mail
billing:
type: object
properties:
status:
type: string
example: pending
method:
type: string
example: credit_balance
amount_cents:
type: integer
example: 1288
invoiced_at:
type: string
example: null
nullable: true
paid_at:
type: string
example: null
nullable: true
invoice_reference:
type: string
example: null
nullable: true
payment_reference:
type: string
example: null
nullable: true
tracking_number:
type: string
example: null
nullable: true
carrier:
type: string
example: null
nullable: true
mail_class:
type: string
example: first_class
recipient:
type: object
properties:
name:
type: string
example: 'Macey Rempel PhD'
address_line_1:
type: string
example: '4529 Tillman Ridges Suite 142'
address_line_2:
type: string
example: null
nullable: true
city:
type: string
example: 'East Nickshire'
state:
type: string
example: MO
zip:
type: string
example: '33724'
external_provider_id:
type: string
example: null
nullable: true
shipped_at:
type: string
example: null
nullable: true
delivered_at:
type: string
example: null
nullable: true
metadata:
type: string
example: null
nullable: true
created_at:
type: string
example: '2026-10-05T15:49:20+00:00'
updated_at:
type: string
example: '2026-10-05T15:49:20+00:00'
tags:
- 'Document Orders'
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
recipient_name:
type: string
description: 'Name of the party the document is sent to. Must not be greater than 255 characters.'
example: 'Property Owner LLC'
recipient_address_line_1:
type: string
description: 'Recipient street address, line 1. Must not be greater than 255 characters.'
example: '200 Main Street'
recipient_address_line_2:
type: string
description: 'Recipient street address, line 2. Must not be greater than 255 characters.'
example: b
nullable: true
recipient_city:
type: string
description: 'Recipient city. Must not be greater than 255 characters.'
example: Austin
recipient_state:
type: string
description: 'Recipient two-letter US state code. Must be 2 characters.'
example: TX
recipient_zip:
type: string
description: 'Recipient postal code. Must not be greater than 10 characters.'
example: '78702'
mail_class:
type: string
description: 'USPS mail class.'
example: certified
enum:
- first_class
- certified
- priority
metadata:
type: object
description: 'Free-form keyvalue bag stored alongside the record (max 32 KB, depth 6, 500 items).'
example: null
properties: {}
nullable: true
parameters:
-
in: path
name: uuid
description: ''
example: 6ff8f7f6-1eb3-3525-be4a-3932c805afed
required: true
schema:
type: string
'/api/v1/document-orders/{document_order_uuid}/cancel':
post:
summary: 'Cancel a document order'
operationId: cancelADocumentOrder
description: 'Cancels the order if it has not yet been dispatched.'
parameters:
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
data:
id: 1da9bc80-752f-410b-aa92-35579cde1699
status: pending
order_type: mail
billing:
status: pending
method: credit_balance
amount_cents: 1118
invoiced_at: null
paid_at: null
invoice_reference: null
payment_reference: null
tracking_number: null
carrier: null
mail_class: first_class
recipient:
name: 'Miss Pearl Hauck'
address_line_1: '99279 Kenyatta Knoll'
address_line_2: null
city: Careymouth
state: IA
zip: 64310-6432
external_provider_id: null
shipped_at: null
delivered_at: null
metadata: null
created_at: '2026-10-05T15:49:20+00:00'
updated_at: '2026-10-05T15:49:20+00:00'
properties:
data:
type: object
properties:
id:
type: string
example: 1da9bc80-752f-410b-aa92-35579cde1699
status:
type: string
example: pending
order_type:
type: string
example: mail
billing:
type: object
properties:
status:
type: string
example: pending
method:
type: string
example: credit_balance
amount_cents:
type: integer
example: 1118
invoiced_at:
type: string
example: null
nullable: true
paid_at:
type: string
example: null
nullable: true
invoice_reference:
type: string
example: null
nullable: true
payment_reference:
type: string
example: null
nullable: true
tracking_number:
type: string
example: null
nullable: true
carrier:
type: string
example: null
nullable: true
mail_class:
type: string
example: first_class
recipient:
type: object
properties:
name:
type: string
example: 'Miss Pearl Hauck'
address_line_1:
type: string
example: '99279 Kenyatta Knoll'
address_line_2:
type: string
example: null
nullable: true
city:
type: string
example: Careymouth
state:
type: string
example: IA
zip:
type: string
example: 64310-6432
external_provider_id:
type: string
example: null
nullable: true
shipped_at:
type: string
example: null
nullable: true
delivered_at:
type: string
example: null
nullable: true
metadata:
type: string
example: null
nullable: true
created_at:
type: string
example: '2026-10-05T15:49:20+00:00'
updated_at:
type: string
example: '2026-10-05T15:49:20+00:00'
tags:
- 'Document Orders'
parameters:
-
in: path
name: document_order_uuid
description: ''
example: 6ff8f7f6-1eb3-3525-be4a-3932c805afed
required: true
schema:
type: string
'/api/v1/document-orders/{document_order_uuid}/pay':
post:
summary: 'Record a document-order payment'
operationId: recordADocumentOrderPayment
description: 'Records a charge, refund, adjustment or applied-credit line against the order.'
parameters:
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
data:
id: 878a27d0-9793-4977-851f-69bcebcd5f00
status: pending
order_type: mail
billing:
status: pending
method: credit_balance
amount_cents: 1288
invoiced_at: null
paid_at: null
invoice_reference: null
payment_reference: null
tracking_number: null
carrier: null
mail_class: first_class
recipient:
name: 'Macey Rempel PhD'
address_line_1: '4529 Tillman Ridges Suite 142'
address_line_2: null
city: 'East Nickshire'
state: MO
zip: '33724'
external_provider_id: null
shipped_at: null
delivered_at: null
metadata: null
created_at: '2026-10-05T15:49:20+00:00'
updated_at: '2026-10-05T15:49:20+00:00'
properties:
data:
type: object
properties:
id:
type: string
example: 878a27d0-9793-4977-851f-69bcebcd5f00
status:
type: string
example: pending
order_type:
type: string
example: mail
billing:
type: object
properties:
status:
type: string
example: pending
method:
type: string
example: credit_balance
amount_cents:
type: integer
example: 1288
invoiced_at:
type: string
example: null
nullable: true
paid_at:
type: string
example: null
nullable: true
invoice_reference:
type: string
example: null
nullable: true
payment_reference:
type: string
example: null
nullable: true
tracking_number:
type: string
example: null
nullable: true
carrier:
type: string
example: null
nullable: true
mail_class:
type: string
example: first_class
recipient:
type: object
properties:
name:
type: string
example: 'Macey Rempel PhD'
address_line_1:
type: string
example: '4529 Tillman Ridges Suite 142'
address_line_2:
type: string
example: null
nullable: true
city:
type: string
example: 'East Nickshire'
state:
type: string
example: MO
zip:
type: string
example: '33724'
external_provider_id:
type: string
example: null
nullable: true
shipped_at:
type: string
example: null
nullable: true
delivered_at:
type: string
example: null
nullable: true
metadata:
type: string
example: null
nullable: true
created_at:
type: string
example: '2026-10-05T15:49:20+00:00'
updated_at:
type: string
example: '2026-10-05T15:49:20+00:00'
tags:
- 'Document Orders'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
type:
type: string
description: 'Payment kind. charge and credit_applied must be positive; refund must be negative; none may be zero.'
example: charge
enum:
- charge
- refund
- adjustment
- credit_applied
amount_cents:
type: integer
description: 'Signed amount in cents (sign is enforced per type). Must be between -100000000 and 100000000.'
example: 995
reference:
type: string
description: 'Optional external payment reference (e.g. a Stripe PaymentIntent id). Must not be greater than 255 characters.'
example: pi_3Q1abcXyz
nullable: true
notes:
type: string
description: 'Optional free-text note about the payment. Must not be greater than 1000 characters.'
example: b
nullable: true
required:
- type
- amount_cents
parameters:
-
in: path
name: document_order_uuid
description: ''
example: 6ff8f7f6-1eb3-3525-be4a-3932c805afed
required: true
schema:
type: string
'/api/v1/document-orders/{document_order_uuid}/payments':
get:
summary: 'List document-order payments'
operationId: listDocumentOrderPayments
description: 'Returns the payment ledger for the order.'
parameters:
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
data:
-
id: 9bc483b6-af19-4172-9ef8-cc3a5be75da5
type: charge
amount_cents: 1118
reference: TXN-35450949
notes: 'Commodi incidunt iure odit.'
recorded_at: '2026-10-05T15:49:20+00:00'
created_at: '2026-10-05T15:49:20+00:00'
-
id: 6bbd4a73-c2a8-4646-b82e-e094fc680458
type: charge
amount_cents: 1047
reference: TXN-66214223
notes: null
recorded_at: '2026-10-05T15:49:20+00:00'
created_at: '2026-10-05T15:49:20+00:00'
properties:
data:
type: array
example:
-
id: 9bc483b6-af19-4172-9ef8-cc3a5be75da5
type: charge
amount_cents: 1118
reference: TXN-35450949
notes: 'Commodi incidunt iure odit.'
recorded_at: '2026-10-05T15:49:20+00:00'
created_at: '2026-10-05T15:49:20+00:00'
-
id: 6bbd4a73-c2a8-4646-b82e-e094fc680458
type: charge
amount_cents: 1047
reference: TXN-66214223
notes: null
recorded_at: '2026-10-05T15:49:20+00:00'
created_at: '2026-10-05T15:49:20+00:00'
items:
type: object
properties:
id:
type: string
example: 9bc483b6-af19-4172-9ef8-cc3a5be75da5
type:
type: string
example: charge
amount_cents:
type: integer
example: 1118
reference:
type: string
example: TXN-35450949
notes:
type: string
example: 'Commodi incidunt iure odit.'
recorded_at:
type: string
example: '2026-10-05T15:49:20+00:00'
created_at:
type: string
example: '2026-10-05T15:49:20+00:00'
tags:
- 'Document Orders'
parameters:
-
in: path
name: document_order_uuid
description: ''
example: 6ff8f7f6-1eb3-3525-be4a-3932c805afed
required: true
schema:
type: string
/api/v1/documents:
get:
summary: 'List documents'
operationId: listDocuments
description: 'Paginated generated documents visible to the caller.'
parameters:
-
in: query
name: type
description: 'Filter by type.'
example: architecto
required: true
schema:
type: string
description: 'Filter by type.'
example: architecto
-
in: query
name: status
description: 'Filter by lifecycle status.'
example: architecto
required: true
schema:
type: string
description: 'Filter by lifecycle status.'
example: architecto
-
in: query
name: is_preview
description: 'Filter to preview / non-preview documents.'
example: false
required: true
schema:
type: boolean
description: 'Filter to preview / non-preview documents.'
example: false
-
in: query
name: per_page
description: 'Results per page. Clamped to 1-100; defaults to 15.'
example: 15
required: true
schema:
type: integer
description: 'Results per page. Clamped to 1-100; defaults to 15.'
example: 15
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
data:
-
id: 1e1311cc-be60-4bd0-8f05-0bf987f1c175
type: pay-application
template: documents.pay-application.default
state: null
file_name: animi.pdf
mime_type: application/pdf
file_size: 290549
status: completed
is_preview: false
metadata: null
created_at: '2026-10-05T15:49:20+00:00'
updated_at: '2026-10-05T15:49:20+00:00'
-
id: 3a87d5de-f176-41a5-8bf9-51eca125090a
type: pay-application
template: documents.pay-application.default
state: null
file_name: impedit.pdf
mime_type: application/pdf
file_size: 80691
status: completed
is_preview: false
metadata: null
created_at: '2026-10-05T15:49:20+00:00'
updated_at: '2026-10-05T15:49:20+00:00'
links:
first: '/?page=1'
last: '/?page=1'
prev: null
next: null
meta:
current_page: 1
from: 1
last_page: 1
links:
-
url: null
label: '« Previous'
page: null
active: false
-
url: '/?page=1'
label: '1'
page: 1
active: true
-
url: null
label: 'Next »'
page: null
active: false
path: /
per_page: 15
to: 2
total: 2
properties:
data:
type: array
example:
-
id: 1e1311cc-be60-4bd0-8f05-0bf987f1c175
type: pay-application
template: documents.pay-application.default
state: null
file_name: animi.pdf
mime_type: application/pdf
file_size: 290549
status: completed
is_preview: false
metadata: null
created_at: '2026-10-05T15:49:20+00:00'
updated_at: '2026-10-05T15:49:20+00:00'
-
id: 3a87d5de-f176-41a5-8bf9-51eca125090a
type: pay-application
template: documents.pay-application.default
state: null
file_name: impedit.pdf
mime_type: application/pdf
file_size: 80691
status: completed
is_preview: false
metadata: null
created_at: '2026-10-05T15:49:20+00:00'
updated_at: '2026-10-05T15:49:20+00:00'
items:
type: object
properties:
id:
type: string
example: 1e1311cc-be60-4bd0-8f05-0bf987f1c175
type:
type: string
example: pay-application
template:
type: string
example: documents.pay-application.default
state:
type: string
example: null
nullable: true
file_name:
type: string
example: animi.pdf
mime_type:
type: string
example: application/pdf
file_size:
type: integer
example: 290549
status:
type: string
example: completed
is_preview:
type: boolean
example: false
metadata:
type: string
example: null
nullable: true
created_at:
type: string
example: '2026-10-05T15:49:20+00:00'
updated_at:
type: string
example: '2026-10-05T15:49:20+00:00'
links:
type: object
properties:
first:
type: string
example: '/?page=1'
last:
type: string
example: '/?page=1'
prev:
type: string
example: null
nullable: true
next:
type: string
example: null
nullable: true
meta:
type: object
properties:
current_page:
type: integer
example: 1
from:
type: integer
example: 1
last_page:
type: integer
example: 1
links:
type: array
example:
-
url: null
label: '« Previous'
page: null
active: false
-
url: '/?page=1'
label: '1'
page: 1
active: true
-
url: null
label: 'Next »'
page: null
active: false
items:
type: object
properties:
url:
type: string
example: null
nullable: true
label:
type: string
example: '« Previous'
page:
type: string
example: null
nullable: true
active:
type: boolean
example: false
path:
type: string
example: /
per_page:
type: integer
example: 15
to:
type: integer
example: 2
total:
type: integer
example: 2
tags:
- Documents
'/api/v1/documents/{uuid}':
get:
summary: 'Retrieve a document'
operationId: retrieveADocument
description: 'Returns document metadata by UUID (not the PDF bytes).'
parameters:
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
data:
id: b195331e-0576-4b04-a279-8a691955ba6e
type: pay-application
template: documents.pay-application.default
state: null
file_name: quidem.pdf
mime_type: application/pdf
file_size: 47583
status: completed
is_preview: false
metadata: null
created_at: '2026-10-05T15:49:20+00:00'
updated_at: '2026-10-05T15:49:20+00:00'
properties:
data:
type: object
properties:
id:
type: string
example: b195331e-0576-4b04-a279-8a691955ba6e
type:
type: string
example: pay-application
template:
type: string
example: documents.pay-application.default
state:
type: string
example: null
nullable: true
file_name:
type: string
example: quidem.pdf
mime_type:
type: string
example: application/pdf
file_size:
type: integer
example: 47583
status:
type: string
example: completed
is_preview:
type: boolean
example: false
metadata:
type: string
example: null
nullable: true
created_at:
type: string
example: '2026-10-05T15:49:20+00:00'
updated_at:
type: string
example: '2026-10-05T15:49:20+00:00'
tags:
- Documents
parameters:
-
in: path
name: uuid
description: ''
example: 6ff8f7f6-1eb3-3525-be4a-3932c805afed
required: true
schema:
type: string
/api/v1/documents/generate:
post:
summary: 'Generate a document'
operationId: generateADocument
description: 'Renders a PDF for a notice, waiver, escalation or pay application. Runs the claimant / owner / GC preflight first. Pass preview=true for a no-charge draft.'
parameters:
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
201:
description: ''
content:
application/json:
schema:
type: object
example:
data:
id: dc6c347b-a29d-4053-b237-29ef32be46af
type: pay-application
template: documents.pay-application.default
state: null
file_name: et.pdf
mime_type: application/pdf
file_size: 122326
status: completed
is_preview: false
metadata: null
created_at: '2026-10-05T15:49:20+00:00'
updated_at: '2026-10-05T15:49:20+00:00'
properties:
data:
type: object
properties:
id:
type: string
example: dc6c347b-a29d-4053-b237-29ef32be46af
type:
type: string
example: pay-application
template:
type: string
example: documents.pay-application.default
state:
type: string
example: null
nullable: true
file_name:
type: string
example: et.pdf
mime_type:
type: string
example: application/pdf
file_size:
type: integer
example: 122326
status:
type: string
example: completed
is_preview:
type: boolean
example: false
metadata:
type: string
example: null
nullable: true
created_at:
type: string
example: '2026-10-05T15:49:20+00:00'
updated_at:
type: string
example: '2026-10-05T15:49:20+00:00'
tags:
- Documents
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
documentable_type:
type: string
description: 'The kind of record the PDF is generated from.'
example: notice
enum:
- pay_application
- waiver
- escalation
- notice
documentable_id:
type: string
description: 'UUID of the notice / waiver / escalation / pay_application to render.'
example: 9b7e0e2a-1c3d-4f5a-8b6c-2d4e6f8a0b1c
type:
type: string
description: 'The specific document/template to produce (e.g. notice, g702, g703, or an escalation document type).'
example: notice
enum:
- pay-application
- waiver
- escalation
- notice
- g702
- g703
- notice_of_intent
- notice_of_claim
- mechanics_lien
- bond_claim
- stop_notice
- lien_release
state:
type: string
description: 'Optional two-letter state override for template selection. Defaults to the record state. Must be 2 characters.'
example: CA
nullable: true
organization_id:
type: string
description: 'UUID of the organization this record belongs to. Must be one the API key can access. Must match an existing stored value.'
example: 9b7e0e2a-1c3d-4f5a-8b6c-2d4e6f8a0b1c
preview:
type: boolean
description: 'When true, render a draft without persisting it or charging a credit.'
example: false
nullable: true
required:
- documentable_type
- documentable_id
- type
- organization_id
'/api/v1/documents/{document_uuid}/revert':
post:
summary: 'Revert a document'
operationId: revertADocument
description: 'Marks the current generated document reverted so the source record can be regenerated.'
parameters:
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
message: 'Document reverted.'
properties:
message:
type: string
example: 'Document reverted.'
tags:
- Documents
parameters:
-
in: path
name: document_uuid
description: ''
example: 6ff8f7f6-1eb3-3525-be4a-3932c805afed
required: true
schema:
type: string
'/api/v1/documents/{document_uuid}/download':
get:
summary: 'Download a document PDF'
operationId: downloadADocumentPDF
description: 'Streams the generated PDF (application/pdf).'
parameters:
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
200:
description: 'The generated PDF, served as application/pdf with a Content-Disposition attachment header.'
content:
text/plain:
schema:
type: string
example: ''
tags:
- Documents
parameters:
-
in: path
name: document_uuid
description: ''
example: 6ff8f7f6-1eb3-3525-be4a-3932c805afed
required: true
schema:
type: string
'/api/v1/{entityType}/{entityId}/meta':
get:
summary: 'List entity metadata'
operationId: listEntityMetadata
description: 'All metadata keyvalue pairs stored on the given entity.'
parameters:
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
data:
-
key: review_state
value: in_review
type: string
properties:
data:
type: array
example:
-
key: review_state
value: in_review
type: string
items:
type: object
properties:
key:
type: string
example: review_state
value:
type: string
example: in_review
type:
type: string
example: string
tags:
- 'Entity Meta'
parameters:
-
in: path
name: entityType
description: ''
example: architecto
required: true
schema:
type: string
-
in: path
name: entityId
description: ''
example: architecto
required: true
schema:
type: string
'/api/v1/{entityType}/{entityId}/meta/{key}':
get:
summary: 'Get an entity metadata value'
operationId: getAnEntityMetadataValue
description: 'Returns one metadata entry by key.'
parameters:
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
data:
key: review_state
value: in_review
type: string
properties:
data:
type: object
properties:
key:
type: string
example: review_state
value:
type: string
example: in_review
type:
type: string
example: string
tags:
- 'Entity Meta'
put:
summary: 'Set an entity metadata value'
operationId: setAnEntityMetadataValue
description: 'Creates or replaces the metadata entry at the given key.'
parameters:
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
data:
key: review_state
value: in_review
type: string
properties:
data:
type: object
properties:
key:
type: string
example: review_state
value:
type: string
example: in_review
type:
type: string
example: string
tags:
- 'Entity Meta'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
value:
type: string
description: 'The value to store. Scalars or a bounded JSON structure (max 32 KB, depth 6, 500 items).'
example: in_review
type:
type: string
description: 'How to cast the stored value on read.'
example: string
enum:
- string
- integer
- boolean
- json
nullable: true
required:
- value
delete:
summary: 'Delete an entity metadata value'
operationId: deleteAnEntityMetadataValue
description: 'Removes the metadata entry at the given key.'
parameters:
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
message: 'Meta value deleted.'
properties:
message:
type: string
example: 'Meta value deleted.'
tags:
- 'Entity Meta'
parameters:
-
in: path
name: entityType
description: ''
example: architecto
required: true
schema:
type: string
-
in: path
name: entityId
description: ''
example: architecto
required: true
schema:
type: string
-
in: path
name: key
description: ''
example: architecto
required: true
schema:
type: string
/api/v1/escalations:
get:
summary: 'List escalations'
operationId: listEscalations
description: 'Paginated escalations visible to the caller, newest first.'
parameters:
-
in: query
name: project_id
description: 'Filter to this project (UUID).'
example: 9b7e0e2a-1c3d-4f5a-8b6c-2d4e6f8a0b1c
required: true
schema:
type: string
description: 'Filter to this project (UUID).'
example: 9b7e0e2a-1c3d-4f5a-8b6c-2d4e6f8a0b1c
-
in: query
name: organization_id
description: 'Filter to this organization (UUID).'
example: 9b7e0e2a-1c3d-4f5a-8b6c-2d4e6f8a0b1c
required: true
schema:
type: string
description: 'Filter to this organization (UUID).'
example: 9b7e0e2a-1c3d-4f5a-8b6c-2d4e6f8a0b1c
-
in: query
name: type
description: 'Filter by type.'
example: architecto
required: true
schema:
type: string
description: 'Filter by type.'
example: architecto
-
in: query
name: status
description: 'Filter by lifecycle status.'
example: architecto
required: true
schema:
type: string
description: 'Filter by lifecycle status.'
example: architecto
-
in: query
name: state
description: 'Filter by two-letter US state code.'
example: CA
required: true
schema:
type: string
description: 'Filter by two-letter US state code.'
example: CA
-
in: query
name: per_page
description: 'Results per page. Clamped to 1-100; defaults to 15.'
example: 15
required: true
schema:
type: integer
description: 'Results per page. Clamped to 1-100; defaults to 15.'
example: 15
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
data:
-
id: c7b0e9e9-0da5-4e21-81e8-63a7e3b0b8ca
project_id: d0672308-15b0-4575-9f99-18feaf312965
organization_id: 34cd7cf9-d69f-465b-bb84-0c9e496caeb7
division_id: a8c06a50-fb35-40e1-b696-4b43a10a8d85
notice_id: null
type: lawsuit
type_label: Lawsuit
status: draft
status_label: Draft
state: RI
escalation_date: '2026-02-22'
deadline_date: '2026-11-08'
claim_amount: '271817.20'
description: null
cls_reference_id: null
metadata: null
created_at: '2026-10-05T15:49:19+00:00'
updated_at: '2026-10-05T15:49:19+00:00'
-
id: 353e8c03-0d85-4bfc-8ba6-922905cc5bc2
project_id: 88251d87-12a7-4185-a909-fc3598885e07
organization_id: b0f64a37-3efc-4363-9ff9-71381ec4e358
division_id: bcd8631a-3730-4984-8982-3bae1bb6ac59
notice_id: null
type: lien_filing
type_label: 'Lien Filing'
status: draft
status_label: Draft
state: ND
escalation_date: '2026-06-18'
deadline_date: null
claim_amount: null
description: null
cls_reference_id: null
metadata: null
created_at: '2026-10-05T15:49:19+00:00'
updated_at: '2026-10-05T15:49:19+00:00'
links:
first: '/?page=1'
last: '/?page=1'
prev: null
next: null
meta:
current_page: 1
from: 1
last_page: 1
links:
-
url: null
label: '« Previous'
page: null
active: false
-
url: '/?page=1'
label: '1'
page: 1
active: true
-
url: null
label: 'Next »'
page: null
active: false
path: /
per_page: 15
to: 2
total: 2
properties:
data:
type: array
example:
-
id: c7b0e9e9-0da5-4e21-81e8-63a7e3b0b8ca
project_id: d0672308-15b0-4575-9f99-18feaf312965
organization_id: 34cd7cf9-d69f-465b-bb84-0c9e496caeb7
division_id: a8c06a50-fb35-40e1-b696-4b43a10a8d85
notice_id: null
type: lawsuit
type_label: Lawsuit
status: draft
status_label: Draft
state: RI
escalation_date: '2026-02-22'
deadline_date: '2026-11-08'
claim_amount: '271817.20'
description: null
cls_reference_id: null
metadata: null
created_at: '2026-10-05T15:49:19+00:00'
updated_at: '2026-10-05T15:49:19+00:00'
-
id: 353e8c03-0d85-4bfc-8ba6-922905cc5bc2
project_id: 88251d87-12a7-4185-a909-fc3598885e07
organization_id: b0f64a37-3efc-4363-9ff9-71381ec4e358
division_id: bcd8631a-3730-4984-8982-3bae1bb6ac59
notice_id: null
type: lien_filing
type_label: 'Lien Filing'
status: draft
status_label: Draft
state: ND
escalation_date: '2026-06-18'
deadline_date: null
claim_amount: null
description: null
cls_reference_id: null
metadata: null
created_at: '2026-10-05T15:49:19+00:00'
updated_at: '2026-10-05T15:49:19+00:00'
items:
type: object
properties:
id:
type: string
example: c7b0e9e9-0da5-4e21-81e8-63a7e3b0b8ca
project_id:
type: string
example: d0672308-15b0-4575-9f99-18feaf312965
organization_id:
type: string
example: 34cd7cf9-d69f-465b-bb84-0c9e496caeb7
division_id:
type: string
example: a8c06a50-fb35-40e1-b696-4b43a10a8d85
notice_id:
type: string
example: null
nullable: true
type:
type: string
example: lawsuit
type_label:
type: string
example: Lawsuit
status:
type: string
example: draft
status_label:
type: string
example: Draft
state:
type: string
example: RI
escalation_date:
type: string
example: '2026-02-22'
deadline_date:
type: string
example: '2026-11-08'
claim_amount:
type: string
example: '271817.20'
description:
type: string
example: null
nullable: true
cls_reference_id:
type: string
example: null
nullable: true
metadata:
type: string
example: null
nullable: true
created_at:
type: string
example: '2026-10-05T15:49:19+00:00'
updated_at:
type: string
example: '2026-10-05T15:49:19+00:00'
links:
type: object
properties:
first:
type: string
example: '/?page=1'
last:
type: string
example: '/?page=1'
prev:
type: string
example: null
nullable: true
next:
type: string
example: null
nullable: true
meta:
type: object
properties:
current_page:
type: integer
example: 1
from:
type: integer
example: 1
last_page:
type: integer
example: 1
links:
type: array
example:
-
url: null
label: '« Previous'
page: null
active: false
-
url: '/?page=1'
label: '1'
page: 1
active: true
-
url: null
label: 'Next »'
page: null
active: false
items:
type: object
properties:
url:
type: string
example: null
nullable: true
label:
type: string
example: '« Previous'
page:
type: string
example: null
nullable: true
active:
type: boolean
example: false
path:
type: string
example: /
per_page:
type: integer
example: 15
to:
type: integer
example: 2
total:
type: integer
example: 2
tags:
- Escalations
post:
summary: 'Create a escalation'
operationId: createAEscalation
description: 'Creates a escalation and returns it.'
parameters:
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
201:
description: ''
content:
application/json:
schema:
type: object
example:
data:
id: f573c767-61c9-4ddc-ac75-eef0f61dac88
project_id: d4e0de47-0810-40d5-bb1f-b784a4c216b9
organization_id: fbe016f0-0d51-40d0-974b-8170e909b595
division_id: 8985742a-c5e2-4f8c-be15-049aaa15fffd
notice_id: null
type: lien_filing
type_label: 'Lien Filing'
status: draft
status_label: Draft
state: ND
escalation_date: '2025-12-23'
deadline_date: '2026-10-31'
claim_amount: null
description: null
cls_reference_id: null
metadata: null
created_at: '2026-10-05T15:49:19+00:00'
updated_at: '2026-10-05T15:49:19+00:00'
properties:
data:
type: object
properties:
id:
type: string
example: f573c767-61c9-4ddc-ac75-eef0f61dac88
project_id:
type: string
example: d4e0de47-0810-40d5-bb1f-b784a4c216b9
organization_id:
type: string
example: fbe016f0-0d51-40d0-974b-8170e909b595
division_id:
type: string
example: 8985742a-c5e2-4f8c-be15-049aaa15fffd
notice_id:
type: string
example: null
nullable: true
type:
type: string
example: lien_filing
type_label:
type: string
example: 'Lien Filing'
status:
type: string
example: draft
status_label:
type: string
example: Draft
state:
type: string
example: ND
escalation_date:
type: string
example: '2025-12-23'
deadline_date:
type: string
example: '2026-10-31'
claim_amount:
type: string
example: null
nullable: true
description:
type: string
example: null
nullable: true
cls_reference_id:
type: string
example: null
nullable: true
metadata:
type: string
example: null
nullable: true
created_at:
type: string
example: '2026-10-05T15:49:19+00:00'
updated_at:
type: string
example: '2026-10-05T15:49:19+00:00'
tags:
- Escalations
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
project_id:
type: string
description: 'UUID of the project. Must match an existing stored value.'
example: 9b7e0e2a-1c3d-4f5a-8b6c-2d4e6f8a0b1c
organization_id:
type: string
description: 'UUID of the organization this record belongs to. Must be one the API key can access. Must match an existing stored value.'
example: 9b7e0e2a-1c3d-4f5a-8b6c-2d4e6f8a0b1c
division_id:
type: string
description: 'UUID of the claimant division. Optional: inherited from the project. Supplying a division other than the project one is rejected (422). Must match an existing stored value.'
example: 9b7e0e2a-1c3d-4f5a-8b6c-2d4e6f8a0b1c
nullable: true
notice_id:
type: string
description: 'Optional UUID of the notice this escalation follows from. Must match an existing stored value.'
example: 9b7e0e2a-1c3d-4f5a-8b6c-2d4e6f8a0b1c
nullable: true
type:
type: string
description: 'Escalation type: demand_letter, lien_filing, bond_claim, or lawsuit.'
example: demand_letter
enum:
- demand_letter
- lien_filing
- bond_claim
- lawsuit
state:
type: string
description: 'Two-letter US state code. Must be 2 characters.'
example: CA
escalation_date:
type: string
description: 'Date the escalation is issued (YYYY-MM-DD). Must be a valid date.'
example: '2026-05-24'
deadline_date:
type: string
description: 'Optional statutory deadline; must be after escalation_date. Must be a valid date. Must be a date after escalation_date.'
example: '2026-06-24'
nullable: true
claim_amount:
type: number
description: 'Amount claimed, in dollars. Must be at least 0.'
example: 50000.0
nullable: true
description:
type: string
description: 'Optional narrative included on the document. Must not be greater than 10000 characters.'
example: 'Eius et animi quos velit et.'
nullable: true
metadata:
type: object
description: 'Free-form keyvalue bag (max 32 KB, depth 6, 500 items). Claimant-identity keys (claimant_name, claimant_address, claimant_license_number, ...) are rejected here (422): the claimant comes from the division. Supply metadata.owner.name / metadata.gc.name to satisfy the document preflight inline.'
example: null
properties: {}
nullable: true
required:
- project_id
- organization_id
- type
- state
- escalation_date
'/api/v1/escalations/{uuid}':
get:
summary: 'Retrieve a escalation'
operationId: retrieveAEscalation
description: 'Returns a single escalation by UUID.'
parameters:
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
data:
id: 54a2382d-e750-47ae-8ffc-c1930d58e7b0
project_id: da167f52-38c0-495d-b759-9ba220ebafbb
organization_id: e7b14d44-9801-40b9-8cf7-a9d04df680c5
division_id: 1301e112-b499-4e40-a929-212fa930efd4
notice_id: null
type: demand_letter
type_label: 'Demand Letter'
status: draft
status_label: Draft
state: MO
escalation_date: '2025-11-04'
deadline_date: '2027-02-03'
claim_amount: '370510.26'
description: null
cls_reference_id: null
metadata: null
created_at: '2026-10-05T15:49:19+00:00'
updated_at: '2026-10-05T15:49:19+00:00'
properties:
data:
type: object
properties:
id:
type: string
example: 54a2382d-e750-47ae-8ffc-c1930d58e7b0
project_id:
type: string
example: da167f52-38c0-495d-b759-9ba220ebafbb
organization_id:
type: string
example: e7b14d44-9801-40b9-8cf7-a9d04df680c5
division_id:
type: string
example: 1301e112-b499-4e40-a929-212fa930efd4
notice_id:
type: string
example: null
nullable: true
type:
type: string
example: demand_letter
type_label:
type: string
example: 'Demand Letter'
status:
type: string
example: draft
status_label:
type: string
example: Draft
state:
type: string
example: MO
escalation_date:
type: string
example: '2025-11-04'
deadline_date:
type: string
example: '2027-02-03'
claim_amount:
type: string
example: '370510.26'
description:
type: string
example: null
nullable: true
cls_reference_id:
type: string
example: null
nullable: true
metadata:
type: string
example: null
nullable: true
created_at:
type: string
example: '2026-10-05T15:49:19+00:00'
updated_at:
type: string
example: '2026-10-05T15:49:19+00:00'
tags:
- Escalations
put:
summary: 'Update a escalation'
operationId: updateAEscalation
description: 'Applies a partial update to a escalation and returns it.'
parameters:
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
data:
id: 0712a80f-f3f5-41db-97a4-39ebe89bb8d6
project_id: 5d718586-9239-4f74-a80d-df31800cdedb
organization_id: 06a4bc9c-e2df-470a-85fc-cd0d160292ec
division_id: 248ca091-60e7-4dd7-9551-940c12c5f5f5
notice_id: null
type: lien_filing
type_label: 'Lien Filing'
status: draft
status_label: Draft
state: ND
escalation_date: '2025-12-23'
deadline_date: '2026-10-31'
claim_amount: null
description: null
cls_reference_id: null
metadata: null
created_at: '2026-10-05T15:49:19+00:00'
updated_at: '2026-10-05T15:49:19+00:00'
properties:
data:
type: object
properties:
id:
type: string
example: 0712a80f-f3f5-41db-97a4-39ebe89bb8d6
project_id:
type: string
example: 5d718586-9239-4f74-a80d-df31800cdedb
organization_id:
type: string
example: 06a4bc9c-e2df-470a-85fc-cd0d160292ec
division_id:
type: string
example: 248ca091-60e7-4dd7-9551-940c12c5f5f5
notice_id:
type: string
example: null
nullable: true
type:
type: string
example: lien_filing
type_label:
type: string
example: 'Lien Filing'
status:
type: string
example: draft
status_label:
type: string
example: Draft
state:
type: string
example: ND
escalation_date:
type: string
example: '2025-12-23'
deadline_date:
type: string
example: '2026-10-31'
claim_amount:
type: string
example: null
nullable: true
description:
type: string
example: null
nullable: true
cls_reference_id:
type: string
example: null
nullable: true
metadata:
type: string
example: null
nullable: true
created_at:
type: string
example: '2026-10-05T15:49:19+00:00'
updated_at:
type: string
example: '2026-10-05T15:49:19+00:00'
tags:
- Escalations
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
notice_id:
type: string
description: 'Optional UUID of the notice this escalation follows from. Must match an existing stored value.'
example: 9b7e0e2a-1c3d-4f5a-8b6c-2d4e6f8a0b1c
nullable: true
type:
type: string
description: 'Escalation type.'
example: demand_letter
enum:
- demand_letter
- lien_filing
- bond_claim
- lawsuit
state:
type: string
description: 'Two-letter US state code. Must be 2 characters.'
example: CA
escalation_date:
type: string
description: 'Date the escalation is issued (YYYY-MM-DD). Must be a valid date.'
example: '2026-05-24'
deadline_date:
type: string
description: 'Optional statutory deadline. Must be a valid date.'
example: '2026-06-24'
nullable: true
claim_amount:
type: number
description: 'Amount claimed, in dollars. Must be at least 0.'
example: 50000.0
nullable: true
description:
type: string
description: 'Optional narrative included on the document. Must not be greater than 10000 characters.'
example: 'Eius et animi quos velit et.'
nullable: true
metadata:
type: object
description: 'Free-form keyvalue bag (max 32 KB, depth 6, 500 items). Claimant-identity keys (claimant_name, claimant_address, claimant_license_number, ...) are rejected here (422): the claimant comes from the division. Supply metadata.owner.name / metadata.gc.name to satisfy the document preflight inline.'
example: null
properties: {}
nullable: true
delete:
summary: 'Delete a escalation'
operationId: deleteAEscalation
description: 'Soft-deletes the escalation.'
parameters:
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
message: 'Escalation deleted.'
properties:
message:
type: string
example: 'Escalation deleted.'
tags:
- Escalations
parameters:
-
in: path
name: uuid
description: ''
example: 6ff8f7f6-1eb3-3525-be4a-3932c805afed
required: true
schema:
type: string
'/api/v1/escalations/{escalation_uuid}/transition':
post:
summary: 'Transition an escalation'
operationId: transitionAnEscalation
description: 'Moves the escalation to another workflow status.'
parameters:
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
data:
id: a0762252-a884-4970-8eee-481b8373bc11
project_id: 4e8f79ae-a8cd-4baa-a7c1-012c2aca9d8c
organization_id: f3f23a00-19b6-4245-a4c8-1e54ff501acc
division_id: 2655b3de-ddcf-4e85-955a-ed8c08054dc6
notice_id: null
type: demand_letter
type_label: 'Demand Letter'
status: draft
status_label: Draft
state: MO
escalation_date: '2025-11-04'
deadline_date: '2027-02-03'
claim_amount: '370510.26'
description: null
cls_reference_id: null
metadata: null
created_at: '2026-10-05T15:49:19+00:00'
updated_at: '2026-10-05T15:49:19+00:00'
properties:
data:
type: object
properties:
id:
type: string
example: a0762252-a884-4970-8eee-481b8373bc11
project_id:
type: string
example: 4e8f79ae-a8cd-4baa-a7c1-012c2aca9d8c
organization_id:
type: string
example: f3f23a00-19b6-4245-a4c8-1e54ff501acc
division_id:
type: string
example: 2655b3de-ddcf-4e85-955a-ed8c08054dc6
notice_id:
type: string
example: null
nullable: true
type:
type: string
example: demand_letter
type_label:
type: string
example: 'Demand Letter'
status:
type: string
example: draft
status_label:
type: string
example: Draft
state:
type: string
example: MO
escalation_date:
type: string
example: '2025-11-04'
deadline_date:
type: string
example: '2027-02-03'
claim_amount:
type: string
example: '370510.26'
description:
type: string
example: null
nullable: true
cls_reference_id:
type: string
example: null
nullable: true
metadata:
type: string
example: null
nullable: true
created_at:
type: string
example: '2026-10-05T15:49:19+00:00'
updated_at:
type: string
example: '2026-10-05T15:49:19+00:00'
tags:
- Escalations
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
status:
type: string
description: 'Target status: draft, sent, filed, resolved, or cancelled.'
example: sent
enum:
- draft
- sent
- filed
- resolved
- cancelled
required:
- status
parameters:
-
in: path
name: escalation_uuid
description: ''
example: 6ff8f7f6-1eb3-3525-be4a-3932c805afed
required: true
schema:
type: string
'/api/v1/escalations/{escalation_uuid}/order':
post:
summary: 'Generate & mail an escalation'
operationId: generateMailAnEscalation
description: 'Generates the escalation document if needed, then creates a mail order for it.'
parameters:
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
201:
description: ''
content:
application/json:
schema:
type: object
example:
data:
id: 15a5d9dc-9993-4bc3-9a58-279d416ca402
status: pending
order_type: mail
billing:
status: pending
method: credit_balance
amount_cents: 4175
invoiced_at: null
paid_at: null
invoice_reference: null
payment_reference: null
tracking_number: null
carrier: null
mail_class: priority
recipient:
name: 'Rowan Gulgowski'
address_line_1: '4529 Tillman Ridges Suite 142'
address_line_2: null
city: 'East Nickshire'
state: MO
zip: '33724'
external_provider_id: null
shipped_at: null
delivered_at: null
metadata: null
created_at: '2026-10-05T15:49:19+00:00'
updated_at: '2026-10-05T15:49:19+00:00'
properties:
data:
type: object
properties:
id:
type: string
example: 15a5d9dc-9993-4bc3-9a58-279d416ca402
status:
type: string
example: pending
order_type:
type: string
example: mail
billing:
type: object
properties:
status:
type: string
example: pending
method:
type: string
example: credit_balance
amount_cents:
type: integer
example: 4175
invoiced_at:
type: string
example: null
nullable: true
paid_at:
type: string
example: null
nullable: true
invoice_reference:
type: string
example: null
nullable: true
payment_reference:
type: string
example: null
nullable: true
tracking_number:
type: string
example: null
nullable: true
carrier:
type: string
example: null
nullable: true
mail_class:
type: string
example: priority
recipient:
type: object
properties:
name:
type: string
example: 'Rowan Gulgowski'
address_line_1:
type: string
example: '4529 Tillman Ridges Suite 142'
address_line_2:
type: string
example: null
nullable: true
city:
type: string
example: 'East Nickshire'
state:
type: string
example: MO
zip:
type: string
example: '33724'
external_provider_id:
type: string
example: null
nullable: true
shipped_at:
type: string
example: null
nullable: true
delivered_at:
type: string
example: null
nullable: true
metadata:
type: string
example: null
nullable: true
created_at:
type: string
example: '2026-10-05T15:49:19+00:00'
updated_at:
type: string
example: '2026-10-05T15:49:19+00:00'
tags:
- Escalations
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
billing_method:
type: string
description: 'How the order is paid for: prepay (debit credits now), invoice (bill later), or credit_balance.'
example: credit_balance
enum:
- prepay
- invoice
- credit_balance
nullable: true
amount_cents:
type: integer
description: 'Optional caller-declared amount in cents. The authoritative price is still computed server-side. Must be at least 0.'
example: 27
nullable: true
mail_class:
type: string
description: 'USPS mail class for the parcel.'
example: certified
enum:
- first_class
- certified
- priority
nullable: true
recipient_name:
type: string
description: 'Name of the party the document is mailed to. Must not be greater than 255 characters.'
example: 'Property Owner LLC'
recipient_address_line_1:
type: string
description: 'Recipient street address, line 1. Must not be greater than 255 characters.'
example: '200 Main Street'
recipient_address_line_2:
type: string
description: 'Recipient street address, line 2. Must not be greater than 255 characters.'
example: 'n'
nullable: true
recipient_city:
type: string
description: 'Recipient city. Must not be greater than 255 characters.'
example: Austin
recipient_state:
type: string
description: 'Recipient two-letter US state code. Must be 2 characters.'
example: TX
recipient_zip:
type: string
description: 'Recipient postal code. Must not be greater than 10 characters.'
example: '78702'
metadata:
type: object
description: 'Free-form keyvalue bag stored alongside the record (max 32 KB, depth 6, 500 items).'
example: null
properties: {}
nullable: true
required:
- recipient_name
- recipient_address_line_1
- recipient_city
- recipient_state
- recipient_zip
parameters:
-
in: path
name: escalation_uuid
description: ''
example: 6ff8f7f6-1eb3-3525-be4a-3932c805afed
required: true
schema:
type: string
/api/v1/fulfillment-requests:
get:
summary: 'List fulfillment requests'
operationId: listFulfillmentRequests
description: 'Paginated CLS research requests visible to the caller.'
parameters:
-
in: query
name: type
description: 'Filter by type (notice_research).'
example: notice_research
required: true
schema:
type: string
description: 'Filter by type (notice_research).'
example: notice_research
-
in: query
name: status
description: 'Filter by lifecycle status.'
example: architecto
required: true
schema:
type: string
description: 'Filter by lifecycle status.'
example: architecto
-
in: query
name: per_page
description: 'Results per page. Clamped to 1-100; defaults to 15.'
example: 15
required: true
schema:
type: integer
description: 'Results per page. Clamped to 1-100; defaults to 15.'
example: 15
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
data:
-
id: 6b8e2779-bf78-4b65-83fb-7863c5c70de3
organization_id: d4c2d0a6-01c4-463a-af95-1254c79c525a
requested_by_user_id: null
type: notice_research
status: queued
status_label: Queued
idempotency_key: a4855dc5-0acb-33c3-b921-f4291f719ca0
source_kind: project
source_id: c90237e9-ced5-3af6-88ea-84aeaa148878
cls_resource_type: null
cls_resource_id: null
status_reason: null
last_error: null
retry_count: 0
payload:
fulfillment_scope: research
project:
external_id: a1a0a47d-e8c3-3cf0-8e6e-c1ff9dca5d1f
name: 'Ernser Group'
jobsite:
line_1: '5954 Schuster Lane Apt. 042'
city: Lyricberg
state: MO
zip: 42170-0432
division_id: 3cb1f6c4-6159-4e94-8f09-74925602bd1f
claimant_role: sub-contractor
meta: null
result: null
postage: null
payment_due: null
submitted_at: null
fulfilled_at: null
failed_at: null
created_at: '2026-10-05T15:49:20+00:00'
updated_at: '2026-10-05T15:49:20+00:00'
-
id: 50ccc6a6-20b8-4565-a050-447b0786b141
organization_id: f635e347-d9f8-4d94-a54c-51c3c9348631
requested_by_user_id: null
type: notice_research
status: queued
status_label: Queued
idempotency_key: 128dddd1-af1b-310e-a6a4-c38c0253b195
source_kind: project
source_id: 3dd3dce1-4b7c-321e-848a-0aab7c899d4a
cls_resource_type: null
cls_resource_id: null
status_reason: null
last_error: null
retry_count: 0
payload:
fulfillment_scope: research
project:
external_id: a6ed8703-1bb4-356c-b26b-3dab078a446c
name: 'Grady Ltd'
jobsite:
line_1: '368 Kendra Gardens'
city: Corwinchester
state: NE
zip: 11087-1102
division_id: 4797f45d-f90d-4404-ba75-2c87255ee3af
claimant_role: sub-contractor
meta: null
result: null
postage: null
payment_due: null
submitted_at: null
fulfilled_at: null
failed_at: null
created_at: '2026-10-05T15:49:20+00:00'
updated_at: '2026-10-05T15:49:20+00:00'
links:
first: '/?page=1'
last: '/?page=1'
prev: null
next: null
meta:
current_page: 1
from: 1
last_page: 1
links:
-
url: null
label: '« Previous'
page: null
active: false
-
url: '/?page=1'
label: '1'
page: 1
active: true
-
url: null
label: 'Next »'
page: null
active: false
path: /
per_page: 15
to: 2
total: 2
properties:
data:
type: array
example:
-
id: 6b8e2779-bf78-4b65-83fb-7863c5c70de3
organization_id: d4c2d0a6-01c4-463a-af95-1254c79c525a
requested_by_user_id: null
type: notice_research
status: queued
status_label: Queued
idempotency_key: a4855dc5-0acb-33c3-b921-f4291f719ca0
source_kind: project
source_id: c90237e9-ced5-3af6-88ea-84aeaa148878
cls_resource_type: null
cls_resource_id: null
status_reason: null
last_error: null
retry_count: 0
payload:
fulfillment_scope: research
project:
external_id: a1a0a47d-e8c3-3cf0-8e6e-c1ff9dca5d1f
name: 'Ernser Group'
jobsite:
line_1: '5954 Schuster Lane Apt. 042'
city: Lyricberg
state: MO
zip: 42170-0432
division_id: 3cb1f6c4-6159-4e94-8f09-74925602bd1f
claimant_role: sub-contractor
meta: null
result: null
postage: null
payment_due: null
submitted_at: null
fulfilled_at: null
failed_at: null
created_at: '2026-10-05T15:49:20+00:00'
updated_at: '2026-10-05T15:49:20+00:00'
-
id: 50ccc6a6-20b8-4565-a050-447b0786b141
organization_id: f635e347-d9f8-4d94-a54c-51c3c9348631
requested_by_user_id: null
type: notice_research
status: queued
status_label: Queued
idempotency_key: 128dddd1-af1b-310e-a6a4-c38c0253b195
source_kind: project
source_id: 3dd3dce1-4b7c-321e-848a-0aab7c899d4a
cls_resource_type: null
cls_resource_id: null
status_reason: null
last_error: null
retry_count: 0
payload:
fulfillment_scope: research
project:
external_id: a6ed8703-1bb4-356c-b26b-3dab078a446c
name: 'Grady Ltd'
jobsite:
line_1: '368 Kendra Gardens'
city: Corwinchester
state: NE
zip: 11087-1102
division_id: 4797f45d-f90d-4404-ba75-2c87255ee3af
claimant_role: sub-contractor
meta: null
result: null
postage: null
payment_due: null
submitted_at: null
fulfilled_at: null
failed_at: null
created_at: '2026-10-05T15:49:20+00:00'
updated_at: '2026-10-05T15:49:20+00:00'
items:
type: object
properties:
id:
type: string
example: 6b8e2779-bf78-4b65-83fb-7863c5c70de3
organization_id:
type: string
example: d4c2d0a6-01c4-463a-af95-1254c79c525a
requested_by_user_id:
type: string
example: null
nullable: true
type:
type: string
example: notice_research
status:
type: string
example: queued
status_label:
type: string
example: Queued
idempotency_key:
type: string
example: a4855dc5-0acb-33c3-b921-f4291f719ca0
source_kind:
type: string
example: project
source_id:
type: string
example: c90237e9-ced5-3af6-88ea-84aeaa148878
cls_resource_type:
type: string
example: null
nullable: true
cls_resource_id:
type: string
example: null
nullable: true
status_reason:
type: string
example: null
nullable: true
last_error:
type: string
example: null
nullable: true
retry_count:
type: integer
example: 0
payload:
type: object
properties:
fulfillment_scope:
type: string
example: research
project:
type: object
properties:
external_id:
type: string
example: a1a0a47d-e8c3-3cf0-8e6e-c1ff9dca5d1f
name:
type: string
example: 'Ernser Group'
jobsite:
type: object
properties:
line_1:
type: string
example: '5954 Schuster Lane Apt. 042'
city:
type: string
example: Lyricberg
state:
type: string
example: MO
zip:
type: string
example: 42170-0432
division_id:
type: string
example: 3cb1f6c4-6159-4e94-8f09-74925602bd1f
claimant_role:
type: string
example: sub-contractor
meta:
type: string
example: null
nullable: true
result:
type: string
example: null
nullable: true
postage:
type: string
example: null
nullable: true
payment_due:
type: string
example: null
nullable: true
submitted_at:
type: string
example: null
nullable: true
fulfilled_at:
type: string
example: null
nullable: true
failed_at:
type: string
example: null
nullable: true
created_at:
type: string
example: '2026-10-05T15:49:20+00:00'
updated_at:
type: string
example: '2026-10-05T15:49:20+00:00'
links:
type: object
properties:
first:
type: string
example: '/?page=1'
last:
type: string
example: '/?page=1'
prev:
type: string
example: null
nullable: true
next:
type: string
example: null
nullable: true
meta:
type: object
properties:
current_page:
type: integer
example: 1
from:
type: integer
example: 1
last_page:
type: integer
example: 1
links:
type: array
example:
-
url: null
label: '« Previous'
page: null
active: false
-
url: '/?page=1'
label: '1'
page: 1
active: true
-
url: null
label: 'Next »'
page: null
active: false
items:
type: object
properties:
url:
type: string
example: null
nullable: true
label:
type: string
example: '« Previous'
page:
type: string
example: null
nullable: true
active:
type: boolean
example: false
path:
type: string
example: /
per_page:
type: integer
example: 15
to:
type: integer
example: 2
total:
type: integer
example: 2
tags:
- 'Fulfillment Requests'
post:
summary: 'Create a fulfillment request'
operationId: createAFulfillmentRequest
description: 'Hands a notice-research job to CLS staff. Idempotent on idempotency_key. CLS materialises the project and notice back into your account.'
parameters:
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
201:
description: ''
content:
application/json:
schema:
type: object
example:
data:
id: 63bc1a0c-7c31-4d17-aebc-708149ce6396
organization_id: 94f918d5-2979-47bd-a116-34f5eb6fef3e
requested_by_user_id: null
type: notice_research
status: queued
status_label: Queued
idempotency_key: 5e4f00df-4238-35bd-9edc-0b98dc359c80
source_kind: project
source_id: 3c85cf54-98c1-36ed-b65a-abaafdecdfa9
cls_resource_type: null
cls_resource_id: null
status_reason: null
last_error: null
retry_count: 0
payload:
fulfillment_scope: research
project:
external_id: e2398df3-051c-3810-a269-3a15e327b316
name: 'Swift Inc'
jobsite:
line_1: '532 Leuschke Causeway'
city: McLaughlinstad
state: MI
zip: '07365'
division_id: 921e7af0-0143-4db0-bd77-b4c0249e78d6
claimant_role: sub-contractor
meta: null
result: null
postage: null
payment_due: null
submitted_at: null
fulfilled_at: null
failed_at: null
created_at: '2026-10-05T15:49:20+00:00'
updated_at: '2026-10-05T15:49:20+00:00'
properties:
data:
type: object
properties:
id:
type: string
example: 63bc1a0c-7c31-4d17-aebc-708149ce6396
organization_id:
type: string
example: 94f918d5-2979-47bd-a116-34f5eb6fef3e
requested_by_user_id:
type: string
example: null
nullable: true
type:
type: string
example: notice_research
status:
type: string
example: queued
status_label:
type: string
example: Queued
idempotency_key:
type: string
example: 5e4f00df-4238-35bd-9edc-0b98dc359c80
source_kind:
type: string
example: project
source_id:
type: string
example: 3c85cf54-98c1-36ed-b65a-abaafdecdfa9
cls_resource_type:
type: string
example: null
nullable: true
cls_resource_id:
type: string
example: null
nullable: true
status_reason:
type: string
example: null
nullable: true
last_error:
type: string
example: null
nullable: true
retry_count:
type: integer
example: 0
payload:
type: object
properties:
fulfillment_scope:
type: string
example: research
project:
type: object
properties:
external_id:
type: string
example: e2398df3-051c-3810-a269-3a15e327b316
name:
type: string
example: 'Swift Inc'
jobsite:
type: object
properties:
line_1:
type: string
example: '532 Leuschke Causeway'
city:
type: string
example: McLaughlinstad
state:
type: string
example: MI
zip:
type: string
example: '07365'
division_id:
type: string
example: 921e7af0-0143-4db0-bd77-b4c0249e78d6
claimant_role:
type: string
example: sub-contractor
meta:
type: string
example: null
nullable: true
result:
type: string
example: null
nullable: true
postage:
type: string
example: null
nullable: true
payment_due:
type: string
example: null
nullable: true
submitted_at:
type: string
example: null
nullable: true
fulfilled_at:
type: string
example: null
nullable: true
failed_at:
type: string
example: null
nullable: true
created_at:
type: string
example: '2026-10-05T15:49:20+00:00'
updated_at:
type: string
example: '2026-10-05T15:49:20+00:00'
tags:
- 'Fulfillment Requests'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
organization_id:
type: string
description: 'UUID of the organization this record belongs to. Must be one the API key can access. Must match an existing stored value.'
example: 9b7e0e2a-1c3d-4f5a-8b6c-2d4e6f8a0b1c
type:
type: string
description: 'Fulfillment type. Only notice_research is available today.'
example: notice_research
enum:
- notice_research
idempotency_key:
type: string
description: 'Caller-generated key; replaying the same key returns the existing request instead of creating a duplicate. Must not be greater than 100 characters.'
example: fulfill-2026-05-24-0001
source_kind:
type: string
description: 'Optional label for where this request originated. Must not be greater than 50 characters.'
example: api
nullable: true
source_id:
type: string
description: 'Optional caller-side id for the originating record. Must not be greater than 100 characters.'
example: job-8821
nullable: true
payload:
type: object
description: 'The research request body (bounded: max 32 KB, depth 6, 500 items).'
example: []
properties:
fulfillment_scope:
type: string
description: 'How far CLS should take it: research only, research_and_document, or full_service (research + document + mail).'
example: research_and_document
enum:
- research
- research_and_document
- full_service
division_id:
type: string
description: 'UUID of the claimant division. Becomes the materialised project division and is_claimant party. Must match an existing stored value.'
example: 9b7e0e2a-1c3d-4f5a-8b6c-2d4e6f8a0b1c
claimant_role:
type: string
description: 'Optional claimant role token (CLS vocabulary) for the materialised claimant party.'
example: sub-contractor
enum:
- general-contractor
- sub-contractor
- 2nd-tier-contractor
- 3rd-tier-contractor
- material-supplier
- equipment-supplier
- labor-supplier
nullable: true
parties:
type: array
description: 'Parties you already know about, forwarded to CLS so staff do not re-discover them. Must not have more than 50 items.'
example: null
items:
type: object
nullable: true
properties:
company_name:
type: string
description: 'Party company / legal name. This field is required when payload.parties is present. Must not be greater than 250 characters.'
example: 'Skyline Builders Inc'
role:
type: string
description: 'Party role in the CLS vocabulary. This field is required when payload.parties is present.'
example: owner-on-title
enum:
- owner-on-title
- owner-reputed-owner
- reputed-owner
- general-contractor
- sub-contractor
- 2nd-tier-contractor
- 3rd-tier-contractor
- material-supplier
- equipment-supplier
- labor-supplier
- lender-beneficiary
- surety-bond-company
- architect
- title-company
- escrow-title-agency
- developer
- construction-manager
- project-manager
- owner-representative
- project-owner
- lessee
- lessor
- sub-lessee
- home-owners-association
- property-manager
- trustee
- insurance-agency
- professional-services
- copy-to
address:
type: object
description: 'Party mailing address.'
example: null
properties:
line_1:
type: string
description: 'Party address, line 1. Must not be greater than 250 characters.'
example: '12 Field Ave'
nullable: true
line_2:
type: string
description: 'Party address, line 2. Must not be greater than 250 characters.'
example: d
nullable: true
city:
type: string
description: 'Party address city. Must not be greater than 100 characters.'
example: Dallas
nullable: true
state:
type: string
description: 'Party address two-letter state code. Must be 2 characters.'
example: TX
nullable: true
zip:
type: string
description: 'Party address postal code. Must not be greater than 10 characters.'
example: '75201'
nullable: true
nullable: true
phone:
type: string
description: 'Party phone number. Must not be greater than 50 characters.'
example: l
nullable: true
email:
type: string
description: 'Party email address. Must be a valid email address. Must not be greater than 255 characters.'
example: idickens@example.org
nullable: true
is_customer:
type: boolean
description: 'Marks the party that hired the claimant (your customer on this project). At most one party may set it.'
example: true
nullable: true
project:
type: object
description: 'The project CLS should research and materialise.'
example: []
properties:
external_id:
type: string
description: 'Your id for the project; echoed back on the materialised record. Must not be greater than 100 characters.'
example: job-8821
name:
type: string
description: 'Project name. Must not be greater than 250 characters.'
example: 'Riverside Medical Center'
furnished_description:
type: string
description: 'The labor and/or materials the claimant furnished, as printed on the notice. Must not be greater than 10000 characters.'
example: 'Electrical rough-in, wiring and light fixtures'
contract_amount:
type: number
description: 'Estimated total price of the labor/materials furnished, or the amount owed where the state counts unpaid balance (greater than zero).'
example: 48250.75
first_furnishing_date:
type: string
description: 'First date labor/materials were furnished. Required when the jobsite state counts from it (see required_dates per state). Must be a valid date.'
example: '2026-09-01'
nullable: true
last_furnishing_date:
type: string
description: 'Last date labor/materials were furnished. Required when the jobsite state counts from it. Must be a valid date. Must be a date after or equal to payload.project.first_furnishing_date.'
example: '2026-09-28'
nullable: true
date_contract:
type: string
description: "Date of the claimant's contract. Required for AK and NH jobsites. Must be a valid date."
example: '2026-08-15'
nullable: true
project_type:
type: string
description: 'CLS project type (same vocabulary as POST /projects). CLS researches it when omitted.'
example: com-new-build
enum:
- com-new-build
- com-tenant-improvement
- com-apartments
- res-spec-home
- res-tract-home
- res-condos
- res-owner-occupied
- res-restoration
- gov-state
- gov-federal
- gov-education-public
- gov-education-private
- tribal
- unknown
nullable: true
jobsite:
type: object
description: 'Where the work is performed.'
example: []
properties:
state:
type: string
description: 'Jobsite two-letter state code. Must be 2 characters.'
example: TX
line_1:
type: string
description: 'Jobsite street address (required unless a description is given). This field is required when payload.project.jobsite.description is not present. Must not be greater than 250 characters.'
example: '500 Riverside Dr'
nullable: true
line_2:
type: string
description: 'Jobsite address, line 2. Must not be greater than 250 characters.'
example: b
nullable: true
city:
type: string
description: 'Jobsite city (required with line_1). This field is required when payload.project.jobsite.line_1 is present. Must not be greater than 100 characters.'
example: Austin
nullable: true
zip:
type: string
description: 'Jobsite postal code (required with line_1). This field is required when payload.project.jobsite.line_1 is present. Must not be greater than 10 characters.'
example: '78704'
nullable: true
county:
type: string
description: 'Jobsite county. Must not be greater than 100 characters.'
example: Travis
nullable: true
description:
type: string
description: 'Free-text site description, used when a street address is not known (required unless line_1 is given). This field is required when payload.project.jobsite.line_1 is not present. Must not be greater than 500 characters.'
example: 'Et animi quos velit et fugiat.'
nullable: true
latitude:
type: number
description: 'Optional jobsite latitude (-90 to 90). Must be between -90 and 90.'
example: 30.2672
nullable: true
longitude:
type: number
description: 'Optional jobsite longitude (-180 to 180). Must be between -180 and 180.'
example: -97.7431
nullable: true
required:
- state
required:
- external_id
- name
- furnished_description
- contract_amount
- jobsite
claimant:
type: string
description: 'Prohibited. The claimant identity is derived from payload.division_id and forwarded to CLS server-side.'
example: null
required:
- fulfillment_scope
- division_id
- project
meta:
type: object
description: 'Optional bounded keyvalue bag stored with the request.'
example: null
properties: {}
nullable: true
required:
- organization_id
- type
- idempotency_key
- payload
'/api/v1/fulfillment-requests/{uuid}':
get:
summary: 'Retrieve a fulfillment request'
operationId: retrieveAFulfillmentRequest
description: 'Returns a single request, including status and any research result, by UUID.'
parameters:
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
data:
id: ba1bdec4-de6a-4ccc-be33-f54b906e31d2
organization_id: a80b3f51-fcbf-46cf-8499-28c036ff47ae
requested_by_user_id: null
type: notice_research
status: queued
status_label: Queued
idempotency_key: bfc53181-d647-36b2-9080-f9c2b76006f4
source_kind: project
source_id: 5d093e7f-5aae-3aa3-bece-f6e784dcbd67
cls_resource_type: null
cls_resource_id: null
status_reason: null
last_error: null
retry_count: 0
payload:
fulfillment_scope: research
project:
external_id: 445bd3f6-8f2c-38cb-aa04-2f4e1edb32bb
name: 'Baumbach Ltd'
jobsite:
line_1: '427 Predovic Ridge'
city: Baileemouth
state: KS
zip: 32375-9947
division_id: 761b6726-c71c-4166-8ab7-fb1ffcc8c6a1
claimant_role: sub-contractor
meta: null
result: null
postage: null
payment_due: null
submitted_at: null
fulfilled_at: null
failed_at: null
created_at: '2026-10-05T15:49:20+00:00'
updated_at: '2026-10-05T15:49:20+00:00'
properties:
data:
type: object
properties:
id:
type: string
example: ba1bdec4-de6a-4ccc-be33-f54b906e31d2
organization_id:
type: string
example: a80b3f51-fcbf-46cf-8499-28c036ff47ae
requested_by_user_id:
type: string
example: null
nullable: true
type:
type: string
example: notice_research
status:
type: string
example: queued
status_label:
type: string
example: Queued
idempotency_key:
type: string
example: bfc53181-d647-36b2-9080-f9c2b76006f4
source_kind:
type: string
example: project
source_id:
type: string
example: 5d093e7f-5aae-3aa3-bece-f6e784dcbd67
cls_resource_type:
type: string
example: null
nullable: true
cls_resource_id:
type: string
example: null
nullable: true
status_reason:
type: string
example: null
nullable: true
last_error:
type: string
example: null
nullable: true
retry_count:
type: integer
example: 0
payload:
type: object
properties:
fulfillment_scope:
type: string
example: research
project:
type: object
properties:
external_id:
type: string
example: 445bd3f6-8f2c-38cb-aa04-2f4e1edb32bb
name:
type: string
example: 'Baumbach Ltd'
jobsite:
type: object
properties:
line_1:
type: string
example: '427 Predovic Ridge'
city:
type: string
example: Baileemouth
state:
type: string
example: KS
zip:
type: string
example: 32375-9947
division_id:
type: string
example: 761b6726-c71c-4166-8ab7-fb1ffcc8c6a1
claimant_role:
type: string
example: sub-contractor
meta:
type: string
example: null
nullable: true
result:
type: string
example: null
nullable: true
postage:
type: string
example: null
nullable: true
payment_due:
type: string
example: null
nullable: true
submitted_at:
type: string
example: null
nullable: true
fulfilled_at:
type: string
example: null
nullable: true
failed_at:
type: string
example: null
nullable: true
created_at:
type: string
example: '2026-10-05T15:49:20+00:00'
updated_at:
type: string
example: '2026-10-05T15:49:20+00:00'
tags:
- 'Fulfillment Requests'
parameters:
-
in: path
name: uuid
description: ''
example: 6ff8f7f6-1eb3-3525-be4a-3932c805afed
required: true
schema:
type: string
'/api/v1/fulfillment-requests/{fulfillment_request_uuid}/cancel':
post:
summary: 'Cancel a fulfillment request'
operationId: cancelAFulfillmentRequest
description: 'Cancels the request if CLS has not already completed it.'
parameters:
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
data:
id: c45c6758-f10c-4ef8-babc-774a61b6c5cd
organization_id: 8aadafae-38fd-440e-96d2-8585746e2929
requested_by_user_id: null
type: notice_research
status: queued
status_label: Queued
idempotency_key: 6ff8f7f6-1eb3-3525-be4a-3932c805afed
source_kind: project
source_id: 6b72fe4a-5b40-307c-bc24-f79acf9a1bb9
cls_resource_type: null
cls_resource_id: null
status_reason: null
last_error: null
retry_count: 0
payload:
fulfillment_scope: research
project:
external_id: 977e5426-8d13-3824-86aa-b092f8ae52c5
name: "O'Kon and Sons"
jobsite:
line_1: '80841 Mya Lane Apt. 042'
city: Lyricberg
state: MO
zip: 42170-0432
division_id: 0a6fd34b-6715-4cc3-8123-7e548702dd58
claimant_role: sub-contractor
meta: null
result: null
postage: null
payment_due: null
submitted_at: null
fulfilled_at: null
failed_at: null
created_at: '2026-10-05T15:49:20+00:00'
updated_at: '2026-10-05T15:49:20+00:00'
properties:
data:
type: object
properties:
id:
type: string
example: c45c6758-f10c-4ef8-babc-774a61b6c5cd
organization_id:
type: string
example: 8aadafae-38fd-440e-96d2-8585746e2929
requested_by_user_id:
type: string
example: null
nullable: true
type:
type: string
example: notice_research
status:
type: string
example: queued
status_label:
type: string
example: Queued
idempotency_key:
type: string
example: 6ff8f7f6-1eb3-3525-be4a-3932c805afed
source_kind:
type: string
example: project
source_id:
type: string
example: 6b72fe4a-5b40-307c-bc24-f79acf9a1bb9
cls_resource_type:
type: string
example: null
nullable: true
cls_resource_id:
type: string
example: null
nullable: true
status_reason:
type: string
example: null
nullable: true
last_error:
type: string
example: null
nullable: true
retry_count:
type: integer
example: 0
payload:
type: object
properties:
fulfillment_scope:
type: string
example: research
project:
type: object
properties:
external_id:
type: string
example: 977e5426-8d13-3824-86aa-b092f8ae52c5
name:
type: string
example: "O'Kon and Sons"
jobsite:
type: object
properties:
line_1:
type: string
example: '80841 Mya Lane Apt. 042'
city:
type: string
example: Lyricberg
state:
type: string
example: MO
zip:
type: string
example: 42170-0432
division_id:
type: string
example: 0a6fd34b-6715-4cc3-8123-7e548702dd58
claimant_role:
type: string
example: sub-contractor
meta:
type: string
example: null
nullable: true
result:
type: string
example: null
nullable: true
postage:
type: string
example: null
nullable: true
payment_due:
type: string
example: null
nullable: true
submitted_at:
type: string
example: null
nullable: true
fulfilled_at:
type: string
example: null
nullable: true
failed_at:
type: string
example: null
nullable: true
created_at:
type: string
example: '2026-10-05T15:49:20+00:00'
updated_at:
type: string
example: '2026-10-05T15:49:20+00:00'
tags:
- 'Fulfillment Requests'
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
reason:
type: string
description: 'Optional human-readable reason for cancelling the fulfillment request. Must not be greater than 500 characters.'
example: 'Duplicate request'
nullable: true
parameters:
-
in: path
name: fulfillment_request_uuid
description: ''
example: 6ff8f7f6-1eb3-3525-be4a-3932c805afed
required: true
schema:
type: string
'/api/v1/fulfillment-requests/{fulfillment_request_uuid}/retry':
post:
summary: 'Retry a fulfillment request'
operationId: retryAFulfillmentRequest
description: 'Resubmits a failed request to CLS.'
parameters:
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
data:
id: c6df5f9c-ffa5-4ef1-b5d8-5a62b3c56920
organization_id: 9ac9d519-464d-4ef7-8b62-7060be4a1f6c
requested_by_user_id: null
type: notice_research
status: queued
status_label: Queued
idempotency_key: 6ff8f7f6-1eb3-3525-be4a-3932c805afed
source_kind: project
source_id: 6b72fe4a-5b40-307c-bc24-f79acf9a1bb9
cls_resource_type: null
cls_resource_id: null
status_reason: null
last_error: null
retry_count: 0
payload:
fulfillment_scope: research
project:
external_id: 977e5426-8d13-3824-86aa-b092f8ae52c5
name: "O'Kon and Sons"
jobsite:
line_1: '80841 Mya Lane Apt. 042'
city: Lyricberg
state: MO
zip: 42170-0432
division_id: 70a2f55b-6581-479b-9898-bc50650d13f6
claimant_role: sub-contractor
meta: null
result: null
postage: null
payment_due: null
submitted_at: null
fulfilled_at: null
failed_at: null
created_at: '2026-10-05T15:49:20+00:00'
updated_at: '2026-10-05T15:49:20+00:00'
properties:
data:
type: object
properties:
id:
type: string
example: c6df5f9c-ffa5-4ef1-b5d8-5a62b3c56920
organization_id:
type: string
example: 9ac9d519-464d-4ef7-8b62-7060be4a1f6c
requested_by_user_id:
type: string
example: null
nullable: true
type:
type: string
example: notice_research
status:
type: string
example: queued
status_label:
type: string
example: Queued
idempotency_key:
type: string
example: 6ff8f7f6-1eb3-3525-be4a-3932c805afed
source_kind:
type: string
example: project
source_id:
type: string
example: 6b72fe4a-5b40-307c-bc24-f79acf9a1bb9
cls_resource_type:
type: string
example: null
nullable: true
cls_resource_id:
type: string
example: null
nullable: true
status_reason:
type: string
example: null
nullable: true
last_error:
type: string
example: null
nullable: true
retry_count:
type: integer
example: 0
payload:
type: object
properties:
fulfillment_scope:
type: string
example: research
project:
type: object
properties:
external_id:
type: string
example: 977e5426-8d13-3824-86aa-b092f8ae52c5
name:
type: string
example: "O'Kon and Sons"
jobsite:
type: object
properties:
line_1:
type: string
example: '80841 Mya Lane Apt. 042'
city:
type: string
example: Lyricberg
state:
type: string
example: MO
zip:
type: string
example: 42170-0432
division_id:
type: string
example: 70a2f55b-6581-479b-9898-bc50650d13f6
claimant_role:
type: string
example: sub-contractor
meta:
type: string
example: null
nullable: true
result:
type: string
example: null
nullable: true
postage:
type: string
example: null
nullable: true
payment_due:
type: string
example: null
nullable: true
submitted_at:
type: string
example: null
nullable: true
fulfilled_at:
type: string
example: null
nullable: true
failed_at:
type: string
example: null
nullable: true
created_at:
type: string
example: '2026-10-05T15:49:20+00:00'
updated_at:
type: string
example: '2026-10-05T15:49:20+00:00'
tags:
- 'Fulfillment Requests'
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
reason:
type: string
description: 'Optional human-readable reason for retrying the fulfillment request. Must not be greater than 500 characters.'
example: 'CLS asked us to resubmit'
nullable: true
parameters:
-
in: path
name: fulfillment_request_uuid
description: ''
example: 6ff8f7f6-1eb3-3525-be4a-3932c805afed
required: true
schema:
type: string
'/api/v1/fulfillment-requests/{fulfillment_request_uuid}/approve-charges':
post:
summary: 'Approve additional fulfillment charges'
operationId: approveAdditionalFulfillmentCharges
description: 'For a full-service request in `payment_required`: CLS research found more recipients than postage is held for. Holds the extra postage (`payment_due.additional_credits`) from your CLS-eligible credits and releases the ticket back to CLS. Responds 402 with the shortfall if your balance cannot cover it yet -- buy credits and call again.'
parameters:
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
data:
id: d8d9d58a-a2e1-492f-8028-aa2088a7e671
organization_id: f08d29f2-0ccf-45b0-978d-6076b2a1872e
requested_by_user_id: null
type: notice_research
status: queued
status_label: Queued
idempotency_key: bfc53181-d647-36b2-9080-f9c2b76006f4
source_kind: project
source_id: 5d093e7f-5aae-3aa3-bece-f6e784dcbd67
cls_resource_type: null
cls_resource_id: null
status_reason: null
last_error: null
retry_count: 0
payload:
fulfillment_scope: research
project:
external_id: 445bd3f6-8f2c-38cb-aa04-2f4e1edb32bb
name: 'Baumbach Ltd'
jobsite:
line_1: '427 Predovic Ridge'
city: Baileemouth
state: KS
zip: 32375-9947
division_id: 59effae1-659e-4347-aa46-210a57cb448b
claimant_role: sub-contractor
meta: null
result: null
postage: null
payment_due: null
submitted_at: null
fulfilled_at: null
failed_at: null
created_at: '2026-10-05T15:49:20+00:00'
updated_at: '2026-10-05T15:49:20+00:00'
properties:
data:
type: object
properties:
id:
type: string
example: d8d9d58a-a2e1-492f-8028-aa2088a7e671
organization_id:
type: string
example: f08d29f2-0ccf-45b0-978d-6076b2a1872e
requested_by_user_id:
type: string
example: null
nullable: true
type:
type: string
example: notice_research
status:
type: string
example: queued
status_label:
type: string
example: Queued
idempotency_key:
type: string
example: bfc53181-d647-36b2-9080-f9c2b76006f4
source_kind:
type: string
example: project
source_id:
type: string
example: 5d093e7f-5aae-3aa3-bece-f6e784dcbd67
cls_resource_type:
type: string
example: null
nullable: true
cls_resource_id:
type: string
example: null
nullable: true
status_reason:
type: string
example: null
nullable: true
last_error:
type: string
example: null
nullable: true
retry_count:
type: integer
example: 0
payload:
type: object
properties:
fulfillment_scope:
type: string
example: research
project:
type: object
properties:
external_id:
type: string
example: 445bd3f6-8f2c-38cb-aa04-2f4e1edb32bb
name:
type: string
example: 'Baumbach Ltd'
jobsite:
type: object
properties:
line_1:
type: string
example: '427 Predovic Ridge'
city:
type: string
example: Baileemouth
state:
type: string
example: KS
zip:
type: string
example: 32375-9947
division_id:
type: string
example: 59effae1-659e-4347-aa46-210a57cb448b
claimant_role:
type: string
example: sub-contractor
meta:
type: string
example: null
nullable: true
result:
type: string
example: null
nullable: true
postage:
type: string
example: null
nullable: true
payment_due:
type: string
example: null
nullable: true
submitted_at:
type: string
example: null
nullable: true
fulfilled_at:
type: string
example: null
nullable: true
failed_at:
type: string
example: null
nullable: true
created_at:
type: string
example: '2026-10-05T15:49:20+00:00'
updated_at:
type: string
example: '2026-10-05T15:49:20+00:00'
tags:
- 'Fulfillment Requests'
parameters:
-
in: path
name: fulfillment_request_uuid
description: ''
example: 6ff8f7f6-1eb3-3525-be4a-3932c805afed
required: true
schema:
type: string
'/api/v1/fulfillment-requests/{fulfillment_request_uuid}/files/{file_uuid}/download':
get:
summary: 'Download a fulfillment file'
operationId: downloadAFulfillmentFile
description: 'Streams a file CLS attached to the fulfilled ticket (research documents, jobsite files), from our own copy. Files are listed under `files` on the fulfillment request once copied.'
parameters:
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
401:
description: ''
content:
application/json:
schema:
type: object
example:
message: Unauthenticated.
properties:
message:
type: string
example: Unauthenticated.
tags:
- 'Fulfillment Requests'
parameters:
-
in: path
name: fulfillment_request_uuid
description: ''
example: 6ff8f7f6-1eb3-3525-be4a-3932c805afed
required: true
schema:
type: string
-
in: path
name: file_uuid
description: ''
example: 6ff8f7f6-1eb3-3525-be4a-3932c805afed
required: true
schema:
type: string
/api/v1/jobsites:
get:
summary: 'List jobsites'
operationId: listJobsites
description: 'Paginated jobsites visible to the caller, newest first.'
parameters:
-
in: query
name: project_id
description: 'Filter to this project (UUID).'
example: 9b7e0e2a-1c3d-4f5a-8b6c-2d4e6f8a0b1c
required: true
schema:
type: string
description: 'Filter to this project (UUID).'
example: 9b7e0e2a-1c3d-4f5a-8b6c-2d4e6f8a0b1c
-
in: query
name: is_primary
description: 'Filter by primary flag.'
example: true
required: true
schema:
type: boolean
description: 'Filter by primary flag.'
example: true
-
in: query
name: search
description: 'Case-insensitive partial match on name and address.'
example: architecto
required: true
schema:
type: string
description: 'Case-insensitive partial match on name and address.'
example: architecto
-
in: query
name: per_page
description: 'Results per page. Clamped to 1-100; defaults to 15.'
example: 15
required: true
schema:
type: integer
description: 'Results per page. Clamped to 1-100; defaults to 15.'
example: 15
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
data:
-
id: 6166e83a-ef90-402f-b62b-650c560f4c67
project_id: 48b4d02e-478d-4f5d-ad95-009bd77ce550
name: 'eius et Site'
address:
line_1: '764 Ernser Parkways Suite 841'
line_2: null
city: Cecilburgh
state: WI
zip: '02042'
county: null
apn: null
legal_description: 'Adipisci quidem nostrum qui commodi incidunt iure.'
is_primary: false
metadata: null
created_at: '2026-10-05T15:49:19+00:00'
updated_at: '2026-10-05T15:49:19+00:00'
-
id: edeaaf87-31fe-48dc-a4e8-8881be01f149
project_id: 40f27878-da1b-4fe7-bb85-ae9b2598c000
name: 'ratione iure Site'
address:
line_1: '441 Swaniawski Roads Apt. 721'
line_2: null
city: Brianneborough
state: AL
zip: 84131-2753
county: error
apn: null
legal_description: null
is_primary: false
metadata: null
created_at: '2026-10-05T15:49:19+00:00'
updated_at: '2026-10-05T15:49:19+00:00'
links:
first: '/?page=1'
last: '/?page=1'
prev: null
next: null
meta:
current_page: 1
from: 1
last_page: 1
links:
-
url: null
label: '« Previous'
page: null
active: false
-
url: '/?page=1'
label: '1'
page: 1
active: true
-
url: null
label: 'Next »'
page: null
active: false
path: /
per_page: 15
to: 2
total: 2
properties:
data:
type: array
example:
-
id: 6166e83a-ef90-402f-b62b-650c560f4c67
project_id: 48b4d02e-478d-4f5d-ad95-009bd77ce550
name: 'eius et Site'
address:
line_1: '764 Ernser Parkways Suite 841'
line_2: null
city: Cecilburgh
state: WI
zip: '02042'
county: null
apn: null
legal_description: 'Adipisci quidem nostrum qui commodi incidunt iure.'
is_primary: false
metadata: null
created_at: '2026-10-05T15:49:19+00:00'
updated_at: '2026-10-05T15:49:19+00:00'
-
id: edeaaf87-31fe-48dc-a4e8-8881be01f149
project_id: 40f27878-da1b-4fe7-bb85-ae9b2598c000
name: 'ratione iure Site'
address:
line_1: '441 Swaniawski Roads Apt. 721'
line_2: null
city: Brianneborough
state: AL
zip: 84131-2753
county: error
apn: null
legal_description: null
is_primary: false
metadata: null
created_at: '2026-10-05T15:49:19+00:00'
updated_at: '2026-10-05T15:49:19+00:00'
items:
type: object
properties:
id:
type: string
example: 6166e83a-ef90-402f-b62b-650c560f4c67
project_id:
type: string
example: 48b4d02e-478d-4f5d-ad95-009bd77ce550
name:
type: string
example: 'eius et Site'
address:
type: object
properties:
line_1:
type: string
example: '764 Ernser Parkways Suite 841'
line_2:
type: string
example: null
nullable: true
city:
type: string
example: Cecilburgh
state:
type: string
example: WI
zip:
type: string
example: '02042'
county:
type: string
example: null
nullable: true
apn:
type: string
example: null
nullable: true
legal_description:
type: string
example: 'Adipisci quidem nostrum qui commodi incidunt iure.'
is_primary:
type: boolean
example: false
metadata:
type: string
example: null
nullable: true
created_at:
type: string
example: '2026-10-05T15:49:19+00:00'
updated_at:
type: string
example: '2026-10-05T15:49:19+00:00'
links:
type: object
properties:
first:
type: string
example: '/?page=1'
last:
type: string
example: '/?page=1'
prev:
type: string
example: null
nullable: true
next:
type: string
example: null
nullable: true
meta:
type: object
properties:
current_page:
type: integer
example: 1
from:
type: integer
example: 1
last_page:
type: integer
example: 1
links:
type: array
example:
-
url: null
label: '« Previous'
page: null
active: false
-
url: '/?page=1'
label: '1'
page: 1
active: true
-
url: null
label: 'Next »'
page: null
active: false
items:
type: object
properties:
url:
type: string
example: null
nullable: true
label:
type: string
example: '« Previous'
page:
type: string
example: null
nullable: true
active:
type: boolean
example: false
path:
type: string
example: /
per_page:
type: integer
example: 15
to:
type: integer
example: 2
total:
type: integer
example: 2
tags:
- Jobsites
post:
summary: 'Create a jobsite'
operationId: createAJobsite
description: 'Creates a jobsite and returns it.'
parameters:
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
201:
description: ''
content:
application/json:
schema:
type: object
example:
data:
id: 445809ee-1be8-447d-aeb1-37371eb63b1d
project_id: 9a60bab2-64b8-4692-a3b6-3f0ebfffbf9e
name: 'eius et Site'
address:
line_1: '764 Ernser Parkways Suite 841'
line_2: null
city: Cecilburgh
state: WI
zip: '02042'
county: null
apn: null
legal_description: 'Adipisci quidem nostrum qui commodi incidunt iure.'
is_primary: false
metadata: null
created_at: '2026-10-05T15:49:19+00:00'
updated_at: '2026-10-05T15:49:19+00:00'
properties:
data:
type: object
properties:
id:
type: string
example: 445809ee-1be8-447d-aeb1-37371eb63b1d
project_id:
type: string
example: 9a60bab2-64b8-4692-a3b6-3f0ebfffbf9e
name:
type: string
example: 'eius et Site'
address:
type: object
properties:
line_1:
type: string
example: '764 Ernser Parkways Suite 841'
line_2:
type: string
example: null
nullable: true
city:
type: string
example: Cecilburgh
state:
type: string
example: WI
zip:
type: string
example: '02042'
county:
type: string
example: null
nullable: true
apn:
type: string
example: null
nullable: true
legal_description:
type: string
example: 'Adipisci quidem nostrum qui commodi incidunt iure.'
is_primary:
type: boolean
example: false
metadata:
type: string
example: null
nullable: true
created_at:
type: string
example: '2026-10-05T15:49:19+00:00'
updated_at:
type: string
example: '2026-10-05T15:49:19+00:00'
tags:
- Jobsites
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
project_id:
type: string
description: 'UUID of the project. Must match an existing stored value.'
example: 9b7e0e2a-1c3d-4f5a-8b6c-2d4e6f8a0b1c
name:
type: string
description: 'Label for the jobsite. Must not be greater than 255 characters.'
example: 'Main Site'
address_line_1:
type: string
description: 'Street address, line 1. Must not be greater than 255 characters.'
example: '100 Commerce Blvd'
address_line_2:
type: string
description: 'Street address, line 2 (suite, unit). Must not be greater than 255 characters.'
example: b
nullable: true
city:
type: string
description: 'City. Must not be greater than 255 characters.'
example: Austin
state:
type: string
description: 'Two-letter US state code. Must be 2 characters.'
example: CA
zip:
type: string
description: 'Postal code (5 or 9 digit). Must not be greater than 10 characters.'
example: '78701'
county:
type: string
description: 'County name. Must not be greater than 255 characters.'
example: Travis
nullable: true
apn:
type: string
description: 'Assessor parcel number. Must not be greater than 255 characters.'
example: 123-456-789
nullable: true
legal_description:
type: string
description: 'Full legal description of the property. Must not be greater than 10000 characters.'
example: 'Lot 5, Block 2, Example Subdivision'
nullable: true
is_primary:
type: boolean
description: 'Whether this is the project primary jobsite.'
example: true
nullable: true
metadata:
type: object
description: 'Free-form keyvalue bag stored alongside the record (max 32 KB, depth 6, 500 items).'
example: null
properties: {}
nullable: true
required:
- project_id
- name
- address_line_1
- city
- state
- zip
'/api/v1/jobsites/{uuid}':
get:
summary: 'Retrieve a jobsite'
operationId: retrieveAJobsite
description: 'Returns a single jobsite by UUID.'
parameters:
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
data:
id: 79633fc6-3644-4e14-ab18-21b87d751294
project_id: db5e3d6b-0f33-4e6e-8693-1332c8a98b2d
name: 'aut adipisci Site'
address:
line_1: '41881 Leo Pine Apt. 627'
line_2: null
city: 'South Isidrostad'
state: WV
zip: 17091-7515
county: non
apn: 584-087-043
legal_description: null
is_primary: false
metadata: null
created_at: '2026-10-05T15:49:19+00:00'
updated_at: '2026-10-05T15:49:19+00:00'
properties:
data:
type: object
properties:
id:
type: string
example: 79633fc6-3644-4e14-ab18-21b87d751294
project_id:
type: string
example: db5e3d6b-0f33-4e6e-8693-1332c8a98b2d
name:
type: string
example: 'aut adipisci Site'
address:
type: object
properties:
line_1:
type: string
example: '41881 Leo Pine Apt. 627'
line_2:
type: string
example: null
nullable: true
city:
type: string
example: 'South Isidrostad'
state:
type: string
example: WV
zip:
type: string
example: 17091-7515
county:
type: string
example: non
apn:
type: string
example: 584-087-043
legal_description:
type: string
example: null
nullable: true
is_primary:
type: boolean
example: false
metadata:
type: string
example: null
nullable: true
created_at:
type: string
example: '2026-10-05T15:49:19+00:00'
updated_at:
type: string
example: '2026-10-05T15:49:19+00:00'
tags:
- Jobsites
put:
summary: 'Update a jobsite'
operationId: updateAJobsite
description: 'Applies a partial update to a jobsite and returns it.'
parameters:
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
data:
id: fb8b9edd-04dd-441d-a19a-fcecf8eb53a4
project_id: 4b8120d3-fba0-4415-83c5-db1220762d62
name: 'eius et Site'
address:
line_1: '764 Ernser Parkways Suite 841'
line_2: null
city: Cecilburgh
state: WI
zip: '02042'
county: null
apn: null
legal_description: 'Adipisci quidem nostrum qui commodi incidunt iure.'
is_primary: false
metadata: null
created_at: '2026-10-05T15:49:19+00:00'
updated_at: '2026-10-05T15:49:19+00:00'
properties:
data:
type: object
properties:
id:
type: string
example: fb8b9edd-04dd-441d-a19a-fcecf8eb53a4
project_id:
type: string
example: 4b8120d3-fba0-4415-83c5-db1220762d62
name:
type: string
example: 'eius et Site'
address:
type: object
properties:
line_1:
type: string
example: '764 Ernser Parkways Suite 841'
line_2:
type: string
example: null
nullable: true
city:
type: string
example: Cecilburgh
state:
type: string
example: WI
zip:
type: string
example: '02042'
county:
type: string
example: null
nullable: true
apn:
type: string
example: null
nullable: true
legal_description:
type: string
example: 'Adipisci quidem nostrum qui commodi incidunt iure.'
is_primary:
type: boolean
example: false
metadata:
type: string
example: null
nullable: true
created_at:
type: string
example: '2026-10-05T15:49:19+00:00'
updated_at:
type: string
example: '2026-10-05T15:49:19+00:00'
tags:
- Jobsites
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
name:
type: string
description: 'Label for the jobsite. Must not be greater than 255 characters.'
example: 'Main Site'
address_line_1:
type: string
description: 'Street address, line 1. Must not be greater than 255 characters.'
example: '100 Commerce Blvd'
address_line_2:
type: string
description: 'Street address, line 2 (suite, unit). Must not be greater than 255 characters.'
example: b
nullable: true
city:
type: string
description: 'City. Must not be greater than 255 characters.'
example: Austin
state:
type: string
description: 'Two-letter US state code. Must be 2 characters.'
example: CA
zip:
type: string
description: 'Postal code (5 or 9 digit). Must not be greater than 10 characters.'
example: '78701'
county:
type: string
description: 'County name. Must not be greater than 255 characters.'
example: Travis
nullable: true
apn:
type: string
description: 'Assessor parcel number. Must not be greater than 255 characters.'
example: 123-456-789
nullable: true
legal_description:
type: string
description: 'Full legal description of the property. Must not be greater than 10000 characters.'
example: 'Lot 5, Block 2, Example Subdivision'
nullable: true
is_primary:
type: boolean
description: 'Whether this is the project primary jobsite.'
example: true
nullable: true
metadata:
type: object
description: 'Free-form keyvalue bag stored alongside the record (max 32 KB, depth 6, 500 items).'
example: null
properties: {}
nullable: true
delete:
summary: 'Delete a jobsite'
operationId: deleteAJobsite
description: 'Soft-deletes the jobsite.'
parameters:
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
message: 'Jobsite deleted.'
properties:
message:
type: string
example: 'Jobsite deleted.'
tags:
- Jobsites
parameters:
-
in: path
name: uuid
description: ''
example: 6ff8f7f6-1eb3-3525-be4a-3932c805afed
required: true
schema:
type: string
/api/v1/notices:
get:
summary: 'List notices'
operationId: listNotices
description: 'Paginated notices visible to the caller, newest first.'
parameters:
-
in: query
name: project_id
description: 'Filter to this project (UUID).'
example: 9b7e0e2a-1c3d-4f5a-8b6c-2d4e6f8a0b1c
required: true
schema:
type: string
description: 'Filter to this project (UUID).'
example: 9b7e0e2a-1c3d-4f5a-8b6c-2d4e6f8a0b1c
-
in: query
name: organization_id
description: 'Filter to this organization (UUID).'
example: 9b7e0e2a-1c3d-4f5a-8b6c-2d4e6f8a0b1c
required: true
schema:
type: string
description: 'Filter to this organization (UUID).'
example: 9b7e0e2a-1c3d-4f5a-8b6c-2d4e6f8a0b1c
-
in: query
name: type
description: 'Filter by type.'
example: architecto
required: true
schema:
type: string
description: 'Filter by type.'
example: architecto
-
in: query
name: status
description: 'Filter by lifecycle status.'
example: architecto
required: true
schema:
type: string
description: 'Filter by lifecycle status.'
example: architecto
-
in: query
name: state
description: 'Filter by two-letter US state code.'
example: CA
required: true
schema:
type: string
description: 'Filter by two-letter US state code.'
example: CA
-
in: query
name: per_page
description: 'Results per page. Clamped to 1-100; defaults to 15.'
example: 15
required: true
schema:
type: integer
description: 'Results per page. Clamped to 1-100; defaults to 15.'
example: 15
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
data:
-
id: 87a78e82-e91a-4bfa-8442-a07d1562d7f6
notice_number: N-260222-C6P001
project_id: 00b6aa9b-f819-4c5a-aecf-ac40e507f589
organization_id: 068f1505-1d36-4b04-93f5-cd294b487e6e
division_id: 845ad3bb-e734-45a9-83de-c4d13e05bcb8
type: bond_claim
type_label: 'Bond Claim'
status: draft
status_label: Draft
state: RI
notice_date: '2026-02-22'
deadline_date: '2026-11-08'
deadline_source: null
first_furnishing_date: '2026-02-11'
last_furnishing_date: '2026-09-10'
deadline_rule:
required: null
basis: not_applicable
days: null
deadline: null
rolling_lookback_days: null
explanation: 'Serve-by deadlines are only calculated for preliminary notices.'
source: null
verified: false
claim_amount: '280415.85'
original_claim_amount: null
description: 'Accusantium harum mollitia modi deserunt aut ab.'
is_amendment: false
parent_notice_id: null
amendment_reason: null
amendment_reason_label: null
amendment_sequence: 1
cls_reference_id: null
metadata: null
created_at: '2026-10-05T15:49:19+00:00'
updated_at: '2026-10-05T15:49:19+00:00'
-
id: bba7d89a-fd55-4afa-863b-d47e7e56b952
notice_number: N-260902-K66001
project_id: 7ab1a274-abc6-4a72-b974-18ec78e7899e
organization_id: 1ded52c3-268c-4404-8d73-bc0014f16781
division_id: ef8f65c7-32e0-4e91-9861-527be667a14f
type: lien
type_label: 'Lien Notice'
status: draft
status_label: Draft
state: CT
notice_date: '2026-09-02'
deadline_date: null
deadline_source: null
first_furnishing_date: '2026-07-11'
last_furnishing_date: '2026-10-03'
deadline_rule:
required: null
basis: not_applicable
days: null
deadline: null
rolling_lookback_days: null
explanation: 'Serve-by deadlines are only calculated for preliminary notices.'
source: null
verified: false
claim_amount: '448226.98'
original_claim_amount: null
description: 'Rem ea ut aut deserunt.'
is_amendment: false
parent_notice_id: null
amendment_reason: null
amendment_reason_label: null
amendment_sequence: 1
cls_reference_id: null
metadata: null
created_at: '2026-10-05T15:49:19+00:00'
updated_at: '2026-10-05T15:49:19+00:00'
links:
first: '/?page=1'
last: '/?page=1'
prev: null
next: null
meta:
current_page: 1
from: 1
last_page: 1
links:
-
url: null
label: '« Previous'
page: null
active: false
-
url: '/?page=1'
label: '1'
page: 1
active: true
-
url: null
label: 'Next »'
page: null
active: false
path: /
per_page: 15
to: 2
total: 2
properties:
data:
type: array
example:
-
id: 87a78e82-e91a-4bfa-8442-a07d1562d7f6
notice_number: N-260222-C6P001
project_id: 00b6aa9b-f819-4c5a-aecf-ac40e507f589
organization_id: 068f1505-1d36-4b04-93f5-cd294b487e6e
division_id: 845ad3bb-e734-45a9-83de-c4d13e05bcb8
type: bond_claim
type_label: 'Bond Claim'
status: draft
status_label: Draft
state: RI
notice_date: '2026-02-22'
deadline_date: '2026-11-08'
deadline_source: null
first_furnishing_date: '2026-02-11'
last_furnishing_date: '2026-09-10'
deadline_rule:
required: null
basis: not_applicable
days: null
deadline: null
rolling_lookback_days: null
explanation: 'Serve-by deadlines are only calculated for preliminary notices.'
source: null
verified: false
claim_amount: '280415.85'
original_claim_amount: null
description: 'Accusantium harum mollitia modi deserunt aut ab.'
is_amendment: false
parent_notice_id: null
amendment_reason: null
amendment_reason_label: null
amendment_sequence: 1
cls_reference_id: null
metadata: null
created_at: '2026-10-05T15:49:19+00:00'
updated_at: '2026-10-05T15:49:19+00:00'
-
id: bba7d89a-fd55-4afa-863b-d47e7e56b952
notice_number: N-260902-K66001
project_id: 7ab1a274-abc6-4a72-b974-18ec78e7899e
organization_id: 1ded52c3-268c-4404-8d73-bc0014f16781
division_id: ef8f65c7-32e0-4e91-9861-527be667a14f
type: lien
type_label: 'Lien Notice'
status: draft
status_label: Draft
state: CT
notice_date: '2026-09-02'
deadline_date: null
deadline_source: null
first_furnishing_date: '2026-07-11'
last_furnishing_date: '2026-10-03'
deadline_rule:
required: null
basis: not_applicable
days: null
deadline: null
rolling_lookback_days: null
explanation: 'Serve-by deadlines are only calculated for preliminary notices.'
source: null
verified: false
claim_amount: '448226.98'
original_claim_amount: null
description: 'Rem ea ut aut deserunt.'
is_amendment: false
parent_notice_id: null
amendment_reason: null
amendment_reason_label: null
amendment_sequence: 1
cls_reference_id: null
metadata: null
created_at: '2026-10-05T15:49:19+00:00'
updated_at: '2026-10-05T15:49:19+00:00'
items:
type: object
properties:
id:
type: string
example: 87a78e82-e91a-4bfa-8442-a07d1562d7f6
notice_number:
type: string
example: N-260222-C6P001
project_id:
type: string
example: 00b6aa9b-f819-4c5a-aecf-ac40e507f589
organization_id:
type: string
example: 068f1505-1d36-4b04-93f5-cd294b487e6e
division_id:
type: string
example: 845ad3bb-e734-45a9-83de-c4d13e05bcb8
type:
type: string
example: bond_claim
type_label:
type: string
example: 'Bond Claim'
status:
type: string
example: draft
status_label:
type: string
example: Draft
state:
type: string
example: RI
notice_date:
type: string
example: '2026-02-22'
deadline_date:
type: string
example: '2026-11-08'
deadline_source:
type: string
example: null
nullable: true
first_furnishing_date:
type: string
example: '2026-02-11'
last_furnishing_date:
type: string
example: '2026-09-10'
deadline_rule:
type: object
properties:
required:
type: string
example: null
nullable: true
basis:
type: string
example: not_applicable
days:
type: string
example: null
nullable: true
deadline:
type: string
example: null
nullable: true
rolling_lookback_days:
type: string
example: null
nullable: true
explanation:
type: string
example: 'Serve-by deadlines are only calculated for preliminary notices.'
source:
type: string
example: null
nullable: true
verified:
type: boolean
example: false
claim_amount:
type: string
example: '280415.85'
original_claim_amount:
type: string
example: null
nullable: true
description:
type: string
example: 'Accusantium harum mollitia modi deserunt aut ab.'
is_amendment:
type: boolean
example: false
parent_notice_id:
type: string
example: null
nullable: true
amendment_reason:
type: string
example: null
nullable: true
amendment_reason_label:
type: string
example: null
nullable: true
amendment_sequence:
type: integer
example: 1
cls_reference_id:
type: string
example: null
nullable: true
metadata:
type: string
example: null
nullable: true
created_at:
type: string
example: '2026-10-05T15:49:19+00:00'
updated_at:
type: string
example: '2026-10-05T15:49:19+00:00'
links:
type: object
properties:
first:
type: string
example: '/?page=1'
last:
type: string
example: '/?page=1'
prev:
type: string
example: null
nullable: true
next:
type: string
example: null
nullable: true
meta:
type: object
properties:
current_page:
type: integer
example: 1
from:
type: integer
example: 1
last_page:
type: integer
example: 1
links:
type: array
example:
-
url: null
label: '« Previous'
page: null
active: false
-
url: '/?page=1'
label: '1'
page: 1
active: true
-
url: null
label: 'Next »'
page: null
active: false
items:
type: object
properties:
url:
type: string
example: null
nullable: true
label:
type: string
example: '« Previous'
page:
type: string
example: null
nullable: true
active:
type: boolean
example: false
path:
type: string
example: /
per_page:
type: integer
example: 15
to:
type: integer
example: 2
total:
type: integer
example: 2
tags:
- Notices
post:
summary: 'Create a notice'
operationId: createANotice
description: 'Creates a notice and returns it.'
parameters:
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
201:
description: ''
content:
application/json:
schema:
type: object
example:
data:
id: 44d02522-5bd1-4ed5-a127-82cfb48d2afd
notice_number: N-260518-7DQ001
project_id: 0d7cf48b-0214-4dc9-8fc8-9ca13bb172ef
organization_id: 44bc4702-7e7d-451a-9473-12de34c1e46a
division_id: f2fb3327-0194-4877-a51d-2b8aaafbb12d
type: lien
type_label: 'Lien Notice'
status: draft
status_label: Draft
state: IL
notice_date: '2026-05-18'
deadline_date: null
deadline_source: null
first_furnishing_date: '2026-02-11'
last_furnishing_date: '2026-09-10'
deadline_rule:
required: null
basis: not_applicable
days: null
deadline: null
rolling_lookback_days: null
explanation: 'Serve-by deadlines are only calculated for preliminary notices.'
source: null
verified: false
claim_amount: '280415.85'
original_claim_amount: null
description: 'Accusantium harum mollitia modi deserunt aut ab.'
is_amendment: false
parent_notice_id: null
amendment_reason: null
amendment_reason_label: null
amendment_sequence: 1
cls_reference_id: null
metadata: null
created_at: '2026-10-05T15:49:19+00:00'
updated_at: '2026-10-05T15:49:19+00:00'
properties:
data:
type: object
properties:
id:
type: string
example: 44d02522-5bd1-4ed5-a127-82cfb48d2afd
notice_number:
type: string
example: N-260518-7DQ001
project_id:
type: string
example: 0d7cf48b-0214-4dc9-8fc8-9ca13bb172ef
organization_id:
type: string
example: 44bc4702-7e7d-451a-9473-12de34c1e46a
division_id:
type: string
example: f2fb3327-0194-4877-a51d-2b8aaafbb12d
type:
type: string
example: lien
type_label:
type: string
example: 'Lien Notice'
status:
type: string
example: draft
status_label:
type: string
example: Draft
state:
type: string
example: IL
notice_date:
type: string
example: '2026-05-18'
deadline_date:
type: string
example: null
nullable: true
deadline_source:
type: string
example: null
nullable: true
first_furnishing_date:
type: string
example: '2026-02-11'
last_furnishing_date:
type: string
example: '2026-09-10'
deadline_rule:
type: object
properties:
required:
type: string
example: null
nullable: true
basis:
type: string
example: not_applicable
days:
type: string
example: null
nullable: true
deadline:
type: string
example: null
nullable: true
rolling_lookback_days:
type: string
example: null
nullable: true
explanation:
type: string
example: 'Serve-by deadlines are only calculated for preliminary notices.'
source:
type: string
example: null
nullable: true
verified:
type: boolean
example: false
claim_amount:
type: string
example: '280415.85'
original_claim_amount:
type: string
example: null
nullable: true
description:
type: string
example: 'Accusantium harum mollitia modi deserunt aut ab.'
is_amendment:
type: boolean
example: false
parent_notice_id:
type: string
example: null
nullable: true
amendment_reason:
type: string
example: null
nullable: true
amendment_reason_label:
type: string
example: null
nullable: true
amendment_sequence:
type: integer
example: 1
cls_reference_id:
type: string
example: null
nullable: true
metadata:
type: string
example: null
nullable: true
created_at:
type: string
example: '2026-10-05T15:49:19+00:00'
updated_at:
type: string
example: '2026-10-05T15:49:19+00:00'
tags:
- Notices
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
project_id:
type: string
description: 'UUID of the project. Must match an existing stored value.'
example: 9b7e0e2a-1c3d-4f5a-8b6c-2d4e6f8a0b1c
organization_id:
type: string
description: 'UUID of the organization this record belongs to. Must be one the API key can access. Must match an existing stored value.'
example: 9b7e0e2a-1c3d-4f5a-8b6c-2d4e6f8a0b1c
division_id:
type: string
description: 'UUID of the claimant division. Optional: inherited from the project. Supplying a division other than the project one is rejected (422). Must match an existing stored value.'
example: 9b7e0e2a-1c3d-4f5a-8b6c-2d4e6f8a0b1c
nullable: true
type:
type: string
description: 'Notice type: preliminary, stop_payment, lien, or bond_claim.'
example: preliminary
enum:
- preliminary
- stop_payment
- lien
- bond_claim
state:
type: string
description: 'Two-letter US state code. Must be 2 characters.'
example: CA
notice_date:
type: string
description: 'Date the notice is issued (YYYY-MM-DD). Must be a valid date.'
example: '2026-05-24'
deadline_date:
type: string
description: 'Serve-by deadline. Omit it to have it calculated for preliminary notices from the state rule and furnishing dates (see deadline_rule in the response); send null on update to switch back to the calculated date. Must be a valid date. Must be a date after notice_date.'
example: '2026-06-24'
nullable: true
first_furnishing_date:
type: string
description: 'First date the claimant furnished labor or materials. Drives the calculated serve-by deadline in most states; required for a preliminary notice in states that count from it (see required_dates per state). Must be a valid date.'
example: '2026-09-15'
nullable: true
last_furnishing_date:
type: string
description: 'Last date the claimant furnished labor or materials (used where the state counts from last furnishing); required for a preliminary notice in those states. Must be a valid date. Must be a date after or equal to first_furnishing_date.'
example: '2026-10-20'
nullable: true
claim_amount:
type: number
description: 'Amount claimed, in dollars (greater than zero). On a preliminary notice this is the estimated total price of the labor/materials furnished, or the amount owed where the state counts unpaid balance.'
example: 50000.0
original_claim_amount:
type: number
description: 'For an amendment, the claim amount on the notice being amended. Must be at least 0.'
example: 27
nullable: true
parent_notice_id:
type: string
description: 'UUID of the notice this one amends. Presence makes this an amendment. Must match an existing stored value.'
example: 9b7e0e2a-1c3d-4f5a-8b6c-2d4e6f8a0b1c
nullable: true
amendment_reason:
type: string
description: 'Why the parent notice is being amended. Required when parent_notice_id is set. This field is required when parent_notice_id is present.'
example: corrected_amount
enum:
- amount_changed
- scope_changed
- party_correction
- other
nullable: true
description:
type: string
description: 'The labor and/or materials furnished, printed on the notice. Must not be greater than 10000 characters.'
example: 'Electrical rough-in, wiring and light fixtures'
metadata:
type: object
description: 'Free-form keyvalue bag (max 32 KB, depth 6, 500 items). Claimant-identity keys (claimant_name, claimant_address, claimant_license_number, ...) are rejected here (422): the claimant comes from the division. Supply metadata.owner.name / metadata.gc.name to satisfy the document preflight inline. metadata.party_grid_max (4 or 8, default 8) caps the party boxes on the first page of a preliminary notice; the rest are listed on an Exhibit A page. metadata.mail_pack=true adds a cover page per served party (acknowledgment of receipt, or a proof-of-service affidavit in CA; metadata.service_method / metadata.service_date fill the affidavit). metadata.months_work_performed (string or list) prints the month(s) covered, e.g. on a Texas monthly notice.'
example: null
properties:
party_grid_max:
type: integer
description: ''
example: 8
enum:
- 4
- 8
mail_pack:
type: boolean
description: ''
example: true
service_method:
type: string
description: 'Must not be greater than 120 characters.'
example: 'n'
service_date:
type: string
description: 'Must be a valid date.'
example: '2026-10-05T15:49:19'
months_work_performed:
type: string
description: ''
example: null
nullable: true
nullable: true
required:
- project_id
- organization_id
- type
- state
- notice_date
- claim_amount
- description
'/api/v1/notices/{uuid}':
get:
summary: 'Retrieve a notice'
operationId: retrieveANotice
description: 'Returns a single notice by UUID.'
parameters:
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
data:
id: 6473e2d5-b977-403d-87f6-27a4219d8627
notice_number: N-251104-9FV001
project_id: 7d724e6e-f60f-4000-b86e-faccba78e026
organization_id: 00fd486f-3e89-46a9-93b0-46da60dd96d6
division_id: 06fe9388-e339-4be8-80bb-59d037ea9c12
type: preliminary
type_label: 'Preliminary Notice'
status: draft
status_label: Draft
state: MO
notice_date: '2025-11-04'
deadline_date: '2027-02-03'
deadline_source: null
first_furnishing_date: '2025-12-20'
last_furnishing_date: '2026-09-20'
deadline_rule:
required: true
basis: varies
days: null
deadline: null
rolling_lookback_days: null
explanation: 'The MO deadline depends on the facts of the project (varies) and is not calculated; set deadline_date yourself.'
source: null
verified: false
claim_amount: '99055.43'
original_claim_amount: null
description: 'Et et modi ipsum nostrum.'
is_amendment: false
parent_notice_id: null
amendment_reason: null
amendment_reason_label: null
amendment_sequence: 1
cls_reference_id: null
metadata: null
created_at: '2026-10-05T15:49:19+00:00'
updated_at: '2026-10-05T15:49:19+00:00'
properties:
data:
type: object
properties:
id:
type: string
example: 6473e2d5-b977-403d-87f6-27a4219d8627
notice_number:
type: string
example: N-251104-9FV001
project_id:
type: string
example: 7d724e6e-f60f-4000-b86e-faccba78e026
organization_id:
type: string
example: 00fd486f-3e89-46a9-93b0-46da60dd96d6
division_id:
type: string
example: 06fe9388-e339-4be8-80bb-59d037ea9c12
type:
type: string
example: preliminary
type_label:
type: string
example: 'Preliminary Notice'
status:
type: string
example: draft
status_label:
type: string
example: Draft
state:
type: string
example: MO
notice_date:
type: string
example: '2025-11-04'
deadline_date:
type: string
example: '2027-02-03'
deadline_source:
type: string
example: null
nullable: true
first_furnishing_date:
type: string
example: '2025-12-20'
last_furnishing_date:
type: string
example: '2026-09-20'
deadline_rule:
type: object
properties:
required:
type: boolean
example: true
basis:
type: string
example: varies
days:
type: string
example: null
nullable: true
deadline:
type: string
example: null
nullable: true
rolling_lookback_days:
type: string
example: null
nullable: true
explanation:
type: string
example: 'The MO deadline depends on the facts of the project (varies) and is not calculated; set deadline_date yourself.'
source:
type: string
example: null
nullable: true
verified:
type: boolean
example: false
claim_amount:
type: string
example: '99055.43'
original_claim_amount:
type: string
example: null
nullable: true
description:
type: string
example: 'Et et modi ipsum nostrum.'
is_amendment:
type: boolean
example: false
parent_notice_id:
type: string
example: null
nullable: true
amendment_reason:
type: string
example: null
nullable: true
amendment_reason_label:
type: string
example: null
nullable: true
amendment_sequence:
type: integer
example: 1
cls_reference_id:
type: string
example: null
nullable: true
metadata:
type: string
example: null
nullable: true
created_at:
type: string
example: '2026-10-05T15:49:19+00:00'
updated_at:
type: string
example: '2026-10-05T15:49:19+00:00'
tags:
- Notices
put:
summary: 'Update a notice'
operationId: updateANotice
description: 'Applies a partial update to a notice and returns it.'
parameters:
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
data:
id: 5b113d62-8f68-464b-83aa-06bdcee18cc0
notice_number: N-251120-6MK001
project_id: b4919775-4341-4ec1-8901-2a017fc6ed64
organization_id: 3313285e-20d2-49f2-aa0d-29634aa32fd7
division_id: cba56efe-184a-4a06-ac9b-72f44081448b
type: bond_claim
type_label: 'Bond Claim'
status: draft
status_label: Draft
state: OK
notice_date: '2025-11-20'
deadline_date: '2027-01-06'
deadline_source: null
first_furnishing_date: '2026-02-23'
last_furnishing_date: '2026-09-26'
deadline_rule:
required: null
basis: not_applicable
days: null
deadline: null
rolling_lookback_days: null
explanation: 'Serve-by deadlines are only calculated for preliminary notices.'
source: null
verified: false
claim_amount: '315532.61'
original_claim_amount: null
description: 'Provident perspiciatis quo omnis nostrum aut adipisci quidem.'
is_amendment: false
parent_notice_id: null
amendment_reason: null
amendment_reason_label: null
amendment_sequence: 1
cls_reference_id: null
metadata: null
created_at: '2026-10-05T15:49:19+00:00'
updated_at: '2026-10-05T15:49:19+00:00'
properties:
data:
type: object
properties:
id:
type: string
example: 5b113d62-8f68-464b-83aa-06bdcee18cc0
notice_number:
type: string
example: N-251120-6MK001
project_id:
type: string
example: b4919775-4341-4ec1-8901-2a017fc6ed64
organization_id:
type: string
example: 3313285e-20d2-49f2-aa0d-29634aa32fd7
division_id:
type: string
example: cba56efe-184a-4a06-ac9b-72f44081448b
type:
type: string
example: bond_claim
type_label:
type: string
example: 'Bond Claim'
status:
type: string
example: draft
status_label:
type: string
example: Draft
state:
type: string
example: OK
notice_date:
type: string
example: '2025-11-20'
deadline_date:
type: string
example: '2027-01-06'
deadline_source:
type: string
example: null
nullable: true
first_furnishing_date:
type: string
example: '2026-02-23'
last_furnishing_date:
type: string
example: '2026-09-26'
deadline_rule:
type: object
properties:
required:
type: string
example: null
nullable: true
basis:
type: string
example: not_applicable
days:
type: string
example: null
nullable: true
deadline:
type: string
example: null
nullable: true
rolling_lookback_days:
type: string
example: null
nullable: true
explanation:
type: string
example: 'Serve-by deadlines are only calculated for preliminary notices.'
source:
type: string
example: null
nullable: true
verified:
type: boolean
example: false
claim_amount:
type: string
example: '315532.61'
original_claim_amount:
type: string
example: null
nullable: true
description:
type: string
example: 'Provident perspiciatis quo omnis nostrum aut adipisci quidem.'
is_amendment:
type: boolean
example: false
parent_notice_id:
type: string
example: null
nullable: true
amendment_reason:
type: string
example: null
nullable: true
amendment_reason_label:
type: string
example: null
nullable: true
amendment_sequence:
type: integer
example: 1
cls_reference_id:
type: string
example: null
nullable: true
metadata:
type: string
example: null
nullable: true
created_at:
type: string
example: '2026-10-05T15:49:19+00:00'
updated_at:
type: string
example: '2026-10-05T15:49:19+00:00'
tags:
- Notices
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
type:
type: string
description: 'Notice type.'
example: preliminary
enum:
- preliminary
- stop_payment
- lien
- bond_claim
state:
type: string
description: 'Two-letter US state code. Must be 2 characters.'
example: CA
notice_date:
type: string
description: 'Date the notice is issued (YYYY-MM-DD). Must be a valid date.'
example: '2026-05-24'
deadline_date:
type: string
description: 'Serve-by deadline. Send null to switch back to the calculated date (preliminary notices; see deadline_rule in the response). Must be a valid date.'
example: '2026-06-24'
nullable: true
first_furnishing_date:
type: string
description: 'First date the claimant furnished labor or materials. Drives the calculated serve-by deadline in most states. Must be a valid date.'
example: '2026-09-15'
nullable: true
last_furnishing_date:
type: string
description: 'Last date the claimant furnished labor or materials (used where the state counts from last furnishing). Must be a valid date. Must be a date after or equal to first_furnishing_date.'
example: '2026-10-20'
nullable: true
claim_amount:
type: number
description: 'Amount claimed, in dollars.'
example: 50000.0
description:
type: string
description: 'The labor and/or materials furnished, printed on the notice. Cannot be cleared. Must not be greater than 10000 characters.'
example: 'Eius et animi quos velit et.'
metadata:
type: object
description: 'Free-form keyvalue bag (max 32 KB, depth 6, 500 items). Claimant-identity keys (claimant_name, claimant_address, claimant_license_number, ...) are rejected here (422): the claimant comes from the division. Supply metadata.owner.name / metadata.gc.name to satisfy the document preflight inline. metadata.party_grid_max (4 or 8, default 8) caps the party boxes on the first page of a preliminary notice; the rest are listed on an Exhibit A page. metadata.mail_pack=true adds a cover page per served party (acknowledgment of receipt, or a proof-of-service affidavit in CA; metadata.service_method / metadata.service_date fill the affidavit). metadata.months_work_performed (string or list) prints the month(s) covered, e.g. on a Texas monthly notice.'
example: null
properties:
party_grid_max:
type: integer
description: ''
example: 4
enum:
- 4
- 8
mail_pack:
type: boolean
description: ''
example: true
service_method:
type: string
description: 'Must not be greater than 120 characters.'
example: v
service_date:
type: string
description: 'Must be a valid date.'
example: '2026-10-05T15:49:19'
months_work_performed:
type: string
description: ''
example: null
nullable: true
nullable: true
delete:
summary: 'Delete a notice'
operationId: deleteANotice
description: 'Soft-deletes the notice.'
parameters:
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
message: 'Notice deleted.'
properties:
message:
type: string
example: 'Notice deleted.'
tags:
- Notices
parameters:
-
in: path
name: uuid
description: ''
example: 6ff8f7f6-1eb3-3525-be4a-3932c805afed
required: true
schema:
type: string
'/api/v1/notices/{notice_uuid}/transition':
post:
summary: 'Transition a notice'
operationId: transitionANotice
description: "Moves the notice to another workflow status. Reaching 'generated' is not allowed here - generate the document instead."
parameters:
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
data:
id: e254bdbd-54dd-4d5b-9c8a-eb1e7ddd22e5
notice_number: N-251104-X9H001
project_id: 3de0cff4-44c5-4bd3-8a21-230c362f28a1
organization_id: e354c530-1cf6-445e-9bd4-3b1e4ddb5e59
division_id: 00ecc154-47cf-4f38-b957-c99063163eb9
type: preliminary
type_label: 'Preliminary Notice'
status: draft
status_label: Draft
state: MO
notice_date: '2025-11-04'
deadline_date: '2027-02-03'
deadline_source: null
first_furnishing_date: '2025-12-20'
last_furnishing_date: '2026-09-20'
deadline_rule:
required: true
basis: varies
days: null
deadline: null
rolling_lookback_days: null
explanation: 'The MO deadline depends on the facts of the project (varies) and is not calculated; set deadline_date yourself.'
source: null
verified: false
claim_amount: '99055.43'
original_claim_amount: null
description: 'Et et modi ipsum nostrum.'
is_amendment: false
parent_notice_id: null
amendment_reason: null
amendment_reason_label: null
amendment_sequence: 1
cls_reference_id: null
metadata: null
created_at: '2026-10-05T15:49:19+00:00'
updated_at: '2026-10-05T15:49:19+00:00'
properties:
data:
type: object
properties:
id:
type: string
example: e254bdbd-54dd-4d5b-9c8a-eb1e7ddd22e5
notice_number:
type: string
example: N-251104-X9H001
project_id:
type: string
example: 3de0cff4-44c5-4bd3-8a21-230c362f28a1
organization_id:
type: string
example: e354c530-1cf6-445e-9bd4-3b1e4ddb5e59
division_id:
type: string
example: 00ecc154-47cf-4f38-b957-c99063163eb9
type:
type: string
example: preliminary
type_label:
type: string
example: 'Preliminary Notice'
status:
type: string
example: draft
status_label:
type: string
example: Draft
state:
type: string
example: MO
notice_date:
type: string
example: '2025-11-04'
deadline_date:
type: string
example: '2027-02-03'
deadline_source:
type: string
example: null
nullable: true
first_furnishing_date:
type: string
example: '2025-12-20'
last_furnishing_date:
type: string
example: '2026-09-20'
deadline_rule:
type: object
properties:
required:
type: boolean
example: true
basis:
type: string
example: varies
days:
type: string
example: null
nullable: true
deadline:
type: string
example: null
nullable: true
rolling_lookback_days:
type: string
example: null
nullable: true
explanation:
type: string
example: 'The MO deadline depends on the facts of the project (varies) and is not calculated; set deadline_date yourself.'
source:
type: string
example: null
nullable: true
verified:
type: boolean
example: false
claim_amount:
type: string
example: '99055.43'
original_claim_amount:
type: string
example: null
nullable: true
description:
type: string
example: 'Et et modi ipsum nostrum.'
is_amendment:
type: boolean
example: false
parent_notice_id:
type: string
example: null
nullable: true
amendment_reason:
type: string
example: null
nullable: true
amendment_reason_label:
type: string
example: null
nullable: true
amendment_sequence:
type: integer
example: 1
cls_reference_id:
type: string
example: null
nullable: true
metadata:
type: string
example: null
nullable: true
created_at:
type: string
example: '2026-10-05T15:49:19+00:00'
updated_at:
type: string
example: '2026-10-05T15:49:19+00:00'
tags:
- Notices
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
status:
type: string
description: 'Target status. Reaching generated is not allowed here (generate the document instead).'
example: sent
enum:
- draft
- generated
- sent
- delivered
- cancelled
required:
- status
parameters:
-
in: path
name: notice_uuid
description: ''
example: 6ff8f7f6-1eb3-3525-be4a-3932c805afed
required: true
schema:
type: string
'/api/v1/notices/{notice_uuid}/order':
post:
summary: 'Generate & mail a notice'
operationId: generateMailANotice
description: 'Generates the notice PDF if needed, then creates an accountable USPS mail order for it. Reuses an existing PDF to avoid a second charge.'
parameters:
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
201:
description: ''
content:
application/json:
schema:
type: object
example:
data:
id: ac2e04b3-1e15-4e30-9fd7-94dbd86a8b19
status: pending
order_type: mail
billing:
status: pending
method: credit_balance
amount_cents: 4175
invoiced_at: null
paid_at: null
invoice_reference: null
payment_reference: null
tracking_number: null
carrier: null
mail_class: priority
recipient:
name: 'Rowan Gulgowski'
address_line_1: '4529 Tillman Ridges Suite 142'
address_line_2: null
city: 'East Nickshire'
state: MO
zip: '33724'
external_provider_id: null
shipped_at: null
delivered_at: null
metadata: null
created_at: '2026-10-05T15:49:19+00:00'
updated_at: '2026-10-05T15:49:19+00:00'
properties:
data:
type: object
properties:
id:
type: string
example: ac2e04b3-1e15-4e30-9fd7-94dbd86a8b19
status:
type: string
example: pending
order_type:
type: string
example: mail
billing:
type: object
properties:
status:
type: string
example: pending
method:
type: string
example: credit_balance
amount_cents:
type: integer
example: 4175
invoiced_at:
type: string
example: null
nullable: true
paid_at:
type: string
example: null
nullable: true
invoice_reference:
type: string
example: null
nullable: true
payment_reference:
type: string
example: null
nullable: true
tracking_number:
type: string
example: null
nullable: true
carrier:
type: string
example: null
nullable: true
mail_class:
type: string
example: priority
recipient:
type: object
properties:
name:
type: string
example: 'Rowan Gulgowski'
address_line_1:
type: string
example: '4529 Tillman Ridges Suite 142'
address_line_2:
type: string
example: null
nullable: true
city:
type: string
example: 'East Nickshire'
state:
type: string
example: MO
zip:
type: string
example: '33724'
external_provider_id:
type: string
example: null
nullable: true
shipped_at:
type: string
example: null
nullable: true
delivered_at:
type: string
example: null
nullable: true
metadata:
type: string
example: null
nullable: true
created_at:
type: string
example: '2026-10-05T15:49:19+00:00'
updated_at:
type: string
example: '2026-10-05T15:49:19+00:00'
tags:
- Notices
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
billing_method:
type: string
description: 'How the order is paid for: prepay (debit credits now), invoice (bill later), or credit_balance.'
example: credit_balance
enum:
- prepay
- invoice
- credit_balance
nullable: true
amount_cents:
type: integer
description: 'Optional caller-declared amount in cents. The authoritative price is still computed server-side. Must be at least 0.'
example: 27
nullable: true
mail_class:
type: string
description: 'USPS mail class for the parcel.'
example: certified
enum:
- first_class
- certified
- priority
nullable: true
recipient_name:
type: string
description: 'Name of the party the document is mailed to. Must not be greater than 255 characters.'
example: 'Property Owner LLC'
recipient_address_line_1:
type: string
description: 'Recipient street address, line 1. Must not be greater than 255 characters.'
example: '200 Main Street'
recipient_address_line_2:
type: string
description: 'Recipient street address, line 2. Must not be greater than 255 characters.'
example: 'n'
nullable: true
recipient_city:
type: string
description: 'Recipient city. Must not be greater than 255 characters.'
example: Austin
recipient_state:
type: string
description: 'Recipient two-letter US state code. Must be 2 characters.'
example: TX
recipient_zip:
type: string
description: 'Recipient postal code. Must not be greater than 10 characters.'
example: '78702'
metadata:
type: object
description: 'Free-form keyvalue bag stored alongside the record (max 32 KB, depth 6, 500 items).'
example: null
properties: {}
nullable: true
required:
- recipient_name
- recipient_address_line_1
- recipient_city
- recipient_state
- recipient_zip
parameters:
-
in: path
name: notice_uuid
description: ''
example: 6ff8f7f6-1eb3-3525-be4a-3932c805afed
required: true
schema:
type: string
/api/v1/organizations:
get:
summary: 'List organizations'
operationId: listOrganizations
description: 'Paginated organizations visible to the caller, newest first.'
parameters:
-
in: query
name: type
description: 'Filter by type.'
example: architecto
required: true
schema:
type: string
description: 'Filter by type.'
example: architecto
-
in: query
name: role
description: 'Filter by your relationship: owner or contact.'
example: owner
required: true
schema:
type: string
description: 'Filter by your relationship: owner or contact.'
example: owner
-
in: query
name: search
description: 'Case-insensitive partial match on name.'
example: architecto
required: true
schema:
type: string
description: 'Case-insensitive partial match on name.'
example: architecto
-
in: query
name: per_page
description: 'Results per page. Clamped to 1-100; defaults to 15.'
example: 15
required: true
schema:
type: integer
description: 'Results per page. Clamped to 1-100; defaults to 15.'
example: 15
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
data:
-
id: 0dc8cc85-76ab-4463-bee6-f1385cd01bdb
name: 'Bailey Ltd'
type: general-contractor
license_number: null
ein: 31-2965625
phone: null
email: idickens@runte.com
address:
line_1: '16748 Lyric Loop'
line_2: null
city: 'New Theoburgh'
state: LA
zip: '19279'
zip_plus_4: null
country_code: US
cls_reference_id: null
metadata: null
created_at: '2026-10-05T15:49:19+00:00'
updated_at: '2026-10-05T15:49:19+00:00'
-
id: bd17fbb9-45cb-4691-85b1-d72331c439dd
name: 'Leuschke, Bauch and Fritsch'
type: sub-contractor
license_number: null
ein: 79-0915066
phone: null
email: null
address:
line_1: '5161 Vesta Coves Apt. 809'
line_2: null
city: Haagborough
state: MT
zip: 36080-0782
zip_plus_4: null
country_code: US
cls_reference_id: null
metadata: null
created_at: '2026-10-05T15:49:19+00:00'
updated_at: '2026-10-05T15:49:19+00:00'
links:
first: '/?page=1'
last: '/?page=1'
prev: null
next: null
meta:
current_page: 1
from: 1
last_page: 1
links:
-
url: null
label: '« Previous'
page: null
active: false
-
url: '/?page=1'
label: '1'
page: 1
active: true
-
url: null
label: 'Next »'
page: null
active: false
path: /
per_page: 15
to: 2
total: 2
properties:
data:
type: array
example:
-
id: 0dc8cc85-76ab-4463-bee6-f1385cd01bdb
name: 'Bailey Ltd'
type: general-contractor
license_number: null
ein: 31-2965625
phone: null
email: idickens@runte.com
address:
line_1: '16748 Lyric Loop'
line_2: null
city: 'New Theoburgh'
state: LA
zip: '19279'
zip_plus_4: null
country_code: US
cls_reference_id: null
metadata: null
created_at: '2026-10-05T15:49:19+00:00'
updated_at: '2026-10-05T15:49:19+00:00'
-
id: bd17fbb9-45cb-4691-85b1-d72331c439dd
name: 'Leuschke, Bauch and Fritsch'
type: sub-contractor
license_number: null
ein: 79-0915066
phone: null
email: null
address:
line_1: '5161 Vesta Coves Apt. 809'
line_2: null
city: Haagborough
state: MT
zip: 36080-0782
zip_plus_4: null
country_code: US
cls_reference_id: null
metadata: null
created_at: '2026-10-05T15:49:19+00:00'
updated_at: '2026-10-05T15:49:19+00:00'
items:
type: object
properties:
id:
type: string
example: 0dc8cc85-76ab-4463-bee6-f1385cd01bdb
name:
type: string
example: 'Bailey Ltd'
type:
type: string
example: general-contractor
license_number:
type: string
example: null
nullable: true
ein:
type: string
example: 31-2965625
phone:
type: string
example: null
nullable: true
email:
type: string
example: idickens@runte.com
address:
type: object
properties:
line_1:
type: string
example: '16748 Lyric Loop'
line_2:
type: string
example: null
nullable: true
city:
type: string
example: 'New Theoburgh'
state:
type: string
example: LA
zip:
type: string
example: '19279'
zip_plus_4:
type: string
example: null
nullable: true
country_code:
type: string
example: US
cls_reference_id:
type: string
example: null
nullable: true
metadata:
type: string
example: null
nullable: true
created_at:
type: string
example: '2026-10-05T15:49:19+00:00'
updated_at:
type: string
example: '2026-10-05T15:49:19+00:00'
links:
type: object
properties:
first:
type: string
example: '/?page=1'
last:
type: string
example: '/?page=1'
prev:
type: string
example: null
nullable: true
next:
type: string
example: null
nullable: true
meta:
type: object
properties:
current_page:
type: integer
example: 1
from:
type: integer
example: 1
last_page:
type: integer
example: 1
links:
type: array
example:
-
url: null
label: '« Previous'
page: null
active: false
-
url: '/?page=1'
label: '1'
page: 1
active: true
-
url: null
label: 'Next »'
page: null
active: false
items:
type: object
properties:
url:
type: string
example: null
nullable: true
label:
type: string
example: '« Previous'
page:
type: string
example: null
nullable: true
active:
type: boolean
example: false
path:
type: string
example: /
per_page:
type: integer
example: 15
to:
type: integer
example: 2
total:
type: integer
example: 2
tags:
- Organizations
post:
summary: 'Create a organization'
operationId: createAOrganization
description: 'Creates a organization and returns it.'
parameters:
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
201:
description: ''
content:
application/json:
schema:
type: object
example:
data:
id: afbc6bfb-9510-4f28-b957-904a19acac55
name: 'Bailey Ltd'
type: general-contractor
license_number: null
ein: 31-2965625
phone: null
email: idickens@runte.com
address:
line_1: '16748 Lyric Loop'
line_2: null
city: 'New Theoburgh'
state: LA
zip: '19279'
zip_plus_4: null
country_code: US
cls_reference_id: null
metadata: null
created_at: '2026-10-05T15:49:19+00:00'
updated_at: '2026-10-05T15:49:19+00:00'
properties:
data:
type: object
properties:
id:
type: string
example: afbc6bfb-9510-4f28-b957-904a19acac55
name:
type: string
example: 'Bailey Ltd'
type:
type: string
example: general-contractor
license_number:
type: string
example: null
nullable: true
ein:
type: string
example: 31-2965625
phone:
type: string
example: null
nullable: true
email:
type: string
example: idickens@runte.com
address:
type: object
properties:
line_1:
type: string
example: '16748 Lyric Loop'
line_2:
type: string
example: null
nullable: true
city:
type: string
example: 'New Theoburgh'
state:
type: string
example: LA
zip:
type: string
example: '19279'
zip_plus_4:
type: string
example: null
nullable: true
country_code:
type: string
example: US
cls_reference_id:
type: string
example: null
nullable: true
metadata:
type: string
example: null
nullable: true
created_at:
type: string
example: '2026-10-05T15:49:19+00:00'
updated_at:
type: string
example: '2026-10-05T15:49:19+00:00'
tags:
- Organizations
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
name:
type: string
description: 'Organization legal name. Must not be greater than 255 characters.'
example: 'Acme Construction Co'
type:
type: string
description: 'Organization type in the CLS vocabulary.'
example: general_contractor
enum:
- owner-on-title
- owner-reputed-owner
- reputed-owner
- general-contractor
- sub-contractor
- 2nd-tier-contractor
- 3rd-tier-contractor
- material-supplier
- equipment-supplier
- labor-supplier
- lender-beneficiary
- surety-bond-company
- architect
- title-company
- escrow-title-agency
- developer
- construction-manager
- project-manager
- owner-representative
- project-owner
- lessee
- lessor
- sub-lessee
- home-owners-association
- property-manager
- trustee
- insurance-agency
- professional-services
- copy-to
license_number:
type: string
description: 'Contractor license number. Must not be greater than 255 characters.'
example: LIC-558231
nullable: true
ein:
type: string
description: 'Employer identification number. Must not be greater than 255 characters.'
example: 12-3456789
nullable: true
phone:
type: string
description: 'Contact phone number. Must not be greater than 255 characters.'
example: 512-555-0100
nullable: true
email:
type: string
description: 'Contact email address. Must be a valid email address. Must not be greater than 255 characters.'
example: ops@example.com
nullable: true
address_line_1:
type: string
description: 'Street address, line 1. Must not be greater than 255 characters.'
example: '100 Commerce Blvd'
nullable: true
address_line_2:
type: string
description: 'Street address, line 2 (suite, unit). Must not be greater than 255 characters.'
example: b
nullable: true
city:
type: string
description: 'City. Must not be greater than 255 characters.'
example: Austin
nullable: true
state:
type: string
description: 'Two-letter US state code. Must be 2 characters.'
example: CA
nullable: true
zip:
type: string
description: 'Postal code (5 or 9 digit). Must not be greater than 10 characters.'
example: '78701'
nullable: true
zip_plus_4:
type: string
description: 'Optional 4-digit ZIP+4 extension. Must not be greater than 4 characters.'
example: '1234'
nullable: true
country_code:
type: string
description: 'Two-letter ISO country code. Defaults to US. Must be 2 characters.'
example: US
nullable: true
cls_reference_id:
type: string
description: 'Optional external reference id carried through to CLS. Must not be greater than 255 characters.'
example: CLS-10842
nullable: true
metadata:
type: object
description: 'Free-form keyvalue bag stored alongside the record (max 32 KB, depth 6, 500 items).'
example: null
properties: {}
nullable: true
role:
type: string
description: 'Whether this org is your own tenant (owner) or a directory-only counterparty (contact). Defaults to owner.'
example: owner
enum:
- owner
- contact
nullable: true
required:
- name
- type
'/api/v1/organizations/{uuid}':
get:
summary: 'Retrieve a organization'
operationId: retrieveAOrganization
description: 'Returns a single organization by UUID.'
parameters:
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
data:
id: a778a857-8700-44fa-a75c-67bde426960b
name: 'Price Ltd'
type: general-contractor
license_number: null
ein: 59-0214902
phone: null
email: null
address:
line_1: '427 Predovic Ridge'
line_2: null
city: Baileemouth
state: KS
zip: 32375-9947
zip_plus_4: null
country_code: US
cls_reference_id: null
metadata: null
created_at: '2026-10-05T15:49:19+00:00'
updated_at: '2026-10-05T15:49:19+00:00'
properties:
data:
type: object
properties:
id:
type: string
example: a778a857-8700-44fa-a75c-67bde426960b
name:
type: string
example: 'Price Ltd'
type:
type: string
example: general-contractor
license_number:
type: string
example: null
nullable: true
ein:
type: string
example: 59-0214902
phone:
type: string
example: null
nullable: true
email:
type: string
example: null
nullable: true
address:
type: object
properties:
line_1:
type: string
example: '427 Predovic Ridge'
line_2:
type: string
example: null
nullable: true
city:
type: string
example: Baileemouth
state:
type: string
example: KS
zip:
type: string
example: 32375-9947
zip_plus_4:
type: string
example: null
nullable: true
country_code:
type: string
example: US
cls_reference_id:
type: string
example: null
nullable: true
metadata:
type: string
example: null
nullable: true
created_at:
type: string
example: '2026-10-05T15:49:19+00:00'
updated_at:
type: string
example: '2026-10-05T15:49:19+00:00'
tags:
- Organizations
put:
summary: 'Update a organization'
operationId: updateAOrganization
description: 'Applies a partial update to a organization and returns it.'
parameters:
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
data:
id: 4953b899-dc92-40e4-bd9d-bb8a9ccac222
name: 'Bailey Ltd'
type: general-contractor
license_number: null
ein: 31-2965625
phone: null
email: idickens@runte.com
address:
line_1: '16748 Lyric Loop'
line_2: null
city: 'New Theoburgh'
state: LA
zip: '19279'
zip_plus_4: null
country_code: US
cls_reference_id: null
metadata: null
created_at: '2026-10-05T15:49:19+00:00'
updated_at: '2026-10-05T15:49:19+00:00'
properties:
data:
type: object
properties:
id:
type: string
example: 4953b899-dc92-40e4-bd9d-bb8a9ccac222
name:
type: string
example: 'Bailey Ltd'
type:
type: string
example: general-contractor
license_number:
type: string
example: null
nullable: true
ein:
type: string
example: 31-2965625
phone:
type: string
example: null
nullable: true
email:
type: string
example: idickens@runte.com
address:
type: object
properties:
line_1:
type: string
example: '16748 Lyric Loop'
line_2:
type: string
example: null
nullable: true
city:
type: string
example: 'New Theoburgh'
state:
type: string
example: LA
zip:
type: string
example: '19279'
zip_plus_4:
type: string
example: null
nullable: true
country_code:
type: string
example: US
cls_reference_id:
type: string
example: null
nullable: true
metadata:
type: string
example: null
nullable: true
created_at:
type: string
example: '2026-10-05T15:49:19+00:00'
updated_at:
type: string
example: '2026-10-05T15:49:19+00:00'
tags:
- Organizations
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
name:
type: string
description: 'Organization legal name. Must not be greater than 255 characters.'
example: 'Acme Construction Co'
type:
type: string
description: 'Organization type in the CLS vocabulary.'
example: general_contractor
enum:
- owner-on-title
- owner-reputed-owner
- reputed-owner
- general-contractor
- sub-contractor
- 2nd-tier-contractor
- 3rd-tier-contractor
- material-supplier
- equipment-supplier
- labor-supplier
- lender-beneficiary
- surety-bond-company
- architect
- title-company
- escrow-title-agency
- developer
- construction-manager
- project-manager
- owner-representative
- project-owner
- lessee
- lessor
- sub-lessee
- home-owners-association
- property-manager
- trustee
- insurance-agency
- professional-services
- copy-to
license_number:
type: string
description: 'Contractor license number. Must not be greater than 255 characters.'
example: LIC-558231
nullable: true
ein:
type: string
description: 'Employer identification number. Must not be greater than 255 characters.'
example: 12-3456789
nullable: true
phone:
type: string
description: 'Contact phone number. Must not be greater than 255 characters.'
example: 512-555-0100
nullable: true
email:
type: string
description: 'Contact email address. Must be a valid email address. Must not be greater than 255 characters.'
example: ops@example.com
nullable: true
address_line_1:
type: string
description: 'Street address, line 1. Must not be greater than 255 characters.'
example: '100 Commerce Blvd'
nullable: true
address_line_2:
type: string
description: 'Street address, line 2 (suite, unit). Must not be greater than 255 characters.'
example: b
nullable: true
city:
type: string
description: 'City. Must not be greater than 255 characters.'
example: Austin
nullable: true
state:
type: string
description: 'Two-letter US state code. Must be 2 characters.'
example: CA
nullable: true
zip:
type: string
description: 'Postal code (5 or 9 digit). Must not be greater than 10 characters.'
example: '78701'
nullable: true
zip_plus_4:
type: string
description: 'Optional 4-digit ZIP+4 extension. Must not be greater than 4 characters.'
example: '1234'
nullable: true
country_code:
type: string
description: 'Two-letter ISO country code. Defaults to US. Must be 2 characters.'
example: US
nullable: true
cls_reference_id:
type: string
description: 'Optional external reference id carried through to CLS. Must not be greater than 255 characters.'
example: CLS-10842
nullable: true
metadata:
type: object
description: 'Free-form keyvalue bag stored alongside the record (max 32 KB, depth 6, 500 items).'
example: null
properties: {}
nullable: true
delete:
summary: 'Delete a organization'
operationId: deleteAOrganization
description: 'Soft-deletes the organization.'
parameters:
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
message: 'Organization deleted.'
properties:
message:
type: string
example: 'Organization deleted.'
tags:
- Organizations
parameters:
-
in: path
name: uuid
description: ''
example: 6ff8f7f6-1eb3-3525-be4a-3932c805afed
required: true
schema:
type: string
/api/v1/parties:
get:
summary: 'List partys'
operationId: listPartys
description: 'Paginated partys visible to the caller, newest first.'
parameters:
-
in: query
name: project_id
description: 'Filter to this project (UUID).'
example: 9b7e0e2a-1c3d-4f5a-8b6c-2d4e6f8a0b1c
required: true
schema:
type: string
description: 'Filter to this project (UUID).'
example: 9b7e0e2a-1c3d-4f5a-8b6c-2d4e6f8a0b1c
-
in: query
name: organization_id
description: 'Filter to this organization (UUID).'
example: 9b7e0e2a-1c3d-4f5a-8b6c-2d4e6f8a0b1c
required: true
schema:
type: string
description: 'Filter to this organization (UUID).'
example: 9b7e0e2a-1c3d-4f5a-8b6c-2d4e6f8a0b1c
-
in: query
name: role
description: 'Filter by party role (CLS vocabulary).'
example: general_contractor
required: true
schema:
type: string
description: 'Filter by party role (CLS vocabulary).'
example: general_contractor
-
in: query
name: is_active
description: 'Filter by active state.'
example: true
required: true
schema:
type: boolean
description: 'Filter by active state.'
example: true
-
in: query
name: per_page
description: 'Results per page. Clamped to 1-100; defaults to 15.'
example: 15
required: true
schema:
type: integer
description: 'Results per page. Clamped to 1-100; defaults to 15.'
example: 15
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
data:
-
id: 1aa54411-f745-4581-a543-f249e4354ce1
project_id: 2628312c-b356-41be-99ab-c1540374b2b5
organization_id: a1c43657-6c86-42d7-ab95-e0808490127c
division_id: null
is_claimant: false
contact_id: null
role: owner-on-title
tier: sub
license_number: LIC-024635
contract_amount: '1485225.30'
is_active: true
metadata: null
created_at: '2026-10-05T15:49:19+00:00'
updated_at: '2026-10-05T15:49:19+00:00'
-
id: 44f08e8a-e117-4440-94ea-955aa3579d28
project_id: 593edcd7-a5ed-4a88-91d0-0e6663bade44
organization_id: c2b1d8a0-36f4-4bc6-9ed5-633276e3242f
division_id: null
is_claimant: false
contact_id: null
role: owner-on-title
tier: prime
license_number: LIC-693053
contract_amount: null
is_active: true
metadata: null
created_at: '2026-10-05T15:49:19+00:00'
updated_at: '2026-10-05T15:49:19+00:00'
links:
first: '/?page=1'
last: '/?page=1'
prev: null
next: null
meta:
current_page: 1
from: 1
last_page: 1
links:
-
url: null
label: '« Previous'
page: null
active: false
-
url: '/?page=1'
label: '1'
page: 1
active: true
-
url: null
label: 'Next »'
page: null
active: false
path: /
per_page: 15
to: 2
total: 2
properties:
data:
type: array
example:
-
id: 1aa54411-f745-4581-a543-f249e4354ce1
project_id: 2628312c-b356-41be-99ab-c1540374b2b5
organization_id: a1c43657-6c86-42d7-ab95-e0808490127c
division_id: null
is_claimant: false
contact_id: null
role: owner-on-title
tier: sub
license_number: LIC-024635
contract_amount: '1485225.30'
is_active: true
metadata: null
created_at: '2026-10-05T15:49:19+00:00'
updated_at: '2026-10-05T15:49:19+00:00'
-
id: 44f08e8a-e117-4440-94ea-955aa3579d28
project_id: 593edcd7-a5ed-4a88-91d0-0e6663bade44
organization_id: c2b1d8a0-36f4-4bc6-9ed5-633276e3242f
division_id: null
is_claimant: false
contact_id: null
role: owner-on-title
tier: prime
license_number: LIC-693053
contract_amount: null
is_active: true
metadata: null
created_at: '2026-10-05T15:49:19+00:00'
updated_at: '2026-10-05T15:49:19+00:00'
items:
type: object
properties:
id:
type: string
example: 1aa54411-f745-4581-a543-f249e4354ce1
project_id:
type: string
example: 2628312c-b356-41be-99ab-c1540374b2b5
organization_id:
type: string
example: a1c43657-6c86-42d7-ab95-e0808490127c
division_id:
type: string
example: null
nullable: true
is_claimant:
type: boolean
example: false
contact_id:
type: string
example: null
nullable: true
role:
type: string
example: owner-on-title
tier:
type: string
example: sub
license_number:
type: string
example: LIC-024635
contract_amount:
type: string
example: '1485225.30'
is_active:
type: boolean
example: true
metadata:
type: string
example: null
nullable: true
created_at:
type: string
example: '2026-10-05T15:49:19+00:00'
updated_at:
type: string
example: '2026-10-05T15:49:19+00:00'
links:
type: object
properties:
first:
type: string
example: '/?page=1'
last:
type: string
example: '/?page=1'
prev:
type: string
example: null
nullable: true
next:
type: string
example: null
nullable: true
meta:
type: object
properties:
current_page:
type: integer
example: 1
from:
type: integer
example: 1
last_page:
type: integer
example: 1
links:
type: array
example:
-
url: null
label: '« Previous'
page: null
active: false
-
url: '/?page=1'
label: '1'
page: 1
active: true
-
url: null
label: 'Next »'
page: null
active: false
items:
type: object
properties:
url:
type: string
example: null
nullable: true
label:
type: string
example: '« Previous'
page:
type: string
example: null
nullable: true
active:
type: boolean
example: false
path:
type: string
example: /
per_page:
type: integer
example: 15
to:
type: integer
example: 2
total:
type: integer
example: 2
tags:
- Parties
post:
summary: 'Create a party'
operationId: createAParty
description: 'Creates a party and returns it.'
parameters:
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
201:
description: ''
content:
application/json:
schema:
type: object
example:
data:
id: d2646e28-fae3-4538-8496-cb00dbdf2bc1
project_id: 8e41f863-5b9d-4068-96f0-b5961519ac38
organization_id: 35542e78-b04e-4676-ab38-3744249e8a31
division_id: null
is_claimant: false
contact_id: null
role: general-contractor
tier: null
license_number: LIC-589365
contract_amount: '456205.34'
is_active: true
metadata: null
created_at: '2026-10-05T15:49:19+00:00'
updated_at: '2026-10-05T15:49:19+00:00'
properties:
data:
type: object
properties:
id:
type: string
example: d2646e28-fae3-4538-8496-cb00dbdf2bc1
project_id:
type: string
example: 8e41f863-5b9d-4068-96f0-b5961519ac38
organization_id:
type: string
example: 35542e78-b04e-4676-ab38-3744249e8a31
division_id:
type: string
example: null
nullable: true
is_claimant:
type: boolean
example: false
contact_id:
type: string
example: null
nullable: true
role:
type: string
example: general-contractor
tier:
type: string
example: null
nullable: true
license_number:
type: string
example: LIC-589365
contract_amount:
type: string
example: '456205.34'
is_active:
type: boolean
example: true
metadata:
type: string
example: null
nullable: true
created_at:
type: string
example: '2026-10-05T15:49:19+00:00'
updated_at:
type: string
example: '2026-10-05T15:49:19+00:00'
tags:
- Parties
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
project_id:
type: string
description: 'UUID of the project. Must match an existing stored value.'
example: 9b7e0e2a-1c3d-4f5a-8b6c-2d4e6f8a0b1c
organization_id:
type: string
description: 'UUID of the organization this record belongs to. Must be one the API key can access. Must match an existing stored value.'
example: 9b7e0e2a-1c3d-4f5a-8b6c-2d4e6f8a0b1c
contact_id:
type: string
description: 'Optional UUID of a contact to associate with this party. Must match an existing stored value.'
example: 9b7e0e2a-1c3d-4f5a-8b6c-2d4e6f8a0b1c
nullable: true
role:
type: string
description: 'Party role in the CLS vocabulary (property_owner, general_contractor, subcontractor, ...).'
example: general_contractor
enum:
- owner-on-title
- owner-reputed-owner
- reputed-owner
- general-contractor
- sub-contractor
- 2nd-tier-contractor
- 3rd-tier-contractor
- material-supplier
- equipment-supplier
- labor-supplier
- lender-beneficiary
- surety-bond-company
- architect
- title-company
- escrow-title-agency
- developer
- construction-manager
- project-manager
- owner-representative
- project-owner
- lessee
- lessor
- sub-lessee
- home-owners-association
- property-manager
- trustee
- insurance-agency
- professional-services
- copy-to
tier:
type: string
description: 'Contracting tier: prime, sub, or sub-sub.'
example: prime
enum:
- prime
- sub
- sub-sub
nullable: true
license_number:
type: string
description: 'Party contractor license number. Must not be greater than 255 characters.'
example: LIC-119284
nullable: true
contract_amount:
type: number
description: 'Party contract value, in dollars. Must be at least 0.'
example: 250000.0
nullable: true
is_active:
type: boolean
description: 'Whether the record is active. Defaults to true.'
example: true
nullable: true
metadata:
type: object
description: 'Free-form keyvalue bag stored alongside the record (max 32 KB, depth 6, 500 items).'
example: null
properties: {}
nullable: true
required:
- project_id
- organization_id
- role
'/api/v1/parties/{uuid}':
get:
summary: 'Retrieve a party'
operationId: retrieveAParty
description: 'Returns a single party by UUID.'
parameters:
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
data:
id: d1c6aa90-619f-4fc3-b83f-55dd08023323
project_id: 911f6a43-48c7-4e2e-9f78-2bf33fd30e51
organization_id: 2c65f467-0ca5-46b4-8e17-7f1e6d3d5091
division_id: null
is_claimant: false
contact_id: null
role: general-contractor
tier: sub-sub
license_number: LIC-031881
contract_amount: '1483598.02'
is_active: true
metadata: null
created_at: '2026-10-05T15:49:19+00:00'
updated_at: '2026-10-05T15:49:19+00:00'
properties:
data:
type: object
properties:
id:
type: string
example: d1c6aa90-619f-4fc3-b83f-55dd08023323
project_id:
type: string
example: 911f6a43-48c7-4e2e-9f78-2bf33fd30e51
organization_id:
type: string
example: 2c65f467-0ca5-46b4-8e17-7f1e6d3d5091
division_id:
type: string
example: null
nullable: true
is_claimant:
type: boolean
example: false
contact_id:
type: string
example: null
nullable: true
role:
type: string
example: general-contractor
tier:
type: string
example: sub-sub
license_number:
type: string
example: LIC-031881
contract_amount:
type: string
example: '1483598.02'
is_active:
type: boolean
example: true
metadata:
type: string
example: null
nullable: true
created_at:
type: string
example: '2026-10-05T15:49:19+00:00'
updated_at:
type: string
example: '2026-10-05T15:49:19+00:00'
tags:
- Parties
put:
summary: 'Update a party'
operationId: updateAParty
description: 'Partial update. The is_claimant party rejects role / is_active changes (422).'
parameters:
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
data:
id: c55152d3-a81e-4d30-a3db-0b4c72975eb2
project_id: 5d916c3a-44a4-46d0-957f-781e1e93ec7c
organization_id: e475924f-595c-430b-b14d-74894993c4ac
division_id: null
is_claimant: false
contact_id: null
role: general-contractor
tier: null
license_number: LIC-589365
contract_amount: '456205.34'
is_active: true
metadata: null
created_at: '2026-10-05T15:49:19+00:00'
updated_at: '2026-10-05T15:49:19+00:00'
properties:
data:
type: object
properties:
id:
type: string
example: c55152d3-a81e-4d30-a3db-0b4c72975eb2
project_id:
type: string
example: 5d916c3a-44a4-46d0-957f-781e1e93ec7c
organization_id:
type: string
example: e475924f-595c-430b-b14d-74894993c4ac
division_id:
type: string
example: null
nullable: true
is_claimant:
type: boolean
example: false
contact_id:
type: string
example: null
nullable: true
role:
type: string
example: general-contractor
tier:
type: string
example: null
nullable: true
license_number:
type: string
example: LIC-589365
contract_amount:
type: string
example: '456205.34'
is_active:
type: boolean
example: true
metadata:
type: string
example: null
nullable: true
created_at:
type: string
example: '2026-10-05T15:49:19+00:00'
updated_at:
type: string
example: '2026-10-05T15:49:19+00:00'
tags:
- Parties
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
contact_id:
type: string
description: 'Optional UUID of a contact to associate with this party. Must match an existing stored value.'
example: 9b7e0e2a-1c3d-4f5a-8b6c-2d4e6f8a0b1c
nullable: true
role:
type: string
description: 'Party role in the CLS vocabulary. Cannot be changed on the system-managed is_claimant party.'
example: general_contractor
enum:
- owner-on-title
- owner-reputed-owner
- reputed-owner
- general-contractor
- sub-contractor
- 2nd-tier-contractor
- 3rd-tier-contractor
- material-supplier
- equipment-supplier
- labor-supplier
- lender-beneficiary
- surety-bond-company
- architect
- title-company
- escrow-title-agency
- developer
- construction-manager
- project-manager
- owner-representative
- project-owner
- lessee
- lessor
- sub-lessee
- home-owners-association
- property-manager
- trustee
- insurance-agency
- professional-services
- copy-to
tier:
type: string
description: 'Contracting tier: prime, sub, or sub-sub.'
example: prime
enum:
- prime
- sub
- sub-sub
nullable: true
license_number:
type: string
description: 'Party contractor license number. Must not be greater than 255 characters.'
example: LIC-119284
nullable: true
contract_amount:
type: number
description: 'Party contract value, in dollars. Must be at least 0.'
example: 250000.0
nullable: true
is_active:
type: boolean
description: 'Whether the party is active. Cannot be changed on the system-managed is_claimant party.'
example: true
nullable: true
metadata:
type: object
description: 'Free-form keyvalue bag stored alongside the record (max 32 KB, depth 6, 500 items).'
example: null
properties: {}
nullable: true
delete:
summary: 'Delete a party'
operationId: deleteAParty
description: 'Deletes the party. The system-managed is_claimant party cannot be deleted (422).'
parameters:
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
message: 'Party deleted.'
properties:
message:
type: string
example: 'Party deleted.'
tags:
- Parties
parameters:
-
in: path
name: uuid
description: ''
example: 6ff8f7f6-1eb3-3525-be4a-3932c805afed
required: true
schema:
type: string
/api/v1/pay-applications:
get:
summary: 'List pay applications'
operationId: listPayApplications
description: 'Paginated G702/G703 pay applications visible to the caller.'
parameters:
-
in: query
name: status
description: 'Filter by lifecycle status.'
example: architecto
required: true
schema:
type: string
description: 'Filter by lifecycle status.'
example: architecto
-
in: query
name: project_id
description: 'Filter to this project (UUID).'
example: 9b7e0e2a-1c3d-4f5a-8b6c-2d4e6f8a0b1c
required: true
schema:
type: string
description: 'Filter to this project (UUID).'
example: 9b7e0e2a-1c3d-4f5a-8b6c-2d4e6f8a0b1c
-
in: query
name: per_page
description: 'Results per page. Clamped to 1-100; defaults to 15.'
example: 15
required: true
schema:
type: integer
description: 'Results per page. Clamped to 1-100; defaults to 15.'
example: 15
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
data:
-
id: 2a852107-b50d-44a0-bfcc-f76bff555a2e
application_number: 17
period_from: '1996-07-19'
period_to: '2020-02-16'
total_contract_amount: '4977103.93'
previous_billed_amount: '607748.02'
current_billing_amount: '949513.30'
retainage_percent: '0.00'
retainage_amount: '0.00'
total_completed_to_date: '1557261.32'
balance_to_finish: '3419842.61'
status: draft
sov_line_items: null
cls_reference_id: null
metadata: null
created_at: '2026-10-05T15:49:19+00:00'
updated_at: '2026-10-05T15:49:19+00:00'
-
id: bf7b998b-db2c-4c37-abb0-f8385f993972
application_number: 43
period_from: '2009-02-16'
period_to: '1990-04-07'
total_contract_amount: '1077361.99'
previous_billed_amount: '120550.69'
current_billing_amount: '53163.61'
retainage_percent: '0.00'
retainage_amount: '0.00'
total_completed_to_date: '173714.30'
balance_to_finish: '903647.69'
status: draft
sov_line_items: null
cls_reference_id: null
metadata: null
created_at: '2026-10-05T15:49:19+00:00'
updated_at: '2026-10-05T15:49:19+00:00'
links:
first: '/?page=1'
last: '/?page=1'
prev: null
next: null
meta:
current_page: 1
from: 1
last_page: 1
links:
-
url: null
label: '« Previous'
page: null
active: false
-
url: '/?page=1'
label: '1'
page: 1
active: true
-
url: null
label: 'Next »'
page: null
active: false
path: /
per_page: 15
to: 2
total: 2
properties:
data:
type: array
example:
-
id: 2a852107-b50d-44a0-bfcc-f76bff555a2e
application_number: 17
period_from: '1996-07-19'
period_to: '2020-02-16'
total_contract_amount: '4977103.93'
previous_billed_amount: '607748.02'
current_billing_amount: '949513.30'
retainage_percent: '0.00'
retainage_amount: '0.00'
total_completed_to_date: '1557261.32'
balance_to_finish: '3419842.61'
status: draft
sov_line_items: null
cls_reference_id: null
metadata: null
created_at: '2026-10-05T15:49:19+00:00'
updated_at: '2026-10-05T15:49:19+00:00'
-
id: bf7b998b-db2c-4c37-abb0-f8385f993972
application_number: 43
period_from: '2009-02-16'
period_to: '1990-04-07'
total_contract_amount: '1077361.99'
previous_billed_amount: '120550.69'
current_billing_amount: '53163.61'
retainage_percent: '0.00'
retainage_amount: '0.00'
total_completed_to_date: '173714.30'
balance_to_finish: '903647.69'
status: draft
sov_line_items: null
cls_reference_id: null
metadata: null
created_at: '2026-10-05T15:49:19+00:00'
updated_at: '2026-10-05T15:49:19+00:00'
items:
type: object
properties:
id:
type: string
example: 2a852107-b50d-44a0-bfcc-f76bff555a2e
application_number:
type: integer
example: 17
period_from:
type: string
example: '1996-07-19'
period_to:
type: string
example: '2020-02-16'
total_contract_amount:
type: string
example: '4977103.93'
previous_billed_amount:
type: string
example: '607748.02'
current_billing_amount:
type: string
example: '949513.30'
retainage_percent:
type: string
example: '0.00'
retainage_amount:
type: string
example: '0.00'
total_completed_to_date:
type: string
example: '1557261.32'
balance_to_finish:
type: string
example: '3419842.61'
status:
type: string
example: draft
sov_line_items:
type: string
example: null
nullable: true
cls_reference_id:
type: string
example: null
nullable: true
metadata:
type: string
example: null
nullable: true
created_at:
type: string
example: '2026-10-05T15:49:19+00:00'
updated_at:
type: string
example: '2026-10-05T15:49:19+00:00'
links:
type: object
properties:
first:
type: string
example: '/?page=1'
last:
type: string
example: '/?page=1'
prev:
type: string
example: null
nullable: true
next:
type: string
example: null
nullable: true
meta:
type: object
properties:
current_page:
type: integer
example: 1
from:
type: integer
example: 1
last_page:
type: integer
example: 1
links:
type: array
example:
-
url: null
label: '« Previous'
page: null
active: false
-
url: '/?page=1'
label: '1'
page: 1
active: true
-
url: null
label: 'Next »'
page: null
active: false
items:
type: object
properties:
url:
type: string
example: null
nullable: true
label:
type: string
example: '« Previous'
page:
type: string
example: null
nullable: true
active:
type: boolean
example: false
path:
type: string
example: /
per_page:
type: integer
example: 15
to:
type: integer
example: 2
total:
type: integer
example: 2
tags:
- 'Pay Applications'
post:
summary: 'Create a pay application'
operationId: createAPayApplication
description: 'Creates a pay application, optionally with inline SOV line items and participants.'
parameters:
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
201:
description: ''
content:
application/json:
schema:
type: object
example:
data:
id: 39e9ede3-7c2d-4807-a505-fed07903e7bb
application_number: 16
period_from: '1972-10-24'
period_to: '1996-07-19'
total_contract_amount: '1976890.61'
previous_billed_amount: '983826.63'
current_billing_amount: '145593.19'
retainage_percent: '0.00'
retainage_amount: '0.00'
total_completed_to_date: '1129419.82'
balance_to_finish: '847470.79'
status: draft
sov_line_items: null
cls_reference_id: null
metadata: null
created_at: '2026-10-05T15:49:19+00:00'
updated_at: '2026-10-05T15:49:19+00:00'
properties:
data:
type: object
properties:
id:
type: string
example: 39e9ede3-7c2d-4807-a505-fed07903e7bb
application_number:
type: integer
example: 16
period_from:
type: string
example: '1972-10-24'
period_to:
type: string
example: '1996-07-19'
total_contract_amount:
type: string
example: '1976890.61'
previous_billed_amount:
type: string
example: '983826.63'
current_billing_amount:
type: string
example: '145593.19'
retainage_percent:
type: string
example: '0.00'
retainage_amount:
type: string
example: '0.00'
total_completed_to_date:
type: string
example: '1129419.82'
balance_to_finish:
type: string
example: '847470.79'
status:
type: string
example: draft
sov_line_items:
type: string
example: null
nullable: true
cls_reference_id:
type: string
example: null
nullable: true
metadata:
type: string
example: null
nullable: true
created_at:
type: string
example: '2026-10-05T15:49:19+00:00'
updated_at:
type: string
example: '2026-10-05T15:49:19+00:00'
tags:
- 'Pay Applications'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
project_id:
type: string
description: 'UUID of the project. Must match an existing stored value.'
example: 9b7e0e2a-1c3d-4f5a-8b6c-2d4e6f8a0b1c
division_id:
type: string
description: 'UUID of the claimant division. Optional: inherited from the project. Supplying a division other than the project one is rejected (422). Must match an existing stored value.'
example: 9b7e0e2a-1c3d-4f5a-8b6c-2d4e6f8a0b1c
nullable: true
application_number:
type: integer
description: 'Sequential pay application number for the project. Must be at least 1.'
example: 3
period_from:
type: string
description: 'Start of the billing period (YYYY-MM-DD). Must be a valid date.'
example: '2026-05-01'
period_to:
type: string
description: 'End of the billing period; on or after period_from. Must be a valid date. Must be a date after or equal to period_from.'
example: '2026-05-31'
total_contract_amount:
type: number
description: 'Total contract value to date, in dollars. Must be at least 0.'
example: 600000.0
current_billing_amount:
type: number
description: 'Amount billed this period, in dollars. Must be at least 0.'
example: 75000.0
previous_billed_amount:
type: number
description: 'Amount billed in prior periods, in dollars. Must be at least 0.'
example: 0.0
nullable: true
retainage_percent:
type: number
description: 'Retainage withheld, as a percent (0 to 100). Must be at least 0. Must not be greater than 100.'
example: 10.0
nullable: true
sov_line_items:
type: array
description: 'Inline schedule-of-values rows (alternative to a stored SOV). Must not have more than 1000 items.'
example: null
items:
type: object
nullable: true
properties:
description:
type: string
description: 'Line item description. This field is required when sov_line_items is present. Must not be greater than 10000 characters.'
example: 'Concrete - foundations'
scheduled_value:
type: number
description: 'Scheduled value for the line, in dollars. This field is required when sov_line_items is present.'
example: 50000.0
previous:
type: number
description: 'Value completed in prior periods, in dollars.'
example: 0.0
nullable: true
this_period:
type: number
description: 'Value completed this period, in dollars.'
example: 12000.0
nullable: true
cls_reference_id:
type: string
description: 'Optional external reference id carried through to CLS. Must not be greater than 255 characters.'
example: CLS-10842
nullable: true
metadata:
type: object
description: 'Free-form keyvalue bag stored alongside the record (max 32 KB, depth 6, 500 items).'
example: null
properties: {}
nullable: true
participants:
type: array
description: 'Organizations to attach to this pay application, with their role. Must not have more than 50 items.'
example: null
items:
type: object
nullable: true
properties:
organization_id:
type: string
description: 'UUID of a participating organization. This field is required when participants is present. Must match an existing stored value.'
example: 9b7e0e2a-1c3d-4f5a-8b6c-2d4e6f8a0b1c
role:
type: string
description: 'Participant role: sender, receiver, or reviewer. This field is required when participants is present.'
example: receiver
enum:
- sender
- receiver
- reviewer
required:
- project_id
- application_number
- period_from
- period_to
- total_contract_amount
- current_billing_amount
'/api/v1/pay-applications/{uuid}':
get:
summary: 'Retrieve a pay application'
operationId: retrieveAPayApplication
description: 'Returns a single pay application by UUID.'
parameters:
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
data:
id: 58924756-bc0d-466a-8f5b-d07039fb7afe
application_number: 33
period_from: '2010-03-28'
period_to: '2022-06-24'
total_contract_amount: '109752.23'
previous_billed_amount: '53431.06'
current_billing_amount: '12714.35'
retainage_percent: '0.00'
retainage_amount: '0.00'
total_completed_to_date: '66145.41'
balance_to_finish: '43606.82'
status: draft
sov_line_items: null
cls_reference_id: null
metadata: null
created_at: '2026-10-05T15:49:19+00:00'
updated_at: '2026-10-05T15:49:19+00:00'
properties:
data:
type: object
properties:
id:
type: string
example: 58924756-bc0d-466a-8f5b-d07039fb7afe
application_number:
type: integer
example: 33
period_from:
type: string
example: '2010-03-28'
period_to:
type: string
example: '2022-06-24'
total_contract_amount:
type: string
example: '109752.23'
previous_billed_amount:
type: string
example: '53431.06'
current_billing_amount:
type: string
example: '12714.35'
retainage_percent:
type: string
example: '0.00'
retainage_amount:
type: string
example: '0.00'
total_completed_to_date:
type: string
example: '66145.41'
balance_to_finish:
type: string
example: '43606.82'
status:
type: string
example: draft
sov_line_items:
type: string
example: null
nullable: true
cls_reference_id:
type: string
example: null
nullable: true
metadata:
type: string
example: null
nullable: true
created_at:
type: string
example: '2026-10-05T15:49:19+00:00'
updated_at:
type: string
example: '2026-10-05T15:49:19+00:00'
tags:
- 'Pay Applications'
parameters:
-
in: path
name: uuid
description: ''
example: 6ff8f7f6-1eb3-3525-be4a-3932c805afed
required: true
schema:
type: string
'/api/v1/pay-applications/{pay_application_uuid}/transition':
post:
summary: 'Transition a pay application'
operationId: transitionAPayApplication
description: 'Moves the pay application to submitted, under_review, approved or rejected.'
parameters:
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
data:
id: ba61bf5d-51a2-450d-86f0-e1ef6a6cbbff
application_number: 33
period_from: '2010-03-28'
period_to: '2022-06-24'
total_contract_amount: '109752.23'
previous_billed_amount: '53431.06'
current_billing_amount: '12714.35'
retainage_percent: '0.00'
retainage_amount: '0.00'
total_completed_to_date: '66145.41'
balance_to_finish: '43606.82'
status: draft
sov_line_items: null
cls_reference_id: null
metadata: null
created_at: '2026-10-05T15:49:20+00:00'
updated_at: '2026-10-05T15:49:20+00:00'
properties:
data:
type: object
properties:
id:
type: string
example: ba61bf5d-51a2-450d-86f0-e1ef6a6cbbff
application_number:
type: integer
example: 33
period_from:
type: string
example: '2010-03-28'
period_to:
type: string
example: '2022-06-24'
total_contract_amount:
type: string
example: '109752.23'
previous_billed_amount:
type: string
example: '53431.06'
current_billing_amount:
type: string
example: '12714.35'
retainage_percent:
type: string
example: '0.00'
retainage_amount:
type: string
example: '0.00'
total_completed_to_date:
type: string
example: '66145.41'
balance_to_finish:
type: string
example: '43606.82'
status:
type: string
example: draft
sov_line_items:
type: string
example: null
nullable: true
cls_reference_id:
type: string
example: null
nullable: true
metadata:
type: string
example: null
nullable: true
created_at:
type: string
example: '2026-10-05T15:49:20+00:00'
updated_at:
type: string
example: '2026-10-05T15:49:20+00:00'
tags:
- 'Pay Applications'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
status:
type: string
description: 'Target status: submitted, under_review, approved, or rejected.'
example: submitted
enum:
- submitted
- under_review
- approved
- rejected
required:
- status
parameters:
-
in: path
name: pay_application_uuid
description: ''
example: 6ff8f7f6-1eb3-3525-be4a-3932c805afed
required: true
schema:
type: string
/api/v1/projects:
get:
summary: 'List projects'
operationId: listProjects
description: 'Paginated projects visible to the caller, newest first.'
parameters:
-
in: query
name: state
description: 'Filter by two-letter US state code.'
example: CA
required: true
schema:
type: string
description: 'Filter by two-letter US state code.'
example: CA
-
in: query
name: search
description: 'Case-insensitive partial match on name and project number.'
example: architecto
required: true
schema:
type: string
description: 'Case-insensitive partial match on name and project number.'
example: architecto
-
in: query
name: per_page
description: 'Results per page. Clamped to 1-100; defaults to 15.'
example: 15
required: true
schema:
type: integer
description: 'Results per page. Clamped to 1-100; defaults to 15.'
example: 15
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
data:
-
id: 977f512d-f0d1-4407-b25a-33adef1921b4
name: 'eius et animi Project'
division_id: c9af0603-2c74-4a4f-93d7-bccf0331169d
project_number: PRJ-26316
description: null
address:
line_1: '40575 Dickens Inlet'
line_2: null
city: Myaport
state: CT
zip: '08182'
county: null
project_type: null
contract_amount: '177784.58'
date_contract: '1981-06-04'
cls_reference_id: null
metadata: null
created_at: '2026-10-05T15:49:19+00:00'
updated_at: '2026-10-05T15:49:19+00:00'
-
id: a1b39ffb-a611-4c0c-bc79-07d8364a71a1
name: 'repellendus assumenda et Project'
division_id: 41a84ca3-8481-4ccf-912f-b0bc0ea46bc6
project_number: PRJ-82438
description: 'Quia perspiciatis deserunt ducimus corrupti et.'
address:
line_1: '93199 Walker Avenue'
line_2: null
city: Kreigerburgh
state: FL
zip: '96823'
county: ut
project_type: null
contract_amount: '305560.48'
date_contract: '1996-08-19'
cls_reference_id: null
metadata: null
created_at: '2026-10-05T15:49:19+00:00'
updated_at: '2026-10-05T15:49:19+00:00'
links:
first: '/?page=1'
last: '/?page=1'
prev: null
next: null
meta:
current_page: 1
from: 1
last_page: 1
links:
-
url: null
label: '« Previous'
page: null
active: false
-
url: '/?page=1'
label: '1'
page: 1
active: true
-
url: null
label: 'Next »'
page: null
active: false
path: /
per_page: 15
to: 2
total: 2
properties:
data:
type: array
example:
-
id: 977f512d-f0d1-4407-b25a-33adef1921b4
name: 'eius et animi Project'
division_id: c9af0603-2c74-4a4f-93d7-bccf0331169d
project_number: PRJ-26316
description: null
address:
line_1: '40575 Dickens Inlet'
line_2: null
city: Myaport
state: CT
zip: '08182'
county: null
project_type: null
contract_amount: '177784.58'
date_contract: '1981-06-04'
cls_reference_id: null
metadata: null
created_at: '2026-10-05T15:49:19+00:00'
updated_at: '2026-10-05T15:49:19+00:00'
-
id: a1b39ffb-a611-4c0c-bc79-07d8364a71a1
name: 'repellendus assumenda et Project'
division_id: 41a84ca3-8481-4ccf-912f-b0bc0ea46bc6
project_number: PRJ-82438
description: 'Quia perspiciatis deserunt ducimus corrupti et.'
address:
line_1: '93199 Walker Avenue'
line_2: null
city: Kreigerburgh
state: FL
zip: '96823'
county: ut
project_type: null
contract_amount: '305560.48'
date_contract: '1996-08-19'
cls_reference_id: null
metadata: null
created_at: '2026-10-05T15:49:19+00:00'
updated_at: '2026-10-05T15:49:19+00:00'
items:
type: object
properties:
id:
type: string
example: 977f512d-f0d1-4407-b25a-33adef1921b4
name:
type: string
example: 'eius et animi Project'
division_id:
type: string
example: c9af0603-2c74-4a4f-93d7-bccf0331169d
project_number:
type: string
example: PRJ-26316
description:
type: string
example: null
nullable: true
address:
type: object
properties:
line_1:
type: string
example: '40575 Dickens Inlet'
line_2:
type: string
example: null
nullable: true
city:
type: string
example: Myaport
state:
type: string
example: CT
zip:
type: string
example: '08182'
county:
type: string
example: null
nullable: true
project_type:
type: string
example: null
nullable: true
contract_amount:
type: string
example: '177784.58'
date_contract:
type: string
example: '1981-06-04'
cls_reference_id:
type: string
example: null
nullable: true
metadata:
type: string
example: null
nullable: true
created_at:
type: string
example: '2026-10-05T15:49:19+00:00'
updated_at:
type: string
example: '2026-10-05T15:49:19+00:00'
links:
type: object
properties:
first:
type: string
example: '/?page=1'
last:
type: string
example: '/?page=1'
prev:
type: string
example: null
nullable: true
next:
type: string
example: null
nullable: true
meta:
type: object
properties:
current_page:
type: integer
example: 1
from:
type: integer
example: 1
last_page:
type: integer
example: 1
links:
type: array
example:
-
url: null
label: '« Previous'
page: null
active: false
-
url: '/?page=1'
label: '1'
page: 1
active: true
-
url: null
label: 'Next »'
page: null
active: false
items:
type: object
properties:
url:
type: string
example: null
nullable: true
label:
type: string
example: '« Previous'
page:
type: string
example: null
nullable: true
active:
type: boolean
example: false
path:
type: string
example: /
per_page:
type: integer
example: 15
to:
type: integer
example: 2
total:
type: integer
example: 2
tags:
- Projects
post:
summary: 'Create a project'
operationId: createAProject
description: 'Creates a project and returns it.'
parameters:
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
201:
description: ''
content:
application/json:
schema:
type: object
example:
data:
id: a6965421-92a8-4b3e-ae7e-1f53728d1882
name: 'sunt nihil accusantium Project'
division_id: d385fff3-210c-428c-b62c-1c4f7adfb4cb
project_number: PRJ-80841
description: null
address:
line_1: '78142 Nick Field'
line_2: null
city: 'West Noahmouth'
state: WV
zip: 59021-4902
county: null
project_type: null
contract_amount: '655842.27'
date_contract: '1977-08-15'
cls_reference_id: null
metadata: null
created_at: '2026-10-05T15:49:19+00:00'
updated_at: '2026-10-05T15:49:19+00:00'
properties:
data:
type: object
properties:
id:
type: string
example: a6965421-92a8-4b3e-ae7e-1f53728d1882
name:
type: string
example: 'sunt nihil accusantium Project'
division_id:
type: string
example: d385fff3-210c-428c-b62c-1c4f7adfb4cb
project_number:
type: string
example: PRJ-80841
description:
type: string
example: null
nullable: true
address:
type: object
properties:
line_1:
type: string
example: '78142 Nick Field'
line_2:
type: string
example: null
nullable: true
city:
type: string
example: 'West Noahmouth'
state:
type: string
example: WV
zip:
type: string
example: 59021-4902
county:
type: string
example: null
nullable: true
project_type:
type: string
example: null
nullable: true
contract_amount:
type: string
example: '655842.27'
date_contract:
type: string
example: '1977-08-15'
cls_reference_id:
type: string
example: null
nullable: true
metadata:
type: string
example: null
nullable: true
created_at:
type: string
example: '2026-10-05T15:49:19+00:00'
updated_at:
type: string
example: '2026-10-05T15:49:19+00:00'
tags:
- Projects
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
name:
type: string
description: 'Project name. Must not be greater than 255 characters.'
example: 'Riverside Medical Center'
division_id:
type: string
description: 'UUID of the claimant division for this project. Required. Also materialised as the system-managed is_claimant party. Must match an existing stored value.'
example: 9b7e0e2a-1c3d-4f5a-8b6c-2d4e6f8a0b1c
claimant_role:
type: string
description: 'The claimant role on the project (CLS vocabulary), e.g. general_contractor or subcontractor.'
example: general_contractor
enum:
- general-contractor
- sub-contractor
- 2nd-tier-contractor
- 3rd-tier-contractor
- material-supplier
- equipment-supplier
- labor-supplier
date_contract:
type: string
description: 'Prime/sub contract date (YYYY-MM-DD). Required later for G702 generation. Must be a valid date.'
example: '2026-02-01'
nullable: true
project_number:
type: string
description: 'Your internal project number. Must not be greater than 255 characters.'
example: PRJ-1042
nullable: true
description:
type: string
description: 'Optional project description. Must not be greater than 10000 characters.'
example: 'Eius et animi quos velit et.'
nullable: true
address_line_1:
type: string
description: 'Street address, line 1. Must not be greater than 255 characters.'
example: '100 Commerce Blvd'
nullable: true
address_line_2:
type: string
description: 'Street address, line 2 (suite, unit). Must not be greater than 255 characters.'
example: v
nullable: true
city:
type: string
description: 'City. Must not be greater than 255 characters.'
example: Austin
nullable: true
state:
type: string
description: 'Two-letter US state code. Must be 2 characters.'
example: CA
nullable: true
zip:
type: string
description: 'Postal code (5 or 9 digit). Must not be greater than 10 characters.'
example: '78701'
nullable: true
county:
type: string
description: 'County name. Must not be greater than 255 characters.'
example: Travis
nullable: true
project_type:
type: string
description: 'CLS project type (fmp-diy vocabulary). Public-work types (gov-*, tribal) look for bond information on notices; private types look for a construction lender.'
example: com-new-build
enum:
- com-new-build
- com-tenant-improvement
- com-apartments
- res-spec-home
- res-tract-home
- res-condos
- res-owner-occupied
- res-restoration
- gov-state
- gov-federal
- gov-education-public
- gov-education-private
- tribal
- unknown
nullable: true
contract_amount:
type: number
description: 'Project contract value, in dollars. Must be at least 0.'
example: 600000.0
nullable: true
cls_reference_id:
type: string
description: 'Optional external reference id carried through to CLS. Must not be greater than 255 characters.'
example: CLS-10842
nullable: true
metadata:
type: object
description: 'Free-form keyvalue bag stored alongside the record (max 32 KB, depth 6, 500 items).'
example: null
properties: {}
nullable: true
participants:
type: array
description: 'Organizations to attach to the project, with their role. Must not have more than 50 items.'
example: null
items:
type: object
nullable: true
properties:
organization_id:
type: string
description: 'UUID of a participating organization. This field is required when participants is present. Must match an existing stored value.'
example: 9b7e0e2a-1c3d-4f5a-8b6c-2d4e6f8a0b1c
role:
type: string
description: 'Participant role (CLS role token, or claimant). This field is required when participants is present.'
example: property_owner
enum:
- owner-on-title
- owner-reputed-owner
- reputed-owner
- general-contractor
- sub-contractor
- 2nd-tier-contractor
- 3rd-tier-contractor
- material-supplier
- equipment-supplier
- labor-supplier
- lender-beneficiary
- surety-bond-company
- architect
- title-company
- escrow-title-agency
- developer
- construction-manager
- project-manager
- owner-representative
- project-owner
- lessee
- lessor
- sub-lessee
- home-owners-association
- property-manager
- trustee
- insurance-agency
- professional-services
- copy-to
- claimant
required:
- name
- division_id
- claimant_role
'/api/v1/projects/{uuid}':
get:
summary: 'Retrieve a project'
operationId: retrieveAProject
description: 'Returns a single project by UUID.'
parameters:
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
data:
id: f4c690c6-9346-455b-a9f0-4e0e1fe4fbed
name: 'aut adipisci quidem Project'
division_id: 19381109-7056-436d-aa74-7af76e82a924
project_number: PRJ-00432
description: null
address:
line_1: '38862 Ferne Locks Suite 058'
line_2: null
city: Christianshire
state: IA
zip: '97161'
county: tempora
project_type: null
contract_amount: '3701357.66'
date_contract: '1985-12-26'
cls_reference_id: null
metadata: null
created_at: '2026-10-05T15:49:19+00:00'
updated_at: '2026-10-05T15:49:19+00:00'
properties:
data:
type: object
properties:
id:
type: string
example: f4c690c6-9346-455b-a9f0-4e0e1fe4fbed
name:
type: string
example: 'aut adipisci quidem Project'
division_id:
type: string
example: 19381109-7056-436d-aa74-7af76e82a924
project_number:
type: string
example: PRJ-00432
description:
type: string
example: null
nullable: true
address:
type: object
properties:
line_1:
type: string
example: '38862 Ferne Locks Suite 058'
line_2:
type: string
example: null
nullable: true
city:
type: string
example: Christianshire
state:
type: string
example: IA
zip:
type: string
example: '97161'
county:
type: string
example: tempora
project_type:
type: string
example: null
nullable: true
contract_amount:
type: string
example: '3701357.66'
date_contract:
type: string
example: '1985-12-26'
cls_reference_id:
type: string
example: null
nullable: true
metadata:
type: string
example: null
nullable: true
created_at:
type: string
example: '2026-10-05T15:49:19+00:00'
updated_at:
type: string
example: '2026-10-05T15:49:19+00:00'
tags:
- Projects
put:
summary: 'Update a project'
operationId: updateAProject
description: 'Applies a partial update to a project and returns it.'
parameters:
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
data:
id: 21f6303b-59e0-4d7e-a0c8-4b55d56aaaa2
name: 'sunt nihil accusantium Project'
division_id: 3102faa9-72f6-4ac6-8bc6-c2ba06dcd69c
project_number: PRJ-80841
description: null
address:
line_1: '78142 Nick Field'
line_2: null
city: 'West Noahmouth'
state: WV
zip: 59021-4902
county: null
project_type: null
contract_amount: '655842.27'
date_contract: '1977-08-15'
cls_reference_id: null
metadata: null
created_at: '2026-10-05T15:49:19+00:00'
updated_at: '2026-10-05T15:49:19+00:00'
properties:
data:
type: object
properties:
id:
type: string
example: 21f6303b-59e0-4d7e-a0c8-4b55d56aaaa2
name:
type: string
example: 'sunt nihil accusantium Project'
division_id:
type: string
example: 3102faa9-72f6-4ac6-8bc6-c2ba06dcd69c
project_number:
type: string
example: PRJ-80841
description:
type: string
example: null
nullable: true
address:
type: object
properties:
line_1:
type: string
example: '78142 Nick Field'
line_2:
type: string
example: null
nullable: true
city:
type: string
example: 'West Noahmouth'
state:
type: string
example: WV
zip:
type: string
example: 59021-4902
county:
type: string
example: null
nullable: true
project_type:
type: string
example: null
nullable: true
contract_amount:
type: string
example: '655842.27'
date_contract:
type: string
example: '1977-08-15'
cls_reference_id:
type: string
example: null
nullable: true
metadata:
type: string
example: null
nullable: true
created_at:
type: string
example: '2026-10-05T15:49:19+00:00'
updated_at:
type: string
example: '2026-10-05T15:49:19+00:00'
tags:
- Projects
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
name:
type: string
description: 'Project name. Must not be greater than 255 characters.'
example: 'Riverside Medical Center'
project_number:
type: string
description: 'Your internal project number. Must not be greater than 255 characters.'
example: PRJ-1042
nullable: true
description:
type: string
description: 'Optional project description. Must not be greater than 10000 characters.'
example: 'Eius et animi quos velit et.'
nullable: true
address_line_1:
type: string
description: 'Street address, line 1. Must not be greater than 255 characters.'
example: '100 Commerce Blvd'
nullable: true
address_line_2:
type: string
description: 'Street address, line 2 (suite, unit). Must not be greater than 255 characters.'
example: v
nullable: true
city:
type: string
description: 'City. Must not be greater than 255 characters.'
example: Austin
nullable: true
state:
type: string
description: 'Two-letter US state code. Must be 2 characters.'
example: CA
nullable: true
zip:
type: string
description: 'Postal code (5 or 9 digit). Must not be greater than 10 characters.'
example: '78701'
nullable: true
county:
type: string
description: 'County name. Must not be greater than 255 characters.'
example: Travis
nullable: true
project_type:
type: string
description: 'CLS project type (fmp-diy vocabulary). Public-work types (gov-*, tribal) look for bond information on notices; private types look for a construction lender.'
example: com-new-build
enum:
- com-new-build
- com-tenant-improvement
- com-apartments
- res-spec-home
- res-tract-home
- res-condos
- res-owner-occupied
- res-restoration
- gov-state
- gov-federal
- gov-education-public
- gov-education-private
- tribal
- unknown
nullable: true
contract_amount:
type: number
description: 'Project contract value, in dollars. Must be at least 0.'
example: 600000.0
nullable: true
date_contract:
type: string
description: 'Prime/sub contract date (YYYY-MM-DD). Must be a valid date.'
example: '2026-02-01'
nullable: true
cls_reference_id:
type: string
description: 'Optional external reference id carried through to CLS. Must not be greater than 255 characters.'
example: CLS-10842
nullable: true
metadata:
type: object
description: 'Free-form keyvalue bag stored alongside the record (max 32 KB, depth 6, 500 items).'
example: null
properties: {}
nullable: true
delete:
summary: 'Delete a project'
operationId: deleteAProject
description: 'Soft-deletes the project.'
parameters:
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
message: 'Project deleted.'
properties:
message:
type: string
example: 'Project deleted.'
tags:
- Projects
parameters:
-
in: path
name: uuid
description: ''
example: 6ff8f7f6-1eb3-3525-be4a-3932c805afed
required: true
schema:
type: string
/api/v1/provider-auth:
get:
summary: 'List provider credentials'
operationId: listProviderCredentials
description: 'Stored mail-provider credentials (secrets are never returned in full).'
parameters:
-
in: query
name: organization_id
description: 'Filter to this organization (UUID).'
example: 9b7e0e2a-1c3d-4f5a-8b6c-2d4e6f8a0b1c
required: true
schema:
type: string
description: 'Filter to this organization (UUID).'
example: 9b7e0e2a-1c3d-4f5a-8b6c-2d4e6f8a0b1c
-
in: query
name: provider
description: 'Filter by provider: lob, click2mail or stannp.'
example: lob
required: true
schema:
type: string
description: 'Filter by provider: lob, click2mail or stannp.'
example: lob
-
in: query
name: per_page
description: 'Results per page. Clamped to 1-100; defaults to 15.'
example: 15
required: true
schema:
type: integer
description: 'Results per page. Clamped to 1-100; defaults to 15.'
example: 15
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
data:
-
id: e2784395-8e31-406c-b14a-0eb4a9fc665a
provider: lob
label: 'adipisci quidem'
environment: sandbox
is_active: true
has_api_key: true
has_api_secret: true
verified_at: null
metadata: null
created_at: '2026-10-05T15:49:20+00:00'
updated_at: '2026-10-05T15:49:20+00:00'
-
id: b30d7f47-5ba2-4cf3-ba70-cb80ac87e885
provider: stannp
label: 'adipisci molestias'
environment: sandbox
is_active: true
has_api_key: true
has_api_secret: true
verified_at: null
metadata: null
created_at: '2026-10-05T15:49:20+00:00'
updated_at: '2026-10-05T15:49:20+00:00'
links:
first: '/?page=1'
last: '/?page=1'
prev: null
next: null
meta:
current_page: 1
from: 1
last_page: 1
links:
-
url: null
label: '« Previous'
page: null
active: false
-
url: '/?page=1'
label: '1'
page: 1
active: true
-
url: null
label: 'Next »'
page: null
active: false
path: /
per_page: 15
to: 2
total: 2
properties:
data:
type: array
example:
-
id: e2784395-8e31-406c-b14a-0eb4a9fc665a
provider: lob
label: 'adipisci quidem'
environment: sandbox
is_active: true
has_api_key: true
has_api_secret: true
verified_at: null
metadata: null
created_at: '2026-10-05T15:49:20+00:00'
updated_at: '2026-10-05T15:49:20+00:00'
-
id: b30d7f47-5ba2-4cf3-ba70-cb80ac87e885
provider: stannp
label: 'adipisci molestias'
environment: sandbox
is_active: true
has_api_key: true
has_api_secret: true
verified_at: null
metadata: null
created_at: '2026-10-05T15:49:20+00:00'
updated_at: '2026-10-05T15:49:20+00:00'
items:
type: object
properties:
id:
type: string
example: e2784395-8e31-406c-b14a-0eb4a9fc665a
provider:
type: string
example: lob
label:
type: string
example: 'adipisci quidem'
environment:
type: string
example: sandbox
is_active:
type: boolean
example: true
has_api_key:
type: boolean
example: true
has_api_secret:
type: boolean
example: true
verified_at:
type: string
example: null
nullable: true
metadata:
type: string
example: null
nullable: true
created_at:
type: string
example: '2026-10-05T15:49:20+00:00'
updated_at:
type: string
example: '2026-10-05T15:49:20+00:00'
links:
type: object
properties:
first:
type: string
example: '/?page=1'
last:
type: string
example: '/?page=1'
prev:
type: string
example: null
nullable: true
next:
type: string
example: null
nullable: true
meta:
type: object
properties:
current_page:
type: integer
example: 1
from:
type: integer
example: 1
last_page:
type: integer
example: 1
links:
type: array
example:
-
url: null
label: '« Previous'
page: null
active: false
-
url: '/?page=1'
label: '1'
page: 1
active: true
-
url: null
label: 'Next »'
page: null
active: false
items:
type: object
properties:
url:
type: string
example: null
nullable: true
label:
type: string
example: '« Previous'
page:
type: string
example: null
nullable: true
active:
type: boolean
example: false
path:
type: string
example: /
per_page:
type: integer
example: 15
to:
type: integer
example: 2
total:
type: integer
example: 2
tags:
- 'Provider Auth'
post:
summary: 'Store a provider credential'
operationId: storeAProviderCredential
description: 'Saves an encrypted mail-provider API credential.'
parameters:
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
201:
description: ''
content:
application/json:
schema:
type: object
example:
data:
id: 346bd825-e8a8-4d80-8fbd-3951c940a0d2
provider: lob
label: 'et animi'
environment: sandbox
is_active: true
has_api_key: true
has_api_secret: true
verified_at: null
metadata: null
created_at: '2026-10-05T15:49:20+00:00'
updated_at: '2026-10-05T15:49:20+00:00'
properties:
data:
type: object
properties:
id:
type: string
example: 346bd825-e8a8-4d80-8fbd-3951c940a0d2
provider:
type: string
example: lob
label:
type: string
example: 'et animi'
environment:
type: string
example: sandbox
is_active:
type: boolean
example: true
has_api_key:
type: boolean
example: true
has_api_secret:
type: boolean
example: true
verified_at:
type: string
example: null
nullable: true
metadata:
type: string
example: null
nullable: true
created_at:
type: string
example: '2026-10-05T15:49:20+00:00'
updated_at:
type: string
example: '2026-10-05T15:49:20+00:00'
tags:
- 'Provider Auth'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
organization_id:
type: string
description: 'UUID of the organization this record belongs to. Must be one the API key can access. Must match an existing stored value.'
example: 9b7e0e2a-1c3d-4f5a-8b6c-2d4e6f8a0b1c
provider:
type: string
description: 'Mail provider the credential is for.'
example: lob
enum:
- lob
- click2mail
- stannp
label:
type: string
description: 'Optional friendly name for the credential. Must not be greater than 255 characters.'
example: 'Primary Lob key'
nullable: true
api_key:
type: string
description: 'Provider API key. Stored encrypted; never returned in full. Must not be greater than 1000 characters.'
example: live_xxx
api_secret:
type: string
description: 'Optional provider API secret. Must not be greater than 1000 characters.'
example: b
nullable: true
environment:
type: string
description: 'Provider environment the credential targets.'
example: production
enum:
- sandbox
- production
nullable: true
metadata:
type: object
description: 'Free-form keyvalue bag stored alongside the record (max 32 KB, depth 6, 500 items).'
example: null
properties: {}
nullable: true
required:
- organization_id
- provider
- api_key
'/api/v1/provider-auth/{uuid}':
get:
summary: 'Retrieve a provider credential'
operationId: retrieveAProviderCredential
description: 'Returns a single credential by UUID (secrets masked).'
parameters:
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
data:
id: 78f35162-abc9-4db8-9c74-aab667972087
provider: lob
label: 'adipisci quidem'
environment: sandbox
is_active: true
has_api_key: true
has_api_secret: true
verified_at: null
metadata: null
created_at: '2026-10-05T15:49:20+00:00'
updated_at: '2026-10-05T15:49:20+00:00'
properties:
data:
type: object
properties:
id:
type: string
example: 78f35162-abc9-4db8-9c74-aab667972087
provider:
type: string
example: lob
label:
type: string
example: 'adipisci quidem'
environment:
type: string
example: sandbox
is_active:
type: boolean
example: true
has_api_key:
type: boolean
example: true
has_api_secret:
type: boolean
example: true
verified_at:
type: string
example: null
nullable: true
metadata:
type: string
example: null
nullable: true
created_at:
type: string
example: '2026-10-05T15:49:20+00:00'
updated_at:
type: string
example: '2026-10-05T15:49:20+00:00'
tags:
- 'Provider Auth'
parameters:
-
in: path
name: uuid
description: ''
example: 6ff8f7f6-1eb3-3525-be4a-3932c805afed
required: true
schema:
type: string
/api/v1/sovs:
get:
summary: 'List schedules of values'
operationId: listSchedulesOfValues
description: 'Paginated SOVs visible to the caller.'
parameters:
-
in: query
name: project_id
description: 'Filter to this project (UUID).'
example: 9b7e0e2a-1c3d-4f5a-8b6c-2d4e6f8a0b1c
required: true
schema:
type: string
description: 'Filter to this project (UUID).'
example: 9b7e0e2a-1c3d-4f5a-8b6c-2d4e6f8a0b1c
-
in: query
name: pay_application_id
description: 'Filter to this pay application (UUID).'
example: 9b7e0e2a-1c3d-4f5a-8b6c-2d4e6f8a0b1c
required: true
schema:
type: string
description: 'Filter to this pay application (UUID).'
example: 9b7e0e2a-1c3d-4f5a-8b6c-2d4e6f8a0b1c
-
in: query
name: status
description: 'Filter by lifecycle status.'
example: architecto
required: true
schema:
type: string
description: 'Filter by lifecycle status.'
example: architecto
-
in: query
name: per_page
description: 'Results per page. Clamped to 1-100; defaults to 15.'
example: 15
required: true
schema:
type: integer
description: 'Results per page. Clamped to 1-100; defaults to 15.'
example: 15
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
data:
-
id: 2f9db788-8407-4f13-969d-b56e3330acda
project_id: 2b3db26a-0028-4ff7-95ee-87c7a238d087
pay_application_id: null
name: 'Schedule of Values'
line_items:
-
item_number: 1
description: 'transform 24/365 networks'
scheduled_value: 26301.26
work_completed_from_previous: 0
work_completed_this_period: 0
materials_presently_stored: 0
total_completed_and_stored: 0
percent_complete: 0
balance_to_finish: 0
retainage: 0
-
item_number: 2
description: 'aggregate plug-and-play e-business'
scheduled_value: 73527.26
work_completed_from_previous: 0
work_completed_this_period: 0
materials_presently_stored: 0
total_completed_and_stored: 0
percent_complete: 0
balance_to_finish: 0
retainage: 0
-
item_number: 3
description: 'streamline best-of-breed communities'
scheduled_value: 42718.56
work_completed_from_previous: 0
work_completed_this_period: 0
materials_presently_stored: 0
total_completed_and_stored: 0
percent_complete: 0
balance_to_finish: 0
retainage: 0
-
item_number: 4
description: 'streamline virtual vortals'
scheduled_value: 35174.92
work_completed_from_previous: 0
work_completed_this_period: 0
materials_presently_stored: 0
total_completed_and_stored: 0
percent_complete: 0
balance_to_finish: 0
retainage: 0
-
item_number: 5
description: 'repurpose vertical convergence'
scheduled_value: 7452.43
work_completed_from_previous: 0
work_completed_this_period: 0
materials_presently_stored: 0
total_completed_and_stored: 0
percent_complete: 0
balance_to_finish: 0
retainage: 0
-
item_number: 6
description: 'implement intuitive e-tailers'
scheduled_value: 67892.93
work_completed_from_previous: 0
work_completed_this_period: 0
materials_presently_stored: 0
total_completed_and_stored: 0
percent_complete: 0
balance_to_finish: 0
retainage: 0
total_contract_amount: '253067.36'
source: manual
status: active
metadata: null
created_at: '2026-10-05T15:49:19+00:00'
updated_at: '2026-10-05T15:49:19+00:00'
-
id: a2109301-0c33-47d2-86b0-44029ae59f6c
project_id: 87ecf023-fd7c-4640-9d2f-393ef47d5b50
pay_application_id: null
name: 'Schedule of Values'
line_items:
-
item_number: 1
description: 'repurpose transparent metrics'
scheduled_value: 95837.82
work_completed_from_previous: 0
work_completed_this_period: 0
materials_presently_stored: 0
total_completed_and_stored: 0
percent_complete: 0
balance_to_finish: 0
retainage: 0
-
item_number: 2
description: 'repurpose mission-critical portals'
scheduled_value: 77640.32
work_completed_from_previous: 0
work_completed_this_period: 0
materials_presently_stored: 0
total_completed_and_stored: 0
percent_complete: 0
balance_to_finish: 0
retainage: 0
-
item_number: 3
description: 'maximize frictionless e-services'
scheduled_value: 90813.2
work_completed_from_previous: 0
work_completed_this_period: 0
materials_presently_stored: 0
total_completed_and_stored: 0
percent_complete: 0
balance_to_finish: 0
retainage: 0
-
item_number: 4
description: 'envisioneer efficient infomediaries'
scheduled_value: 28549.11
work_completed_from_previous: 0
work_completed_this_period: 0
materials_presently_stored: 0
total_completed_and_stored: 0
percent_complete: 0
balance_to_finish: 0
retainage: 0
-
item_number: 5
description: 'mesh 24/7 e-commerce'
scheduled_value: 50319.38
work_completed_from_previous: 0
work_completed_this_period: 0
materials_presently_stored: 0
total_completed_and_stored: 0
percent_complete: 0
balance_to_finish: 0
retainage: 0
-
item_number: 6
description: 'synthesize web-enabled bandwidth'
scheduled_value: 94610.18
work_completed_from_previous: 0
work_completed_this_period: 0
materials_presently_stored: 0
total_completed_and_stored: 0
percent_complete: 0
balance_to_finish: 0
retainage: 0
total_contract_amount: '437770.01'
source: manual
status: active
metadata: null
created_at: '2026-10-05T15:49:19+00:00'
updated_at: '2026-10-05T15:49:19+00:00'
links:
first: '/?page=1'
last: '/?page=1'
prev: null
next: null
meta:
current_page: 1
from: 1
last_page: 1
links:
-
url: null
label: '« Previous'
page: null
active: false
-
url: '/?page=1'
label: '1'
page: 1
active: true
-
url: null
label: 'Next »'
page: null
active: false
path: /
per_page: 15
to: 2
total: 2
properties:
data:
type: array
example:
-
id: 2f9db788-8407-4f13-969d-b56e3330acda
project_id: 2b3db26a-0028-4ff7-95ee-87c7a238d087
pay_application_id: null
name: 'Schedule of Values'
line_items:
-
item_number: 1
description: 'transform 24/365 networks'
scheduled_value: 26301.26
work_completed_from_previous: 0
work_completed_this_period: 0
materials_presently_stored: 0
total_completed_and_stored: 0
percent_complete: 0
balance_to_finish: 0
retainage: 0
-
item_number: 2
description: 'aggregate plug-and-play e-business'
scheduled_value: 73527.26
work_completed_from_previous: 0
work_completed_this_period: 0
materials_presently_stored: 0
total_completed_and_stored: 0
percent_complete: 0
balance_to_finish: 0
retainage: 0
-
item_number: 3
description: 'streamline best-of-breed communities'
scheduled_value: 42718.56
work_completed_from_previous: 0
work_completed_this_period: 0
materials_presently_stored: 0
total_completed_and_stored: 0
percent_complete: 0
balance_to_finish: 0
retainage: 0
-
item_number: 4
description: 'streamline virtual vortals'
scheduled_value: 35174.92
work_completed_from_previous: 0
work_completed_this_period: 0
materials_presently_stored: 0
total_completed_and_stored: 0
percent_complete: 0
balance_to_finish: 0
retainage: 0
-
item_number: 5
description: 'repurpose vertical convergence'
scheduled_value: 7452.43
work_completed_from_previous: 0
work_completed_this_period: 0
materials_presently_stored: 0
total_completed_and_stored: 0
percent_complete: 0
balance_to_finish: 0
retainage: 0
-
item_number: 6
description: 'implement intuitive e-tailers'
scheduled_value: 67892.93
work_completed_from_previous: 0
work_completed_this_period: 0
materials_presently_stored: 0
total_completed_and_stored: 0
percent_complete: 0
balance_to_finish: 0
retainage: 0
total_contract_amount: '253067.36'
source: manual
status: active
metadata: null
created_at: '2026-10-05T15:49:19+00:00'
updated_at: '2026-10-05T15:49:19+00:00'
-
id: a2109301-0c33-47d2-86b0-44029ae59f6c
project_id: 87ecf023-fd7c-4640-9d2f-393ef47d5b50
pay_application_id: null
name: 'Schedule of Values'
line_items:
-
item_number: 1
description: 'repurpose transparent metrics'
scheduled_value: 95837.82
work_completed_from_previous: 0
work_completed_this_period: 0
materials_presently_stored: 0
total_completed_and_stored: 0
percent_complete: 0
balance_to_finish: 0
retainage: 0
-
item_number: 2
description: 'repurpose mission-critical portals'
scheduled_value: 77640.32
work_completed_from_previous: 0
work_completed_this_period: 0
materials_presently_stored: 0
total_completed_and_stored: 0
percent_complete: 0
balance_to_finish: 0
retainage: 0
-
item_number: 3
description: 'maximize frictionless e-services'
scheduled_value: 90813.2
work_completed_from_previous: 0
work_completed_this_period: 0
materials_presently_stored: 0
total_completed_and_stored: 0
percent_complete: 0
balance_to_finish: 0
retainage: 0
-
item_number: 4
description: 'envisioneer efficient infomediaries'
scheduled_value: 28549.11
work_completed_from_previous: 0
work_completed_this_period: 0
materials_presently_stored: 0
total_completed_and_stored: 0
percent_complete: 0
balance_to_finish: 0
retainage: 0
-
item_number: 5
description: 'mesh 24/7 e-commerce'
scheduled_value: 50319.38
work_completed_from_previous: 0
work_completed_this_period: 0
materials_presently_stored: 0
total_completed_and_stored: 0
percent_complete: 0
balance_to_finish: 0
retainage: 0
-
item_number: 6
description: 'synthesize web-enabled bandwidth'
scheduled_value: 94610.18
work_completed_from_previous: 0
work_completed_this_period: 0
materials_presently_stored: 0
total_completed_and_stored: 0
percent_complete: 0
balance_to_finish: 0
retainage: 0
total_contract_amount: '437770.01'
source: manual
status: active
metadata: null
created_at: '2026-10-05T15:49:19+00:00'
updated_at: '2026-10-05T15:49:19+00:00'
items:
type: object
properties:
id:
type: string
example: 2f9db788-8407-4f13-969d-b56e3330acda
project_id:
type: string
example: 2b3db26a-0028-4ff7-95ee-87c7a238d087
pay_application_id:
type: string
example: null
nullable: true
name:
type: string
example: 'Schedule of Values'
line_items:
type: array
example:
-
item_number: 1
description: 'transform 24/365 networks'
scheduled_value: 26301.26
work_completed_from_previous: 0
work_completed_this_period: 0
materials_presently_stored: 0
total_completed_and_stored: 0
percent_complete: 0
balance_to_finish: 0
retainage: 0
-
item_number: 2
description: 'aggregate plug-and-play e-business'
scheduled_value: 73527.26
work_completed_from_previous: 0
work_completed_this_period: 0
materials_presently_stored: 0
total_completed_and_stored: 0
percent_complete: 0
balance_to_finish: 0
retainage: 0
-
item_number: 3
description: 'streamline best-of-breed communities'
scheduled_value: 42718.56
work_completed_from_previous: 0
work_completed_this_period: 0
materials_presently_stored: 0
total_completed_and_stored: 0
percent_complete: 0
balance_to_finish: 0
retainage: 0
-
item_number: 4
description: 'streamline virtual vortals'
scheduled_value: 35174.92
work_completed_from_previous: 0
work_completed_this_period: 0
materials_presently_stored: 0
total_completed_and_stored: 0
percent_complete: 0
balance_to_finish: 0
retainage: 0
-
item_number: 5
description: 'repurpose vertical convergence'
scheduled_value: 7452.43
work_completed_from_previous: 0
work_completed_this_period: 0
materials_presently_stored: 0
total_completed_and_stored: 0
percent_complete: 0
balance_to_finish: 0
retainage: 0
-
item_number: 6
description: 'implement intuitive e-tailers'
scheduled_value: 67892.93
work_completed_from_previous: 0
work_completed_this_period: 0
materials_presently_stored: 0
total_completed_and_stored: 0
percent_complete: 0
balance_to_finish: 0
retainage: 0
items:
type: object
properties:
item_number:
type: integer
example: 1
description:
type: string
example: 'transform 24/365 networks'
scheduled_value:
type: number
example: 26301.26
work_completed_from_previous:
type: integer
example: 0
work_completed_this_period:
type: integer
example: 0
materials_presently_stored:
type: integer
example: 0
total_completed_and_stored:
type: integer
example: 0
percent_complete:
type: integer
example: 0
balance_to_finish:
type: integer
example: 0
retainage:
type: integer
example: 0
total_contract_amount:
type: string
example: '253067.36'
source:
type: string
example: manual
status:
type: string
example: active
metadata:
type: string
example: null
nullable: true
created_at:
type: string
example: '2026-10-05T15:49:19+00:00'
updated_at:
type: string
example: '2026-10-05T15:49:19+00:00'
links:
type: object
properties:
first:
type: string
example: '/?page=1'
last:
type: string
example: '/?page=1'
prev:
type: string
example: null
nullable: true
next:
type: string
example: null
nullable: true
meta:
type: object
properties:
current_page:
type: integer
example: 1
from:
type: integer
example: 1
last_page:
type: integer
example: 1
links:
type: array
example:
-
url: null
label: '« Previous'
page: null
active: false
-
url: '/?page=1'
label: '1'
page: 1
active: true
-
url: null
label: 'Next »'
page: null
active: false
items:
type: object
properties:
url:
type: string
example: null
nullable: true
label:
type: string
example: '« Previous'
page:
type: string
example: null
nullable: true
active:
type: boolean
example: false
path:
type: string
example: /
per_page:
type: integer
example: 15
to:
type: integer
example: 2
total:
type: integer
example: 2
tags:
- SOVs
post:
summary: 'Create a schedule of values'
operationId: createAScheduleOfValues
description: 'Creates an SOV with 1-1000 line items.'
parameters:
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
201:
description: ''
content:
application/json:
schema:
type: object
example:
data:
id: cc12bbe1-8993-41b7-a010-de80b46ed922
project_id: 3c4cba61-5612-4532-938a-36a89908cf7a
pay_application_id: null
name: 'Schedule of Values'
line_items:
-
item_number: 1
description: 'exploit scalable supply-chains'
scheduled_value: 88168.27
work_completed_from_previous: 0
work_completed_this_period: 0
materials_presently_stored: 0
total_completed_and_stored: 0
percent_complete: 0
balance_to_finish: 0
retainage: 0
-
item_number: 2
description: 'optimize front-end e-tailers'
scheduled_value: 58195.4
work_completed_from_previous: 0
work_completed_this_period: 0
materials_presently_stored: 0
total_completed_and_stored: 0
percent_complete: 0
balance_to_finish: 0
retainage: 0
-
item_number: 3
description: 'orchestrate out-of-the-box web-readiness'
scheduled_value: 57528.21
work_completed_from_previous: 0
work_completed_this_period: 0
materials_presently_stored: 0
total_completed_and_stored: 0
percent_complete: 0
balance_to_finish: 0
retainage: 0
-
item_number: 4
description: 'seize sexy e-services'
scheduled_value: 92046.48
work_completed_from_previous: 0
work_completed_this_period: 0
materials_presently_stored: 0
total_completed_and_stored: 0
percent_complete: 0
balance_to_finish: 0
retainage: 0
-
item_number: 5
description: 'engineer compelling e-markets'
scheduled_value: 72985.28
work_completed_from_previous: 0
work_completed_this_period: 0
materials_presently_stored: 0
total_completed_and_stored: 0
percent_complete: 0
balance_to_finish: 0
retainage: 0
-
item_number: 6
description: 'aggregate granular synergies'
scheduled_value: 39857.96
work_completed_from_previous: 0
work_completed_this_period: 0
materials_presently_stored: 0
total_completed_and_stored: 0
percent_complete: 0
balance_to_finish: 0
retainage: 0
total_contract_amount: '408781.60'
source: manual
status: active
metadata: null
created_at: '2026-10-05T15:49:19+00:00'
updated_at: '2026-10-05T15:49:19+00:00'
properties:
data:
type: object
properties:
id:
type: string
example: cc12bbe1-8993-41b7-a010-de80b46ed922
project_id:
type: string
example: 3c4cba61-5612-4532-938a-36a89908cf7a
pay_application_id:
type: string
example: null
nullable: true
name:
type: string
example: 'Schedule of Values'
line_items:
type: array
example:
-
item_number: 1
description: 'exploit scalable supply-chains'
scheduled_value: 88168.27
work_completed_from_previous: 0
work_completed_this_period: 0
materials_presently_stored: 0
total_completed_and_stored: 0
percent_complete: 0
balance_to_finish: 0
retainage: 0
-
item_number: 2
description: 'optimize front-end e-tailers'
scheduled_value: 58195.4
work_completed_from_previous: 0
work_completed_this_period: 0
materials_presently_stored: 0
total_completed_and_stored: 0
percent_complete: 0
balance_to_finish: 0
retainage: 0
-
item_number: 3
description: 'orchestrate out-of-the-box web-readiness'
scheduled_value: 57528.21
work_completed_from_previous: 0
work_completed_this_period: 0
materials_presently_stored: 0
total_completed_and_stored: 0
percent_complete: 0
balance_to_finish: 0
retainage: 0
-
item_number: 4
description: 'seize sexy e-services'
scheduled_value: 92046.48
work_completed_from_previous: 0
work_completed_this_period: 0
materials_presently_stored: 0
total_completed_and_stored: 0
percent_complete: 0
balance_to_finish: 0
retainage: 0
-
item_number: 5
description: 'engineer compelling e-markets'
scheduled_value: 72985.28
work_completed_from_previous: 0
work_completed_this_period: 0
materials_presently_stored: 0
total_completed_and_stored: 0
percent_complete: 0
balance_to_finish: 0
retainage: 0
-
item_number: 6
description: 'aggregate granular synergies'
scheduled_value: 39857.96
work_completed_from_previous: 0
work_completed_this_period: 0
materials_presently_stored: 0
total_completed_and_stored: 0
percent_complete: 0
balance_to_finish: 0
retainage: 0
items:
type: object
properties:
item_number:
type: integer
example: 1
description:
type: string
example: 'exploit scalable supply-chains'
scheduled_value:
type: number
example: 88168.27
work_completed_from_previous:
type: integer
example: 0
work_completed_this_period:
type: integer
example: 0
materials_presently_stored:
type: integer
example: 0
total_completed_and_stored:
type: integer
example: 0
percent_complete:
type: integer
example: 0
balance_to_finish:
type: integer
example: 0
retainage:
type: integer
example: 0
total_contract_amount:
type: string
example: '408781.60'
source:
type: string
example: manual
status:
type: string
example: active
metadata:
type: string
example: null
nullable: true
created_at:
type: string
example: '2026-10-05T15:49:19+00:00'
updated_at:
type: string
example: '2026-10-05T15:49:19+00:00'
tags:
- SOVs
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
project_id:
type: string
description: 'UUID of the project. Must match an existing stored value.'
example: 9b7e0e2a-1c3d-4f5a-8b6c-2d4e6f8a0b1c
pay_application_id:
type: string
description: 'Optional UUID of a pay application to attach the SOV to. Must match an existing stored value.'
example: 9b7e0e2a-1c3d-4f5a-8b6c-2d4e6f8a0b1c
nullable: true
name:
type: string
description: 'Optional label for the schedule of values. Must not be greater than 255 characters.'
example: 'Base contract SOV'
nullable: true
line_items:
type: array
description: 'Schedule-of-values rows (1 to 1000). Must have at least 1 items. Must not have more than 1000 items.'
example:
- []
items:
type: object
properties:
item_number:
type: string
description: 'Row number / identifier.'
example: '1'
description:
type: string
description: 'Line item description. Must not be greater than 10000 characters.'
example: 'Concrete - foundations'
scheduled_value:
type: number
description: 'Scheduled value for the line, in dollars. Must be at least 0.'
example: 50000.0
required:
- item_number
- description
- scheduled_value
metadata:
type: object
description: 'Free-form keyvalue bag stored alongside the record (max 32 KB, depth 6, 500 items).'
example: null
properties: {}
nullable: true
required:
- project_id
- line_items
'/api/v1/sovs/{uuid}':
get:
summary: 'Retrieve a schedule of values'
operationId: retrieveAScheduleOfValues
description: 'Returns a single SOV by UUID.'
parameters:
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
data:
id: 306fbe5a-0557-419b-9224-7bf03f528e6b
project_id: ade9676a-9d68-4060-bf44-c559e8809f96
pay_application_id: null
name: 'Schedule of Values'
line_items:
-
item_number: 1
description: 'synergize next-generation vortals'
scheduled_value: 45413.38
work_completed_from_previous: 0
work_completed_this_period: 0
materials_presently_stored: 0
total_completed_and_stored: 0
percent_complete: 0
balance_to_finish: 0
retainage: 0
-
item_number: 2
description: 'reintermediate world-class webservices'
scheduled_value: 16627.28
work_completed_from_previous: 0
work_completed_this_period: 0
materials_presently_stored: 0
total_completed_and_stored: 0
percent_complete: 0
balance_to_finish: 0
retainage: 0
-
item_number: 3
description: 'enhance back-end content'
scheduled_value: 7616.01
work_completed_from_previous: 0
work_completed_this_period: 0
materials_presently_stored: 0
total_completed_and_stored: 0
percent_complete: 0
balance_to_finish: 0
retainage: 0
total_contract_amount: '69656.67'
source: manual
status: active
metadata: null
created_at: '2026-10-05T15:49:19+00:00'
updated_at: '2026-10-05T15:49:19+00:00'
properties:
data:
type: object
properties:
id:
type: string
example: 306fbe5a-0557-419b-9224-7bf03f528e6b
project_id:
type: string
example: ade9676a-9d68-4060-bf44-c559e8809f96
pay_application_id:
type: string
example: null
nullable: true
name:
type: string
example: 'Schedule of Values'
line_items:
type: array
example:
-
item_number: 1
description: 'synergize next-generation vortals'
scheduled_value: 45413.38
work_completed_from_previous: 0
work_completed_this_period: 0
materials_presently_stored: 0
total_completed_and_stored: 0
percent_complete: 0
balance_to_finish: 0
retainage: 0
-
item_number: 2
description: 'reintermediate world-class webservices'
scheduled_value: 16627.28
work_completed_from_previous: 0
work_completed_this_period: 0
materials_presently_stored: 0
total_completed_and_stored: 0
percent_complete: 0
balance_to_finish: 0
retainage: 0
-
item_number: 3
description: 'enhance back-end content'
scheduled_value: 7616.01
work_completed_from_previous: 0
work_completed_this_period: 0
materials_presently_stored: 0
total_completed_and_stored: 0
percent_complete: 0
balance_to_finish: 0
retainage: 0
items:
type: object
properties:
item_number:
type: integer
example: 1
description:
type: string
example: 'synergize next-generation vortals'
scheduled_value:
type: number
example: 45413.38
work_completed_from_previous:
type: integer
example: 0
work_completed_this_period:
type: integer
example: 0
materials_presently_stored:
type: integer
example: 0
total_completed_and_stored:
type: integer
example: 0
percent_complete:
type: integer
example: 0
balance_to_finish:
type: integer
example: 0
retainage:
type: integer
example: 0
total_contract_amount:
type: string
example: '69656.67'
source:
type: string
example: manual
status:
type: string
example: active
metadata:
type: string
example: null
nullable: true
created_at:
type: string
example: '2026-10-05T15:49:19+00:00'
updated_at:
type: string
example: '2026-10-05T15:49:19+00:00'
tags:
- SOVs
delete:
summary: 'Delete a schedule of values'
operationId: deleteAScheduleOfValues
description: 'Deletes the SOV.'
parameters:
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
message: 'SOV deleted.'
properties:
message:
type: string
example: 'SOV deleted.'
tags:
- SOVs
parameters:
-
in: path
name: uuid
description: ''
example: 6ff8f7f6-1eb3-3525-be4a-3932c805afed
required: true
schema:
type: string
/api/v1/sovs/import-csv:
post:
summary: 'Import an SOV from CSV'
operationId: importAnSOVFromCSV
description: 'Creates an SOV from an uploaded CSV file (multipart/form-data).'
parameters:
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
201:
description: ''
content:
application/json:
schema:
type: object
example:
data:
id: 81a3f51c-25fa-4efb-8ac4-ddd48c0c6454
project_id: 89022d9c-8034-4920-afd1-4100ab470c37
pay_application_id: null
name: 'Schedule of Values'
line_items:
-
item_number: 1
description: 'exploit scalable supply-chains'
scheduled_value: 88168.27
work_completed_from_previous: 0
work_completed_this_period: 0
materials_presently_stored: 0
total_completed_and_stored: 0
percent_complete: 0
balance_to_finish: 0
retainage: 0
-
item_number: 2
description: 'optimize front-end e-tailers'
scheduled_value: 58195.4
work_completed_from_previous: 0
work_completed_this_period: 0
materials_presently_stored: 0
total_completed_and_stored: 0
percent_complete: 0
balance_to_finish: 0
retainage: 0
-
item_number: 3
description: 'orchestrate out-of-the-box web-readiness'
scheduled_value: 57528.21
work_completed_from_previous: 0
work_completed_this_period: 0
materials_presently_stored: 0
total_completed_and_stored: 0
percent_complete: 0
balance_to_finish: 0
retainage: 0
-
item_number: 4
description: 'seize sexy e-services'
scheduled_value: 92046.48
work_completed_from_previous: 0
work_completed_this_period: 0
materials_presently_stored: 0
total_completed_and_stored: 0
percent_complete: 0
balance_to_finish: 0
retainage: 0
-
item_number: 5
description: 'engineer compelling e-markets'
scheduled_value: 72985.28
work_completed_from_previous: 0
work_completed_this_period: 0
materials_presently_stored: 0
total_completed_and_stored: 0
percent_complete: 0
balance_to_finish: 0
retainage: 0
-
item_number: 6
description: 'aggregate granular synergies'
scheduled_value: 39857.96
work_completed_from_previous: 0
work_completed_this_period: 0
materials_presently_stored: 0
total_completed_and_stored: 0
percent_complete: 0
balance_to_finish: 0
retainage: 0
total_contract_amount: '408781.60'
source: manual
status: active
metadata: null
created_at: '2026-10-05T15:49:19+00:00'
updated_at: '2026-10-05T15:49:19+00:00'
properties:
data:
type: object
properties:
id:
type: string
example: 81a3f51c-25fa-4efb-8ac4-ddd48c0c6454
project_id:
type: string
example: 89022d9c-8034-4920-afd1-4100ab470c37
pay_application_id:
type: string
example: null
nullable: true
name:
type: string
example: 'Schedule of Values'
line_items:
type: array
example:
-
item_number: 1
description: 'exploit scalable supply-chains'
scheduled_value: 88168.27
work_completed_from_previous: 0
work_completed_this_period: 0
materials_presently_stored: 0
total_completed_and_stored: 0
percent_complete: 0
balance_to_finish: 0
retainage: 0
-
item_number: 2
description: 'optimize front-end e-tailers'
scheduled_value: 58195.4
work_completed_from_previous: 0
work_completed_this_period: 0
materials_presently_stored: 0
total_completed_and_stored: 0
percent_complete: 0
balance_to_finish: 0
retainage: 0
-
item_number: 3
description: 'orchestrate out-of-the-box web-readiness'
scheduled_value: 57528.21
work_completed_from_previous: 0
work_completed_this_period: 0
materials_presently_stored: 0
total_completed_and_stored: 0
percent_complete: 0
balance_to_finish: 0
retainage: 0
-
item_number: 4
description: 'seize sexy e-services'
scheduled_value: 92046.48
work_completed_from_previous: 0
work_completed_this_period: 0
materials_presently_stored: 0
total_completed_and_stored: 0
percent_complete: 0
balance_to_finish: 0
retainage: 0
-
item_number: 5
description: 'engineer compelling e-markets'
scheduled_value: 72985.28
work_completed_from_previous: 0
work_completed_this_period: 0
materials_presently_stored: 0
total_completed_and_stored: 0
percent_complete: 0
balance_to_finish: 0
retainage: 0
-
item_number: 6
description: 'aggregate granular synergies'
scheduled_value: 39857.96
work_completed_from_previous: 0
work_completed_this_period: 0
materials_presently_stored: 0
total_completed_and_stored: 0
percent_complete: 0
balance_to_finish: 0
retainage: 0
items:
type: object
properties:
item_number:
type: integer
example: 1
description:
type: string
example: 'exploit scalable supply-chains'
scheduled_value:
type: number
example: 88168.27
work_completed_from_previous:
type: integer
example: 0
work_completed_this_period:
type: integer
example: 0
materials_presently_stored:
type: integer
example: 0
total_completed_and_stored:
type: integer
example: 0
percent_complete:
type: integer
example: 0
balance_to_finish:
type: integer
example: 0
retainage:
type: integer
example: 0
total_contract_amount:
type: string
example: '408781.60'
source:
type: string
example: manual
status:
type: string
example: active
metadata:
type: string
example: null
nullable: true
created_at:
type: string
example: '2026-10-05T15:49:19+00:00'
updated_at:
type: string
example: '2026-10-05T15:49:19+00:00'
tags:
- SOVs
requestBody:
required: true
content:
multipart/form-data:
schema:
type: object
properties:
project_id:
type: string
description: 'UUID of the project. Must match an existing stored value.'
example: 9b7e0e2a-1c3d-4f5a-8b6c-2d4e6f8a0b1c
pay_application_id:
type: string
description: 'Optional UUID of a pay application to attach the imported SOV to. Must match an existing stored value.'
example: 9b7e0e2a-1c3d-4f5a-8b6c-2d4e6f8a0b1c
nullable: true
name:
type: string
description: 'Optional label for the imported schedule of values. Must not be greater than 255 characters.'
example: 'Imported SOV'
nullable: true
file:
type: string
format: binary
description: 'The CSV file (csv or txt, max 2 MB). Sent as multipart/form-data. Must be a file. Must not be greater than 2048 kilobytes.'
metadata:
type: object
description: 'Free-form keyvalue bag stored alongside the record (max 32 KB, depth 6, 500 items).'
example: null
properties: {}
nullable: true
required:
- project_id
- file
/api/v1/sandbox:
get:
summary: 'Get sandbox status'
operationId: getSandboxStatus
description: 'Reports whether the current API key is in live or sandbox mode.'
parameters:
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
mode: sandbox
is_sandbox: true
properties:
mode:
type: string
example: sandbox
is_sandbox:
type: boolean
example: true
tags:
- Sandbox
/api/v1/sandbox/reset:
post:
summary: 'Reset sandbox data'
operationId: resetSandboxData
description: 'Wipes all disposable sandbox records for the caller. Optionally reseeds demo data. Sandbox keys only.'
parameters:
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
message: 'Sandbox data reset.'
reseeded: false
properties:
message:
type: string
example: 'Sandbox data reset.'
reseeded:
type: boolean
example: false
tags:
- Sandbox
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
sample_data:
type: boolean
description: 'When true, reseed a fresh set of demo records after wiping sandbox data.'
example: true
/api/v1/search:
get:
summary: 'Search across resources'
operationId: searchAcrossResources
description: 'Case-insensitive partial-match search over organizations, projects and contacts the caller can see.'
parameters:
-
in: query
name: q
description: 'Search term (2-255 chars).'
example: riverside
required: true
schema:
type: string
description: 'Search term (2-255 chars).'
example: riverside
-
in: query
name: types
description: 'Which resource types to search. Defaults to all.'
example:
- projects
- contacts
required: false
schema:
type: array
description: 'Which resource types to search. Defaults to all.'
example:
- projects
- contacts
items:
type: string
-
in: query
name: per_type
description: 'Max results per resource type (1-25). Default 5.'
example: 5
required: false
schema:
type: integer
description: 'Max results per resource type (1-25). Default 5.'
example: 5
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
data:
organizations:
-
id: 9b7e0e2a-1c3d-4f5a-8b6c-2d4e6f8a0b1c
name: 'Riverside Builders'
projects:
-
id: 104ad307-aee6-4277-9c47-ebb899a035f5
name: 'Riverside Medical Center'
project_number: PRJ-1042
contacts: []
query: riverside
properties:
data:
type: object
properties:
organizations:
type: array
example:
-
id: 9b7e0e2a-1c3d-4f5a-8b6c-2d4e6f8a0b1c
name: 'Riverside Builders'
items:
type: object
properties:
id:
type: string
example: 9b7e0e2a-1c3d-4f5a-8b6c-2d4e6f8a0b1c
name:
type: string
example: 'Riverside Builders'
projects:
type: array
example:
-
id: 104ad307-aee6-4277-9c47-ebb899a035f5
name: 'Riverside Medical Center'
project_number: PRJ-1042
items:
type: object
properties:
id:
type: string
example: 104ad307-aee6-4277-9c47-ebb899a035f5
name:
type: string
example: 'Riverside Medical Center'
project_number:
type: string
example: PRJ-1042
contacts:
type: array
example: []
query:
type: string
example: riverside
tags:
- Search
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
q:
type: string
description: 'Must be at least 2 characters. Must not be greater than 255 characters.'
example: b
types:
type: array
description: ''
example:
- contacts
items:
type: string
enum:
- organizations
- projects
- contacts
per_type:
type: integer
description: 'Must be at least 1.'
example: 22
nullable: true
required:
- q
/api/v1/shipper-auth:
get:
summary: 'List shipper credentials'
operationId: listShipperCredentials
description: 'Stored carrier credentials (secrets are never returned in full).'
parameters:
-
in: query
name: organization_id
description: 'Filter to this organization (UUID).'
example: 9b7e0e2a-1c3d-4f5a-8b6c-2d4e6f8a0b1c
required: true
schema:
type: string
description: 'Filter to this organization (UUID).'
example: 9b7e0e2a-1c3d-4f5a-8b6c-2d4e6f8a0b1c
-
in: query
name: carrier
description: 'Filter by carrier: usps, fedex or ups.'
example: usps
required: true
schema:
type: string
description: 'Filter by carrier: usps, fedex or ups.'
example: usps
-
in: query
name: per_page
description: 'Results per page. Clamped to 1-100; defaults to 15.'
example: 15
required: true
schema:
type: integer
description: 'Results per page. Clamped to 1-100; defaults to 15.'
example: 15
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
data:
-
id: 0dcb0594-f4de-4aa6-af1c-f817576255bb
carrier: usps
label: 'adipisci quidem'
account_number: '310719'
environment: sandbox
is_active: true
has_api_key: true
has_api_secret: true
verified_at: null
metadata: null
created_at: '2026-10-05T15:49:20+00:00'
updated_at: '2026-10-05T15:49:20+00:00'
-
id: df86388d-681d-4f89-9511-b03a8ce34ecf
carrier: ups
label: 'adipisci molestias'
account_number: '696081'
environment: sandbox
is_active: true
has_api_key: true
has_api_secret: true
verified_at: null
metadata: null
created_at: '2026-10-05T15:49:20+00:00'
updated_at: '2026-10-05T15:49:20+00:00'
links:
first: '/?page=1'
last: '/?page=1'
prev: null
next: null
meta:
current_page: 1
from: 1
last_page: 1
links:
-
url: null
label: '« Previous'
page: null
active: false
-
url: '/?page=1'
label: '1'
page: 1
active: true
-
url: null
label: 'Next »'
page: null
active: false
path: /
per_page: 15
to: 2
total: 2
properties:
data:
type: array
example:
-
id: 0dcb0594-f4de-4aa6-af1c-f817576255bb
carrier: usps
label: 'adipisci quidem'
account_number: '310719'
environment: sandbox
is_active: true
has_api_key: true
has_api_secret: true
verified_at: null
metadata: null
created_at: '2026-10-05T15:49:20+00:00'
updated_at: '2026-10-05T15:49:20+00:00'
-
id: df86388d-681d-4f89-9511-b03a8ce34ecf
carrier: ups
label: 'adipisci molestias'
account_number: '696081'
environment: sandbox
is_active: true
has_api_key: true
has_api_secret: true
verified_at: null
metadata: null
created_at: '2026-10-05T15:49:20+00:00'
updated_at: '2026-10-05T15:49:20+00:00'
items:
type: object
properties:
id:
type: string
example: 0dcb0594-f4de-4aa6-af1c-f817576255bb
carrier:
type: string
example: usps
label:
type: string
example: 'adipisci quidem'
account_number:
type: string
example: '310719'
environment:
type: string
example: sandbox
is_active:
type: boolean
example: true
has_api_key:
type: boolean
example: true
has_api_secret:
type: boolean
example: true
verified_at:
type: string
example: null
nullable: true
metadata:
type: string
example: null
nullable: true
created_at:
type: string
example: '2026-10-05T15:49:20+00:00'
updated_at:
type: string
example: '2026-10-05T15:49:20+00:00'
links:
type: object
properties:
first:
type: string
example: '/?page=1'
last:
type: string
example: '/?page=1'
prev:
type: string
example: null
nullable: true
next:
type: string
example: null
nullable: true
meta:
type: object
properties:
current_page:
type: integer
example: 1
from:
type: integer
example: 1
last_page:
type: integer
example: 1
links:
type: array
example:
-
url: null
label: '« Previous'
page: null
active: false
-
url: '/?page=1'
label: '1'
page: 1
active: true
-
url: null
label: 'Next »'
page: null
active: false
items:
type: object
properties:
url:
type: string
example: null
nullable: true
label:
type: string
example: '« Previous'
page:
type: string
example: null
nullable: true
active:
type: boolean
example: false
path:
type: string
example: /
per_page:
type: integer
example: 15
to:
type: integer
example: 2
total:
type: integer
example: 2
tags:
- 'Shipper Auth'
post:
summary: 'Store a shipper credential'
operationId: storeAShipperCredential
description: 'Saves an encrypted carrier API credential.'
parameters:
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
201:
description: ''
content:
application/json:
schema:
type: object
example:
data:
id: 0dcea519-ea7e-424e-8922-a421c4e48e20
carrier: usps
label: 'et animi'
account_number: '089432'
environment: sandbox
is_active: true
has_api_key: true
has_api_secret: true
verified_at: null
metadata: null
created_at: '2026-10-05T15:49:20+00:00'
updated_at: '2026-10-05T15:49:20+00:00'
properties:
data:
type: object
properties:
id:
type: string
example: 0dcea519-ea7e-424e-8922-a421c4e48e20
carrier:
type: string
example: usps
label:
type: string
example: 'et animi'
account_number:
type: string
example: '089432'
environment:
type: string
example: sandbox
is_active:
type: boolean
example: true
has_api_key:
type: boolean
example: true
has_api_secret:
type: boolean
example: true
verified_at:
type: string
example: null
nullable: true
metadata:
type: string
example: null
nullable: true
created_at:
type: string
example: '2026-10-05T15:49:20+00:00'
updated_at:
type: string
example: '2026-10-05T15:49:20+00:00'
tags:
- 'Shipper Auth'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
organization_id:
type: string
description: 'UUID of the organization this record belongs to. Must be one the API key can access. Must match an existing stored value.'
example: 9b7e0e2a-1c3d-4f5a-8b6c-2d4e6f8a0b1c
carrier:
type: string
description: 'Shipping carrier the credential is for.'
example: usps
enum:
- usps
- fedex
- ups
label:
type: string
description: 'Optional friendly name for the credential. Must not be greater than 255 characters.'
example: 'USPS account'
nullable: true
api_key:
type: string
description: 'Carrier API key. Stored encrypted; never returned in full. Must not be greater than 1000 characters.'
example: live_xxx
api_secret:
type: string
description: 'Optional carrier API secret. Must not be greater than 1000 characters.'
example: b
nullable: true
account_number:
type: string
description: 'Optional carrier account number. Must not be greater than 255 characters.'
example: '0001234'
nullable: true
environment:
type: string
description: 'Carrier environment the credential targets.'
example: production
enum:
- sandbox
- production
nullable: true
metadata:
type: object
description: 'Free-form keyvalue bag stored alongside the record (max 32 KB, depth 6, 500 items).'
example: null
properties: {}
nullable: true
required:
- organization_id
- carrier
- api_key
'/api/v1/shipper-auth/{uuid}':
get:
summary: 'Retrieve a shipper credential'
operationId: retrieveAShipperCredential
description: 'Returns a single credential by UUID (secrets masked).'
parameters:
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
data:
id: 1a210080-d9cc-437d-b800-591c5cbea122
carrier: usps
label: 'adipisci quidem'
account_number: '310719'
environment: sandbox
is_active: true
has_api_key: true
has_api_secret: true
verified_at: null
metadata: null
created_at: '2026-10-05T15:49:20+00:00'
updated_at: '2026-10-05T15:49:20+00:00'
properties:
data:
type: object
properties:
id:
type: string
example: 1a210080-d9cc-437d-b800-591c5cbea122
carrier:
type: string
example: usps
label:
type: string
example: 'adipisci quidem'
account_number:
type: string
example: '310719'
environment:
type: string
example: sandbox
is_active:
type: boolean
example: true
has_api_key:
type: boolean
example: true
has_api_secret:
type: boolean
example: true
verified_at:
type: string
example: null
nullable: true
metadata:
type: string
example: null
nullable: true
created_at:
type: string
example: '2026-10-05T15:49:20+00:00'
updated_at:
type: string
example: '2026-10-05T15:49:20+00:00'
tags:
- 'Shipper Auth'
parameters:
-
in: path
name: uuid
description: ''
example: 6ff8f7f6-1eb3-3525-be4a-3932c805afed
required: true
schema:
type: string
/api/v1/support/health:
get:
summary: 'Health check'
operationId: healthCheck
description: 'Liveness probe plus CLS connectivity. No auth required.'
parameters:
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
status: ok
time: '2026-09-09T00:00:00+00:00'
cls:
driver: http
reachable: true
properties:
status:
type: string
example: ok
time:
type: string
example: '2026-09-09T00:00:00+00:00'
cls:
type: object
properties:
driver:
type: string
example: http
reachable:
type: boolean
example: true
tags:
- Support
security: []
/api/v1/support/credits:
get:
summary: 'Credit summary'
operationId: creditSummary
description: 'Credit balance and recent usage totals for the calling organization.'
parameters:
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
balance: 250.0
cls_eligible_balance: 250.0
used_last_30d: 42.5
properties:
balance:
type: number
example: 250.0
cls_eligible_balance:
type: number
example: 250.0
used_last_30d:
type: number
example: 42.5
tags:
- Support
/api/v1/support/usage:
get:
summary: 'Usage summary'
operationId: usageSummary
description: 'API and billable-event counts for the calling organization.'
parameters:
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
api_calls_last_30d: 1284
documents_generated_last_30d: 37
mail_sent_last_30d: 12
properties:
api_calls_last_30d:
type: integer
example: 1284
documents_generated_last_30d:
type: integer
example: 37
mail_sent_last_30d:
type: integer
example: 12
tags:
- Support
/api/v1/waivers:
get:
summary: 'List waivers'
operationId: listWaivers
description: 'Paginated lien waivers visible to the caller.'
parameters:
-
in: query
name: type
description: 'Filter by type.'
example: architecto
required: true
schema:
type: string
description: 'Filter by type.'
example: architecto
-
in: query
name: status
description: 'Filter by lifecycle status.'
example: architecto
required: true
schema:
type: string
description: 'Filter by lifecycle status.'
example: architecto
-
in: query
name: project_id
description: 'Filter to this project (UUID).'
example: 9b7e0e2a-1c3d-4f5a-8b6c-2d4e6f8a0b1c
required: true
schema:
type: string
description: 'Filter to this project (UUID).'
example: 9b7e0e2a-1c3d-4f5a-8b6c-2d4e6f8a0b1c
-
in: query
name: pay_application_id
description: 'Filter to this pay application (UUID).'
example: 9b7e0e2a-1c3d-4f5a-8b6c-2d4e6f8a0b1c
required: true
schema:
type: string
description: 'Filter to this pay application (UUID).'
example: 9b7e0e2a-1c3d-4f5a-8b6c-2d4e6f8a0b1c
-
in: query
name: per_page
description: 'Results per page. Clamped to 1-100; defaults to 15.'
example: 15
required: true
schema:
type: integer
description: 'Results per page. Clamped to 1-100; defaults to 15.'
example: 15
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
data:
-
id: 12a4eac2-9589-4fff-b86b-36ccad5d5c19
project_id: 373471bf-f4bd-48bb-a68e-5a4609437257
pay_application_id: beb6c7a6-2b50-42d2-903f-c911b1626516
division_id: 1ca1015e-4d3e-41b2-beee-21e6bd8876fc
type: unconditional
status: pending
amount: '122864.55'
through_date: '2024-07-19'
check_number: null
exceptions: null
signee_name: null
signee_title: null
signed_at: null
cls_reference_id: null
metadata: null
created_at: '2026-10-05T15:49:20+00:00'
updated_at: '2026-10-05T15:49:20+00:00'
-
id: c93ae1d2-0662-496c-8279-ca592a4d36b8
project_id: 5704fe13-342d-43b3-8c41-eda8bade8b91
pay_application_id: 6a2ac7a4-db29-4993-8573-fe2bdda57446
division_id: 26d0f33e-8a15-47e4-b59c-2982a93fcc54
type: unconditional
status: pending
amount: '120142.13'
through_date: '2013-10-02'
check_number: null
exceptions: null
signee_name: null
signee_title: null
signed_at: null
cls_reference_id: null
metadata: null
created_at: '2026-10-05T15:49:20+00:00'
updated_at: '2026-10-05T15:49:20+00:00'
links:
first: '/?page=1'
last: '/?page=1'
prev: null
next: null
meta:
current_page: 1
from: 1
last_page: 1
links:
-
url: null
label: '« Previous'
page: null
active: false
-
url: '/?page=1'
label: '1'
page: 1
active: true
-
url: null
label: 'Next »'
page: null
active: false
path: /
per_page: 15
to: 2
total: 2
properties:
data:
type: array
example:
-
id: 12a4eac2-9589-4fff-b86b-36ccad5d5c19
project_id: 373471bf-f4bd-48bb-a68e-5a4609437257
pay_application_id: beb6c7a6-2b50-42d2-903f-c911b1626516
division_id: 1ca1015e-4d3e-41b2-beee-21e6bd8876fc
type: unconditional
status: pending
amount: '122864.55'
through_date: '2024-07-19'
check_number: null
exceptions: null
signee_name: null
signee_title: null
signed_at: null
cls_reference_id: null
metadata: null
created_at: '2026-10-05T15:49:20+00:00'
updated_at: '2026-10-05T15:49:20+00:00'
-
id: c93ae1d2-0662-496c-8279-ca592a4d36b8
project_id: 5704fe13-342d-43b3-8c41-eda8bade8b91
pay_application_id: 6a2ac7a4-db29-4993-8573-fe2bdda57446
division_id: 26d0f33e-8a15-47e4-b59c-2982a93fcc54
type: unconditional
status: pending
amount: '120142.13'
through_date: '2013-10-02'
check_number: null
exceptions: null
signee_name: null
signee_title: null
signed_at: null
cls_reference_id: null
metadata: null
created_at: '2026-10-05T15:49:20+00:00'
updated_at: '2026-10-05T15:49:20+00:00'
items:
type: object
properties:
id:
type: string
example: 12a4eac2-9589-4fff-b86b-36ccad5d5c19
project_id:
type: string
example: 373471bf-f4bd-48bb-a68e-5a4609437257
pay_application_id:
type: string
example: beb6c7a6-2b50-42d2-903f-c911b1626516
division_id:
type: string
example: 1ca1015e-4d3e-41b2-beee-21e6bd8876fc
type:
type: string
example: unconditional
status:
type: string
example: pending
amount:
type: string
example: '122864.55'
through_date:
type: string
example: '2024-07-19'
check_number:
type: string
example: null
nullable: true
exceptions:
type: string
example: null
nullable: true
signee_name:
type: string
example: null
nullable: true
signee_title:
type: string
example: null
nullable: true
signed_at:
type: string
example: null
nullable: true
cls_reference_id:
type: string
example: null
nullable: true
metadata:
type: string
example: null
nullable: true
created_at:
type: string
example: '2026-10-05T15:49:20+00:00'
updated_at:
type: string
example: '2026-10-05T15:49:20+00:00'
links:
type: object
properties:
first:
type: string
example: '/?page=1'
last:
type: string
example: '/?page=1'
prev:
type: string
example: null
nullable: true
next:
type: string
example: null
nullable: true
meta:
type: object
properties:
current_page:
type: integer
example: 1
from:
type: integer
example: 1
last_page:
type: integer
example: 1
links:
type: array
example:
-
url: null
label: '« Previous'
page: null
active: false
-
url: '/?page=1'
label: '1'
page: 1
active: true
-
url: null
label: 'Next »'
page: null
active: false
items:
type: object
properties:
url:
type: string
example: null
nullable: true
label:
type: string
example: '« Previous'
page:
type: string
example: null
nullable: true
active:
type: boolean
example: false
path:
type: string
example: /
per_page:
type: integer
example: 15
to:
type: integer
example: 2
total:
type: integer
example: 2
tags:
- Waivers
post:
summary: 'Create a waiver'
operationId: createAWaiver
description: 'Creates a conditional or unconditional lien waiver.'
parameters:
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
201:
description: ''
content:
application/json:
schema:
type: object
example:
data:
id: 20979b21-c3eb-4c26-afd2-f1b8eebe7688
project_id: 4a0d9882-3dec-4143-baaa-8ca6cfc86025
pay_application_id: 05c2b85f-a59a-4d2f-a126-3a112041be23
division_id: dfa04dd3-2280-4e99-a7e9-d2ef2e1dd906
type: unconditional
status: pending
amount: '122864.55'
through_date: '2024-07-19'
check_number: null
exceptions: null
signee_name: null
signee_title: null
signed_at: null
cls_reference_id: null
metadata: null
created_at: '2026-10-05T15:49:20+00:00'
updated_at: '2026-10-05T15:49:20+00:00'
properties:
data:
type: object
properties:
id:
type: string
example: 20979b21-c3eb-4c26-afd2-f1b8eebe7688
project_id:
type: string
example: 4a0d9882-3dec-4143-baaa-8ca6cfc86025
pay_application_id:
type: string
example: 05c2b85f-a59a-4d2f-a126-3a112041be23
division_id:
type: string
example: dfa04dd3-2280-4e99-a7e9-d2ef2e1dd906
type:
type: string
example: unconditional
status:
type: string
example: pending
amount:
type: string
example: '122864.55'
through_date:
type: string
example: '2024-07-19'
check_number:
type: string
example: null
nullable: true
exceptions:
type: string
example: null
nullable: true
signee_name:
type: string
example: null
nullable: true
signee_title:
type: string
example: null
nullable: true
signed_at:
type: string
example: null
nullable: true
cls_reference_id:
type: string
example: null
nullable: true
metadata:
type: string
example: null
nullable: true
created_at:
type: string
example: '2026-10-05T15:49:20+00:00'
updated_at:
type: string
example: '2026-10-05T15:49:20+00:00'
tags:
- Waivers
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
organization_id:
type: string
description: 'UUID of the organization this record belongs to. Must be one the API key can access. Must match an existing stored value.'
example: 9b7e0e2a-1c3d-4f5a-8b6c-2d4e6f8a0b1c
division_id:
type: string
description: 'UUID of the claimant division. Optional: inherited from the project. Supplying a division other than the project one is rejected (422). Must match an existing stored value.'
example: 9b7e0e2a-1c3d-4f5a-8b6c-2d4e6f8a0b1c
nullable: true
project_id:
type: string
description: 'UUID of the project. Required unless pay_application_id is given. This field is required when pay_application_id is not present. Must match an existing stored value.'
example: 9b7e0e2a-1c3d-4f5a-8b6c-2d4e6f8a0b1c
nullable: true
pay_application_id:
type: string
description: 'UUID of the pay application this waiver is tied to. Required unless project_id is given. Must match an existing stored value.'
example: 9b7e0e2a-1c3d-4f5a-8b6c-2d4e6f8a0b1c
nullable: true
type:
type: string
description: 'Waiver type: conditional or unconditional.'
example: conditional
enum:
- conditional
- unconditional
amount:
type: number
description: 'Waiver amount, in dollars. Must be at least 0.'
example: 75000.0
through_date:
type: string
description: 'Effective-through date of the waiver (YYYY-MM-DD). Must be a valid date.'
example: '2026-05-31'
check_number:
type: string
description: 'Optional payment check number referenced by the waiver. Must not be greater than 50 characters.'
example: '10482'
nullable: true
exceptions:
type: string
description: 'Optional text describing amounts or claims excluded from the waiver. Must not be greater than 10000 characters.'
example: b
nullable: true
metadata:
type: object
description: 'Free-form keyvalue bag (max 32 KB, depth 6, 500 items). Claimant-identity keys (claimant_name, claimant_address, claimant_license_number, ...) are rejected here (422): the claimant comes from the division. Supply metadata.owner.name / metadata.gc.name to satisfy the document preflight inline.'
example: null
properties: {}
nullable: true
required:
- organization_id
- type
- amount
- through_date
'/api/v1/waivers/{uuid}':
get:
summary: 'Retrieve a waiver'
operationId: retrieveAWaiver
description: 'Returns a single waiver by UUID.'
parameters:
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
data:
id: 18aeb5b5-fe3b-4c17-b9dc-441ff7873371
project_id: 4193443a-85dd-4130-b83e-396a1c8090d4
pay_application_id: b1de1cb2-2161-49e4-8e32-d467b8589177
division_id: 8ea7eed2-3ecd-4fcd-98ee-de4f37a02564
type: conditional
status: pending
amount: '486859.78'
through_date: '2006-04-05'
check_number: null
exceptions: null
signee_name: null
signee_title: null
signed_at: null
cls_reference_id: null
metadata: null
created_at: '2026-10-05T15:49:20+00:00'
updated_at: '2026-10-05T15:49:20+00:00'
properties:
data:
type: object
properties:
id:
type: string
example: 18aeb5b5-fe3b-4c17-b9dc-441ff7873371
project_id:
type: string
example: 4193443a-85dd-4130-b83e-396a1c8090d4
pay_application_id:
type: string
example: b1de1cb2-2161-49e4-8e32-d467b8589177
division_id:
type: string
example: 8ea7eed2-3ecd-4fcd-98ee-de4f37a02564
type:
type: string
example: conditional
status:
type: string
example: pending
amount:
type: string
example: '486859.78'
through_date:
type: string
example: '2006-04-05'
check_number:
type: string
example: null
nullable: true
exceptions:
type: string
example: null
nullable: true
signee_name:
type: string
example: null
nullable: true
signee_title:
type: string
example: null
nullable: true
signed_at:
type: string
example: null
nullable: true
cls_reference_id:
type: string
example: null
nullable: true
metadata:
type: string
example: null
nullable: true
created_at:
type: string
example: '2026-10-05T15:49:20+00:00'
updated_at:
type: string
example: '2026-10-05T15:49:20+00:00'
tags:
- Waivers
patch:
summary: 'Update a waiver'
operationId: updateAWaiver
description: 'Applies a partial update to a waiver.'
parameters:
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
data:
id: 2cff6cf6-f816-4853-a890-b88b2c61066e
project_id: 513c3b2c-2616-45a9-bf3d-1c0c7d3af4d7
pay_application_id: ffbd2bba-d19c-41d2-9e6f-6eef2765b274
division_id: 5f3ca6b3-70c6-4550-b05c-9a97cbaf981b
type: unconditional
status: pending
amount: '122864.55'
through_date: '2024-07-19'
check_number: null
exceptions: null
signee_name: null
signee_title: null
signed_at: null
cls_reference_id: null
metadata: null
created_at: '2026-10-05T15:49:20+00:00'
updated_at: '2026-10-05T15:49:20+00:00'
properties:
data:
type: object
properties:
id:
type: string
example: 2cff6cf6-f816-4853-a890-b88b2c61066e
project_id:
type: string
example: 513c3b2c-2616-45a9-bf3d-1c0c7d3af4d7
pay_application_id:
type: string
example: ffbd2bba-d19c-41d2-9e6f-6eef2765b274
division_id:
type: string
example: 5f3ca6b3-70c6-4550-b05c-9a97cbaf981b
type:
type: string
example: unconditional
status:
type: string
example: pending
amount:
type: string
example: '122864.55'
through_date:
type: string
example: '2024-07-19'
check_number:
type: string
example: null
nullable: true
exceptions:
type: string
example: null
nullable: true
signee_name:
type: string
example: null
nullable: true
signee_title:
type: string
example: null
nullable: true
signed_at:
type: string
example: null
nullable: true
cls_reference_id:
type: string
example: null
nullable: true
metadata:
type: string
example: null
nullable: true
created_at:
type: string
example: '2026-10-05T15:49:20+00:00'
updated_at:
type: string
example: '2026-10-05T15:49:20+00:00'
tags:
- Waivers
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
pay_application_id:
type: string
description: 'UUID of the pay application this waiver is tied to. Must match an existing stored value.'
example: 9b7e0e2a-1c3d-4f5a-8b6c-2d4e6f8a0b1c
nullable: true
type:
type: string
description: 'Waiver type: conditional or unconditional.'
example: conditional
enum:
- conditional
- unconditional
amount:
type: number
description: 'Waiver amount, in dollars. Must be at least 0.'
example: 75000.0
through_date:
type: string
description: 'Effective-through date of the waiver (YYYY-MM-DD). Must be a valid date.'
example: '2026-05-31'
check_number:
type: string
description: 'Optional payment check number referenced by the waiver. Must not be greater than 50 characters.'
example: '10482'
nullable: true
exceptions:
type: string
description: 'Optional text describing amounts or claims excluded from the waiver. Must not be greater than 10000 characters.'
example: b
nullable: true
metadata:
type: object
description: 'Free-form keyvalue bag (max 32 KB, depth 6, 500 items). Claimant-identity keys (claimant_name, claimant_address, claimant_license_number, ...) are rejected here (422): the claimant comes from the division. Supply metadata.owner.name / metadata.gc.name to satisfy the document preflight inline.'
example: null
properties: {}
nullable: true
parameters:
-
in: path
name: uuid
description: ''
example: 6ff8f7f6-1eb3-3525-be4a-3932c805afed
required: true
schema:
type: string
'/api/v1/waivers/{waiver_uuid}/sign':
post:
summary: 'Sign a waiver'
operationId: signAWaiver
description: 'Records the signer name and title and marks the waiver signed.'
parameters:
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
data:
id: 557abed2-927f-44a3-8464-fd30bbb3c4fa
project_id: 29f8df8d-0240-4ea6-96b6-6bdd2084124c
pay_application_id: 83539844-eb4c-4c1b-ab22-5d425d9300fa
division_id: a19e0832-548a-41c5-b38f-40eebe80fce7
type: unconditional
status: pending
amount: '497668.34'
through_date: '1997-11-28'
check_number: null
exceptions: null
signee_name: null
signee_title: null
signed_at: null
cls_reference_id: null
metadata: null
created_at: '2026-10-05T15:49:20+00:00'
updated_at: '2026-10-05T15:49:20+00:00'
properties:
data:
type: object
properties:
id:
type: string
example: 557abed2-927f-44a3-8464-fd30bbb3c4fa
project_id:
type: string
example: 29f8df8d-0240-4ea6-96b6-6bdd2084124c
pay_application_id:
type: string
example: 83539844-eb4c-4c1b-ab22-5d425d9300fa
division_id:
type: string
example: a19e0832-548a-41c5-b38f-40eebe80fce7
type:
type: string
example: unconditional
status:
type: string
example: pending
amount:
type: string
example: '497668.34'
through_date:
type: string
example: '1997-11-28'
check_number:
type: string
example: null
nullable: true
exceptions:
type: string
example: null
nullable: true
signee_name:
type: string
example: null
nullable: true
signee_title:
type: string
example: null
nullable: true
signed_at:
type: string
example: null
nullable: true
cls_reference_id:
type: string
example: null
nullable: true
metadata:
type: string
example: null
nullable: true
created_at:
type: string
example: '2026-10-05T15:49:20+00:00'
updated_at:
type: string
example: '2026-10-05T15:49:20+00:00'
tags:
- Waivers
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
signee_name:
type: string
description: 'Full name of the person signing the waiver. Must not be greater than 255 characters.'
example: 'Jane Smith'
signee_title:
type: string
description: 'Job title of the signer. Must not be greater than 255 characters.'
example: Controller
required:
- signee_name
- signee_title
parameters:
-
in: path
name: waiver_uuid
description: ''
example: 6ff8f7f6-1eb3-3525-be4a-3932c805afed
required: true
schema:
type: string
/api/v1/webhooks:
get:
summary: 'List webhook subscriptions'
operationId: listWebhookSubscriptions
description: 'Paginated webhook subscriptions visible to the caller.'
parameters:
-
in: query
name: organization_id
description: 'Filter to this organization (UUID).'
example: 9b7e0e2a-1c3d-4f5a-8b6c-2d4e6f8a0b1c
required: true
schema:
type: string
description: 'Filter to this organization (UUID).'
example: 9b7e0e2a-1c3d-4f5a-8b6c-2d4e6f8a0b1c
-
in: query
name: per_page
description: 'Results per page. Clamped to 1-100; defaults to 15.'
example: 15
required: true
schema:
type: integer
description: 'Results per page. Clamped to 1-100; defaults to 15.'
example: 15
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
data:
-
id: 50657cb6-5ddd-4578-b10d-12e27b653d13
organization_id: 445f3fde-a538-4125-862d-4b1733f433a6
url: 'http://armstrong.net/error-voluptatibus-odio-ut-dignissimos'
events:
- pay_app.created
- pay_app.approved
is_active: true
last_triggered_at: null
metadata: null
created_at: '2026-10-05T15:49:20+00:00'
updated_at: '2026-10-05T15:49:20+00:00'
-
id: efaddca8-666f-4a1f-bd07-bad5249de0a8
organization_id: c5099161-9693-42a9-ae6b-1b507255ee69
url: 'http://tromp.com/molestias-reiciendis-velit-doloremque-quidem-et.html'
events:
- pay_app.created
- pay_app.approved
is_active: true
last_triggered_at: null
metadata: null
created_at: '2026-10-05T15:49:20+00:00'
updated_at: '2026-10-05T15:49:20+00:00'
links:
first: '/?page=1'
last: '/?page=1'
prev: null
next: null
meta:
current_page: 1
from: 1
last_page: 1
links:
-
url: null
label: '« Previous'
page: null
active: false
-
url: '/?page=1'
label: '1'
page: 1
active: true
-
url: null
label: 'Next »'
page: null
active: false
path: /
per_page: 15
to: 2
total: 2
properties:
data:
type: array
example:
-
id: 50657cb6-5ddd-4578-b10d-12e27b653d13
organization_id: 445f3fde-a538-4125-862d-4b1733f433a6
url: 'http://armstrong.net/error-voluptatibus-odio-ut-dignissimos'
events:
- pay_app.created
- pay_app.approved
is_active: true
last_triggered_at: null
metadata: null
created_at: '2026-10-05T15:49:20+00:00'
updated_at: '2026-10-05T15:49:20+00:00'
-
id: efaddca8-666f-4a1f-bd07-bad5249de0a8
organization_id: c5099161-9693-42a9-ae6b-1b507255ee69
url: 'http://tromp.com/molestias-reiciendis-velit-doloremque-quidem-et.html'
events:
- pay_app.created
- pay_app.approved
is_active: true
last_triggered_at: null
metadata: null
created_at: '2026-10-05T15:49:20+00:00'
updated_at: '2026-10-05T15:49:20+00:00'
items:
type: object
properties:
id:
type: string
example: 50657cb6-5ddd-4578-b10d-12e27b653d13
organization_id:
type: string
example: 445f3fde-a538-4125-862d-4b1733f433a6
url:
type: string
example: 'http://armstrong.net/error-voluptatibus-odio-ut-dignissimos'
events:
type: array
example:
- pay_app.created
- pay_app.approved
items:
type: string
is_active:
type: boolean
example: true
last_triggered_at:
type: string
example: null
nullable: true
metadata:
type: string
example: null
nullable: true
created_at:
type: string
example: '2026-10-05T15:49:20+00:00'
updated_at:
type: string
example: '2026-10-05T15:49:20+00:00'
links:
type: object
properties:
first:
type: string
example: '/?page=1'
last:
type: string
example: '/?page=1'
prev:
type: string
example: null
nullable: true
next:
type: string
example: null
nullable: true
meta:
type: object
properties:
current_page:
type: integer
example: 1
from:
type: integer
example: 1
last_page:
type: integer
example: 1
links:
type: array
example:
-
url: null
label: '« Previous'
page: null
active: false
-
url: '/?page=1'
label: '1'
page: 1
active: true
-
url: null
label: 'Next »'
page: null
active: false
items:
type: object
properties:
url:
type: string
example: null
nullable: true
label:
type: string
example: '« Previous'
page:
type: string
example: null
nullable: true
active:
type: boolean
example: false
path:
type: string
example: /
per_page:
type: integer
example: 15
to:
type: integer
example: 2
total:
type: integer
example: 2
tags:
- Webhooks
post:
summary: 'Create a webhook subscription'
operationId: createAWebhookSubscription
description: 'Registers an HTTPS endpoint for the given event names.'
parameters:
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
201:
description: ''
content:
application/json:
schema:
type: object
example:
data:
id: f1abc611-cc8e-4105-950d-2b6970c142f1
organization_id: 7726d606-ffc1-4542-9d77-ce85cc7d4a17
url: 'http://www.bailey.biz/quos-velit-et-fugiat-sunt-nihil-accusantium-harum.html'
events:
- pay_app.created
- pay_app.approved
is_active: true
last_triggered_at: null
metadata: null
created_at: '2026-10-05T15:49:20+00:00'
updated_at: '2026-10-05T15:49:20+00:00'
properties:
data:
type: object
properties:
id:
type: string
example: f1abc611-cc8e-4105-950d-2b6970c142f1
organization_id:
type: string
example: 7726d606-ffc1-4542-9d77-ce85cc7d4a17
url:
type: string
example: 'http://www.bailey.biz/quos-velit-et-fugiat-sunt-nihil-accusantium-harum.html'
events:
type: array
example:
- pay_app.created
- pay_app.approved
items:
type: string
is_active:
type: boolean
example: true
last_triggered_at:
type: string
example: null
nullable: true
metadata:
type: string
example: null
nullable: true
created_at:
type: string
example: '2026-10-05T15:49:20+00:00'
updated_at:
type: string
example: '2026-10-05T15:49:20+00:00'
tags:
- Webhooks
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
organization_id:
type: string
description: 'UUID of the organization this record belongs to. Must be one the API key can access. Must match an existing stored value.'
example: 9b7e0e2a-1c3d-4f5a-8b6c-2d4e6f8a0b1c
url:
type: string
description: 'HTTPS endpoint to POST events to. Private, loopback and reserved hosts are rejected in production. Must not be greater than 2048 characters.'
example: 'https://example.com/webhooks/prelien'
events:
type: array
description: 'A single event name.'
example:
- pay_application.approved
items:
type: string
is_active:
type: boolean
description: 'Whether the subscription is active. Defaults to true.'
example: true
nullable: true
metadata:
type: object
description: 'Free-form keyvalue bag stored alongside the record (max 32 KB, depth 6, 500 items).'
example: null
properties: {}
nullable: true
required:
- organization_id
- url
- events
'/api/v1/webhooks/{uuid}':
get:
summary: 'Retrieve a webhook subscription'
operationId: retrieveAWebhookSubscription
description: 'Returns a single subscription by UUID.'
parameters:
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
data:
id: 6b406358-2c5e-4a4c-ab88-cbe487465337
organization_id: 90bd12c9-31f5-454b-a277-53c20f100cfd
url: 'http://www.price.org/'
events:
- pay_app.created
- pay_app.approved
is_active: true
last_triggered_at: null
metadata: null
created_at: '2026-10-05T15:49:20+00:00'
updated_at: '2026-10-05T15:49:20+00:00'
properties:
data:
type: object
properties:
id:
type: string
example: 6b406358-2c5e-4a4c-ab88-cbe487465337
organization_id:
type: string
example: 90bd12c9-31f5-454b-a277-53c20f100cfd
url:
type: string
example: 'http://www.price.org/'
events:
type: array
example:
- pay_app.created
- pay_app.approved
items:
type: string
is_active:
type: boolean
example: true
last_triggered_at:
type: string
example: null
nullable: true
metadata:
type: string
example: null
nullable: true
created_at:
type: string
example: '2026-10-05T15:49:20+00:00'
updated_at:
type: string
example: '2026-10-05T15:49:20+00:00'
tags:
- Webhooks
put:
summary: 'Update a webhook subscription'
operationId: updateAWebhookSubscription
description: 'Partial update of URL, events or active state.'
parameters:
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
data:
id: dbda829b-e4c0-4b07-8958-6d3bba67230e
organization_id: dcfed30b-9935-4c12-aec5-26d65ff05466
url: 'http://www.bailey.biz/quos-velit-et-fugiat-sunt-nihil-accusantium-harum.html'
events:
- pay_app.created
- pay_app.approved
is_active: true
last_triggered_at: null
metadata: null
created_at: '2026-10-05T15:49:20+00:00'
updated_at: '2026-10-05T15:49:20+00:00'
properties:
data:
type: object
properties:
id:
type: string
example: dbda829b-e4c0-4b07-8958-6d3bba67230e
organization_id:
type: string
example: dcfed30b-9935-4c12-aec5-26d65ff05466
url:
type: string
example: 'http://www.bailey.biz/quos-velit-et-fugiat-sunt-nihil-accusantium-harum.html'
events:
type: array
example:
- pay_app.created
- pay_app.approved
items:
type: string
is_active:
type: boolean
example: true
last_triggered_at:
type: string
example: null
nullable: true
metadata:
type: string
example: null
nullable: true
created_at:
type: string
example: '2026-10-05T15:49:20+00:00'
updated_at:
type: string
example: '2026-10-05T15:49:20+00:00'
tags:
- Webhooks
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
url:
type: string
description: 'HTTPS endpoint to POST events to. Private, loopback and reserved hosts are rejected in production. Must not be greater than 2048 characters.'
example: 'https://example.com/webhooks/prelien'
events:
type: array
description: 'A single event name. This field is required when events is present. Must not be greater than 255 characters.'
example:
- pay_application.approved
items:
type: string
is_active:
type: boolean
description: 'Whether the subscription is active.'
example: true
metadata:
type: object
description: 'Free-form keyvalue bag stored alongside the record (max 32 KB, depth 6, 500 items).'
example: null
properties: {}
nullable: true
delete:
summary: 'Delete a webhook subscription'
operationId: deleteAWebhookSubscription
description: 'Removes the subscription.'
parameters:
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
message: 'Webhook subscription deleted.'
properties:
message:
type: string
example: 'Webhook subscription deleted.'
tags:
- Webhooks
parameters:
-
in: path
name: uuid
description: ''
example: 6ff8f7f6-1eb3-3525-be4a-3932c805afed
required: true
schema:
type: string
/api/v1/webhooks/mail-provider:
post:
summary: 'Mail-provider callback'
operationId: mailProviderCallback
description: 'Inbound endpoint for the mail provider. HMAC-signed; not called by API clients.'
parameters:
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
message: 'Webhook processed.'
properties:
message:
type: string
example: 'Webhook processed.'
tags:
- Webhooks
security: []
/api/v1/webhooks/cls/fulfillment-status:
post:
summary: 'CLS fulfillment-status callback'
operationId: cLSFulfillmentStatusCallback
description: 'Inbound endpoint for CLS research status updates. HMAC-signed; not called by API clients.'
parameters:
-
in: header
name: X-Organization-UUID
description: ''
example: '{YOUR_ORGANIZATION_UUID}'
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
message: ok
properties:
message:
type: string
example: ok
tags:
- Webhooks
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
fulfillment_request_id:
type: string
description: 'UUID of the fulfillment request this status update is for. Must be a valid UUID.'
example: 9b7e0e2a-1c3d-4f5a-8b6c-2d4e6f8a0b1c
status:
type: string
description: 'New lifecycle status of the CLS ticket.'
example: fulfilled
enum:
- submitted_to_cls
- in_progress
- payment_required
- fulfilled
- failed
- cancelled
- rejected
payment_required:
type: object
description: 'This field is required when status is payment_required.'
example: null
properties:
recipients:
type: integer
description: 'This field is required when payment_required is present. Must be at least 1. Must not be greater than 500.'
example: 1
status_reason:
type: string
description: 'Optional explanation for the status change. Must not be greater than 10000 characters.'
example: 'n'
nullable: true
last_error:
type: string
description: 'Optional error detail when status is failed. Must not be greater than 10000 characters.'
example: g
nullable: true
cls_resource_type:
type: string
description: 'Optional CLS resource type the ticket resolved to. Must not be greater than 100 characters.'
example: notice
nullable: true
cls_resource_id:
type: string
description: 'Optional CLS resource id the ticket resolved to. Must not be greater than 100 characters.'
example: cls_ntc_88213
nullable: true
meta:
type: object
description: 'Optional bounded keyvalue bag of extra context.'
example: null
properties: {}
nullable: true
result:
type: object
description: 'Research output for a fulfilled ticket (project / parties / notice specifics). Intentionally flexible and bounded rather than a fixed schema.'
example: null
properties: {}
nullable: true
refund_decision:
type: string
description: 'Optional operator-supplied refund instruction. CLS itself never dictates refunds.'
example: none
enum:
- full
- partial
- none
nullable: true
refund_amount:
type: number
description: 'Refund amount; required when refund_decision is partial. This field is required when refund_decision is partial. Must be at least 0.01.'
example: 12
nullable: true
refund_reason:
type: string
description: 'Optional explanation recorded with the refund. Must not be greater than 10000 characters.'
example: m
nullable: true
required:
- fulfillment_request_id
- status
security: []