Appearance
Contractor Rate Adjustments
Manage rate changes for contractors over time. Each adjustment records a new billing rate with an effective date, supporting hourly, daily, or monthly rate types.
Rate adjustments are nested under contractors -- you always operate on a specific contractor's adjustments.
Temporal model
Each adjustment has an effectiveDate. The most recent adjustment by date determines the contractor's current rate. Creating a new adjustment does not update or replace the old one -- it adds a new record to the history. This means you can backdate corrections or schedule future rate changes.
Rate Adjustment Object
| Field | Type | Description |
|---|---|---|
id | string | Unique identifier (CUID format). System-generated. Read-only. |
contractorId | string | ID of the contractor this adjustment belongs to. References a Contractor. |
effectiveDate | date (YYYY-MM-DD) | Date this rate takes effect. The contractor's rate changes from this date onwards. |
rateType | string | Billing rate period: "hourly", "daily", or "monthly". |
rate | number | Rate amount in the specified currency. Decimal with 2 decimal places. |
currencyCode | string | ISO 4217 currency code (e.g. "GBP", "USD", "EUR"). |
reason | string | null | Reason for the rate change (e.g. "Contract renewal", "Scope increase"). |
createdAt | datetime (ISO 8601) | When the record was created. Read-only. |
updatedAt | datetime (ISO 8601) | When the record was last modified. Read-only. |
Endpoints
| Method | Path | Description |
|---|---|---|
GET | /org/:orgId/contractors/:contractorId/rate-adjustments | List rate adjustments |
POST | /org/:orgId/contractors/:contractorId/rate-adjustments | Create rate adjustment |
PATCH | /org/:orgId/contractors/:contractorId/rate-adjustments/:id | Update rate adjustment |
DELETE | /org/:orgId/contractors/:contractorId/rate-adjustments/:id | Delete rate adjustment |
List Rate Adjustments
GET /org/:orgId/contractors/:contractorId/rate-adjustmentsReturns all rate adjustments for the specified contractor, ordered by effective date (most recent first).
Example Request
bash
curl -X GET "https://{tenant}.flowstate.inc/api/v1/org/{orgId}/contractors/clx4c5d6e7f8g9h0i1j2/rate-adjustments" \
-H "Authorization: Bearer private_..."Example Response
json
{
"data": [
{
"id": "clx7r8s9t0u1v2w3x4y5",
"contractorId": "clx4c5d6e7f8g9h0i1j2",
"effectiveDate": "2026-04-01",
"rateType": "daily",
"rate": 800,
"currencyCode": "GBP",
"reason": "Contract renewal",
"createdAt": "2026-03-20T09:00:00Z",
"updatedAt": "2026-03-20T09:00:00Z"
},
{
"id": "clx3a4b5c6d7e8f9g0h1",
"contractorId": "clx4c5d6e7f8g9h0i1j2",
"effectiveDate": "2025-01-15",
"rateType": "daily",
"rate": 750,
"currencyCode": "GBP",
"reason": "Initial engagement rate",
"createdAt": "2025-01-10T08:00:00Z",
"updatedAt": "2025-01-10T08:00:00Z"
}
],
"meta": {
"total": 2,
"page": 1,
"limit": 20,
"hasNextPage": false
}
}Create Rate Adjustment
POST /org/:orgId/contractors/:contractorId/rate-adjustmentsRecords a new rate adjustment for the contractor. This is additive -- it never overwrites existing adjustments.
Create Request Body
| Field | Type | Required | Description |
|---|---|---|---|
effectiveDate | date (YYYY-MM-DD) | Yes | Date the new rate takes effect. |
rateType | string | Yes | Billing period: "hourly", "daily", or "monthly". |
rate | number | Yes | Rate amount. Must be >= 0. |
currencyCode | string | Yes | ISO 4217 currency code (3 uppercase letters, e.g. "GBP"). |
reason | string | null | No | Reason for the rate change. |
Example Request
bash
curl -X POST "https://{tenant}.flowstate.inc/api/v1/org/{orgId}/contractors/clx4c5d6e7f8g9h0i1j2/rate-adjustments" \
-H "Authorization: Bearer private_..." \
-H "Content-Type: application/json" \
-d '{
"effectiveDate": "2026-10-01",
"rateType": "daily",
"rate": 850,
"currencyCode": "GBP",
"reason": "Scope increase for Q4 deliverables"
}'Example Response
json
{
"data": {
"id": "clx9k0l1m2n3o4p5q6r7",
"contractorId": "clx4c5d6e7f8g9h0i1j2",
"effectiveDate": "2026-10-01",
"rateType": "daily",
"rate": 850,
"currencyCode": "GBP",
"reason": "Scope increase for Q4 deliverables",
"createdAt": "2026-04-08T09:00:00Z",
"updatedAt": "2026-04-08T09:00:00Z"
}
}Status: 201 Created
Update Rate Adjustment
PATCH /org/:orgId/contractors/:contractorId/rate-adjustments/:idUpdates an existing rate adjustment. All fields are optional.
Update Request Body
| Field | Type | Required | Description |
|---|---|---|---|
effectiveDate | date (YYYY-MM-DD) | No | Updated effective date. |
rateType | string | No | Updated billing period: "hourly", "daily", or "monthly". |
rate | number | No | Updated rate amount. Must be >= 0. |
currencyCode | string | No | Updated ISO 4217 currency code. |
reason | string | null | No | Updated reason. |
Example Request
bash
curl -X PATCH "https://{tenant}.flowstate.inc/api/v1/org/{orgId}/contractors/clx4c5d6e7f8g9h0i1j2/rate-adjustments/clx9k0l1m2n3o4p5q6r7" \
-H "Authorization: Bearer private_..." \
-H "Content-Type: application/json" \
-d '{
"rate": 875,
"reason": "Scope increase for Q4 deliverables (renegotiated)"
}'Delete Rate Adjustment
DELETE /org/:orgId/contractors/:contractorId/rate-adjustments/:idPermanently removes a rate adjustment record. This cannot be undone.
WARNING
Deleting the most recent rate adjustment will change the contractor's current rate to the next most recent adjustment. If there are no remaining adjustments, the contractor will have no rate on record.
Status: 204 No Content
Error Responses
Validation Error (400)
json
{
"error": {
"code": "VALIDATION_ERROR",
"message": "Request validation failed.",
"details": [
{ "field": "rateType", "message": "rateType must be one of: hourly, daily, monthly" }
],
"errorId": "err_clx9a8b7c6d5e4f3"
}
}Not Found (404)
json
{
"error": {
"code": "NOT_FOUND",
"message": "Rate adjustment not found.",
"errorId": "err_clx9a8b7c6d5e4f3"
}
}Related Endpoints
- Contractors -- The parent resource. You can also create rate adjustments inline when creating/updating a contractor via the nested
rateAdjustmentobject. - Recipes: Add a Contractor Engagement -- Step-by-step guide.