Apperio Filter API

The filter endpoints provide resource discovery in Apperio. This has two basic mechanisms. Firstly there are the resource discovery endpoints. These are: * `/api/v1/filter/engagements/` * `/api/v1/filter/invoices/` * `/api/v1/filter/matter-tags/` These endpoints return lists of resource references with decorating metadata that can be filtered, ordered and paginated. Secondly resources may be tagged. The tag management endpoints allow you to create different groupings of matters For those familiar with writing SQL queries, the resource discovery endpoints can be thought of in a similar way. The `SELECT` section or projection clause determines which fields are returned. The `WHERE` clause or filter section determines which records are returned and `ORDER BY` section determines the order that they are returned in. Ordering and pagination is covered in the section above. Below, we will take each of the other sections in turn to show how these are handled on these endpoints. **Data Projection** The filter API is designed to provide broad information about resources for easy resource discovery. The client can choose which denormalised fields can appear in the projection clause using the `fields` query parameter. Only the fields listed in this query parameter, together with any mandatory fields, will be included in the response. The field names are URL encoded comma (%2C) separated. For example if I wish to bring back the fields `one`, `two` and `three` I would query the endpoint with: ``` ...?fields=one%2Ctwo%2Cthree ``` And the response will bring back only those fields and any mandatory fields (such as the identifier for the resource). For example the response may be: ```json { "results": [ { "one": 5000.0, "two": 5, "three": false }, { "one": 86645.23, "two": 59541, "three": false } ], "pagination": { "next": null, "previous": null, "nextPage": null, "previousPage": null } } ``` The full list of available fields can be seen in the response body for that endpoint. **Resource Permissions** The set of resources that can be discovered in the API is limited to those that the user generating the token has access to. This can then be filtered further using explicit filters; resources that the user is not authorized to see will not be returned. **Filtering the data** On the resource discovery endpoints the returning data can be filtered by each of the fields on the resource. Each field has been associated with the type of filter that will make it easier to discover resources. The filter types are explained below. *Range filters* Range filters allow a slice of the data to be selected. They can be used to select all data less than equal to a value; all data above or equal to a value or can be combined to return a slice of the data. For example if I have the field `foo` and wish to return all data between 10000 and 12000 GBP I would add the filters: ``` ?foo__gte=10000&foo__lte=12000 ``` When the field is a monetary field it is assumed that these values will be in your organisation's base currency and any transactions in another currency will be subject to a exchange conversion on the rate held for the date of that transaction. **Text filters** Text filters will return all entries that start with the selected value. For example if I wanted to bring back all matters that started with the name 'Pricing' I would filter on ``` ?law_firm_name__icontains=Pricing ``` These query would bring back matters called both 'Pricing development contract' and 'Pricing housing development' **Choice filters** Choice filters allow both exact matching and a selection of values to be matched. For example, to search for the single value apple I would include: ``` ?bar=apple ``` To bring back both apples, pairs and mangos: ``` ?bar__in=apple%2Cpair%2Cmango ``` Where the field can be null, the `__isnull` filter is provided ``` ?foo__isnull=true ``` If you want to incorporate null as one of the choices then `__is_null` and `__in` on the same field returns the _union_ of those resources that match one of those values and those resources where this field isn't set: ``` ?foo__isnull=true&foo__in=cucumber%2Ctomato ``` **Boolean filters** Boolean filters filter out data where a field is true or false. For example, if I want to bring back matters that I haven't yet shared with the business. ``` ?is_shared=false ```

OpenAPI Specification

apperio-filter-api-openapi.yml Raw ↑
openapi: 3.0.3
info:
  title: Apperio API Documentation Analytics Filter API
  description: "# Introduction\n\nThe Apperio API allows law firms and businesses to enhance their internal\nbusiness intelligence capabilities. These APIs are designed to efficiently support\ninteractive reporting and are used to power the Apperio application.\n\n# API Versioning\n\nMajor versions will come with semantic versioning guarantees.\nThat is to say, there will be no breaking changes in minor version upgrades.\nIn particular the following changes will only be introduced in major versions of the API:\n\n  * Changing the meaning of an entity or attribute\n  * Renaming entities or attributes\n  * Adding new required attributes in the request\n  * Changing the URI of the endpoint\n  * Removing a URI endpoint\n  * Adding further choices to an enumeration\n  * Removing choices from an enumeration in the request\n\nFurther endpoints and entity attributes can be added in minor versions. It's expected that\nclients should ignore any attributes that are returned in the response that they weren't\naware of. When a multiple option attribute isn't modelled with an explicit enumeration the\nintegrating clients should also ensure that they can handle unknown responses.\n\nEach previous version of the API will be supported for 6 months after the release of a new\nmajor version. A migration plan will be published for each major version to inform integrators\nof breaking changes.\n\n### What is likely to change in the next major version of the API?\n\n#### Service Versioning\n\nEach endpoint will include the version and service name. Endpoints will have the following format:\n\n`/api/v[MAJOR VERSION NUMBER]/[SERVICE_NAME]/[ENDPOINT NAME]`\n\nHence in version 2:\n\n* `/api/v1/filter/invoices/` will change to `/api/v2/filter/invoices/`\n* `/api/v1/analytics/` will change to `/api/v2/analytics/analytics/`\n\n#### Matter / Engagement\n\nThe terms matter and engagement are used interchangeably in the current version. This\nreflects historical usage in the product. References to `engagement` will be replaced\nwith `matter` in future versions.\n\n# Change Log for Version 1.5\n\n#### v1.5\n* Updated engagement and invoice filter endpoints parameters documentation\n* Added documentation for some ebilling endpoints\n\n#### v1.4\n* Added basic information about the matter header endpoint\n\n#### v1.3\n* Update rate limits\n* Fix analytics URL and auhorization header\n\n#### v1.2\n* Key Management\n* HTTP 429 response\n* Versioning moved from service to global API version\n* Glossary definitions\n\n#### v1.1\n* Matter Tag Set Discovery Endpoint\n\n#### v1.0\n* Versioning Strategy\n* Glossary\n\n#### v0.2\n\n* Invoice discovery endpoint.\n* Null choice filter.\n* Fair usage policy.\n* Capabilities for law firm and business users.\n\n#### v0.1\n\n* Filter resource discovery API.\n\n# Authentication\n\nAll endpoints require that you be authenticated. To become authenticated\nyou will need to create an API Key from the profile page in the application,\nand supply it within the Authentication header in the following format:\n\n```\ncurl -X GET \"https://sandbox.apperio.com/api/v1/data/analytics/\"\n-H \"Authorization: Token <TOKEN VALUE>\"\n```\n\nPlease contact Customer Success to enable API access on your account.\n\nAll requests that are made to the API will be made with the capabilities of\nthe user generating the token. It's important that you ensure that the access\ntoken is kept secret and not shared outside of your organisation. In particular\nbe mindful not to check it in to code or configuration files where it can be\nseen in plain text. We recommend cycling the API key at least every 12 months.\nIf you suspect that the key may been leaked then disable it immediately in the profile\nsection and inform Apperio. Apperio do not have access to these tokens; hence, you\nwill need to generate a new token if it's lost.\n\nYou should consider that this token grants access to anything that the associated\nuser can access on the website. This will allow you to take advantage of future\nendpoints without further configuration. With this in mind be careful to give this\naccount the minimum set of privileges required for your integration.\n\n# Pagination and Ordering\n\nPagination endpoints allow ordered data to be brought back in chunks. Pagination\nis usually limited to data discovery and information feed endpoints. If available\n`PAGINATION` will be listed in the *Capabilities* section of the endpoint. The response\ncan be ordered by setting the `ordering` query parameter. This takes a URL encoded\ncomma separated list of fields to order by. If a field is prepended by a `-` then\nthe ordering is reversed. For example if I wished to order by `last_worked_at_law_firm`\nwith the latest results first and then by `engagement_id` I would add the following\nto the query:\n\n```\nordering=-last_worked_at_law_firm%2Cengagement_id\n```\n\nThe number of results returned on a page is controlled by the `page-size` parameter.\nIt defaults to 50 across the API and will be capped to avoid large one-time data\nextractions that may be prone to fail.\n\n```\nordering=-last_worked_at_law_firm%2Cengagement_id&page-size=10\n```\n\nWhen there are more items to return than can be shown on one page then a pagination\nobject is returned in the response:\n\n```json\n\"pagination\": {\n  \"next\": \"https://sandbox.apperio.com/api/v1/filter/engagements/?ordering=-last_worked_at_law_firm%2Cengagement_id&page=dj0yJnA9MiZnPWJiNTdmMDg2NzI2YzQxYWRhZmI4NmZjMjRlODI5ZTIz&page-size=10\",\n  \"previous\":null\n  \"nextPage\":\"dj0yJnA9MiZnPWJiNTdmMDg2NzI2YzQxYWRhZmI4NmZjMjRlODI5ZTIz\",\n  \"previousPage\":null\n}\n```\n\nThe `nextPage` and `previousPage` provide a token that can be passed to the `page` parameter to\nnavigate to that page. `null` indicates that there is no further data in that direction. The `next` and\n`previous` attributes provide HATEOAS style links to navigate to the next and previous page.\n\n# Business and Law Firm Capabilities\n\nApperio is a double sided platform that allows law firms and businesses to collaborate. The Apperio API is available\nto both businesses and law firms; however some requests are only available to one side of the platform. The capabilities\nsection for each endpoint details which side can access each API call.\n\nThe access token serves to identify the organisation (law firm or business). Resources in each request will be restricted\nto those available to that organisation.\n\n# Acceptable usage policy\n\n* Please respect the usage limits. If you think you are likely to exceed them then please contact Customer Success.\n  The standard usage limits are:\n  - Requests from the same authorization token should be made in series; not in parallel\n  - Maximum of 10000 requests in an hour\n* The API is designed to allow you to provide innovative services that incorporate data that's held in Apperio.\nThey should not be used as a means of duplicating that data.\n* If you're unsure about the most effective way to integrate with Apperio to support your business case then\nplease contact Customer Success so we can take you through different solutions.\n* Your application must be able to handle a `HTTP 429 Too Many Requests` response.\n* Apperio reserve the right to suspend API access if usage contravenes this policy. \n\n# Glossary\n\nThe following terminology is used throughout the API\n\n| Term           | Description   |\n| -------------  | ------------- |\n| Billable       | The billable amount includes both entries that have been billed and the potential contribution from work that's in progress. |\n| Billed         | The amount that has already been invoiced. |\n| Budget         | The estimated budgeted amount for hourly matters. For fixed matters this represents the fixed cost. This also represents the cap for capped matters (see Fee Structure). |\n| Client         | The client of the law firm. Multiple law firm clients can be associated with the one Apperio business. |\n| Disbursement   | disbursements, hard cost and soft costs. |\n| Engagement     | (see Matter) The term `engagement` is Apperio internal terminology for `matter` and will be replaced with `matter` in the next major version. |\n| Fee            | The charge for work undertaken by the law firm. |\n| Fee Structure  | How the matter will be billed. Apperio supports Hourly, Capped and Fixed Fee structures. |\n| Matter         | A law firm case. |\n| Practice Group | The division in the law firm conducting the work. |\n| Wip            | Work that has been carried out but not yet billed on the matter (Work in progress). |\n"
servers:
- url: https://sandbox.apperio.com/
- url: https://app.apperio.com/
tags:
- name: Filter
  description: "The filter endpoints provide resource discovery in Apperio. This has\ntwo basic mechanisms. Firstly there are the resource discovery endpoints.\nThese are:\n  * `/api/v1/filter/engagements/`\n  * `/api/v1/filter/invoices/`\n  * `/api/v1/filter/matter-tags/`\n\nThese endpoints return lists of resource references with decorating metadata\nthat can be filtered, ordered and paginated.\n\nSecondly resources may be tagged. The tag management endpoints allow you to\ncreate different groupings of matters\n\nFor those familiar with writing SQL queries, the resource discovery endpoints\ncan be thought of in a similar way. The `SELECT` section or projection clause\ndetermines which fields are returned. The `WHERE` clause or filter section determines\nwhich records are returned and `ORDER BY` section determines the order that they are\nreturned in. Ordering and pagination is covered in the section above. Below, we will\ntake each of the other sections in turn to show how these are handled on these endpoints. \n\n**Data Projection**\n\nThe filter API is designed to provide broad information about resources for easy resource\ndiscovery. The client can choose which denormalised fields can appear in the projection\nclause using the `fields` query parameter. Only the fields listed in this query parameter,\ntogether with any mandatory fields, will be included in the response.\nThe field names are URL encoded comma (%2C) separated.\n\nFor example if I wish to bring back the fields `one`, `two` and `three` I would query the\nendpoint with:\n\n```\n...?fields=one%2Ctwo%2Cthree\n```\n\nAnd the response will bring back only those fields and any mandatory fields (such as the\nidentifier for the resource). For example the response may be:\n\n```json\n{\n  \"results\": [\n    {\n        \"one\": 5000.0,\n        \"two\": 5,\n        \"three\": false\n    },\n    {\n        \"one\": 86645.23,\n        \"two\": 59541,\n        \"three\": false\n    }\n  ],\n  \"pagination\": {\n      \"next\": null,\n      \"previous\": null,\n      \"nextPage\": null,\n      \"previousPage\": null\n  }\n}\n```\n\nThe full list of available fields can be seen in the response body for that endpoint.\n\n**Resource Permissions**\n\nThe set of resources that can be discovered in the API is limited to those that\nthe user generating the token has access to. This can then be filtered further\nusing explicit filters; resources that the user is not authorized to see will not\nbe returned.\n\n**Filtering the data**\n\nOn the resource discovery endpoints the returning data can be filtered\nby each of the fields on the resource. Each field has been associated with\nthe type of filter that will make it easier to discover resources. The filter\ntypes are explained below.  \n\n*Range filters*\n\nRange filters allow a slice of the data to be selected. They can be used to\nselect all data less than equal to a value; all data above or equal to a value\nor can be combined to return a slice of the data. For example if I have the\nfield `foo` and wish to return all data between 10000 and 12000 GBP I would add\nthe filters:\n\n```\n?foo__gte=10000&foo__lte=12000\n```\n\nWhen the field is a monetary field it is assumed that these values will be in\nyour organisation's base currency and any transactions in another currency will\nbe subject to a exchange conversion on the rate held for the date of that\ntransaction.\n\n**Text filters**\n\nText filters will return all entries that start with the selected value. For\nexample if I wanted to bring back all matters that started with the name 'Pricing'\nI would filter on\n\n```\n?law_firm_name__icontains=Pricing\n```\n\nThese query would bring back matters called both 'Pricing development contract'\nand 'Pricing housing development'\n\n**Choice filters**\n\nChoice filters allow both exact matching and a selection of values to be matched.\nFor example, to search for the single value apple I would include:\n\n```\n?bar=apple\n```\n\nTo bring back both apples, pairs and mangos:\n\n```\n?bar__in=apple%2Cpair%2Cmango\n```\n\nWhere the field can be null, the `__isnull` filter is provided\n\n```\n?foo__isnull=true\n```\n\nIf you want to incorporate null as one of the choices then `__is_null`\nand `__in` on the same field returns the _union_ of those resources that\nmatch one of those values and those resources where this field isn't set:\n\n```\n?foo__isnull=true&foo__in=cucumber%2Ctomato\n```\n\n**Boolean filters**\n\nBoolean filters filter out data where a field is true or false. For example, if\nI want to bring back matters that I haven't yet shared with the business.\n\n```\n?is_shared=false\n```\n"
paths:
  /api/v1/filter/engagements/:
    get:
      summary: Discover matter resources
      description: 'Capabilities: BUSINESS, LAW_FIRM, PAGINATION

        Matter discovery endpoint. The returned projection can be controlled by setting the

        `fields` parameter to just return the fields you require. Results can be ordered and

        paginated.

        '
      tags:
      - Filter
      parameters:
      - name: fields
        in: query
        required: true
        schema:
          type: string
          example: engagement_id%2Cbilled%2Cearliest_work_date
          description: 'The filter API is designed to provide broad information about resources for easy resource

            discovery. The client can choose which denormalised fields can appear in the projection clause.

            Only the selected fields will be included in the response. Fields are comma

            separated. The commas will need to be URL encoded (%2C)


            The full list of available fields depends on the type of the user''s organisation (business or firm).

            Most of the fields are available to all users, but some are restricted.


            | Field name | Description | Business | Firm |

            |------------|-------------|:--------:|:----:|

            | `engagement_id` | Apperio ID of a matter | ✅ | ✅ |

            | `business_engagement_name` | Business name of a matter | ✅ | ✅ |

            | `law_firm_engagement_name` | Law firm name of a matter | ✅ | ✅ |

            | `accessible` | Is the matter accessible? | ❌ | ✅ |

            | `created_at` | When was the matter created in Apperio | ✅ | ✅ |

            | `currency` | The matter currency | ✅ | ✅ |

            | `earliest_work_date` | The date of the earliest recorded time entry or expense for this matter | ✅ | ✅ |

            | `fee_structure` | The fee structure of the matter (`hourly`, `capped`, `fixed`) | ✅ | ✅ |

            | `service_provider_type` | The type of firm (`legal` or `accountancy`).<br> Only available if the business is connected to firms of multiple types | ✅ | ❌ |

            | `business_config_id` | ID of the "business config" entity | ❌ | ✅ |

            | `business_config_is_ebilled` | Whether ebilling is enabled for the matter''s business | ❌ | ✅ |

            | `business_matter_type_id` | The ID of a matter type. | ✅ | ✅* |

            | `client_id` | The ID of the client entity | ✅ | ✅ |

            | `client_name` | The client name | ❌ | ✅ |

            | `billing_entity_id` | The ID of the billing entity | ✅ | ✅ |

            | `billing_entity` | The billing entity. An object with the following fields: `id`, `business_id`, `name` | ✅ | ✅ |

            | `folder_id` | The ID of the folder | ✅ | ✅<sup>1</sup> |

            | `folder_full_name` | The full path of a folder, e.g. `Europe > France > Paris` | ✅ | ✅<sup>1</sup> |

            | `pass_through` | Is it a pass-through matter? | ✅ | ✅<sup>1</sup> |

            | `team_id` | The ID of the team | ✅ | ✅<sup>1</sup> |

            | `matter_owner` | The matter owner. On object with the following fields: `id`, `assignment_start`, `user`, where `user` is an object containing `id`, `first_name` and `last_name`. | ✅ | ✅<sup>1</sup> |

            | `is_manual` | Is it a matter created manually (as opposed to being uploaded via the data file uploader)? | ✅ | ✅ |

            | `is_shared` | Is the matter shared with the business | ❌ | ✅ |

            | `last_worked_at_business` | The date of the last recorded time entry or expense, as seen by the business (including the sharing window) | ✅ | ❌ |

            | `last_worked_at_law_firm` | The date of the last recorded time entry or expense, as seen by the firm (ignoring the sharing window) | ❌ | ✅ |

            | `law_firm_created` | Matter creation date, as recorded in the firm''s system | ✅ | ✅ |

            | `law_firm_id` | Apperio ID of a firm | ✅ | ✅ |

            | `law_firm_name` | The name of the firm | ✅ | ✅ |

            | `number` | The matter number, as recorded by the firm | ✅ | ✅ |

            | `practice_group_id` | The Apperio ID of a practice group | ✅ | ✅ |

            | `practice_group_name` | The practice group name | ✅ | ✅ |

            | `project_id` | The Apperio ID of the "project" entity (that contains the business-provided matter data) | ✅ | ✅ |

            | `status` | The matter status (`current` or `closed`) | ✅ | ✅ |

            | `unbillable` | Is the matter non-billable? | ✅ | ✅ |

            | `confidential` | Is the matter confidential? (as defined by the firm) | ❌ | ✅ |

            | `confidential_project` | Is the matter confidential? (as defined by the business) | ✅ | ❌ |

            | `client_matter_reference` | The matter number, as defined by the business | ✅ | ✅ |

            | `tag_id` | The matter tags. A list of objects with the following fields: `link_id`, `tag_id`, `tag_name`, `tag_set_id` | ✅ | ✅<sup>2</sup> |

            | `standard_fee_structure_id` | The ID of the "standard" fee structure | ✅ | ✅ |

            | `client_contact_first_name` | The first name of the client contact for the matter | ✅ | ✅ |

            | `client_contact_last_name` | The last name of the client contact for the matter | ✅ | ✅ |

            | `client_contact_email` | The email address of the client contact for the matter | ✅ | ✅ |

            | `own_assignment_date` | The date this matter was assigned to the user making the request | ✅ | ❌ |

            | `own_matter_seen` | Was the matter seen by the current user since they were assigned to the matter? | ✅ | ❌ |

            | `billable` | The total amount billable on the matter | ✅ | ✅ |

            | `fees_billable` | The amount of fees (time entries) billable on the matter | ✅ | ✅ |

            | `disbursements_billable` | The amount of disbursements (expenses) billable on the matter | ✅ | ✅ |

            | `billed` | The total amount billed on the matter| ✅ | ✅ |

            | `fees_billed` | The amount of fees (time entries) billed on the matter | ✅ | ✅ |

            | `disbursements_billed` | The amount of disbursements (expenses) billed on the matter | ✅ | ✅ |

            | `wip` | The total amount WIP (not yet billed) on the matter | ✅ | ✅ |

            | `fees_wip` | The amount of fees (time entries) WIP (not yet billed) on the matter | ✅ | ✅ |

            | `disbursements_wip` | The amount of disbursements (expenses) WIP (not yet billed) on the matter | ✅ | ✅ |

            | `write_down` | The total amount written down on the matter | ✅ | ✅ |

            | `fees_write_down` | The amount of fees (time entries) written down on the matter | ✅ | ✅ |

            | `disbursements_write_down` | The amount of disbursements (expenses) written down on the matter | ✅ | ✅ |

            | `budget_total` | The total amount of the matter budget | ✅ | ✅ |

            | `budget_total_fees` | The amount of the matter fees budget | ✅ | ✅ |

            | `budget_total_disbursements` | The amount of the matter disbursements budget | ✅ | ✅ |

            | `budget_percentage` | The percentage of the total budget used up by the billable amount | ✅ | ✅ |

            | `budget_fees_percentage` | The percentage of the fees budget used up by the billable fees amount | ✅ | ✅ |

            | `budget_disbursements_percentage` | The percentage of the disbursements budget used up by the billable disbursements amount | ✅ | ✅ |


            <sup>1</sup> Only available if at least one business is sharing their matter attributes with their firms<br>

            <sup>2</sup> Only available if at least one business is sharing their tag sets with their firms

            '
      - name: page
        in: query
        schema:
          type: string
          example: dj0yJnA9MiZnPWJiNTdmMDg2NzI2YzQxYWRhZmI4NmZjMjRlODI5ZTIz
          description: 'Go to a specific page of content. This cursor is returned in the

            `nextPage` and `previousPage` properties of the `pagination` object.

            '
      - name: page-size
        in: query
        schema:
          type: integer
          example: 20
          description: 'The number of items to bring back on a page.

            '
      - name: ordering
        in: query
        schema:
          type: string
          example: ordering=-last_worked_at_law_firm%2Cengagement_id
          description: 'How the results should be ordered.


            This takes a URL encoded comma separated list of fields to order by.

            If a field is prepended by a `-` then the ordering is reversed. For example if I wished

            to order by `last_worked_at_law_firm` with the latest results first and then by `engagement_id`

            I would add `ordering=-last_worked_at_law_firm%2Cengagement_id` to the query

            '
      - name: engagement_id
        in: query
        schema:
          type: int
          description: Return a single matter
      - name: engagement_id__in
        in: query
        schema:
          type: string
          description: 'Comma separated list of Apperio matter identifiers. The commas must

            be URL encoded (%2C)

            '
          example: 25%2C66
      - name: project_id
        in: query
        schema:
          type: int
          description: Filter by a single "project" (the business representation of a matter)
      - name: project_id__in
        in: query
        schema:
          type: string
          description: 'Comma separated list of Apperio project identifiers. The commas must

            be URL encoded (%2C)

            '
          example: 25%2C66
      - name: business_config_id
        in: query
        schema:
          type: int
          description: 'Filter matters to the one Apperio business-law firm connection identifier

            '
      - name: business_config_id__in
        in: query
        schema:
          type: string
          description: 'Comma separated list of Apperio business-law firm connection identifiers.

            The commas must be URL encoded (%2C)

            '
      - name: standard_fee_structure_id
        in: query
        schema:
          type: int
          description: 'Filter matters by a single standard fee structure

            '
      - name: standard_fee_structure_id__in
        in: query
        schema:
          type: string
          description: 'Comma separated list of Apperio business-law firm connection identifiers.

            The commas must be URL encoded (%2C)

            '
      - name: business_config_is_ebilled
        in: query
        schema:
          type: boolean
          description: Only return matters from businesses with/without ebilling enabled
      - name: business_matter_type_id
        in: query
        schema:
          type: string
          description: 'Filter by a single business matter type

            '
      - name: business_matter_type_id__in
        in: query
        schema:
          type: string
          description: 'Comma separated list of Apperio business matter type identifiers. The commas must

            be URL encoded (%2C)

            '
      - name: business_matter_type_id__isnull
        in: query
        schema:
          type: boolean
          description: 'Filter matters where the matter type isn''t set

            '
      - name: accessible
        in: query
        schema:
          type: boolean,
          description: Matters (in)accessible to the business
      - name: created_at__lt
        in: query
        schema:
          type: date
          description: Filter matters created in Apperio before a given date
      - name: created_at__lte
        in: query
        schema:
          type: date
          description: Filter matters created in Apperio on or before a given date
      - name: created_at__gte
        in: query
        schema:
          type: date
          description: Filter matters created in Apperio on or after a given date
      - name: created_at__gt
        in: query
        schema:
          type: date
          description: Filter matters created in Apperio after a given date
      - name: earliest_work_date__lt
        in: query
        schema:
          type: date
          description: Filter matters where the earliest recorded time entry or expense is before a given date
      - name: earliest_work_date__lte
        in: query
        schema:
          type: date
          description: Filter matters where the earliest recorded time entry or expense is on or before a given date
      - name: earliest_work_date__gte
        in: query
        schema:
          type: date
          description: Filter matters where the earliest recorded time entry or expense is on or after a given date
      - name: earliest_work_date__gt
        in: query
        schema:
          type: date
          description: Filter matters where the earliest recorded time entry or expense is after a given date
      - name: last_worked_at_business__lt
        in: query
        schema:
          type: date
          description: 'Filter matters where the latest recorded time entry or expense is before a given date.<br>

            Only available to business users.

            '
      - name: last_worked_at_business__lte
        in: query
        schema:
          type: date
          description: 'Filter matters where the latest recorded time entry or expense is on or before a given date.<br>

            Only available to business users.

            '
      - name: last_worked_at_business__gte
        in: query
        schema:
          type: date
          description: 'Filter matters where the latest recorded time entry or expense is on or after a given date.<br>

            Only available to business users.

            '
      - name: last_worked_at_business__gt
        in: query
        schema:
          type: date
          description: 'Filter matters where the latest recorded time entry or expense is after a given date.<br>

            Only available to business users.

            '
      - name: last_worked_at_law_firm__lt
        in: query
        schema:
          type: date
          description: 'Filter matters where the latest recorded time entry or expense is before a given date.<br>

            Only available to firm users.

            '
      - name: last_worked_at_law_firm__lte
        in: query
        schema:
          type: date
          description: 'Filter matters where the latest recorded time entry or expense is on or before a given date.<br>

            Only available to firm users.

            '
      - name: last_worked_at_law_firm__gte
        in: query
        schema:
          type: date
          description: 'Filter matters where the latest recorded time entry or expense is on or after a given date.<br>

            Only available to firm users.

            '
      - name: last_worked_at_law_firm__gt
        in: query
        schema:
          type: date
          description: 'Filter matters where the latest recorded time entry or expense is after a given date.<br>

            Only available to firm users.

            '
      - name: service_provider_type
        in: query
        schema:
          type: string
          description: Only return matters from firms with a given service provider type
          enum:
          - legal
          - accountancy
      - name: own_assignment_date__lt
        in: query
        schema:
          type: date
          description: Filter matters assigned to the current user before a given date
      - name: own_assignment_date__lte
        in: query
        schema:
          type: date
          description: Filter matters assigned to the current user on or before a given date
      - name: own_assignment_date__gte
        in: query
        schema:
          type: date
          description: Filter matters assigned to the current user on or after a given date
      - name: own_assignment_date__gt
        in: query
        schema:
          type: date
          description: Filter matters assigned to the current user after a given date
      - name: own_assignment_seen
        in: query
        schema:
          type: boolean
          description: 'Filter matters owned by the current user, either already seen or not.<br>

            Can be used to find matters newly assigned to the current user.

            '
      - name: billable__gte
        in: query
        schema:
          type: number
          description: 'Filter matters with the billable amount greater or equal to the VALUE

            The comparison VALUE is in your organisation''s currency and matters

            in other currencies would be compared in your organisation''s currency

            '
      - name: billable__lte
        in: query
        schema:
          type: number
          description: 'Filter matters with the billed amount less than or equal to the VALUE

            The comparison VALUE is in your organisation''s currency and matters

            in other currencies would be compared in your organisation''s currency

            '
      - name: billed__gte
        in: query
        schema:
          type: number
          description: 'Filter matters with the billed amount greater or equal to the VALUE

            The comparison VALUE is in your organisation''s currency and matters

            in other currencies would be compared in your organisation''s currency

            '
      - name: billed__lte
        in: query
        schema:
          type: number
          description: 'Filter matters with the billed amount less than or equal to the VALUE

            The comparison VALUE is in your organisation''s currency and matters

            in other currencies would be compared in your organisation''s currency

            '
      - name: budget_total__gte
        in: query
        schema:
          type: number
          description: 'Filter matters with the budget total amount greater or equal to the VALUE

            The comparison VALUE is in your organisation''s currency and matters

            in other currencies would be compared in your organisation''s currency

            '
      - name: budget_total__lte
        in: query
        schema:
          type: number
          description: 'Filter matters with the budget total amount less than or equal to the VALUE

            The comparison VALUE is in your organisation''s currency and matters

            in other currencies would be compared in your organisation''s currency

            '
      - name: budget_total_disbursements__gte
        in: query
        schema:
          type: number
          description: 'Filter matters with the disbursement budget total amount greater or equal to the VALUE

            The comparison VALUE is in your organisation''s currency and matters

            in other currencies would be compared in your organisation''s currency

            '
      - 

# --- truncated at 32 KB (152 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/apperio/refs/heads/main/openapi/apperio-filter-api-openapi.yml