List contacts
GEThttps://
Returns the contacts the caller may read, by name A-Z.
Access
- Token scope
- api:
read: customers Without it:
403 insufficient-token-scope. - Permission
- customers::
read Without it:
403 insufficient-permission. - Rate cost
- 1 unit, read bucket.
view=detailmakes it 3. Adds: each include +1,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
Pass filter[contactable_type] and filter[contactable_id] together to list one customer's or one user's contacts (there is no nested path for them), or filter[contact_role_id] to list one role's. Pass q to search name and email, and include=contactable,role to expand the parent and the role.
Query parameters
Unknown parameters are refused with 400, naming the parameter.
19 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
- [in]
- any of a comma-separated list
- [null]
trueorfalse: whether it is empty- [gte][lt]
- at least, less than
Assigned contact role. Use the null operator to list contacts with no role.
A comma-separated list of at most 100 values.
Key of the parent record. This pair is how a customer's contacts are listed: there is no /customers/{customer}/contacts path.
A comma-separated list of at most 100 values.
Kind of parent the contact hangs off. Must be sent together with filter[contactable_id]; one half without the other is a 400.
Creation timestamp. Pair with sort=id for a stable full export.
Search
Sorting
| Key | Sorts by |
|---|---|
name | Contact name, A→Z. |
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.
Includes
| Path | Adds | Cost |
|---|---|---|
contactable | Expands the parent record into a CustomerSummary or a UserSummary. The user branch is cross-prefix: expanding it additionally needs users::read and a token covering the users prefix, and without them the row keeps the {"id": N} reference form with contactable_type intact rather than failing. | +1 |
role | Expands the assigned contact role into {id, name}. | +1 |
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 ContactList rows.
The rows, each a ContactList.
per_page, next_cursor, prev_cursor, total, current_page, last_page.
self, next, prev.
Each row is a ContactList: 18 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
The kind of record contactable points at; it says which branch of contactable applies.
customeruser
New values may be added.
The record this contact belongs to: a customer for a CRM contact, a user for an employee's emergency contact. Rendered as {"id": N} until named in ?include=contactable, and still as {"id": N} where the caller may not read the parent's prefix. contactable_type and contactable_id are always present, so the parent can be found without the include, and the reference form shows nothing contactable_id does not.
Which form you get depends on contactable_type.
customerCustomerSummaryuserUserSummary
Assigned contact role, or null. Deleting a role unassigns it rather than refusing.
The contact's role. Rendered as {"id": N} until named in ?include=role, and null where no role is assigned.
Street address. plnnrly pre-fills this from the customer when adding a contact, but the API fills in no default for it.
Country as an ISO 3166-1 alpha-2 code, e.g. NL, as plnnrly writes it. Older records may hold any string.
Free-form note, sanitised HTML. The emergency-contact form uses it for the relationship to the employee, e.g. Partner.
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, POST. Anything else answers 405.
Something wrong or missing on this page? Tell us