The REPSLog API lets you log and read REPS work hours programmatically. Use it to build your own integrations, automate time logging from another tool, or pull hours summaries into a report.
This article is a quickstart and reference. For an always-current, interactive version you can call directly from your browser, see the live docs at api.reps-log.com/v1/docs.
Before you start
-
Premium required. The API is available to REPSLog Premium subscribers only. Requests from non-Premium accounts return
403. -
Get an API key. Create one in the Developer Portal at api.reps-log.com. A key looks like
rl_<keyId>.<secret>. The secret is shown once at creation time and never again, so store it somewhere safe. If you lose it, rotate the key to issue a new secret.
Base URL
https://api.reps-log.com/v1
Authentication
Every request to /v1 must include your API key as a bearer token in the Authorization header. The REST API accepts API keys only. If you connected REPSLog to Claude, ChatGPT or Grok, that OAuth sign-in is for the MCP connector and does not work here; create an API key instead.
Authorization: Bearer rl_<keyId>.<secret>
If a key is leaked, revoke it from the Developer Portal. Revocation takes effect immediately (the next request returns 401). The raw secret is never logged on our side.
Endpoints
All paths below are relative to the base URL https://api.reps-log.com/v1.
| Method | Path | Description | Key parameters |
|---|---|---|---|
| POST | /time-logs |
Create a time log against an existing property | Body: propertyId, description, durationMinutes (required); categoryId, performedOn, performedBy (optional). Header: Idempotency-Key (optional) |
| GET | /time-logs |
List time logs |
from, to, propertyId, categoryId, propertyType (str/ltr), limit, cursor
|
| GET | /properties |
List all of your properties (no pagination) | none |
| GET | /categories |
List your categories | none |
| GET | /participants |
List your participants | none |
| GET | /hours-summary |
Aggregate logged hours |
from, to, propertyId, categoryId, participantId, propertyType (str/ltr) |
| GET | /user-settings |
Read whitelisted account settings | none. Returns propertiesType (both/ltr/str) and internationalPropertiesEnabled
|
Create time log body fields
-
propertyId(string, required): the property the work was performed against. -
description(string, required, max 2000 chars): what the work was. -
durationMinutes(integer, required, 1 to 1440): how long the work took. -
categoryId(string, optional): the work category. -
performedOn(date, optional,YYYY-MM-DD): when the work was done. Defaults to today if omitted. -
performedBy(string, optional):selforspouse. - Whether the log counts toward short-term or long-term rental hours is inherited from the property. It is returned as
isSTRand cannot be set on the request.
curl examples
Create a time log
The optional Idempotency-Key header lets you safely retry a create without logging it twice. Reusing the same key returns the original result instead of creating a duplicate.
curl -X POST https://api.reps-log.com/v1/time-logs \
-H "Authorization: Bearer rl_abc123.s3cr3t" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 7f1c9e2a-0001" \
-d '{
"propertyId": "prop_maple_street",
"description": "Met contractor to review kitchen renovation bids",
"durationMinutes": 90,
"categoryId": "cat_repairs",
"performedOn": "2026-06-01",
"performedBy": "self"
}'
A successful create returns 201:
{
"ok": true,
"data": {
"id": "log_8842",
"propertyId": "prop_maple_street",
"categoryId": "cat_repairs",
"description": "Met contractor to review kitchen renovation bids",
"durationMinutes": 90,
"performedOn": "2026-06-01",
"performedBy": "self",
"isSTR": false,
"isMaterial": true,
"source": "public-api"
}
}
List time logs
curl -G https://api.reps-log.com/v1/time-logs \
-H "Authorization: Bearer rl_abc123.s3cr3t" \
--data-urlencode "from=2026-01-01" \
--data-urlencode "to=2026-06-30" \
--data-urlencode "propertyId=prop_maple_street" \
--data-urlencode "limit=50"
Returns 200 with a paginated payload. When more results are available, nextCursor is set; pass it back as the cursor parameter to fetch the next page.
{
"ok": true,
"data": {
"data": [
{
"id": "log_8842",
"propertyId": "prop_maple_street",
"categoryId": "cat_repairs",
"description": "Met contractor to review kitchen renovation bids",
"durationMinutes": 90,
"performedOn": "2026-06-01",
"performedBy": "self",
"isSTR": false,
"isMaterial": true,
"source": "public-api"
}
],
"nextCursor": "eyJwIjoyfQ"
}
}
Get an hours summary
curl -G https://api.reps-log.com/v1/hours-summary \
-H "Authorization: Bearer rl_abc123.s3cr3t" \
--data-urlencode "from=2026-01-01" \
--data-urlencode "to=2026-06-30" \
--data-urlencode "propertyType=str"
Returns 200:
{
"ok": true,
"data": {
"totalHours": 142.5,
"materialHours": 120.0,
"strHours": 142.5,
"entryCount": 96,
"from": "2026-01-01",
"to": "2026-06-30",
"byProperty": [
{ "propertyId": "prop_maple_street", "hours": 80.0, "entryCount": 54 },
{ "propertyId": "prop_oak_avenue", "hours": 62.5, "entryCount": 42 }
]
}
}
Rate limits
Requests are limited to 60 requests per 60 seconds per API key. When you exceed the limit you get a 429 response. These responses include a Retry-After header telling you how long to wait, plus RateLimit-* headers describing your current quota. Back off and retry after the indicated delay.
Error envelope
Every error response uses the same JSON shape:
{
"ok": false,
"code": "validation_error",
"message": "durationMinutes must be between 1 and 1440",
"requestId": "req_a1b2c3",
"details": {}
}
-
okis alwaysfalseon errors. -
codeis a stable machine-readable string you can branch on. -
messageis a human-readable explanation. -
requestIdidentifies the request. Include it if you contact support. -
detailsis optional and may carry field-level validation info.
Common status codes:
| Status | Meaning |
|---|---|
400 |
Validation or bad request |
401 |
Missing, invalid, or revoked credentials |
403 |
Forbidden scope, or the account is not Premium |
404 |
Resource not found |
429 |
Rate limited (see Retry-After) |
Interactive docs
The full, always-current specification with a try-it console lives at api.reps-log.com/v1/docs. The raw OpenAPI document is at api.reps-log.com/v1/openapi.json. Both are public and need no authentication to view.
See also
Feature overview
Related articles
- What Is the REPSLog API & AI Assistant Integration?
- Connect REPSLog to ChatGPT
- Connect REPSLog to Claude
- Connect REPSLog to Grok
- Developer Portal & API keys
- Use cases & example prompts
Try it in REPSLog: iPhone, Android or the web app. Free for 14 days.
Comments
0 comments
Please sign in to leave a comment.