Filtering
Selecting specific fields to include in response only
Use the select parameter as a comma separated string to only include fields in the response you're interested in. If it's a nested property in the response, you may end the property name with a . (period) to include all its children. Selecting specific fields may be required in the future, and is regarded a good practice. Please note: some fields may be returned regardless of what you select.
Use case: Return only id, name, and all properties of relation_type:
GET /api/v2/crm/organization?select=id,relation_type.,name
This also works with nested properties in the response as well:
Use case: Return only id, name, and payment_term of its debtor property:
GET /api/v2/crm/organization?select=id,debtor.payment_term.,name
Filter the actual dataset returned
Filtering is allowed on almost all endpoints through the use of the q parameter, expressed as an array.
If this is a normal array, an OR-search will be done on the given fields.
Wildcards are allowed by means of *: q[name]=Don*.
NULL values may be searched with null: q[name]=null
Non NULL values may be searched with *: q[name]=*
Use case: Search for all entries in 'name' that contain 'Bob' somewhere in its value:
q[name]=*Bob*
Use case: Search for all entries in 'name' that have the value of 'Alice' OR 'Charlie'
q[name][]=Alice&q[name][]=Charlie
Use case: Search for all entries in 'name' that are of value 'Alice' AND values in 'email' that end with 'gmail.com'
q[name]=Alice&q[email]=*gmail.com
Use case: Search for all entries in 'name' that have 'Alice' OR values in 'email' that end with 'gmail.com'
q[name]=Alice&q[or][email]=*gmail.com&limit=10&sort=name
Filtering on Nested Values
Nested values, sometimes even several layers deep, can be filtered on as well. A simplified example response of /api/v2/projects/project is as follows:
{
"data": [
{
"id": "project:abc",
"name": "My First Project",
"organization": {
"id": "organization:xyz",
"name": "Google"
},
"my_organization_profile": {
"id": "myorganizationprofile:123",
"organization": {
"id": "organization:456",
"name": "My Company"
}
}
}
]
}
Use case: Find projects related to an organization by the name of 'Google':
/api/v2/projects/project?q[organization.name]=Google
Use case: Find projects related to your own organization by the name of 'My Company':
/api/v2/projects/project?q[my_organization_profile.organization.name]=My%20Company
Advanced Filtering
Advanced filtering is available with these options:
Additional Operators
There are additional operators to be used:
| Operator in URL | Math operator | Explanation |
|---|---|---|
ge | >= | greater than or equals |
gt | > | greater than |
le | <= | less than or equals |
lt | < | less than |
in | IN | column with a value that matches one of the values in a comma separated list of values |
nin | NOT IN | same as above, but negating |
Use case: Search for all entries where they were last modified since a specific date, max 10 records, order by 'updated_at' date in descending order:
q[updated_at][ge]=2025-12-15 00:00:00&limit=10&sort=-updated_at
Use case: Search for all entries where they were created between two dates, max 10 records, order by 'created_at' in descending order:
q[created_at][ge]=2025-12-08 00:00:00&q[created_at][le]=2025-12-15 23:59:59&limit=10&sort=-created_at
Please note: when using comparison operators (ge, gt, le, lt), fields like created_at and updated_at are date time fields (among others). When working with date times, please include the time to avoid any confusion. Upon omitting the time part, it'll default to 00:00:00.
Use case: Find all services for projects that have invoice method 'Hours' or 'FixedFee', order by budget descending:
/projects/services?q[invoice_method][in]=FixedFee,Subscription&sort=-budget
Custom Fields
Custom fields is a module independent entity within Simplicate. Please see this support article for more information (in Dutch).
There are 5 entities that support custom fields. All of them are available through the API, though not all of them can be filtered on yet.
| Entity | URL | Filtering supported? |
|---|---|---|
| Projects | /projects/project | Yes |
| Organizations | /crm/organization | Yes |
| Person | /crm/person | Yes |
| Sales | /sales/sale | Yes |
| Employee | /hrm/employee | No |
Each custom field has a property called 'name'. This name must be used to filter on. See the results of each respective listing call to find out what the custom field names are.
Use case: Find all projects that have a link to Google Docs in the custom field 'external_link':
This use case assumes there is a custom field named "External link" for "Projects"
q[custom_fields.external_link]=*docs.google.com*
The following 2 use cases assume there is a custom field named 'Part of country' for 'Projects', with 5 possible values: (North, East, South, West, Centre).
Use case: Find all projects that have no 'part_of_country' set yet
This use case combines custom field filtering with the advanced operators found above.
q[custom_fields.part_of_country][nin]=*
Use case: Find all projects that have no 'part_of_country' set yet, created after a specific date, show only the id, name, and project_manager fields, order by updated_at descending.
q[custom_fields.part_of_country][nin]=*&q[created_at][ge]=2025-12-27 00:00:00&select=id,name,project_manager.employee_id,project_manager.name&sort=-updated_at
Return Limit and Pagination
By default, most GET requests return a maximum of 100 records. You may decrease the number of records on a per-request basis by passing a limit parameter in the request URL parameters. Example: limit=50. You can't exceed 100 records per page on almost all endpoints. When the results exceed the limit, you can iterate through the records by incrementing the offset parameter.
Use case: Search for all entries in 'name' that have '%Bob%' from offset 11 with max 10 records, order by 'name' descending:
q[name]=*Bob*&offset=11&limit=10&sort=-name
Sorting Results
You can pass a sort parameter in the request URL. This parameter should contain a list of fields where to sort on. By default, the sort order is ascending. This can be reversed by prefixing the field with a minus (-).
Use case: Search for all entries in 'name' that have 'Alice' OR entries in 'email' that have 'gmail.com', max 10 records, order by name ascending:
q[name]=Alice&q[or][email]=*gmail.com&limit=10&sort=name
Use case: Search for all entries in 'name' that have 'Alice' OR entries in 'email' that have 'gmail.com', max 10 records, order by name descending:
q[name]=Alice&q[or][email]=*gmail.com&limit=10&sort=-name
Metadata
It is possible to receive metadata with your request. Below are the accepted values, separated by a comma.
| Metadata | Purpose |
|---|---|
count | Shows the count of the entire collection, ignoring the limit & offset parameters, but taking into account all query parameters. Useful for pagination |
limit | Returns the limit that's also set in the request parameters |
offset | Returns the offset that's also set in the request parameters |
Use case: Find all entries with name like *my*, limit by 10, but show the count & limit in the metadata property
q[name]=*my*&limit=10&metadata=count,limit