List users
GEThttps://
Returns the organisation's people, by name A→Z, the order plnnrly's user list uses.
Access
- Token scope
- api:
read: users Without it:
403 insufficient-token-scope. - Permission
- users::
read Without it:
403 insufficient-permission. - Rate cost
- 1 unit, read bucket.
view=detailmakes it 3. Adds:q+2. - Also
If-None-Matchanswers304when nothing changed. Never cached:private, no-store. Unknown query parameters are refused, never ignored.
Both are checked, scope first. A token never does more than its user. How access is checked
Search by name or email address with q, which is the practical way to resolve a colleague to the user_id every other collection filters on. Service accounts are never listed. Roles, permissions and teams are not part of this payload and no filter narrows by them. The working week is a detail-view field: send view=detail to get working_hours. ?include= is not accepted: this resource expands no relation, and company_branch in particular belongs to customers, not to users. Soft-deleted users are excluded by default; trashed=with includes them and trashed=only returns just the departed, which is how an incremental sync learns somebody left.
Query parameters
Unknown parameters are refused with 400, naming the parameter.
21 parameters in 6 groups
Views
Pagination
Rows per page. At most 25 when include names a to-many relation; a larger value is 400 invalid-query-parameter.
Default: 25
Filters
- =
- equals
- [null]
trueorfalse: whether it is empty- [gte][lte][lt]
- at least, at most, less than
Date of birth. null selects the users whose birthday was never recorded.
Whether the field is null.
Creation timestamp. Pair with sort=id for a stable full export.
First day of employment. null selects the users whose start date was never recorded.
Whether the field is null.
Search
Sorting
| Key | Sorts by |
|---|---|
name | Full name, A→Z, the order plnnrly's people list uses. |
date_employed | First day of employment, earliest first; the users with none sort with the nulls. |
birthday | Date of birth, oldest first; the users with none sort with the nulls. |
id | Id, ascending. An id never changes, so use this for a stable full export. |
updated_at | Last-write timestamp; pair with the id tiebreaker for sync. |
Prefix a key with - for descending.
Other
Request headers
A correlation id of your own. It is recorded in our logs next to the server's request id but never returned: the response header always carries the server's id. A value that does not match the pattern is discarded silently, never rejected.
Response 200
Returns a page of UserList rows.
The rows, each a UserList.
per_page, next_cursor, prev_cursor, total, current_page, last_page.
self, next, prev.
Each row is a UserList: 14 fields.
Headers
ETag- A weak validator (
W/"…") of the rendered page. RateLimit- The IETF
httpapi-ratelimit-headersform of your remaining allowance on the tightest bucket this request touched. RateLimit-Policy- The ceiling and window of that bucket, as
<limit>;w=<seconds>. X-Request-Id- The server-generated ULID correlating this response with our logs.
Every response also carries Cache-Control, Vary, X-Content-Type-Options, X-Plnnrly-Api-Version, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset. Headers and versioning
Work email address, unique within the organisation. Searchable with ?q=, which is the practical way to resolve a person to an id.
The user's identifying colour, as a CSS colour string. Used by plnnrly's calendars and avatars; render it or ignore it.
The user's own IANA timezone, e.g. Europe/Amsterdam. Null means the organisation's default applies. Every timestamp in this API is UTC regardless; this is the zone a client renders them in for this person.
First day of employment, or null where it was never recorded. A calendar date with no clock, so it is never converted to UTC.
Share of available hours this person is expected to bill, 1 to 100, or null where no target is set. Read by the profitability report; a user without a target is still reported on, just not judged against one.
The contracted working week, one entry per shift, in week order. A weekday may carry several entries (a split day is two ranges), and a weekday that is not worked simply has none. Null or empty means no schedule has been recorded.
Where the user usually works on each weekday, keyed monday through sunday. The stored pattern lists only the days away from the office, so a weekday it does not name reads as office here. A single day's override from the agenda is not reflected.
Show 7 child fields
Soft-delete timestamp, null while the user is active.
Errors
8 errors every operation can return: 304, 400, 401, 404, 406, 429, 500, 503
304 Not modified.
400 Bad request.
idempotency-key-requiredinvalid-cursorinvalid-query-parametermalformed-requestunsupported-parameter
401 Unauthenticated.
404 Not found.
406 Not acceptable.
429 Too many requests.
500 Server error.
503 Service unavailable.
This path allows GET. Anything else answers 405.
Something wrong or missing on this page? Tell us