Get Pay Rates
The "Get Pay Rates" endpoint retrieves pay rate information for one or more users within a date range.
Endpoint
GET https://api.connecteam.com/pay-rates/v1/pay-rates
Authentication
- API Key or OAuth 2.0
- OAuth Scope:
pay_rates.read
Query Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
startDate | string (YYYY-MM-DD) | Yes | Start of the date range. Includes rates in effect at this date |
endDate | string (YYYY-MM-DD) | Yes | End of the date range. Max range: 365 days |
userIds | array of integers | No | Filter by specific user IDs. Omit to return all active users |
rateType | string | No | Filter by rate type: hourly, monthly, yearly |
resourceIds | array of strings | No | Filter resource rate details to specific resources only |
isIncludeHistory | boolean | No | Include modification history (default: false) |
limit | integer | No | Max results per page (default: 100, max: 500) |
offset | integer | No | Number of results to skip for pagination (default: 0) |
Date Range Behavior
How date filtering worksThe response includes the most recent rate with an effective date before
startDateif no rate starts exactly onstartDate. This ensures you always see which rate is in effect at the beginning of the range.
Specifically:
- Rates with
effectiveDatewithin[startDate, endDate]are always included - The single most recent rate with
effectiveDatebeforestartDateis also included (if it exists), because that rate is still in effect at the start of the range - Older rates before that most recent one are not included
- If
rateTypefilter is applied, it also applies to the "in effect" rate — a monthly rate in effect at range start will be excluded if you filter byhourly
Example: A user has rates on 2018-01-01, 2022-06-01, and 2026-03-01. Querying startDate=2026-01-01&endDate=2026-06-30 returns only the 2022-06-01 rate (most recent before range) and the 2026-03-01 rate (within range). The 2018-01-01 rate is not returned.
Modification History
When isIncludeHistory=true, each pay rate includes a modifications array showing every change made to that specific effective date entry. Each modification records:
modifiedBy— the admin who made the changemodifiedAt— Unix timestamp of the change- Previous values for
rateType,defaultRate,isDefaultRateEnabled, andisResourceRateEnabled
When isIncludeHistory=false (default), the modifications field is omitted entirely. The modifiedAt top-level field still shows the timestamp of the most recent modification (or is omitted if the rate was never modified after creation).
Performance NoteSetting
isIncludeHistory=truemay increase response time and payload size, especially for users with frequent rate changes. Use it only when audit data is needed.
Pagination
Results are paginated using limit and offset. The response includes a paging.offset field with the next offset value. To fetch the next page, pass this value as the offset parameter. When fewer results are returned than the limit, you've reached the last page.
Response Structure
Payload example:
{
"requestId": "550e8400-e29b-41d4-a716-446655440000",
"data": {
"payRatesByUsers": [
{
"userId": 12345,
"payRate": {
"effectiveDate": "2025-01-01",
"rateType": "hourly",
"isDefaultRateEnabled": true,
"defaultRate": 25.50,
"isResourceRateEnabled": true,
"isApplyDefaultRateToNewResource": true,
"resourcesRates": [
{
"resourceId": "100",
"rate": 30.00,
"isUsingDefaultRate": false,
"subResourcesRates": [
{
"subResourceId": "200",
"isUsingParentRate": true
}
]
}
],
"createdBy": 99999,
"createdAt": 1704067200,
"modifiedAt": 1706745600
}
}
],
"paging": {
"offset": 1
}
}
}Response Fields
| Field | Type | Description |
|---|---|---|
data.payRatesByUsers[].userId | integer | User ID |
data.payRatesByUsers[].payRate.effectiveDate | string | Date this rate becomes effective (YYYY-MM-DD) |
data.payRatesByUsers[].payRate.rateType | string | hourly, monthly, or yearly |
data.payRatesByUsers[].payRate.isDefaultRateEnabled | boolean | Whether the default rate is enabled |
data.payRatesByUsers[].payRate.defaultRate | number | Default rate amount. Omitted when isDefaultRateEnabled is false |
data.payRatesByUsers[].payRate.isResourceRateEnabled | boolean | Whether resource-specific rates are enabled |
data.payRatesByUsers[].payRate.resourcesRates | array | Resource rates. Empty array when isResourceRateEnabled is false |
data.payRatesByUsers[].payRate.createdBy | integer | Admin who created this entry |
data.payRatesByUsers[].payRate.createdAt | integer | Unix timestamp of creation |
data.payRatesByUsers[].payRate.modifiedAt | integer | Unix timestamp of last modification. Omitted if never modified |
data.payRatesByUsers[].payRate.modifications | array | Modification history. Only present when isIncludeHistory=true |
Null vs OmittedFields that are not applicable are omitted from the response (not returned as
null). For example, a resource withisUsingDefaultRate: truewill not include aratefield.
Error Codes
| HTTP Status | Error Code | Description |
|---|---|---|
| 400 | 1003 | Date range exceeds 365 days, end date before start date, or invalid date format |
| 401 | — | Missing authentication |
| 403 | — | Invalid API key or insufficient OAuth scope |
Updated about 18 hours ago
