Contracts API Reference
Access and track agreements, terms, pricing, and signature status for contracts inside your Hermon workspace.
Date & Timezone Handling: All timestamps in responses are UTC, formatted as ISO 8601 (2026-01-15T10:30:00.000Z). Date-range filters accept either date-only YYYY-MM-DD (which expands to UTC day boundaries) or full ISO 8601 timestamps.
Amounts: All monetary values are in major currency units (e.g. 2997.00 for $2,997). The currency field is returned as an ISO 4217 code (e.g. USD, EUR).
Amounts: All monetary values are in major currency units (e.g. 2997.00 for $2,997). The currency field is returned as an ISO 4217 code (e.g. USD, EUR).
List Contracts
Retrieve a paginated list of contracts. Results can be filtered by status, lead, and assigned setter, triager, or closer.
GET/api/external/contracts
Query Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| page | integer | Optional | Page number for pagination. Default: 1 |
| limit | integer | Optional | Number of items per page. Default: 10, Max: 100 |
| status | string | Optional | Filter by contract status. See Contract Status Values. |
| lead_id | string (UUID) | Optional | UUID of the lead to filter contracts by. |
| setter | string | Optional | Email address of the setter to filter by. |
| triager | string | Optional | Email address of the triager to filter by. |
| closer | string | Optional | Email address of the closer to filter by. |
| created_from | string | Optional | Lower bound for created_at. Accepts YYYY-MM-DD or ISO 8601. |
| created_to | string | Optional | Upper bound for created_at. Accepts YYYY-MM-DD or ISO 8601. |
| updated_from | string | Optional | Lower bound for updated_at. |
| updated_to | string | Optional | Upper bound for updated_at. |
Code Examples
curl -X GET "https://api.hermon.io/api/external/contracts?page=1&limit=10&status=VOIDED&setter=sales-setter@mailinator.com&closer=hermon@mailinator.com&triager=triager@mailinator.com&lead_id=e799c30f-9da7-4fd7-9552-83b96a9bfac2" \
-H "Content-Type: application/json" \
-H "x-api-key: sk_live_your_key_here"Response Example
json
{
"success": true,
"message": "Contracts fetched successfully",
"data": [
{
"id": "c3d4e5f6-a7b8-9012-cdef-123456789012",
"lead": {
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"first_name": "John",
"last_name": "Doe",
"email": "john.doe@example.com"
},
"program": {
"name": "12-Week Coaching Program"
},
"total_amount": 2997.0,
"collected_amount": 997.0,
"to_be_collected": 2000.0,
"next_due_date": "2026-04-15T00:00:00.000Z",
"closer": {
"first_name": "Jane",
"last_name": "Smith",
"profile_image_url": "https://img.clerk.com/eyJ0eXBlIjoicHJveHkiLCJzcmMiOiJodHRwczovL2ltYWdlcy5jbGVyay5kZXYvb2F1dGhfZ29vZ2xlL2ltZ18zOWJ3NkxJaTFFSTdlM3Z4RHFhTFViUTZVeFMifQ",
"id": "user_456def",
"role": "org:admin"
},
"setter": null,
"triager": null,
"currency": "USD",
"contract_status": "SIGNED",
"contract_type": "PP",
"subscription_status": null,
"signed_at": "2026-02-10T14:30:00.000Z",
"created_at": "2026-02-08T10:00:00.000Z"
}
],
"pagination": {
"page": 1,
"limit": 20,
"total": 1,
"totalPages": 1,
"hasNext": false,
"hasPrev": false
}
}Get Contract Details
Fetch detailed information for a single contract by its unique UUID.
Note that the response shape varies slightly depending on the contract type (One-Time vs. Subscription vs. Commission).
GET/api/external/contracts/:id
Path Parameters
:idRequired. The unique contract UUID.
Contract Object Fields
| Field | Type | Description |
|---|---|---|
| id | string (UUID) | Unique identifier for the contract. |
| lead | object | Lead linked to this contract (id, first_name, last_name, email). See Contract Lead Object. |
| program | object | Program metadata (name, price, type, etc.). See Contract Program Object. |
| total_amount | number | Total contract value in major currency units. For subscriptions this is the per-cycle amount [List API Only]. |
| collected_amount | number | Amount collected to date. |
| to_be_collected | number | null | Remaining balance. null for subscriptions, commissions, or when fully collected [List API Only]. |
| next_due_date | string (ISO 8601) | null | Next payment due date. null when no future payments exist [List API Only]. |
| closer | object | null | Closer who sold the contract (first_name, last_name, profile_image_url, id, role). See User Details Object. |
| setter | object | null | Setter who generated the lead (first_name, last_name, profile_image_url, id, role). See User Details Object. |
| triager | object | null | Triager assigned to the contract (first_name, last_name, profile_image_url, id, role). See User Details Object. |
| currency | string | ISO 4217 currency code (e.g. USD, EUR). |
| contract_status | string (enum) | Current status (DRAFT, SENT, VIEWED, WITHDRAWN, SIGNED, VOIDED) [List API Only]. |
| contract_type | string (enum) | Payment structure (PIF, PP, SUBSCRIPTION, COMMISSION) [List API Only]. |
| subscription_status | string (enum) | null | Subscription billing status (PENDING, ACTIVE, PAUSED, PAST_DUE, etc.) [List API Only]. |
| signed_at | string (ISO 8601) | null | UTC timestamp when signed. null if not yet signed. |
| created_with_template | boolean | Whether the contract was created from a template [Details API Only]. |
| first_source | object | null | Lead's first attribution source [Details API Only]. |
| last_source | object | null | Lead's last attribution source [Details API Only]. |
| status | string (enum) | Contract status [Details API Only]. |
| voided_at | string (ISO 8601) | null | When voided [Details API Only]. |
| voided_reason | string | null | Reason for voiding [Details API Only]. |
| voided_by_details | object | null | User details of who voided the contract [Details API Only]. |
| type | string (enum) | Contract type [Details API Only]. |
| payment_mandate | object | null | Mandate status/provider (null if no mandate) [Details API Only]. |
| custom_fields | array | Custom field values. |
| sign_page_url | string | null | URL to the e-signature page [Details API Only]. |
| esign_preview_pdf_url | string | null | URL to the contract PDF preview [Details API Only]. |
| engagement | object | null | Linked delivery engagement. See Engagement Object [Details API Only]. |
| total_value | number | null | Total contract value in major currency units [Details API Only - One-Time/Commission]. |
| remaining_amount | number | null | Amount not yet allocated to payments [Details API Only - One-Time/Commission]. |
| amount_per_cycle | number | null | Per-cycle billing amount [Details API Only - Subscription]. |
| subscription | object | null | Full subscription details. See Subscription Object [Details API Only - Subscription]. |
| setup_fee | object | null | Setup fee block if applicable (null if none). See Setup Fee Object [Details API Only - Subscription]. |
| commission_rate | number | null | Commission percentage (0–100) [Details API Only - Commission]. |
| billing_period | string | null | Billing interval [Details API Only - Commission]. |
| payments | array | Cycle payment history or ordered array of instalments [Details API Only]. |
| created_at | string (ISO 8601) | UTC timestamp when created. |
| updated_at | string (ISO 8601) | UTC timestamp when last updated [Details API Only]. |
Code Examples
curl -X GET "https://api.hermon.io/api/external/contracts/d5e0fb5d-5b14-45cf-81d8-2a0eb7a49224" \
-H "Content-Type: application/json" \
-H "x-api-key: sk_live_your_key_here"Response Example (One-Time Contract)
json
{
"success": true,
"message": "Contract fetched successfully",
"data": {
"id": "c3d4e5f6-a7b8-9012-cdef-123456789012",
"created_with_template": true,
"currency": "USD",
"lead": {
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"first_name": "John",
"last_name": "Doe",
"email": "john.doe@example.com",
"phone_country": "US",
"phone_e164": "+14155551234",
"sales_status": {
"id": "status_xyz789",
"name": "Closed Won",
"text_color": "#14532D",
"bg_color": "#DCFCE7"
}
},
"first_source": { "id": "src_abc", "name": "Facebook Ad" },
"last_source": { "id": "src_def", "name": "Referral" },
"status": "SIGNED",
"signed_at": "2026-02-10T14:30:00.000Z",
"voided_at": null,
"voided_reason": null,
"voided_by_details": null,
"type": "PP",
"closer": {
"first_name": "Jane",
"last_name": "Smith",
"profile_image_url": null,
"id": "user_456def",
"role": "org:admin"
},
"setter": null,
"triager": null,
"program": {
"id": "prog_abc123",
"name": "12-Week Coaching Program",
"notes": null,
"template_name": "Standard Contract",
"price": 2997.0,
"type": "ONE_TIME",
"co_signer": null
},
"payment_mandate": null,
"custom_fields": [],
"sign_page_url": "https://sign.hermon.io/c/abc123",
"esign_preview_pdf_url": "https://sign.hermon.io/preview/abc123.pdf",
"engagement": {
"id": "eng_xyz789",
"name": "John Doe — 12-Week Coaching",
"status": {
"id": "engstatus_001",
"name": "Active",
"text_color": "#14532D",
"bg_color": "#DCFCE7"
}
},
"created_at": "2026-02-08T10:00:00.000Z",
"updated_at": "2026-02-10T14:30:00.000Z",
"total_value": 2997.0,
"collected_amount": 997.0,
"remaining_amount": 2000.0,
"payments": [
{
"id": "pay_001",
"type": "DEPOSIT",
"amount": 997.0,
"date": "2026-02-10T00:00:00.000Z",
"status": "PAID",
"payment_provider": "STRIPE",
"is_mandate_payment": false,
"active_payment_link": null
},
{
"id": "pay_002",
"type": "INSTALMENT",
"amount": 2000.0,
"date": "2026-04-15T00:00:00.000Z",
"status": "PENDING",
"payment_provider": "STRIPE",
"is_mandate_payment": true,
"active_payment_link": {
"id": "link_abc",
"url": "https://pay.stripe.com/xyz"
}
}
]
}
}Values Reference
Contract Status Values
| Value | Description |
|---|---|
| DRAFT | Created but not yet sent to the client |
| SENT | Sent to the client for signing |
| VIEWED | Client has opened the contract |
| WITHDRAWN | Contract pulled back before signing |
| SIGNED | Client has signed |
| VOIDED | Contract voided/cancelled |
Contract Type Values
| Value | Description |
|---|---|
| PIF | Pay in full (single payment) |
| PP | Payment plan (multiple instalments) |
| SUBSCRIPTION | Recurring subscription billing |
| COMMISSION | Commission-based |
Subscription Status Values
| Value | Description |
|---|---|
| PENDING | Subscription not yet started |
| ACTIVE | Billing active |
| PAUSED | Billing temporarily paused |
| PAST_DUE | Payment overdue |
| CANCELLATION_SCHEDULED | Cancellation pending at period end |
| CANCELLED | Subscription cancelled |
Billing Interval Values
| Value | Description |
|---|---|
| WEEKLY | Every week |
| MONTHLY | Every month |
| QUARTERLY | Every three months |
| YEARLY | Every year |
Payment Provider Values
| Value | Description |
|---|---|
| STRIPE | Stripe |
| WHOP | Whop |
| MOLLIE | Mollie |
| MANUAL | Manual / offline payment |
Nested Objects Reference
Contract Lead Object (List API)
| Field | Type | Description |
|---|---|---|
| id | string | Lead ID |
| first_name | string | First name |
| last_name | string | Last name |
| string | Email address |
Contract Detail Lead Object
| Field | Type | Description |
|---|---|---|
| id | string | Lead ID |
| first_name | string | First name |
| last_name | string | Last name |
| string | Email address | |
| phone_country | string | ISO country code |
| phone_e164 | string | Phone in E.164 format |
| sales_status | object | Current lead status with id, name, text_color, bg_color |
User Details Object
| Field | Type | Description |
|---|---|---|
| first_name | string | First name |
| last_name | string | Last name |
| profile_image_url | string | Profile image URL (null if none) |
| id | string | Clerk user ID |
| role | string | Organization role |
Contract Program Object
| Field | Type | Description |
|---|---|---|
| id | string | Program ID |
| name | string | Program name |
| notes | string | Program notes |
| template_name | string | Contract template name |
| price | number | Program price in major currency units |
| type | string | Payment type enum |
| co_signer | object | Co-signer user details (null if none) |
Engagement Object
| Field | Type | Description |
|---|---|---|
| id | string | Delivery engagement ID |
| name | string | Engagement name |
| status | object | Status with id, name, text_color, bg_color |
Payment Instalment Object
| Field | Type | Description |
|---|---|---|
| id | string | Payment ID |
| type | string (enum) | Payment type (DEPOSIT, FIRST_PAYMENT, INSTALMENT) |
| amount | number | Amount in major currency units |
| date | string (ISO 8601) | Due date |
| status | string (enum) | Payment status |
| payment_provider | string (enum) | Payment provider |
| is_mandate_payment | boolean | Whether charged via mandate (automatic) |
| active_payment_link | object | Active payment link (null if none) |
Subscription Object
| Field | Type | Description |
|---|---|---|
| id | string | Subscription ID |
| status | string (enum) | Billing status. See Subscription Status Values. |
| billing_interval | string (enum) | Billing frequency. See Billing Interval Values. |
| payment_provider | string (enum) | Provider handling billing |
| external_subscription_id | string | Provider's subscription ID |
| billing_cycles_paid | integer | Number of cycles successfully charged |
| current_period_start | string (ISO 8601) | Start of current billing period |
| current_period_end | string (ISO 8601) | End of current billing period |
| next_billing_date | string (ISO 8601) | Next charge date |
| started_at | string (ISO 8601) | When billing began |
| cancel_at_period_end | boolean | Whether cancellation is scheduled at period end |
| cancelled_at | string (ISO 8601) | When the subscription was cancelled |
| cancellation_reason | string | Cancellation reason |
| checkout_links | array | Available checkout links |
| pause | object | Active pause details (null if not paused) |
Setup Fee Object
| Field | Type | Description |
|---|---|---|
| total | number | Total setup fee amount |
| is_editable | boolean | Whether any instalment can be edited |
| lock_reason | string | Why editing is blocked ("PAID" or "CHARGE_IN_FLIGHT") |
| installments | array | Individual setup fee instalments |
Error Responses
401Missing or invalid API key
json
{
"status": "error",
"message": "Invalid or revoked API key"
}404Resource not found
json
{
"status": "error",
"message": "Resource not found"
}429Rate limit exceeded
json
{
"status": "error",
"message": "Too many requests"
}