Skip to main content
All endpoints on this page require a tenant bearer token. See Roles & Permissions for what each @Perm module/level means.

List contracts

GET /contracts · requires contract_view (view)
page
integer
default:"1"
pageSize
integer
default:"20"
Max 200.
q
string
Free-text search.
type
string
sale | lease
typeCode
string
Custom contract type code, if configured.
status
string
in_progress | completed
statusCode
string
payment
string
unpaid | partial | paid
ownerId
string
subjectId
string
workflow
string
One of draft, extracted, review, approved, signed, active, completed, archived.
lifecycleStageCode
string
overdue
boolean
dueSoon
boolean
sort
string
order
string
default:"asc"
asc | desc

Get a contract

GET /contracts/:id · requires contract_view (view)

Create a contract

POST /contracts · requires contract_edit (edit)
archiveCode
string
required
contractNo
string
required
projectName
string
required
type
string
sale | lease
typeCode
string
subjectId
string
required
partyA
string
required
partyB
string
required
equipmentName
string
required
equipmentModel
string
required
quantity
integer
required
Minimum 1.
unitPrice
number
required
Minimum 0.
totalAmount
number
Minimum 0.
currencyCode
string
paymentMethod
string
required
payeeAccount
string
payeeBank
string
deposit
number
periodicRent
number
paymentCycle
string
signDate
string
ISO date.
startDate
string
required
ISO date.
endDate
string
required
ISO date.
invoicePoints
integer
contractAttachment
string
File reference.
status
string
in_progress | completed
statusCode
string
ownerId
string
required
ownerSuperiorId
string
remark
string
dynamicFields
object
Custom field values keyed by field id.
workflowStage
string
lifecycleTemplateId
string
lifecycleStageCode
string
workflowAllowedRoles
string[]
payments
array
Initial payment plan lines — see Add a payment line for the shape of each entry.
terms
array
extraNotes
array
{ label, value }[]
curl -X POST https://api.alforse.com/api/v1/contracts \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "archiveCode": "A-2026-001",
    "contractNo": "C-2026-001",
    "projectName": "Excavator lease — north yard",
    "subjectId": "sub_123",
    "partyA": "Acme Leasing",
    "partyB": "Northline Construction",
    "equipmentName": "Excavator",
    "equipmentModel": "CAT-320",
    "quantity": 1,
    "unitPrice": 250000,
    "paymentMethod": "bank_transfer",
    "startDate": "2026-08-01",
    "endDate": "2027-08-01",
    "ownerId": "usr_456"
  }'

Update a contract

PATCH /contracts/:id · requires contract_edit (edit) Same fields as create, all optional.

Delete a contract

DELETE /contracts/:id · requires contract_delete (edit)

Bulk operations

EndpointBodyRequires
POST /contracts/bulk-delete{ ids: string[] } (max 1000)contract_delete (edit)
POST /contracts/bulk-attachment{ ids: string[], contractAttachment: string }contract_edit (edit)

Import and export

EndpointBodyRequires
POST /contracts/import{ rows?: CreateContractDto[], xlsxBase64?, sheetName?, csv? } — supply one of rows, xlsxBase64, or csvcontract_edit (edit)
GET /contracts/exportSame query params as List, plus ids?: string[] and profile: "summary" | "full"export (edit)
POST /contracts/exportSame fields as the GET variant, in the body — use this when your filter/id list is too long for a query stringexport (edit)
Both export endpoints respond with Content-Type: text/csv; charset=utf-8.

OCR extraction

EndpointBodyRequires
POST /contracts/extract{ contractId?, fileRef?, fileName?, text? }contract_edit (edit)
PATCH /contracts/extractions/:runId/review{ fields: { fieldKey, status: "accepted" | "overridden" | "rejected", overrideValue? }[], applyToContract?, metadata? }contract_edit (edit)
See Contract Intake for how this fits into the upload flow.

Add a note

POST /contracts/:id/notes · requires contract_edit (edit)
label
string
required
value
string
required

Add a term note

POST /contracts/:id/terms · requires contract_edit (edit)
kind
string
required
deposit | delivery | debug | payment | expiry | other
title
string
required
date
string
ISO date.
note
string
required

Add a payment line

POST /contracts/:id/payments · requires payment_entry (edit)
period
string
required
dueDate
string
required
ISO date.
amount
number
required
Minimum 0.
currencyCode
string
receivedAmount
number
receivedDate
string
method
string
payerName
string
receiptAccount
string
bankSerialNo
string
reconciliationStatus
string
pending | matched | exception
reconciliationNote
string
invoiceAmount
number
invoiceDate
string
invoiceNo
string
invoiceAttachment
string
proof
string
For updating a payment that already exists (rather than adding a new line), see Payments.

Fulfillment tasks

EndpointBodyRequires
POST /contracts/:id/fulfillment-tasks{ code, title, kind?, status?, ownerId?, dueDate?, acceptanceStatus?, attachment?, metadata? }contract_edit (edit)
PATCH /contracts/:id/fulfillment-tasks/:taskIdSame fields, all optionalcontract_edit (edit)
status is one of pending, in_progress, completed, accepted, blocked, canceled, overdue.

Add an invoice record

POST /contracts/:id/invoices · requires invoice (edit)
receivablePlanId
string
paymentRecordId
string
invoiceNo
string
required
invoiceAmount
number
required
Minimum 0.
invoiceDate
string
status
string
draft | issued | void | red_letter
attachment
string
taxRate
number
note
string