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: []