Skip to main content

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 URLMath operatorExplanation
ge>=greater than or equals
gt>greater than
le<=less than or equals
lt<less than
inINcolumn with a value that matches one of the values in a comma separated list of values
ninNOT INsame 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.

EntityURLFiltering supported?
Projects/projects/projectYes
Organizations/crm/organizationYes
Person/crm/personYes
Sales/sales/saleYes
Employee/hrm/employeeNo

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.

MetadataPurpose
countShows the count of the entire collection, ignoring the limit & offset parameters, but taking into account all query parameters. Useful for pagination
limitReturns the limit that's also set in the request parameters
offsetReturns 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