API Reference

RESTful API for MatterFirst: legal practice management. Responses follow JSON:API-like conventions. ## Surfaces and credentials MatterFirst exposes seven HTTP surfaces; this document describes the first two in full and indexes the rest: | Surface | Base path | Credential | |---|---|---| | v1 REST API | `/api/v1` | `Authorization: Bearer mf_live_…` API key | | Referral partner API | `/api/v1/referral-contracts` | `Authorization: Bearer mf_ref_…` partner key | | Content API | `/api/content/v1` | `Authorization: Bearer mf_content_…` content key | | Marketing lead capture | `/api/marketing/leads` | none (anonymous form capture) | | Provider webhook receivers | `/api/webhooks/*` | each provider's own signature (Stripe, Xero, Resend, Google, Microsoft) | | MCP server | `/mcp` | Bearer token or OAuth, JSON-RPC 2.0, outside this document | | Signed document downloads | `/api/v1/documents/{id}/content` | single-use signed `token` query param, no API key | ## Error envelope Every error on the JSON surfaces is the same shape (see `ErrorResponse`): `{"errors": [{"status", "code", "title", "detail", "source"}]}`. A client branches on `code` (stable), shows `detail` (prose, may change), and never needs to parse `title`. ## Pagination and filtering List endpoints take `page_number` and `page_size` and answer with `meta` (`total`, `page`, `page_size`, `total_pages`) plus `links` (`self`, `first`, `last`, `prev`, `next`). Filtering is `filter[field]=value` against each resource's declared filterable fields; sorting is `sort=field` or `sort=-field` against its sortable fields; sparse fieldsets are `fields[type]=a,b`; related resources are embedded with `include=`. ## Outbound webhook signatures Deliveries to endpoints registered via `/api/v1/webhooks` carry `x-matterfirst-timestamp` and `x-matterfirst-signature: v1=<hex>`, where the signature is HMAC-SHA256 over `"v1.<timestamp>.<body>"`. Verify the signature, then reject timestamps outside your tolerance window (300 seconds is the reference tolerance) to stop replays. ## Links Interactive docs: `/api/v1/swaggerui`. This document: `/api/v1/openapi`. What your key can do: `GET /api/v1/capabilities`. ## Rate limits Rate limits: 300 requests per minute per API key and 1,000 per minute per organization, with a tighter 30-per-minute per-key limit on expensive POST endpoints (paths ending in /send, /run, /convert, /uploads, /test or /merge). Every response carries RateLimit-Limit, RateLimit-Remaining and RateLimit-Reset headers; exceeding a limit returns 429 with error code `rate_limited` and a Retry-After header. Safe retries: POST endpoints accept an optional `Idempotency-Key` header (max 255 chars). Retrying with the same key and body replays the original response byte-identically with `Idempotency-Replayed: true`; the same key with a different body is refused with 409 `idempotency_key_reuse`, and a key whose first request is still running answers 409 `idempotency_key_in_flight` with Retry-After. 5xx responses are never stored, so retrying them re-runs the request. Optimistic concurrency: GET and update responses for matters, invoices, tasks and leads carry a weak `ETag`. Sending it back as `If-Match` on PATCH/PUT makes the update conditional: a stale tag is refused with 412 `precondition_failed` before anything is written. Both headers are optional; omitting them keeps today's behaviour.


Authentication

All API endpoints require a Bearer token passed in the Authorization header. You can generate API keys from your organization settings.

Include the token as a Bearer authorization header on all requests. Requests without valid authentication will return a 401 status code.

Example request
curl -H "Authorization: Bearer {YOUR_API_KEY}" \
     https://app.matterfirst.com.au/api/v1/matters

Errors

The API returns standard HTTP status codes. Error responses include a JSON body with an errors key describing what went wrong.

  • Status
    400
    Description
    Bad Request: the request was malformed
  • Status
    401
    Description
    Unauthorized: invalid or missing API key
  • Status
    403
    Description
    Forbidden: insufficient permissions
  • Status
    404
    Description
    Not Found: resource does not exist
  • Status
    422
    Description
    Unprocessable Entity: validation errors
  • Status
    429
    Description
    Rate Limited: too many requests
  • Status
    500
    Description
    Internal Server Error
Error response
{
  "errors": {
    "detail": "Resource not found"
  }
}

Pagination

List endpoints support pagination via page[number] and page[size] query parameters.

  • Name
    total
    Type
    integer
    Description
    Total number of records.
  • Name
    page
    Type
    integer
    Description
    Current page number.
  • Name
    page_size
    Type
    integer
    Description
    Number of records per page.
  • Name
    total_pages
    Type
    integer
    Description
    Total number of pages.
Paginated response
{
  "data": [],
  "meta": {
    "total": 100,
    "page": 1,
    "page_size": 20,
    "total_pages": 5
  }
}

Audit Log

GET /api/v1/audit-log

List audit log entries

Parameters

  • Name
    page_number
    Type
    integer
    In
    in query
    Description
  • Name
    page_size
    Type
    integer
    In
    in query
    Description
  • Name
    resource_type
    Type
    string
    In
    in query
    Description
  • Name
    action
    Type
    string
    In
    in query
    Description
  • Name
    user_id
    Type
    string (uuid)
    In
    in query
    Description
200 Audit log entries
{
  "data": [
    {
      "attributes": {
        "action": "create",
        "changed_fields": [
          "string"
        ],
        "inserted_at": "2026-01-01T00:00:00Z",
        "metadata": {},
        "resource_id": "00000000-0000-0000-0000-000000000000",
        "resource_type": "string",
        "user_id": "00000000-0000-0000-0000-000000000000"
      },
      "id": "00000000-0000-0000-0000-000000000000",
      "type": "audit-logs"
    }
  ],
  "links": {
    "first": "string",
    "last": "string",
    "next": "string",
    "prev": "string",
    "self": "string"
  },
  "meta": {
    "page": 0,
    "page_size": 0,
    "total": 0,
    "total_pages": 0
  }
}
GET /api/v1/audit-log/{resource_type}/{resource_id}

Get audit log entries for a specific resource

Parameters

  • Name
    resource_type
    Type
    string
    required
    In
    in path
    Description
  • Name
    resource_id
    Type
    string (uuid)
    required
    In
    in path
    Description
  • Name
    page_number
    Type
    integer
    In
    in query
    Description
  • Name
    page_size
    Type
    integer
    In
    in query
    Description
200 Audit log entries for resource
{
  "data": [
    {
      "attributes": {
        "action": "create",
        "changed_fields": [
          "string"
        ],
        "inserted_at": "2026-01-01T00:00:00Z",
        "metadata": {},
        "resource_id": "00000000-0000-0000-0000-000000000000",
        "resource_type": "string",
        "user_id": "00000000-0000-0000-0000-000000000000"
      },
      "id": "00000000-0000-0000-0000-000000000000",
      "type": "audit-logs"
    }
  ],
  "links": {
    "first": "string",
    "last": "string",
    "next": "string",
    "prev": "string",
    "self": "string"
  },
  "meta": {
    "page": 0,
    "page_size": 0,
    "total": 0,
    "total_pages": 0
  }
}

Automation Actions

GET /api/v1/automations/{automation_id}/actions

List actions for an automation

Parameters

  • Name
    automation_id
    Type
    string (uuid)
    required
    In
    in path
    Description
  • Name
    page_number
    Type
    integer
    In
    in query
    Description
  • Name
    page_size
    Type
    integer
    In
    in query
    Description
200 Automation action list
{
  "data": [
    {
      "attributes": {
        "action_type": "string",
        "automation_id": "00000000-0000-0000-0000-000000000000",
        "conditions": [
          {
            "field": "string",
            "operator": "equals",
            "type": "field",
            "value": {}
          }
        ],
        "configuration": {},
        "continue_on_error": false,
        "delay_seconds": 0,
        "inserted_at": "2026-01-01T00:00:00Z",
        "position": 0,
        "updated_at": "2026-01-01T00:00:00Z"
      },
      "id": "00000000-0000-0000-0000-000000000000",
      "type": "automation-actions"
    }
  ],
  "meta": {
    "count": 0,
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
POST /api/v1/automations/{automation_id}/actions

Create an automation action

Parameters

  • Name
    automation_id
    Type
    string (uuid)
    required
    In
    in path
    Description

Request body

  • Name
    data
    Type
    object
    required
    Description
POST /api/v1/automations/{automation_id}/actions
{
  "data": {
    "attributes": {
      "action_type": "string",
      "configuration": {},
      "continue_on_error": false,
      "delay_seconds": 0,
      "position": 0
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "automation-actions"
  }
}
201 Created action
{
  "data": {
    "attributes": {
      "action_type": "string",
      "automation_id": "00000000-0000-0000-0000-000000000000",
      "conditions": [
        {
          "field": "string",
          "operator": "equals",
          "type": "field",
          "value": {}
        }
      ],
      "configuration": {},
      "continue_on_error": false,
      "delay_seconds": 0,
      "inserted_at": "2026-01-01T00:00:00Z",
      "position": 0,
      "updated_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "automation-actions"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
GET /api/v1/automations/{automation_id}/actions/{id}

Get an automation action

Parameters

  • Name
    automation_id
    Type
    string (uuid)
    required
    In
    in path
    Description
  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
200 Automation action
{
  "data": {
    "attributes": {
      "action_type": "string",
      "automation_id": "00000000-0000-0000-0000-000000000000",
      "conditions": [
        {
          "field": "string",
          "operator": "equals",
          "type": "field",
          "value": {}
        }
      ],
      "configuration": {},
      "continue_on_error": false,
      "delay_seconds": 0,
      "inserted_at": "2026-01-01T00:00:00Z",
      "position": 0,
      "updated_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "automation-actions"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
PUT /api/v1/automations/{automation_id}/actions/{id}

Update an automation action

Parameters

  • Name
    automation_id
    Type
    string (uuid)
    required
    In
    in path
    Description
  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description

Request body

  • Name
    data
    Type
    object
    required
    Description
PUT /api/v1/automations/{automation_id}/actions/{id}
{
  "data": {
    "attributes": {
      "action_type": "string",
      "configuration": {},
      "continue_on_error": false,
      "delay_seconds": 0,
      "position": 0
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "automation-actions"
  }
}
200 Updated action
{
  "data": {
    "attributes": {
      "action_type": "string",
      "automation_id": "00000000-0000-0000-0000-000000000000",
      "conditions": [
        {
          "field": "string",
          "operator": "equals",
          "type": "field",
          "value": {}
        }
      ],
      "configuration": {},
      "continue_on_error": false,
      "delay_seconds": 0,
      "inserted_at": "2026-01-01T00:00:00Z",
      "position": 0,
      "updated_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "automation-actions"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
PATCH /api/v1/automations/{automation_id}/actions/{id}

Update an automation action

Parameters

  • Name
    automation_id
    Type
    string (uuid)
    required
    In
    in path
    Description
  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description

Request body

  • Name
    data
    Type
    object
    required
    Description
PATCH /api/v1/automations/{automation_id}/actions/{id}
{
  "data": {
    "attributes": {
      "action_type": "string",
      "configuration": {},
      "continue_on_error": false,
      "delay_seconds": 0,
      "position": 0
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "automation-actions"
  }
}
200 Updated action
{
  "data": {
    "attributes": {
      "action_type": "string",
      "automation_id": "00000000-0000-0000-0000-000000000000",
      "conditions": [
        {
          "field": "string",
          "operator": "equals",
          "type": "field",
          "value": {}
        }
      ],
      "configuration": {},
      "continue_on_error": false,
      "delay_seconds": 0,
      "inserted_at": "2026-01-01T00:00:00Z",
      "position": 0,
      "updated_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "automation-actions"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
DELETE /api/v1/automations/{automation_id}/actions/{id}

Delete an automation action

Parameters

  • Name
    automation_id
    Type
    string (uuid)
    required
    In
    in path
    Description
  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
DELETE /api/v1/automations/{automation_id}/actions/{id}
curl -X DELETE \
     -H "Authorization: Bearer {token}" \
     https://app.matterfirst.com.au/api/v1/automations/{automation_id}/actions/{id}

Automations

GET /api/v1/automations

List automations

Parameters

  • Name
    page_number
    Type
    integer
    In
    in query
    Description
  • Name
    page_size
    Type
    integer
    In
    in query
    Description
200 Automation list
{
  "data": [
    {
      "attributes": {
        "actions": [
          {
            "action_type": "string",
            "automation_id": "00000000-0000-0000-0000-000000000000",
            "conditions": [
              {
                "field": "string",
                "operator": "equals",
                "type": "field",
                "value": {}
              }
            ],
            "configuration": {},
            "continue_on_error": false,
            "delay_seconds": 0,
            "inserted_at": "2026-01-01T00:00:00Z",
            "position": 0,
            "updated_at": "2026-01-01T00:00:00Z"
          }
        ],
        "conditions": [
          {
            "field": "string",
            "operator": "equals",
            "type": "field",
            "value": {}
          }
        ],
        "description": "string",
        "inserted_at": "2026-01-01T00:00:00Z",
        "is_active": false,
        "matter_type_id": "00000000-0000-0000-0000-000000000000",
        "name": "string",
        "position": 0,
        "trigger_config": {},
        "trigger_type": "string",
        "updated_at": "2026-01-01T00:00:00Z"
      },
      "id": "00000000-0000-0000-0000-000000000000",
      "type": "automations"
    }
  ],
  "meta": {
    "count": 0,
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
POST /api/v1/automations

Create an automation

Request body

  • Name
    data
    Type
    object
    required
    Description
POST /api/v1/automations
{
  "data": {
    "attributes": {
      "conditions": [
        {
          "field": "string",
          "operator": "equals",
          "type": "field",
          "value": {}
        }
      ],
      "description": "string",
      "is_active": false,
      "matter_type_id": "00000000-0000-0000-0000-000000000000",
      "name": "string",
      "position": 0,
      "trigger_config": {},
      "trigger_type": "string"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "automations"
  }
}
201 Created automation
{
  "data": {
    "attributes": {
      "actions": [
        {
          "action_type": "string",
          "automation_id": "00000000-0000-0000-0000-000000000000",
          "conditions": [
            {
              "field": "string",
              "operator": "equals",
              "type": "field",
              "value": {}
            }
          ],
          "configuration": {},
          "continue_on_error": false,
          "delay_seconds": 0,
          "inserted_at": "2026-01-01T00:00:00Z",
          "position": 0,
          "updated_at": "2026-01-01T00:00:00Z"
        }
      ],
      "conditions": [
        {
          "field": "string",
          "operator": "equals",
          "type": "field",
          "value": {}
        }
      ],
      "description": "string",
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_active": false,
      "matter_type_id": "00000000-0000-0000-0000-000000000000",
      "name": "string",
      "position": 0,
      "trigger_config": {},
      "trigger_type": "string",
      "updated_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "automations"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
GET /api/v1/automations/{automation_id}/logs

List an automation's execution logs

The run history for one automation, newest first, paginated. Serves the outcome of each run (status, timing, error message), never the raw `trigger_data` or per-action results, which are free-form maps that can carry anything the trigger passed.

Parameters

  • Name
    automation_id
    Type
    string (uuid)
    required
    In
    in path
    Description
  • Name
    page_number
    Type
    integer
    In
    in query
    Description
  • Name
    page_size
    Type
    integer
    In
    in query
    Description
200 Execution log list
{
  "data": [
    {
      "attributes": {
        "automation_id": "00000000-0000-0000-0000-000000000000",
        "completed_at": "2026-01-01T00:00:00Z",
        "duration_ms": 0,
        "error_message": "string",
        "inserted_at": "2026-01-01T00:00:00Z",
        "matter_id": "00000000-0000-0000-0000-000000000000",
        "started_at": "2026-01-01T00:00:00Z",
        "status": "running",
        "trigger_type": "string"
      },
      "id": "00000000-0000-0000-0000-000000000000",
      "type": "automation-logs"
    }
  ],
  "links": {
    "first": "string",
    "last": "string",
    "next": "string",
    "prev": "string",
    "self": "string"
  },
  "meta": {
    "page": 0,
    "page_size": 0,
    "total": 0,
    "total_pages": 0
  }
}
GET /api/v1/automations/{id}

Get an automation

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
200 Automation
{
  "data": {
    "attributes": {
      "actions": [
        {
          "action_type": "string",
          "automation_id": "00000000-0000-0000-0000-000000000000",
          "conditions": [
            {
              "field": "string",
              "operator": "equals",
              "type": "field",
              "value": {}
            }
          ],
          "configuration": {},
          "continue_on_error": false,
          "delay_seconds": 0,
          "inserted_at": "2026-01-01T00:00:00Z",
          "position": 0,
          "updated_at": "2026-01-01T00:00:00Z"
        }
      ],
      "conditions": [
        {
          "field": "string",
          "operator": "equals",
          "type": "field",
          "value": {}
        }
      ],
      "description": "string",
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_active": false,
      "matter_type_id": "00000000-0000-0000-0000-000000000000",
      "name": "string",
      "position": 0,
      "trigger_config": {},
      "trigger_type": "string",
      "updated_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "automations"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
PUT /api/v1/automations/{id}

Update an automation

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description

Request body

  • Name
    data
    Type
    object
    required
    Description
PUT /api/v1/automations/{id}
{
  "data": {
    "attributes": {
      "conditions": [
        {
          "field": "string",
          "operator": "equals",
          "type": "field",
          "value": {}
        }
      ],
      "description": "string",
      "is_active": false,
      "matter_type_id": "00000000-0000-0000-0000-000000000000",
      "name": "string",
      "position": 0,
      "trigger_config": {},
      "trigger_type": "string"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "automations"
  }
}
200 Updated automation
{
  "data": {
    "attributes": {
      "actions": [
        {
          "action_type": "string",
          "automation_id": "00000000-0000-0000-0000-000000000000",
          "conditions": [
            {
              "field": "string",
              "operator": "equals",
              "type": "field",
              "value": {}
            }
          ],
          "configuration": {},
          "continue_on_error": false,
          "delay_seconds": 0,
          "inserted_at": "2026-01-01T00:00:00Z",
          "position": 0,
          "updated_at": "2026-01-01T00:00:00Z"
        }
      ],
      "conditions": [
        {
          "field": "string",
          "operator": "equals",
          "type": "field",
          "value": {}
        }
      ],
      "description": "string",
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_active": false,
      "matter_type_id": "00000000-0000-0000-0000-000000000000",
      "name": "string",
      "position": 0,
      "trigger_config": {},
      "trigger_type": "string",
      "updated_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "automations"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
PATCH /api/v1/automations/{id}

Update an automation

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description

Request body

  • Name
    data
    Type
    object
    required
    Description
PATCH /api/v1/automations/{id}
{
  "data": {
    "attributes": {
      "conditions": [
        {
          "field": "string",
          "operator": "equals",
          "type": "field",
          "value": {}
        }
      ],
      "description": "string",
      "is_active": false,
      "matter_type_id": "00000000-0000-0000-0000-000000000000",
      "name": "string",
      "position": 0,
      "trigger_config": {},
      "trigger_type": "string"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "automations"
  }
}
200 Updated automation
{
  "data": {
    "attributes": {
      "actions": [
        {
          "action_type": "string",
          "automation_id": "00000000-0000-0000-0000-000000000000",
          "conditions": [
            {
              "field": "string",
              "operator": "equals",
              "type": "field",
              "value": {}
            }
          ],
          "configuration": {},
          "continue_on_error": false,
          "delay_seconds": 0,
          "inserted_at": "2026-01-01T00:00:00Z",
          "position": 0,
          "updated_at": "2026-01-01T00:00:00Z"
        }
      ],
      "conditions": [
        {
          "field": "string",
          "operator": "equals",
          "type": "field",
          "value": {}
        }
      ],
      "description": "string",
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_active": false,
      "matter_type_id": "00000000-0000-0000-0000-000000000000",
      "name": "string",
      "position": 0,
      "trigger_config": {},
      "trigger_type": "string",
      "updated_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "automations"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
DELETE /api/v1/automations/{id}

Delete an automation

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
DELETE /api/v1/automations/{id}
curl -X DELETE \
     -H "Authorization: Bearer {token}" \
     https://app.matterfirst.com.au/api/v1/automations/{id}
POST /api/v1/automations/{id}/trigger

Manually trigger an automation

Enqueues a run of an active, manual-trigger automation, optionally against a matter (`?matter_id=`). Refused (409) for an inactive automation or one whose trigger type is not `manual`. The run is asynchronous: poll `GET /automations/:automation_id/logs` for its outcome.

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
  • Name
    matter_id
    Type
    string (uuid)
    In
    in query
    Description
202 Run enqueued
{
  "meta": {
    "status": "enqueued"
  }
}
409 Not triggerable
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}

Calendar Events

GET /api/v1/calendar-events

List calendar events

Parameters

  • Name
    filter
    Type
    object
    In
    in query
    Description
  • Name
    include
    Type
    string
    In
    in query
    Description
    Comma-separated related resources to embed in the top-level `included` array. Supported values: matter, created_by.
  • Name
    page_number
    Type
    integer
    In
    in query
    Description
  • Name
    page_size
    Type
    integer
    In
    in query
    Description
  • Name
    sort
    Type
    string
    In
    in query
    Description
  • Name
    start_date
    Type
    string (date)
    In
    in query
    Description
    Start of an overlap window (YYYY-MM-DD, inclusive), resolved in the firm's timezone. Returns every event still running on or after this date, including one that began before it.
  • Name
    end_date
    Type
    string (date)
    In
    in query
    Description
    End of an overlap window (YYYY-MM-DD, inclusive), resolved in the firm's timezone. Returns every event that begins on or before the end of this date, including one that runs past it.
200 Calendar event list
{
  "data": [
    {
      "attributes": {
        "attendee_ids": [
          "00000000-0000-0000-0000-000000000000"
        ],
        "color": "string",
        "contact_ids": [
          "00000000-0000-0000-0000-000000000000"
        ],
        "created_by_id": "00000000-0000-0000-0000-000000000000",
        "description": "string",
        "end_at": "2026-01-01T00:00:00Z",
        "inserted_at": "2026-01-01T00:00:00Z",
        "is_all_day": false,
        "location": "string",
        "matter_id": "00000000-0000-0000-0000-000000000000",
        "start_at": "2026-01-01T00:00:00Z",
        "title": "string",
        "updated_at": "2026-01-01T00:00:00Z"
      },
      "id": "00000000-0000-0000-0000-000000000000",
      "type": "calendar-events"
    }
  ],
  "links": {
    "first": "string",
    "last": "string",
    "next": "string",
    "prev": "string",
    "self": "string"
  },
  "meta": {
    "page": 0,
    "page_size": 0,
    "total": 0,
    "total_pages": 0
  }
}
POST /api/v1/calendar-events

Create a calendar event

Request body

  • Name
    data
    Type
    object
    required
    Description
POST /api/v1/calendar-events
{
  "data": {
    "attributes": {
      "attendee_ids": [
        "00000000-0000-0000-0000-000000000000"
      ],
      "color": "string",
      "contact_ids": [
        "00000000-0000-0000-0000-000000000000"
      ],
      "description": "string",
      "end_at": "2026-01-01T00:00:00Z",
      "is_all_day": false,
      "location": "string",
      "matter_id": "00000000-0000-0000-0000-000000000000",
      "start_at": "2026-01-01T00:00:00Z",
      "title": "string"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "calendar-events"
  }
}
201 Created
{
  "data": {
    "attributes": {
      "attendee_ids": [
        "00000000-0000-0000-0000-000000000000"
      ],
      "color": "string",
      "contact_ids": [
        "00000000-0000-0000-0000-000000000000"
      ],
      "created_by_id": "00000000-0000-0000-0000-000000000000",
      "description": "string",
      "end_at": "2026-01-01T00:00:00Z",
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_all_day": false,
      "location": "string",
      "matter_id": "00000000-0000-0000-0000-000000000000",
      "start_at": "2026-01-01T00:00:00Z",
      "title": "string",
      "updated_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "calendar-events"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
GET /api/v1/calendar-events/{id}

Get a calendar event

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
  • Name
    include
    Type
    string
    In
    in query
    Description
    Comma-separated related resources to embed in the top-level `included` array. Supported values: matter, created_by.
200 Calendar event
{
  "data": {
    "attributes": {
      "attendee_ids": [
        "00000000-0000-0000-0000-000000000000"
      ],
      "color": "string",
      "contact_ids": [
        "00000000-0000-0000-0000-000000000000"
      ],
      "created_by_id": "00000000-0000-0000-0000-000000000000",
      "description": "string",
      "end_at": "2026-01-01T00:00:00Z",
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_all_day": false,
      "location": "string",
      "matter_id": "00000000-0000-0000-0000-000000000000",
      "start_at": "2026-01-01T00:00:00Z",
      "title": "string",
      "updated_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "calendar-events"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
PUT /api/v1/calendar-events/{id}

Update a calendar event

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description

Request body

  • Name
    data
    Type
    object
    required
    Description
PUT /api/v1/calendar-events/{id}
{
  "data": {
    "attributes": {
      "attendee_ids": [
        "00000000-0000-0000-0000-000000000000"
      ],
      "color": "string",
      "contact_ids": [
        "00000000-0000-0000-0000-000000000000"
      ],
      "description": "string",
      "end_at": "2026-01-01T00:00:00Z",
      "is_all_day": false,
      "location": "string",
      "matter_id": "00000000-0000-0000-0000-000000000000",
      "start_at": "2026-01-01T00:00:00Z",
      "title": "string"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "calendar-events"
  }
}
200 Updated
{
  "data": {
    "attributes": {
      "attendee_ids": [
        "00000000-0000-0000-0000-000000000000"
      ],
      "color": "string",
      "contact_ids": [
        "00000000-0000-0000-0000-000000000000"
      ],
      "created_by_id": "00000000-0000-0000-0000-000000000000",
      "description": "string",
      "end_at": "2026-01-01T00:00:00Z",
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_all_day": false,
      "location": "string",
      "matter_id": "00000000-0000-0000-0000-000000000000",
      "start_at": "2026-01-01T00:00:00Z",
      "title": "string",
      "updated_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "calendar-events"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
PATCH /api/v1/calendar-events/{id}

Update a calendar event

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description

Request body

  • Name
    data
    Type
    object
    required
    Description
PATCH /api/v1/calendar-events/{id}
{
  "data": {
    "attributes": {
      "attendee_ids": [
        "00000000-0000-0000-0000-000000000000"
      ],
      "color": "string",
      "contact_ids": [
        "00000000-0000-0000-0000-000000000000"
      ],
      "description": "string",
      "end_at": "2026-01-01T00:00:00Z",
      "is_all_day": false,
      "location": "string",
      "matter_id": "00000000-0000-0000-0000-000000000000",
      "start_at": "2026-01-01T00:00:00Z",
      "title": "string"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "calendar-events"
  }
}
200 Updated
{
  "data": {
    "attributes": {
      "attendee_ids": [
        "00000000-0000-0000-0000-000000000000"
      ],
      "color": "string",
      "contact_ids": [
        "00000000-0000-0000-0000-000000000000"
      ],
      "created_by_id": "00000000-0000-0000-0000-000000000000",
      "description": "string",
      "end_at": "2026-01-01T00:00:00Z",
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_all_day": false,
      "location": "string",
      "matter_id": "00000000-0000-0000-0000-000000000000",
      "start_at": "2026-01-01T00:00:00Z",
      "title": "string",
      "updated_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "calendar-events"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
DELETE /api/v1/calendar-events/{id}

Delete a calendar event

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
DELETE /api/v1/calendar-events/{id}
curl -X DELETE \
     -H "Authorization: Bearer {token}" \
     https://app.matterfirst.com.au/api/v1/calendar-events/{id}

Contact Types

GET /api/v1/contact-types

List contact types

Parameters

  • Name
    page_number
    Type
    integer
    In
    in query
    Description
  • Name
    page_size
    Type
    integer
    In
    in query
    Description
200 Contact type list
{
  "data": [
    {
      "attributes": {
        "code": "string",
        "color": "string",
        "icon": "string",
        "inserted_at": "2026-01-01T00:00:00Z",
        "is_active": false,
        "is_system": false,
        "name": "string",
        "position": 0,
        "updated_at": "2026-01-01T00:00:00Z"
      },
      "id": "00000000-0000-0000-0000-000000000000",
      "type": "contact-types"
    }
  ],
  "links": {
    "first": "string",
    "last": "string",
    "next": "string",
    "prev": "string",
    "self": "string"
  },
  "meta": {
    "page": 0,
    "page_size": 0,
    "total": 0,
    "total_pages": 0
  }
}
POST /api/v1/contact-types

Create a contact type

Request body

  • Name
    data
    Type
    object
    required
    Description
POST /api/v1/contact-types
{
  "data": {
    "attributes": {
      "code": "string",
      "color": "string",
      "icon": "string",
      "is_active": false,
      "name": "string"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "contact-types"
  }
}
201 Created
{
  "data": {
    "attributes": {
      "code": "string",
      "color": "string",
      "icon": "string",
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_active": false,
      "is_system": false,
      "name": "string",
      "position": 0,
      "updated_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "contact-types"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
GET /api/v1/contact-types/{id}

Get a contact type

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
200 Contact type
{
  "data": {
    "attributes": {
      "code": "string",
      "color": "string",
      "icon": "string",
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_active": false,
      "is_system": false,
      "name": "string",
      "position": 0,
      "updated_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "contact-types"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
PUT /api/v1/contact-types/{id}

Update a contact type

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description

Request body

  • Name
    data
    Type
    object
    required
    Description
PUT /api/v1/contact-types/{id}
{
  "data": {
    "attributes": {
      "code": "string",
      "color": "string",
      "icon": "string",
      "is_active": false,
      "name": "string"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "contact-types"
  }
}
200 Updated
{
  "data": {
    "attributes": {
      "code": "string",
      "color": "string",
      "icon": "string",
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_active": false,
      "is_system": false,
      "name": "string",
      "position": 0,
      "updated_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "contact-types"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
PATCH /api/v1/contact-types/{id}

Update a contact type

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description

Request body

  • Name
    data
    Type
    object
    required
    Description
PATCH /api/v1/contact-types/{id}
{
  "data": {
    "attributes": {
      "code": "string",
      "color": "string",
      "icon": "string",
      "is_active": false,
      "name": "string"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "contact-types"
  }
}
200 Updated
{
  "data": {
    "attributes": {
      "code": "string",
      "color": "string",
      "icon": "string",
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_active": false,
      "is_system": false,
      "name": "string",
      "position": 0,
      "updated_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "contact-types"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
POST /api/v1/contact-types/{id}/deactivate

Deactivate a contact type

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
200 Deactivated
{
  "data": {
    "attributes": {
      "code": "string",
      "color": "string",
      "icon": "string",
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_active": false,
      "is_system": false,
      "name": "string",
      "position": 0,
      "updated_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "contact-types"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}

Contacts

GET /api/v1/contacts

List contacts

Parameters

  • Name
    fields
    Type
    object
    In
    in query
    Description
    JSON:API sparse fieldsets: fields[<type>]=a,b limits the attributes returned for that resource type.
  • Name
    filter
    Type
    object
    In
    in query
    Description
    Field filters, e.g. `filter[email]=*@acme.com`. Also supports `filter[lead_id]=<uuid>` to return only the contacts linked to that lead.
  • Name
    page_number
    Type
    integer
    In
    in query
    Description
  • Name
    page_size
    Type
    integer
    In
    in query
    Description
  • Name
    sort
    Type
    string
    In
    in query
    Description
200 Contact list
{
  "data": [
    {
      "attributes": {
        "abn": "string",
        "acn": "string",
        "address_line_1": "string",
        "address_line_2": "string",
        "avatar_url": "string",
        "company_name": "string",
        "contact_type_id": "00000000-0000-0000-0000-000000000000",
        "country": "string",
        "custom_fields": {},
        "date_of_birth": "2026-01-01",
        "email": "string",
        "first_name": "string",
        "inserted_at": "2026-01-01T00:00:00Z",
        "is_archived": false,
        "is_company": false,
        "last_name": "string",
        "mobile": "string",
        "notes": "string",
        "phone": "string",
        "position": "string",
        "postcode": "string",
        "preferred_name": "string",
        "source": "string",
        "state": "string",
        "suburb": "string",
        "tags": [
          "string"
        ],
        "updated_at": "2026-01-01T00:00:00Z"
      },
      "id": "00000000-0000-0000-0000-000000000000",
      "type": "contacts"
    }
  ],
  "links": {
    "first": "string",
    "last": "string",
    "next": "string",
    "prev": "string",
    "self": "string"
  },
  "meta": {
    "page": 0,
    "page_size": 0,
    "total": 0,
    "total_pages": 0
  }
}
POST /api/v1/contacts

Create a contact

Request body

  • Name
    data
    Type
    object
    required
    Description
POST /api/v1/contacts
{
  "data": {
    "attributes": {
      "abn": "string",
      "acn": "string",
      "address_line_1": "string",
      "address_line_2": "string",
      "company_name": "string",
      "contact_type_id": "00000000-0000-0000-0000-000000000000",
      "country": "string",
      "date_of_birth": "2026-01-01",
      "email": "string",
      "first_name": "string",
      "is_company": false,
      "last_name": "string",
      "mobile": "string",
      "notes": "string",
      "phone": "string",
      "postcode": "string",
      "preferred_name": "string",
      "state": "string",
      "suburb": "string",
      "tags": [
        "string"
      ]
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "contacts"
  }
}
201 Created contact
{
  "data": {
    "attributes": {
      "abn": "string",
      "acn": "string",
      "address_line_1": "string",
      "address_line_2": "string",
      "avatar_url": "string",
      "company_name": "string",
      "contact_type_id": "00000000-0000-0000-0000-000000000000",
      "country": "string",
      "custom_fields": {},
      "date_of_birth": "2026-01-01",
      "email": "string",
      "first_name": "string",
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_archived": false,
      "is_company": false,
      "last_name": "string",
      "mobile": "string",
      "notes": "string",
      "phone": "string",
      "position": "string",
      "postcode": "string",
      "preferred_name": "string",
      "source": "string",
      "state": "string",
      "suburb": "string",
      "tags": [
        "string"
      ],
      "updated_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "contacts"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
GET /api/v1/contacts/{id}

Get a contact

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
  • Name
    fields
    Type
    object
    In
    in query
    Description
    JSON:API sparse fieldsets: fields[<type>]=a,b limits the attributes returned for that resource type.
200 Contact
{
  "data": {
    "attributes": {
      "abn": "string",
      "acn": "string",
      "address_line_1": "string",
      "address_line_2": "string",
      "avatar_url": "string",
      "company_name": "string",
      "contact_type_id": "00000000-0000-0000-0000-000000000000",
      "country": "string",
      "custom_fields": {},
      "date_of_birth": "2026-01-01",
      "email": "string",
      "first_name": "string",
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_archived": false,
      "is_company": false,
      "last_name": "string",
      "mobile": "string",
      "notes": "string",
      "phone": "string",
      "position": "string",
      "postcode": "string",
      "preferred_name": "string",
      "source": "string",
      "state": "string",
      "suburb": "string",
      "tags": [
        "string"
      ],
      "updated_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "contacts"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
PUT /api/v1/contacts/{id}

Update a contact

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description

Request body

  • Name
    data
    Type
    object
    required
    Description
PUT /api/v1/contacts/{id}
{
  "data": {
    "attributes": {
      "abn": "string",
      "acn": "string",
      "address_line_1": "string",
      "address_line_2": "string",
      "company_name": "string",
      "contact_type_id": "00000000-0000-0000-0000-000000000000",
      "country": "string",
      "date_of_birth": "2026-01-01",
      "email": "string",
      "first_name": "string",
      "is_company": false,
      "last_name": "string",
      "mobile": "string",
      "notes": "string",
      "phone": "string",
      "postcode": "string",
      "preferred_name": "string",
      "state": "string",
      "suburb": "string",
      "tags": [
        "string"
      ]
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "contacts"
  }
}
200 Updated contact
{
  "data": {
    "attributes": {
      "abn": "string",
      "acn": "string",
      "address_line_1": "string",
      "address_line_2": "string",
      "avatar_url": "string",
      "company_name": "string",
      "contact_type_id": "00000000-0000-0000-0000-000000000000",
      "country": "string",
      "custom_fields": {},
      "date_of_birth": "2026-01-01",
      "email": "string",
      "first_name": "string",
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_archived": false,
      "is_company": false,
      "last_name": "string",
      "mobile": "string",
      "notes": "string",
      "phone": "string",
      "position": "string",
      "postcode": "string",
      "preferred_name": "string",
      "source": "string",
      "state": "string",
      "suburb": "string",
      "tags": [
        "string"
      ],
      "updated_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "contacts"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
PATCH /api/v1/contacts/{id}

Update a contact

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description

Request body

  • Name
    data
    Type
    object
    required
    Description
PATCH /api/v1/contacts/{id}
{
  "data": {
    "attributes": {
      "abn": "string",
      "acn": "string",
      "address_line_1": "string",
      "address_line_2": "string",
      "company_name": "string",
      "contact_type_id": "00000000-0000-0000-0000-000000000000",
      "country": "string",
      "date_of_birth": "2026-01-01",
      "email": "string",
      "first_name": "string",
      "is_company": false,
      "last_name": "string",
      "mobile": "string",
      "notes": "string",
      "phone": "string",
      "postcode": "string",
      "preferred_name": "string",
      "state": "string",
      "suburb": "string",
      "tags": [
        "string"
      ]
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "contacts"
  }
}
200 Updated contact
{
  "data": {
    "attributes": {
      "abn": "string",
      "acn": "string",
      "address_line_1": "string",
      "address_line_2": "string",
      "avatar_url": "string",
      "company_name": "string",
      "contact_type_id": "00000000-0000-0000-0000-000000000000",
      "country": "string",
      "custom_fields": {},
      "date_of_birth": "2026-01-01",
      "email": "string",
      "first_name": "string",
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_archived": false,
      "is_company": false,
      "last_name": "string",
      "mobile": "string",
      "notes": "string",
      "phone": "string",
      "position": "string",
      "postcode": "string",
      "preferred_name": "string",
      "source": "string",
      "state": "string",
      "suburb": "string",
      "tags": [
        "string"
      ],
      "updated_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "contacts"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
DELETE /api/v1/contacts/{id}

Delete a contact

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
422 Still referenced
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
POST /api/v1/contacts/{id}/merge

Merge two contacts

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
    Primary contact ID

Request body

  • Name
    data
    Type
    object
    required
    Description
POST /api/v1/contacts/{id}/merge
{
  "data": {
    "attributes": {
      "field_selections": {},
      "secondary_id": "00000000-0000-0000-0000-000000000000"
    }
  }
}
200 Merged contact
{
  "data": {
    "attributes": {
      "abn": "string",
      "acn": "string",
      "address_line_1": "string",
      "address_line_2": "string",
      "avatar_url": "string",
      "company_name": "string",
      "contact_type_id": "00000000-0000-0000-0000-000000000000",
      "country": "string",
      "custom_fields": {},
      "date_of_birth": "2026-01-01",
      "email": "string",
      "first_name": "string",
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_archived": false,
      "is_company": false,
      "last_name": "string",
      "mobile": "string",
      "notes": "string",
      "phone": "string",
      "position": "string",
      "postcode": "string",
      "preferred_name": "string",
      "source": "string",
      "state": "string",
      "suburb": "string",
      "tags": [
        "string"
      ],
      "updated_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "contacts"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Merge error
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}

Disbursements

GET /api/v1/disbursements

List disbursements

Parameters

  • Name
    filter
    Type
    object
    In
    in query
    Description
  • Name
    include
    Type
    string
    In
    in query
    Description
    Comma-separated related resources to embed in the top-level `included` array. Supported values: matter, user, invoice.
  • Name
    page_number
    Type
    integer
    In
    in query
    Description
  • Name
    page_size
    Type
    integer
    In
    in query
    Description
  • Name
    sort
    Type
    string
    In
    in query
    Description
200 Disbursement list
{
  "data": [
    {
      "attributes": {
        "amount_cents": 0,
        "category": "string",
        "date": "2026-01-01",
        "description": "string",
        "inserted_at": "2026-01-01T00:00:00Z",
        "invoice_id": "00000000-0000-0000-0000-000000000000",
        "is_billable": false,
        "matter_id": "00000000-0000-0000-0000-000000000000",
        "receipt_document_id": "00000000-0000-0000-0000-000000000000",
        "status": "string",
        "updated_at": "2026-01-01T00:00:00Z",
        "user_id": "00000000-0000-0000-0000-000000000000"
      },
      "id": "00000000-0000-0000-0000-000000000000",
      "type": "disbursements"
    }
  ],
  "links": {
    "first": "string",
    "last": "string",
    "next": "string",
    "prev": "string",
    "self": "string"
  },
  "meta": {
    "page": 0,
    "page_size": 0,
    "total": 0,
    "total_pages": 0
  }
}
POST /api/v1/disbursements

Create a disbursement

Request body

  • Name
    data
    Type
    object
    required
    Description
POST /api/v1/disbursements
{
  "data": {
    "attributes": {
      "amount_cents": 0,
      "category": "string",
      "date": "2026-01-01",
      "description": "string",
      "is_billable": false,
      "matter_id": "00000000-0000-0000-0000-000000000000",
      "user_id": "00000000-0000-0000-0000-000000000000"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "disbursements"
  }
}
201 Created
{
  "data": {
    "attributes": {
      "amount_cents": 0,
      "category": "string",
      "date": "2026-01-01",
      "description": "string",
      "inserted_at": "2026-01-01T00:00:00Z",
      "invoice_id": "00000000-0000-0000-0000-000000000000",
      "is_billable": false,
      "matter_id": "00000000-0000-0000-0000-000000000000",
      "receipt_document_id": "00000000-0000-0000-0000-000000000000",
      "status": "string",
      "updated_at": "2026-01-01T00:00:00Z",
      "user_id": "00000000-0000-0000-0000-000000000000"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "disbursements"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
GET /api/v1/disbursements/{id}

Get a disbursement

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
  • Name
    include
    Type
    string
    In
    in query
    Description
    Comma-separated related resources to embed in the top-level `included` array. Supported values: matter, user, invoice.
200 Disbursement
{
  "data": {
    "attributes": {
      "amount_cents": 0,
      "category": "string",
      "date": "2026-01-01",
      "description": "string",
      "inserted_at": "2026-01-01T00:00:00Z",
      "invoice_id": "00000000-0000-0000-0000-000000000000",
      "is_billable": false,
      "matter_id": "00000000-0000-0000-0000-000000000000",
      "receipt_document_id": "00000000-0000-0000-0000-000000000000",
      "status": "string",
      "updated_at": "2026-01-01T00:00:00Z",
      "user_id": "00000000-0000-0000-0000-000000000000"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "disbursements"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
PUT /api/v1/disbursements/{id}

Update a disbursement

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description

Request body

  • Name
    data
    Type
    object
    required
    Description
PUT /api/v1/disbursements/{id}
{
  "data": {
    "attributes": {
      "amount_cents": 0,
      "category": "string",
      "date": "2026-01-01",
      "description": "string",
      "is_billable": false,
      "matter_id": "00000000-0000-0000-0000-000000000000",
      "user_id": "00000000-0000-0000-0000-000000000000"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "disbursements"
  }
}
200 Updated
{
  "data": {
    "attributes": {
      "amount_cents": 0,
      "category": "string",
      "date": "2026-01-01",
      "description": "string",
      "inserted_at": "2026-01-01T00:00:00Z",
      "invoice_id": "00000000-0000-0000-0000-000000000000",
      "is_billable": false,
      "matter_id": "00000000-0000-0000-0000-000000000000",
      "receipt_document_id": "00000000-0000-0000-0000-000000000000",
      "status": "string",
      "updated_at": "2026-01-01T00:00:00Z",
      "user_id": "00000000-0000-0000-0000-000000000000"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "disbursements"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
PATCH /api/v1/disbursements/{id}

Update a disbursement

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description

Request body

  • Name
    data
    Type
    object
    required
    Description
PATCH /api/v1/disbursements/{id}
{
  "data": {
    "attributes": {
      "amount_cents": 0,
      "category": "string",
      "date": "2026-01-01",
      "description": "string",
      "is_billable": false,
      "matter_id": "00000000-0000-0000-0000-000000000000",
      "user_id": "00000000-0000-0000-0000-000000000000"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "disbursements"
  }
}
200 Updated
{
  "data": {
    "attributes": {
      "amount_cents": 0,
      "category": "string",
      "date": "2026-01-01",
      "description": "string",
      "inserted_at": "2026-01-01T00:00:00Z",
      "invoice_id": "00000000-0000-0000-0000-000000000000",
      "is_billable": false,
      "matter_id": "00000000-0000-0000-0000-000000000000",
      "receipt_document_id": "00000000-0000-0000-0000-000000000000",
      "status": "string",
      "updated_at": "2026-01-01T00:00:00Z",
      "user_id": "00000000-0000-0000-0000-000000000000"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "disbursements"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
DELETE /api/v1/disbursements/{id}

Delete a disbursement

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
DELETE /api/v1/disbursements/{id}
curl -X DELETE \
     -H "Authorization: Bearer {token}" \
     https://app.matterfirst.com.au/api/v1/disbursements/{id}

Discovery

GET /api/v1/capabilities

API version, scopes, limits and enum catalogs

200 Capabilities
{}
GET /api/v1/integrations

List connected integrations

Parameters

  • Name
    fields
    Type
    object
    In
    in query
    Description
    JSON:API sparse fieldsets: fields[<type>]=a,b limits the attributes returned for that resource type.
  • Name
    filter
    Type
    object
    In
    in query
    Description
  • Name
    page_number
    Type
    integer
    In
    in query
    Description
  • Name
    page_size
    Type
    integer
    In
    in query
    Description
200 Integration list
{
  "data": [
    {
      "attributes": {
        "capabilities": [
          "string"
        ],
        "connected_by_id": "00000000-0000-0000-0000-000000000000",
        "display_name": "string",
        "inserted_at": "2026-01-01T00:00:00Z",
        "mailbox_email": "string",
        "provider": "google",
        "service": "calendar",
        "status": "active",
        "updated_at": "2026-01-01T00:00:00Z"
      },
      "id": "00000000-0000-0000-0000-000000000000",
      "type": "integrations"
    }
  ],
  "links": {
    "first": "string",
    "last": "string",
    "next": "string",
    "prev": "string",
    "self": "string"
  },
  "meta": {
    "page": 0,
    "page_size": 0,
    "total": 0,
    "total_pages": 0
  }
}
GET /api/v1/lead-pipelines

List active lead pipelines

200 Lead pipeline list
{
  "data": [
    {
      "attributes": {
        "inserted_at": "2026-01-01T00:00:00Z",
        "is_active": false,
        "is_default": false,
        "matter_type_id": "00000000-0000-0000-0000-000000000000",
        "name": "string",
        "position": 0,
        "updated_at": "2026-01-01T00:00:00Z"
      },
      "id": "00000000-0000-0000-0000-000000000000",
      "type": "lead-pipelines"
    }
  ],
  "links": {
    "first": "string",
    "last": "string",
    "next": "string",
    "prev": "string",
    "self": "string"
  },
  "meta": {
    "page": 0,
    "page_size": 0,
    "total": 0,
    "total_pages": 0
  }
}
GET /api/v1/lead-pipelines/{id}/stages

List a pipeline's stages, in position order

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
200 Stage list
{
  "data": [
    {
      "attributes": {
        "color": "string",
        "inserted_at": "2026-01-01T00:00:00Z",
        "is_terminal": false,
        "name": "string",
        "pipeline_id": "00000000-0000-0000-0000-000000000000",
        "position": 0,
        "step_type": "sequential",
        "updated_at": "2026-01-01T00:00:00Z"
      },
      "id": "00000000-0000-0000-0000-000000000000",
      "type": "lead-pipeline-stages"
    }
  ],
  "links": {
    "first": "string",
    "last": "string",
    "next": "string",
    "prev": "string",
    "self": "string"
  },
  "meta": {
    "page": 0,
    "page_size": 0,
    "total": 0,
    "total_pages": 0
  }
}
GET /api/v1/me

The API key's owner and the key's own delegation

200 Current user
{
  "data": {
    "attributes": {
      "email": "string",
      "full_name": "string",
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_active": false,
      "role": "owner",
      "title": "string",
      "updated_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "users"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
GET /api/v1/organization

Get the caller's organization

200 Organization
{
  "data": {
    "attributes": {
      "currency": "string",
      "date_format": "string",
      "inserted_at": "2026-01-01T00:00:00Z",
      "name": "string",
      "timezone": "string"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "organizations"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
GET /api/v1/teams

List teams

Parameters

  • Name
    page_number
    Type
    integer
    In
    in query
    Description
  • Name
    page_size
    Type
    integer
    In
    in query
    Description
200 Team list
{
  "data": [
    {
      "attributes": {
        "archived_at": "2026-01-01T00:00:00Z",
        "description": "string",
        "inserted_at": "2026-01-01T00:00:00Z",
        "lead_user_id": "00000000-0000-0000-0000-000000000000",
        "name": "string",
        "updated_at": "2026-01-01T00:00:00Z"
      },
      "id": "00000000-0000-0000-0000-000000000000",
      "type": "teams"
    }
  ],
  "links": {
    "first": "string",
    "last": "string",
    "next": "string",
    "prev": "string",
    "self": "string"
  },
  "meta": {
    "page": 0,
    "page_size": 0,
    "total": 0,
    "total_pages": 0
  }
}
GET /api/v1/teams/{id}

Get a team

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
200 Team
{
  "data": {
    "attributes": {
      "archived_at": "2026-01-01T00:00:00Z",
      "description": "string",
      "inserted_at": "2026-01-01T00:00:00Z",
      "lead_user_id": "00000000-0000-0000-0000-000000000000",
      "name": "string",
      "updated_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "teams"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
GET /api/v1/users

List users

Parameters

  • Name
    fields
    Type
    object
    In
    in query
    Description
    JSON:API sparse fieldsets: fields[<type>]=a,b limits the attributes returned for that resource type.
  • Name
    filter
    Type
    object
    In
    in query
    Description
  • Name
    page_number
    Type
    integer
    In
    in query
    Description
  • Name
    page_size
    Type
    integer
    In
    in query
    Description
  • Name
    sort
    Type
    string
    In
    in query
    Description
200 User list
{
  "data": [
    {
      "attributes": {
        "email": "string",
        "full_name": "string",
        "inserted_at": "2026-01-01T00:00:00Z",
        "is_active": false,
        "role": "owner",
        "title": "string",
        "updated_at": "2026-01-01T00:00:00Z"
      },
      "id": "00000000-0000-0000-0000-000000000000",
      "type": "users"
    }
  ],
  "links": {
    "first": "string",
    "last": "string",
    "next": "string",
    "prev": "string",
    "self": "string"
  },
  "meta": {
    "page": 0,
    "page_size": 0,
    "total": 0,
    "total_pages": 0
  }
}
GET /api/v1/users/{id}

Get a user

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
  • Name
    fields
    Type
    object
    In
    in query
    Description
    JSON:API sparse fieldsets: fields[<type>]=a,b limits the attributes returned for that resource type.
200 User
{
  "data": {
    "attributes": {
      "email": "string",
      "full_name": "string",
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_active": false,
      "role": "owner",
      "title": "string",
      "updated_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "users"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}

Document Request Templates

GET /api/v1/document-request-templates

List document request templates

Parameters

  • Name
    matter_type_id
    Type
    string (uuid)
    In
    in query
    Description
  • Name
    page_number
    Type
    integer
    In
    in query
    Description
  • Name
    page_size
    Type
    integer
    In
    in query
    Description
200 Document request template list
{
  "data": [
    {
      "attributes": {
        "description": "string",
        "inserted_at": "2026-01-01T00:00:00Z",
        "instructions": "string",
        "is_active": false,
        "items": [
          {
            "name": "string"
          }
        ],
        "matter_type_id": "00000000-0000-0000-0000-000000000000",
        "name": "string",
        "requested_items": "string",
        "subject": "string",
        "updated_at": "2026-01-01T00:00:00Z"
      },
      "id": "00000000-0000-0000-0000-000000000000",
      "type": "document-request-templates"
    }
  ],
  "meta": {
    "count": 0,
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
POST /api/v1/document-request-templates

Create a document request template

Request body

  • Name
    data
    Type
    object
    required
    Description
POST /api/v1/document-request-templates
{
  "data": {
    "attributes": {
      "description": "string",
      "instructions": "string",
      "is_active": false,
      "matter_type_id": "00000000-0000-0000-0000-000000000000",
      "name": "string",
      "requested_items": "string",
      "subject": "string"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "document-request-templates"
  }
}
201 Created
{
  "data": {
    "attributes": {
      "description": "string",
      "inserted_at": "2026-01-01T00:00:00Z",
      "instructions": "string",
      "is_active": false,
      "items": [
        {
          "name": "string"
        }
      ],
      "matter_type_id": "00000000-0000-0000-0000-000000000000",
      "name": "string",
      "requested_items": "string",
      "subject": "string",
      "updated_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "document-request-templates"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
GET /api/v1/document-request-templates/{id}

Get a document request template

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
200 Document request template
{
  "data": {
    "attributes": {
      "description": "string",
      "inserted_at": "2026-01-01T00:00:00Z",
      "instructions": "string",
      "is_active": false,
      "items": [
        {
          "name": "string"
        }
      ],
      "matter_type_id": "00000000-0000-0000-0000-000000000000",
      "name": "string",
      "requested_items": "string",
      "subject": "string",
      "updated_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "document-request-templates"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
PUT /api/v1/document-request-templates/{id}

Update a document request template

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description

Request body

  • Name
    data
    Type
    object
    required
    Description
PUT /api/v1/document-request-templates/{id}
{
  "data": {
    "attributes": {
      "description": "string",
      "instructions": "string",
      "is_active": false,
      "matter_type_id": "00000000-0000-0000-0000-000000000000",
      "name": "string",
      "requested_items": "string",
      "subject": "string"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "document-request-templates"
  }
}
200 Updated
{
  "data": {
    "attributes": {
      "description": "string",
      "inserted_at": "2026-01-01T00:00:00Z",
      "instructions": "string",
      "is_active": false,
      "items": [
        {
          "name": "string"
        }
      ],
      "matter_type_id": "00000000-0000-0000-0000-000000000000",
      "name": "string",
      "requested_items": "string",
      "subject": "string",
      "updated_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "document-request-templates"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
PATCH /api/v1/document-request-templates/{id}

Update a document request template

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description

Request body

  • Name
    data
    Type
    object
    required
    Description
PATCH /api/v1/document-request-templates/{id}
{
  "data": {
    "attributes": {
      "description": "string",
      "instructions": "string",
      "is_active": false,
      "matter_type_id": "00000000-0000-0000-0000-000000000000",
      "name": "string",
      "requested_items": "string",
      "subject": "string"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "document-request-templates"
  }
}
200 Updated
{
  "data": {
    "attributes": {
      "description": "string",
      "inserted_at": "2026-01-01T00:00:00Z",
      "instructions": "string",
      "is_active": false,
      "items": [
        {
          "name": "string"
        }
      ],
      "matter_type_id": "00000000-0000-0000-0000-000000000000",
      "name": "string",
      "requested_items": "string",
      "subject": "string",
      "updated_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "document-request-templates"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
DELETE /api/v1/document-request-templates/{id}

Delete a document request template

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
409 Template is in use
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}

Document Requests

GET /api/v1/document-requests

List secure document requests

Parameters

  • Name
    fields
    Type
    object
    In
    in query
    Description
    JSON:API sparse fieldsets: fields[<type>]=a,b limits the attributes returned for that resource type.
  • Name
    filter
    Type
    object
    In
    in query
    Description
  • Name
    page_number
    Type
    integer
    In
    in query
    Description
  • Name
    page_size
    Type
    integer
    In
    in query
    Description
  • Name
    sort
    Type
    string
    In
    in query
    Description
200 Document request list
{
  "data": [
    {
      "attributes": {
        "closed_at": "2026-01-01T00:00:00Z",
        "completed_at": "2026-01-01T00:00:00Z",
        "contact_id": "00000000-0000-0000-0000-000000000000",
        "email_id": "00000000-0000-0000-0000-000000000000",
        "expires_at": "2026-01-01T00:00:00Z",
        "folder_id": "00000000-0000-0000-0000-000000000000",
        "inserted_at": "2026-01-01T00:00:00Z",
        "instructions": "string",
        "items": [
          {
            "description": "string",
            "id": "00000000-0000-0000-0000-000000000000",
            "name": "string",
            "position": 0,
            "received_at": "2026-01-01T00:00:00Z",
            "status": "string"
          }
        ],
        "matter_id": "00000000-0000-0000-0000-000000000000",
        "recipient_email": "string",
        "recipient_name": "string",
        "requested_by_id": "00000000-0000-0000-0000-000000000000",
        "sent_at": "2026-01-01T00:00:00Z",
        "status": "string",
        "subject": "string",
        "updated_at": "2026-01-01T00:00:00Z",
        "uploads_count": 0
      },
      "id": "00000000-0000-0000-0000-000000000000",
      "type": "document-requests"
    }
  ],
  "links": {
    "first": "string",
    "last": "string",
    "next": "string",
    "prev": "string",
    "self": "string"
  },
  "meta": {
    "page": 0,
    "page_size": 0,
    "total": 0,
    "total_pages": 0
  }
}
POST /api/v1/document-requests

Create and send a secure document request

A document request's whole lifecycle is create → close (W2.6). Creating one mints a live public upload link and emails it; closing revokes the link. There is deliberately no reopen and no delete: the link that was sent is evidence of what the firm asked for, and a closed request stays closed. Send a new request instead.

Request body

  • Name
    data
    Type
    object
    required
    Description
POST /api/v1/document-requests
{
  "data": {
    "attributes": {
      "contact_id": "00000000-0000-0000-0000-000000000000",
      "expires_at": "2026-01-01T00:00:00Z",
      "folder_id": "00000000-0000-0000-0000-000000000000",
      "instructions": "string",
      "items": [
        {
          "description": "string",
          "name": "string"
        }
      ],
      "matter_id": "00000000-0000-0000-0000-000000000000",
      "metadata": {},
      "recipient_email": "string",
      "recipient_name": "string",
      "subject": "string"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "document-requests"
  }
}
201 Created document request
{
  "data": {
    "attributes": {
      "closed_at": "2026-01-01T00:00:00Z",
      "completed_at": "2026-01-01T00:00:00Z",
      "contact_id": "00000000-0000-0000-0000-000000000000",
      "email_id": "00000000-0000-0000-0000-000000000000",
      "expires_at": "2026-01-01T00:00:00Z",
      "folder_id": "00000000-0000-0000-0000-000000000000",
      "inserted_at": "2026-01-01T00:00:00Z",
      "instructions": "string",
      "items": [
        {
          "description": "string",
          "id": "00000000-0000-0000-0000-000000000000",
          "name": "string",
          "position": 0,
          "received_at": "2026-01-01T00:00:00Z",
          "status": "string"
        }
      ],
      "matter_id": "00000000-0000-0000-0000-000000000000",
      "recipient_email": "string",
      "recipient_name": "string",
      "requested_by_id": "00000000-0000-0000-0000-000000000000",
      "sent_at": "2026-01-01T00:00:00Z",
      "status": "string",
      "subject": "string",
      "updated_at": "2026-01-01T00:00:00Z",
      "uploads_count": 0
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "document-requests"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
GET /api/v1/document-requests/{id}

Get a secure document request

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
  • Name
    fields
    Type
    object
    In
    in query
    Description
    JSON:API sparse fieldsets: fields[<type>]=a,b limits the attributes returned for that resource type.
200 Document request
{
  "data": {
    "attributes": {
      "closed_at": "2026-01-01T00:00:00Z",
      "completed_at": "2026-01-01T00:00:00Z",
      "contact_id": "00000000-0000-0000-0000-000000000000",
      "email_id": "00000000-0000-0000-0000-000000000000",
      "expires_at": "2026-01-01T00:00:00Z",
      "folder_id": "00000000-0000-0000-0000-000000000000",
      "inserted_at": "2026-01-01T00:00:00Z",
      "instructions": "string",
      "items": [
        {
          "description": "string",
          "id": "00000000-0000-0000-0000-000000000000",
          "name": "string",
          "position": 0,
          "received_at": "2026-01-01T00:00:00Z",
          "status": "string"
        }
      ],
      "matter_id": "00000000-0000-0000-0000-000000000000",
      "recipient_email": "string",
      "recipient_name": "string",
      "requested_by_id": "00000000-0000-0000-0000-000000000000",
      "sent_at": "2026-01-01T00:00:00Z",
      "status": "string",
      "subject": "string",
      "updated_at": "2026-01-01T00:00:00Z",
      "uploads_count": 0
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "document-requests"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
POST /api/v1/document-requests/{id}/close

Close a secure document request upload link

Revokes the request's live public upload link (COMP-01). This is the terminal state: a closed request cannot be reopened, because the revoked link must never come back to life, so further documents need a new request.

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
200 Closed document request
{
  "data": {
    "attributes": {
      "closed_at": "2026-01-01T00:00:00Z",
      "completed_at": "2026-01-01T00:00:00Z",
      "contact_id": "00000000-0000-0000-0000-000000000000",
      "email_id": "00000000-0000-0000-0000-000000000000",
      "expires_at": "2026-01-01T00:00:00Z",
      "folder_id": "00000000-0000-0000-0000-000000000000",
      "inserted_at": "2026-01-01T00:00:00Z",
      "instructions": "string",
      "items": [
        {
          "description": "string",
          "id": "00000000-0000-0000-0000-000000000000",
          "name": "string",
          "position": 0,
          "received_at": "2026-01-01T00:00:00Z",
          "status": "string"
        }
      ],
      "matter_id": "00000000-0000-0000-0000-000000000000",
      "recipient_email": "string",
      "recipient_name": "string",
      "requested_by_id": "00000000-0000-0000-0000-000000000000",
      "sent_at": "2026-01-01T00:00:00Z",
      "status": "string",
      "subject": "string",
      "updated_at": "2026-01-01T00:00:00Z",
      "uploads_count": 0
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "document-requests"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}

Documents

GET /api/v1/documents

List documents

Parameters

  • Name
    fields
    Type
    object
    In
    in query
    Description
    JSON:API sparse fieldsets: fields[<type>]=a,b limits the attributes returned for that resource type.
  • Name
    filter
    Type
    object
    In
    in query
    Description
  • Name
    include
    Type
    string
    In
    in query
    Description
    Comma-separated related resources to embed in the top-level `included` array. Supported values: matter, contact, folder.
  • Name
    page_number
    Type
    integer
    In
    in query
    Description
  • Name
    page_size
    Type
    integer
    In
    in query
    Description
  • Name
    sort
    Type
    string
    In
    in query
    Description
200 Document list
{
  "data": [
    {
      "attributes": {
        "ai_analyzed_at": "2026-01-01T00:00:00Z",
        "ai_classification": "string",
        "ai_summary": "string",
        "archived_at": "2026-01-01T00:00:00Z",
        "archived_by_id": "00000000-0000-0000-0000-000000000000",
        "category": "string",
        "contact_id": "00000000-0000-0000-0000-000000000000",
        "content_type": "string",
        "description": "string",
        "file_size": 0,
        "filename": "string",
        "folder_id": "00000000-0000-0000-0000-000000000000",
        "inserted_at": "2026-01-01T00:00:00Z",
        "is_current": false,
        "is_portal_visible": false,
        "matter_id": "00000000-0000-0000-0000-000000000000",
        "retention_expires_at": "2026-01-01T00:00:00Z",
        "tags": [
          "string"
        ],
        "updated_at": "2026-01-01T00:00:00Z",
        "uploaded_by_id": "00000000-0000-0000-0000-000000000000",
        "version": 0
      },
      "id": "00000000-0000-0000-0000-000000000000",
      "type": "documents"
    }
  ],
  "links": {
    "first": "string",
    "last": "string",
    "next": "string",
    "prev": "string",
    "self": "string"
  },
  "meta": {
    "page": 0,
    "page_size": 0,
    "total": 0,
    "total_pages": 0
  }
}
POST /api/v1/documents

Register an uploaded document

Second half of the two-step upload flow: registers the document row for a file already PUT to the presigned URL from `POST /documents/uploads`. The upload is verified to exist in storage before the document is created.

Request body

  • Name
    data
    Type
    object
    required
    Description
POST /api/v1/documents
{
  "data": {
    "attributes": {
      "category": "string",
      "contact_id": "00000000-0000-0000-0000-000000000000",
      "content_type": "string",
      "description": "string",
      "filename": "string",
      "folder_id": "00000000-0000-0000-0000-000000000000",
      "matter_id": "00000000-0000-0000-0000-000000000000",
      "tags": [
        "string"
      ],
      "upload_key": "string"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "documents"
  }
}
201 Created document
{
  "data": {
    "attributes": {
      "ai_analyzed_at": "2026-01-01T00:00:00Z",
      "ai_classification": "string",
      "ai_summary": "string",
      "archived_at": "2026-01-01T00:00:00Z",
      "archived_by_id": "00000000-0000-0000-0000-000000000000",
      "category": "string",
      "contact_id": "00000000-0000-0000-0000-000000000000",
      "content_type": "string",
      "description": "string",
      "file_size": 0,
      "filename": "string",
      "folder_id": "00000000-0000-0000-0000-000000000000",
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_current": false,
      "is_portal_visible": false,
      "matter_id": "00000000-0000-0000-0000-000000000000",
      "retention_expires_at": "2026-01-01T00:00:00Z",
      "tags": [
        "string"
      ],
      "updated_at": "2026-01-01T00:00:00Z",
      "uploaded_by_id": "00000000-0000-0000-0000-000000000000",
      "version": 0
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "documents"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
POST /api/v1/documents/uploads

Request a presigned upload URL for a document file

First half of the two-step upload flow. Returns a short-lived presigned URL; PUT the raw file bytes to it (with the returned headers), then register the document with `POST /documents`, passing the returned `upload_key`.

Request body

  • Name
    data
    Type
    object
    required
    Description
POST /api/v1/documents/uploads
{
  "data": {
    "attributes": {
      "byte_size": 0,
      "content_type": "string",
      "filename": "string"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "documents"
  }
}
201 Presigned upload
{
  "data": {
    "attributes": {
      "expires_in": 0,
      "headers": {},
      "method": "PUT",
      "upload_key": "string",
      "upload_url": "string"
    },
    "type": "document-uploads"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
GET /api/v1/documents/{id}

Get a document

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
  • Name
    fields
    Type
    object
    In
    in query
    Description
    JSON:API sparse fieldsets: fields[<type>]=a,b limits the attributes returned for that resource type.
  • Name
    include
    Type
    string
    In
    in query
    Description
    Comma-separated related resources to embed in the top-level `included` array. Supported values: matter, contact, folder.
200 Document
{
  "data": {
    "attributes": {
      "ai_analyzed_at": "2026-01-01T00:00:00Z",
      "ai_classification": "string",
      "ai_summary": "string",
      "archived_at": "2026-01-01T00:00:00Z",
      "archived_by_id": "00000000-0000-0000-0000-000000000000",
      "category": "string",
      "contact_id": "00000000-0000-0000-0000-000000000000",
      "content_type": "string",
      "description": "string",
      "file_size": 0,
      "filename": "string",
      "folder_id": "00000000-0000-0000-0000-000000000000",
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_current": false,
      "is_portal_visible": false,
      "matter_id": "00000000-0000-0000-0000-000000000000",
      "retention_expires_at": "2026-01-01T00:00:00Z",
      "tags": [
        "string"
      ],
      "updated_at": "2026-01-01T00:00:00Z",
      "uploaded_by_id": "00000000-0000-0000-0000-000000000000",
      "version": 0
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "documents"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
PUT /api/v1/documents/{id}

Update a document

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description

Request body

  • Name
    data
    Type
    object
    required
    Description
PUT /api/v1/documents/{id}
{
  "data": {
    "attributes": {
      "category": "string",
      "contact_id": "00000000-0000-0000-0000-000000000000",
      "content_type": "string",
      "description": "string",
      "file_size": 0,
      "filename": "string",
      "folder_id": "00000000-0000-0000-0000-000000000000",
      "matter_id": "00000000-0000-0000-0000-000000000000",
      "tags": [
        "string"
      ]
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "documents"
  }
}
200 Updated document
{
  "data": {
    "attributes": {
      "ai_analyzed_at": "2026-01-01T00:00:00Z",
      "ai_classification": "string",
      "ai_summary": "string",
      "archived_at": "2026-01-01T00:00:00Z",
      "archived_by_id": "00000000-0000-0000-0000-000000000000",
      "category": "string",
      "contact_id": "00000000-0000-0000-0000-000000000000",
      "content_type": "string",
      "description": "string",
      "file_size": 0,
      "filename": "string",
      "folder_id": "00000000-0000-0000-0000-000000000000",
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_current": false,
      "is_portal_visible": false,
      "matter_id": "00000000-0000-0000-0000-000000000000",
      "retention_expires_at": "2026-01-01T00:00:00Z",
      "tags": [
        "string"
      ],
      "updated_at": "2026-01-01T00:00:00Z",
      "uploaded_by_id": "00000000-0000-0000-0000-000000000000",
      "version": 0
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "documents"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
PATCH /api/v1/documents/{id}

Update a document

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description

Request body

  • Name
    data
    Type
    object
    required
    Description
PATCH /api/v1/documents/{id}
{
  "data": {
    "attributes": {
      "category": "string",
      "contact_id": "00000000-0000-0000-0000-000000000000",
      "content_type": "string",
      "description": "string",
      "file_size": 0,
      "filename": "string",
      "folder_id": "00000000-0000-0000-0000-000000000000",
      "matter_id": "00000000-0000-0000-0000-000000000000",
      "tags": [
        "string"
      ]
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "documents"
  }
}
200 Updated document
{
  "data": {
    "attributes": {
      "ai_analyzed_at": "2026-01-01T00:00:00Z",
      "ai_classification": "string",
      "ai_summary": "string",
      "archived_at": "2026-01-01T00:00:00Z",
      "archived_by_id": "00000000-0000-0000-0000-000000000000",
      "category": "string",
      "contact_id": "00000000-0000-0000-0000-000000000000",
      "content_type": "string",
      "description": "string",
      "file_size": 0,
      "filename": "string",
      "folder_id": "00000000-0000-0000-0000-000000000000",
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_current": false,
      "is_portal_visible": false,
      "matter_id": "00000000-0000-0000-0000-000000000000",
      "retention_expires_at": "2026-01-01T00:00:00Z",
      "tags": [
        "string"
      ],
      "updated_at": "2026-01-01T00:00:00Z",
      "uploaded_by_id": "00000000-0000-0000-0000-000000000000",
      "version": 0
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "documents"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
DELETE /api/v1/documents/{id}

Delete a document

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
DELETE /api/v1/documents/{id}
curl -X DELETE \
     -H "Authorization: Bearer {token}" \
     https://app.matterfirst.com.au/api/v1/documents/{id}
GET /api/v1/documents/{id}/content

Fetch a document's file bytes via a signed link

Serves the raw file for a document to a caller holding a valid signed token minted by `POST /documents/:id/download`. The token authorises this single document for a short window; no API key is required (and none is accepted) on this endpoint: the token is the whole authorization, exactly like a presigned S3 URL.

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
  • Name
    token
    Type
    string
    required
    In
    in query
    Description
GET /api/v1/documents/{id}/content
curl -X GET \
     -H "Authorization: Bearer {token}" \
     https://app.matterfirst.com.au/api/v1/documents/{id}/content
POST /api/v1/documents/{id}/download

Get a download URL for a document

Returns a short-lived, signed URL for the document's file. For `:s3` storage this is a presigned, expiring S3 GET URL; for `:local` storage it is a signed link to `GET /documents/:id/content` that expires in 900 seconds. Either way the URL carries its own authorization and stops working once it expires. It is not a permanent, public path.

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
200 Download URL
{
  "url": "string"
}
GET /api/v1/documents/{id}/versions

Get version history for a document

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
200 Version history
{
  "data": [
    {
      "attributes": {
        "ai_analyzed_at": "2026-01-01T00:00:00Z",
        "ai_classification": "string",
        "ai_summary": "string",
        "archived_at": "2026-01-01T00:00:00Z",
        "archived_by_id": "00000000-0000-0000-0000-000000000000",
        "category": "string",
        "contact_id": "00000000-0000-0000-0000-000000000000",
        "content_type": "string",
        "description": "string",
        "file_size": 0,
        "filename": "string",
        "folder_id": "00000000-0000-0000-0000-000000000000",
        "inserted_at": "2026-01-01T00:00:00Z",
        "is_current": false,
        "is_portal_visible": false,
        "matter_id": "00000000-0000-0000-0000-000000000000",
        "retention_expires_at": "2026-01-01T00:00:00Z",
        "tags": [
          "string"
        ],
        "updated_at": "2026-01-01T00:00:00Z",
        "uploaded_by_id": "00000000-0000-0000-0000-000000000000",
        "version": 0
      },
      "id": "00000000-0000-0000-0000-000000000000",
      "type": "documents"
    }
  ],
  "meta": {
    "count": 0,
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
POST /api/v1/documents/{id}/versions

Upload a new version of a document

Registers a file already PUT to a presigned URL (from `POST /documents/uploads`) as the next version of this document, the same two-step flow as document creation. Only the current version accepts a new one; a superseded version is refused with 409. The existing head is marked no longer current and the new version becomes the head, linked to it.

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description

Request body

  • Name
    data
    Type
    object
    required
    Description
POST /api/v1/documents/{id}/versions
{
  "data": {
    "attributes": {
      "content_type": "string",
      "description": "string",
      "filename": "string",
      "upload_key": "string"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "documents"
  }
}
201 Created version
{
  "data": {
    "attributes": {
      "ai_analyzed_at": "2026-01-01T00:00:00Z",
      "ai_classification": "string",
      "ai_summary": "string",
      "archived_at": "2026-01-01T00:00:00Z",
      "archived_by_id": "00000000-0000-0000-0000-000000000000",
      "category": "string",
      "contact_id": "00000000-0000-0000-0000-000000000000",
      "content_type": "string",
      "description": "string",
      "file_size": 0,
      "filename": "string",
      "folder_id": "00000000-0000-0000-0000-000000000000",
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_current": false,
      "is_portal_visible": false,
      "matter_id": "00000000-0000-0000-0000-000000000000",
      "retention_expires_at": "2026-01-01T00:00:00Z",
      "tags": [
        "string"
      ],
      "updated_at": "2026-01-01T00:00:00Z",
      "uploaded_by_id": "00000000-0000-0000-0000-000000000000",
      "version": 0
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "documents"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
409 Not the current version
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
POST /api/v1/documents/{id}/versions/{version_id}/restore

Restore a previous version of a document

Restores `version_id` by creating a NEW head version carrying its file, so the chain only ever grows forward (DOC-11): the version history of a legal file is evidence and is never rewritten. Restoring the version that is already current is refused with 409.

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
  • Name
    version_id
    Type
    string (uuid)
    required
    In
    in path
    Description
201 New head version
{
  "data": {
    "attributes": {
      "ai_analyzed_at": "2026-01-01T00:00:00Z",
      "ai_classification": "string",
      "ai_summary": "string",
      "archived_at": "2026-01-01T00:00:00Z",
      "archived_by_id": "00000000-0000-0000-0000-000000000000",
      "category": "string",
      "contact_id": "00000000-0000-0000-0000-000000000000",
      "content_type": "string",
      "description": "string",
      "file_size": 0,
      "filename": "string",
      "folder_id": "00000000-0000-0000-0000-000000000000",
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_current": false,
      "is_portal_visible": false,
      "matter_id": "00000000-0000-0000-0000-000000000000",
      "retention_expires_at": "2026-01-01T00:00:00Z",
      "tags": [
        "string"
      ],
      "updated_at": "2026-01-01T00:00:00Z",
      "uploaded_by_id": "00000000-0000-0000-0000-000000000000",
      "version": 0
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "documents"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
409 Already current
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}

Email Templates

GET /api/v1/email-templates

List email templates

Parameters

  • Name
    filter
    Type
    object
    In
    in query
    Description
  • Name
    page_number
    Type
    integer
    In
    in query
    Description
  • Name
    page_size
    Type
    integer
    In
    in query
    Description
  • Name
    sort
    Type
    string
    In
    in query
    Description
200 Email template list
{
  "data": [
    {
      "attributes": {
        "body_html": "string",
        "body_text": "string",
        "category": "string",
        "editor_design": {},
        "inserted_at": "2026-01-01T00:00:00Z",
        "is_active": false,
        "is_system": false,
        "matter_type_id": "00000000-0000-0000-0000-000000000000",
        "name": "string",
        "step_id": "00000000-0000-0000-0000-000000000000",
        "subject": "string",
        "system_key": "string",
        "updated_at": "2026-01-01T00:00:00Z"
      },
      "id": "00000000-0000-0000-0000-000000000000",
      "type": "email-templates"
    }
  ],
  "links": {
    "first": "string",
    "last": "string",
    "next": "string",
    "prev": "string",
    "self": "string"
  },
  "meta": {
    "page": 0,
    "page_size": 0,
    "total": 0,
    "total_pages": 0
  }
}
POST /api/v1/email-templates

Create an email template

Request body

  • Name
    data
    Type
    object
    required
    Description
POST /api/v1/email-templates
{
  "data": {
    "attributes": {
      "body_html": "string",
      "body_text": "string",
      "category": "string",
      "editor_design": {},
      "matter_type_id": "00000000-0000-0000-0000-000000000000",
      "name": "string",
      "step_id": "00000000-0000-0000-0000-000000000000",
      "subject": "string"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "email-templates"
  }
}
201 Created
{
  "data": {
    "attributes": {
      "body_html": "string",
      "body_text": "string",
      "category": "string",
      "editor_design": {},
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_active": false,
      "is_system": false,
      "matter_type_id": "00000000-0000-0000-0000-000000000000",
      "name": "string",
      "step_id": "00000000-0000-0000-0000-000000000000",
      "subject": "string",
      "system_key": "string",
      "updated_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "email-templates"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
GET /api/v1/email-templates/{id}

Get an email template

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
200 Email template
{
  "data": {
    "attributes": {
      "body_html": "string",
      "body_text": "string",
      "category": "string",
      "editor_design": {},
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_active": false,
      "is_system": false,
      "matter_type_id": "00000000-0000-0000-0000-000000000000",
      "name": "string",
      "step_id": "00000000-0000-0000-0000-000000000000",
      "subject": "string",
      "system_key": "string",
      "updated_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "email-templates"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
PUT /api/v1/email-templates/{id}

Update an email template

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description

Request body

  • Name
    data
    Type
    object
    required
    Description
PUT /api/v1/email-templates/{id}
{
  "data": {
    "attributes": {
      "body_html": "string",
      "body_text": "string",
      "category": "string",
      "editor_design": {},
      "matter_type_id": "00000000-0000-0000-0000-000000000000",
      "name": "string",
      "step_id": "00000000-0000-0000-0000-000000000000",
      "subject": "string"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "email-templates"
  }
}
200 Updated
{
  "data": {
    "attributes": {
      "body_html": "string",
      "body_text": "string",
      "category": "string",
      "editor_design": {},
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_active": false,
      "is_system": false,
      "matter_type_id": "00000000-0000-0000-0000-000000000000",
      "name": "string",
      "step_id": "00000000-0000-0000-0000-000000000000",
      "subject": "string",
      "system_key": "string",
      "updated_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "email-templates"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
PATCH /api/v1/email-templates/{id}

Update an email template

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description

Request body

  • Name
    data
    Type
    object
    required
    Description
PATCH /api/v1/email-templates/{id}
{
  "data": {
    "attributes": {
      "body_html": "string",
      "body_text": "string",
      "category": "string",
      "editor_design": {},
      "matter_type_id": "00000000-0000-0000-0000-000000000000",
      "name": "string",
      "step_id": "00000000-0000-0000-0000-000000000000",
      "subject": "string"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "email-templates"
  }
}
200 Updated
{
  "data": {
    "attributes": {
      "body_html": "string",
      "body_text": "string",
      "category": "string",
      "editor_design": {},
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_active": false,
      "is_system": false,
      "matter_type_id": "00000000-0000-0000-0000-000000000000",
      "name": "string",
      "step_id": "00000000-0000-0000-0000-000000000000",
      "subject": "string",
      "system_key": "string",
      "updated_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "email-templates"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
DELETE /api/v1/email-templates/{id}

Delete an email template

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
409 Template is in use
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}

Emails

GET /api/v1/email-drafts

List email drafts

Parameters

  • Name
    filter
    Type
    object
    In
    in query
    Description
  • Name
    page_number
    Type
    integer
    In
    in query
    Description
  • Name
    page_size
    Type
    integer
    In
    in query
    Description
  • Name
    sort
    Type
    string
    In
    in query
    Description
200 Email draft list
{
  "data": [
    {
      "attributes": {
        "bcc_addresses": [
          "string"
        ],
        "body_html": "string",
        "cc_addresses": [
          "string"
        ],
        "contact_id": "00000000-0000-0000-0000-000000000000",
        "created_by_id": "00000000-0000-0000-0000-000000000000",
        "inserted_at": "2026-01-01T00:00:00Z",
        "last_edited_by_id": "00000000-0000-0000-0000-000000000000",
        "lead_id": "00000000-0000-0000-0000-000000000000",
        "matter_id": "00000000-0000-0000-0000-000000000000",
        "reply_to_email_id": "00000000-0000-0000-0000-000000000000",
        "reply_to_inbound_email_id": "00000000-0000-0000-0000-000000000000",
        "sender_address": "string",
        "sender_integration_id": "00000000-0000-0000-0000-000000000000",
        "source": "manual",
        "subject": "string",
        "template_id": "00000000-0000-0000-0000-000000000000",
        "to_addresses": [
          "string"
        ],
        "updated_at": "2026-01-01T00:00:00Z",
        "use_branding": false
      },
      "id": "00000000-0000-0000-0000-000000000000",
      "type": "email-drafts"
    }
  ],
  "links": {
    "first": "string",
    "last": "string",
    "next": "string",
    "prev": "string",
    "self": "string"
  },
  "meta": {
    "page": 0,
    "page_size": 0,
    "total": 0,
    "total_pages": 0
  }
}
POST /api/v1/email-drafts

Create an email draft

`sender_integration_id` is an *explicit* mailbox pick and is optional. A draft that leaves it null is still sendable: the sender is resolved at send time by `MatterFirst.Integrations.Senders`, which tries the explicit pick, then the acting user's own connected mailbox, then the matter's or lead's responsible user, then the firm's default mailbox. Sendability therefore cannot be decided when the draft is created (a mailbox can be connected or disconnected in between), so this endpoint does not refuse a draft for want of one. List the pickable mailboxes with `GET /api/v1/integrations?filter[capability]=send_email`.

Request body

  • Name
    data
    Type
    object
    required
    Description
POST /api/v1/email-drafts
{
  "data": {
    "attributes": {
      "bcc_addresses": [
        "string"
      ],
      "body_html": "string",
      "cc_addresses": [
        "string"
      ],
      "contact_id": "00000000-0000-0000-0000-000000000000",
      "lead_id": "00000000-0000-0000-0000-000000000000",
      "matter_id": "00000000-0000-0000-0000-000000000000",
      "reply_to_email_id": "00000000-0000-0000-0000-000000000000",
      "reply_to_inbound_email_id": "00000000-0000-0000-0000-000000000000",
      "sender_address": "string",
      "sender_integration_id": "00000000-0000-0000-0000-000000000000",
      "subject": "string",
      "template_id": "00000000-0000-0000-0000-000000000000",
      "to_addresses": [
        "string"
      ],
      "use_branding": false
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "email-drafts"
  }
}
201 Created draft
{
  "data": {
    "attributes": {
      "bcc_addresses": [
        "string"
      ],
      "body_html": "string",
      "cc_addresses": [
        "string"
      ],
      "contact_id": "00000000-0000-0000-0000-000000000000",
      "created_by_id": "00000000-0000-0000-0000-000000000000",
      "inserted_at": "2026-01-01T00:00:00Z",
      "last_edited_by_id": "00000000-0000-0000-0000-000000000000",
      "lead_id": "00000000-0000-0000-0000-000000000000",
      "matter_id": "00000000-0000-0000-0000-000000000000",
      "reply_to_email_id": "00000000-0000-0000-0000-000000000000",
      "reply_to_inbound_email_id": "00000000-0000-0000-0000-000000000000",
      "sender_address": "string",
      "sender_integration_id": "00000000-0000-0000-0000-000000000000",
      "source": "manual",
      "subject": "string",
      "template_id": "00000000-0000-0000-0000-000000000000",
      "to_addresses": [
        "string"
      ],
      "updated_at": "2026-01-01T00:00:00Z",
      "use_branding": false
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "email-drafts"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
GET /api/v1/email-drafts/{id}

Get an email draft

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
200 Email draft
{
  "data": {
    "attributes": {
      "bcc_addresses": [
        "string"
      ],
      "body_html": "string",
      "cc_addresses": [
        "string"
      ],
      "contact_id": "00000000-0000-0000-0000-000000000000",
      "created_by_id": "00000000-0000-0000-0000-000000000000",
      "inserted_at": "2026-01-01T00:00:00Z",
      "last_edited_by_id": "00000000-0000-0000-0000-000000000000",
      "lead_id": "00000000-0000-0000-0000-000000000000",
      "matter_id": "00000000-0000-0000-0000-000000000000",
      "reply_to_email_id": "00000000-0000-0000-0000-000000000000",
      "reply_to_inbound_email_id": "00000000-0000-0000-0000-000000000000",
      "sender_address": "string",
      "sender_integration_id": "00000000-0000-0000-0000-000000000000",
      "source": "manual",
      "subject": "string",
      "template_id": "00000000-0000-0000-0000-000000000000",
      "to_addresses": [
        "string"
      ],
      "updated_at": "2026-01-01T00:00:00Z",
      "use_branding": false
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "email-drafts"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
PUT /api/v1/email-drafts/{id}

Update an email draft

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description

Request body

  • Name
    data
    Type
    object
    required
    Description
PUT /api/v1/email-drafts/{id}
{
  "data": {
    "attributes": {
      "bcc_addresses": [
        "string"
      ],
      "body_html": "string",
      "cc_addresses": [
        "string"
      ],
      "contact_id": "00000000-0000-0000-0000-000000000000",
      "reply_to_email_id": "00000000-0000-0000-0000-000000000000",
      "reply_to_inbound_email_id": "00000000-0000-0000-0000-000000000000",
      "sender_address": "string",
      "sender_integration_id": "00000000-0000-0000-0000-000000000000",
      "subject": "string",
      "template_id": "00000000-0000-0000-0000-000000000000",
      "to_addresses": [
        "string"
      ],
      "use_branding": false
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "email-drafts"
  }
}
200 Updated draft
{
  "data": {
    "attributes": {
      "bcc_addresses": [
        "string"
      ],
      "body_html": "string",
      "cc_addresses": [
        "string"
      ],
      "contact_id": "00000000-0000-0000-0000-000000000000",
      "created_by_id": "00000000-0000-0000-0000-000000000000",
      "inserted_at": "2026-01-01T00:00:00Z",
      "last_edited_by_id": "00000000-0000-0000-0000-000000000000",
      "lead_id": "00000000-0000-0000-0000-000000000000",
      "matter_id": "00000000-0000-0000-0000-000000000000",
      "reply_to_email_id": "00000000-0000-0000-0000-000000000000",
      "reply_to_inbound_email_id": "00000000-0000-0000-0000-000000000000",
      "sender_address": "string",
      "sender_integration_id": "00000000-0000-0000-0000-000000000000",
      "source": "manual",
      "subject": "string",
      "template_id": "00000000-0000-0000-0000-000000000000",
      "to_addresses": [
        "string"
      ],
      "updated_at": "2026-01-01T00:00:00Z",
      "use_branding": false
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "email-drafts"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
PATCH /api/v1/email-drafts/{id}

Update an email draft

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description

Request body

  • Name
    data
    Type
    object
    required
    Description
PATCH /api/v1/email-drafts/{id}
{
  "data": {
    "attributes": {
      "bcc_addresses": [
        "string"
      ],
      "body_html": "string",
      "cc_addresses": [
        "string"
      ],
      "contact_id": "00000000-0000-0000-0000-000000000000",
      "reply_to_email_id": "00000000-0000-0000-0000-000000000000",
      "reply_to_inbound_email_id": "00000000-0000-0000-0000-000000000000",
      "sender_address": "string",
      "sender_integration_id": "00000000-0000-0000-0000-000000000000",
      "subject": "string",
      "template_id": "00000000-0000-0000-0000-000000000000",
      "to_addresses": [
        "string"
      ],
      "use_branding": false
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "email-drafts"
  }
}
200 Updated draft
{
  "data": {
    "attributes": {
      "bcc_addresses": [
        "string"
      ],
      "body_html": "string",
      "cc_addresses": [
        "string"
      ],
      "contact_id": "00000000-0000-0000-0000-000000000000",
      "created_by_id": "00000000-0000-0000-0000-000000000000",
      "inserted_at": "2026-01-01T00:00:00Z",
      "last_edited_by_id": "00000000-0000-0000-0000-000000000000",
      "lead_id": "00000000-0000-0000-0000-000000000000",
      "matter_id": "00000000-0000-0000-0000-000000000000",
      "reply_to_email_id": "00000000-0000-0000-0000-000000000000",
      "reply_to_inbound_email_id": "00000000-0000-0000-0000-000000000000",
      "sender_address": "string",
      "sender_integration_id": "00000000-0000-0000-0000-000000000000",
      "source": "manual",
      "subject": "string",
      "template_id": "00000000-0000-0000-0000-000000000000",
      "to_addresses": [
        "string"
      ],
      "updated_at": "2026-01-01T00:00:00Z",
      "use_branding": false
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "email-drafts"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
DELETE /api/v1/email-drafts/{id}

Discard an email draft

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
DELETE /api/v1/email-drafts/{id}
curl -X DELETE \
     -H "Authorization: Bearer {token}" \
     https://app.matterfirst.com.au/api/v1/email-drafts/{id}
POST /api/v1/email-drafts/{id}/send

Send an email draft

Runs the draft through the full outbound pipeline (template render, merge tags, branding, sender resolution) and deletes it. Returns the created email. A draft already sent or discarded returns 404. Sender resolution happens here rather than at create time: the draft's `sender_integration_id`, if set, is the explicit pick, and otherwise the chain falls through to the acting user's mailbox, the matter's or lead's responsible user, and the firm default. When no step of that chain yields a send-ready mailbox the send is refused with 422 rather than delivered from an unintended address.

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
201 Sent email
{
  "data": {
    "attributes": {
      "bcc_addresses": [
        "string"
      ],
      "body_html": "string",
      "body_text": "string",
      "cc_addresses": [
        "string"
      ],
      "contact_id": "00000000-0000-0000-0000-000000000000",
      "from_address": "string",
      "from_name": "string",
      "inserted_at": "2026-01-01T00:00:00Z",
      "lead_id": "00000000-0000-0000-0000-000000000000",
      "matter_id": "00000000-0000-0000-0000-000000000000",
      "opened_at": "2026-01-01T00:00:00Z",
      "reply_to": "string",
      "scheduled_at": "2026-01-01T00:00:00Z",
      "sent_at": "2026-01-01T00:00:00Z",
      "sent_by_id": "00000000-0000-0000-0000-000000000000",
      "source": "string",
      "status": "queued",
      "subject": "string",
      "template_id": "00000000-0000-0000-0000-000000000000",
      "to_addresses": [
        "string"
      ],
      "updated_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "emails"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
GET /api/v1/emails

List emails

Parameters

  • Name
    filter
    Type
    object
    In
    in query
    Description
  • Name
    page_number
    Type
    integer
    In
    in query
    Description
  • Name
    page_size
    Type
    integer
    In
    in query
    Description
  • Name
    sort
    Type
    string
    In
    in query
    Description
200 Email list
{
  "data": [
    {
      "attributes": {
        "bcc_addresses": [
          "string"
        ],
        "body_html": "string",
        "body_text": "string",
        "cc_addresses": [
          "string"
        ],
        "contact_id": "00000000-0000-0000-0000-000000000000",
        "from_address": "string",
        "from_name": "string",
        "inserted_at": "2026-01-01T00:00:00Z",
        "lead_id": "00000000-0000-0000-0000-000000000000",
        "matter_id": "00000000-0000-0000-0000-000000000000",
        "opened_at": "2026-01-01T00:00:00Z",
        "reply_to": "string",
        "scheduled_at": "2026-01-01T00:00:00Z",
        "sent_at": "2026-01-01T00:00:00Z",
        "sent_by_id": "00000000-0000-0000-0000-000000000000",
        "source": "string",
        "status": "queued",
        "subject": "string",
        "template_id": "00000000-0000-0000-0000-000000000000",
        "to_addresses": [
          "string"
        ],
        "updated_at": "2026-01-01T00:00:00Z"
      },
      "id": "00000000-0000-0000-0000-000000000000",
      "type": "emails"
    }
  ],
  "links": {
    "first": "string",
    "last": "string",
    "next": "string",
    "prev": "string",
    "self": "string"
  },
  "meta": {
    "page": 0,
    "page_size": 0,
    "total": 0,
    "total_pages": 0
  }
}
POST /api/v1/emails/schedule

Schedule an email for future delivery

Request body

  • Name
    data
    Type
    object
    required
    Description
POST /api/v1/emails/schedule
{
  "data": {
    "attributes": {
      "bcc": [
        "string"
      ],
      "bcc_addresses": [
        "string"
      ],
      "body_html": "string",
      "body_text": "string",
      "cc": [
        "string"
      ],
      "cc_addresses": [
        "string"
      ],
      "contact_id": "00000000-0000-0000-0000-000000000000",
      "from": "string",
      "from_address": "string",
      "lead_id": "00000000-0000-0000-0000-000000000000",
      "matter_id": "00000000-0000-0000-0000-000000000000",
      "scheduled_at": "2026-01-01T00:00:00Z",
      "sender_address": "string",
      "sender_integration_id": "00000000-0000-0000-0000-000000000000",
      "subject": "string",
      "template_id": "00000000-0000-0000-0000-000000000000",
      "to": [
        "string"
      ],
      "to_addresses": [
        "string"
      ]
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "emails"
  }
}
201 Scheduled
{
  "data": {
    "attributes": {
      "bcc_addresses": [
        "string"
      ],
      "body_html": "string",
      "body_text": "string",
      "cc_addresses": [
        "string"
      ],
      "contact_id": "00000000-0000-0000-0000-000000000000",
      "from_address": "string",
      "from_name": "string",
      "inserted_at": "2026-01-01T00:00:00Z",
      "lead_id": "00000000-0000-0000-0000-000000000000",
      "matter_id": "00000000-0000-0000-0000-000000000000",
      "opened_at": "2026-01-01T00:00:00Z",
      "reply_to": "string",
      "scheduled_at": "2026-01-01T00:00:00Z",
      "sent_at": "2026-01-01T00:00:00Z",
      "sent_by_id": "00000000-0000-0000-0000-000000000000",
      "source": "string",
      "status": "queued",
      "subject": "string",
      "template_id": "00000000-0000-0000-0000-000000000000",
      "to_addresses": [
        "string"
      ],
      "updated_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "emails"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
POST /api/v1/emails/send

Send an email

Request body

  • Name
    data
    Type
    object
    required
    Description
POST /api/v1/emails/send
{
  "data": {
    "attributes": {
      "bcc": [
        "string"
      ],
      "bcc_addresses": [
        "string"
      ],
      "body_html": "string",
      "body_text": "string",
      "cc": [
        "string"
      ],
      "cc_addresses": [
        "string"
      ],
      "contact_id": "00000000-0000-0000-0000-000000000000",
      "from": "string",
      "from_address": "string",
      "lead_id": "00000000-0000-0000-0000-000000000000",
      "matter_id": "00000000-0000-0000-0000-000000000000",
      "scheduled_at": "2026-01-01T00:00:00Z",
      "sender_address": "string",
      "sender_integration_id": "00000000-0000-0000-0000-000000000000",
      "subject": "string",
      "template_id": "00000000-0000-0000-0000-000000000000",
      "to": [
        "string"
      ],
      "to_addresses": [
        "string"
      ]
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "emails"
  }
}
201 Sent
{
  "data": {
    "attributes": {
      "bcc_addresses": [
        "string"
      ],
      "body_html": "string",
      "body_text": "string",
      "cc_addresses": [
        "string"
      ],
      "contact_id": "00000000-0000-0000-0000-000000000000",
      "from_address": "string",
      "from_name": "string",
      "inserted_at": "2026-01-01T00:00:00Z",
      "lead_id": "00000000-0000-0000-0000-000000000000",
      "matter_id": "00000000-0000-0000-0000-000000000000",
      "opened_at": "2026-01-01T00:00:00Z",
      "reply_to": "string",
      "scheduled_at": "2026-01-01T00:00:00Z",
      "sent_at": "2026-01-01T00:00:00Z",
      "sent_by_id": "00000000-0000-0000-0000-000000000000",
      "source": "string",
      "status": "queued",
      "subject": "string",
      "template_id": "00000000-0000-0000-0000-000000000000",
      "to_addresses": [
        "string"
      ],
      "updated_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "emails"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
GET /api/v1/emails/{id}

Get an email

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
200 Email
{
  "data": {
    "attributes": {
      "bcc_addresses": [
        "string"
      ],
      "body_html": "string",
      "body_text": "string",
      "cc_addresses": [
        "string"
      ],
      "contact_id": "00000000-0000-0000-0000-000000000000",
      "from_address": "string",
      "from_name": "string",
      "inserted_at": "2026-01-01T00:00:00Z",
      "lead_id": "00000000-0000-0000-0000-000000000000",
      "matter_id": "00000000-0000-0000-0000-000000000000",
      "opened_at": "2026-01-01T00:00:00Z",
      "reply_to": "string",
      "scheduled_at": "2026-01-01T00:00:00Z",
      "sent_at": "2026-01-01T00:00:00Z",
      "sent_by_id": "00000000-0000-0000-0000-000000000000",
      "source": "string",
      "status": "queued",
      "subject": "string",
      "template_id": "00000000-0000-0000-0000-000000000000",
      "to_addresses": [
        "string"
      ],
      "updated_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "emails"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}

Field Definitions

GET /api/v1/field-groups/{field_group_id}/definitions

List field definitions

Parameters

  • Name
    field_group_id
    Type
    string (uuid)
    required
    In
    in path
    Description
  • Name
    page_number
    Type
    integer
    In
    in query
    Description
  • Name
    page_size
    Type
    integer
    In
    in query
    Description
200 Field definition list
{
  "data": [
    {
      "attributes": {
        "code": "string",
        "default_value": "string",
        "description": "string",
        "field_group_id": "00000000-0000-0000-0000-000000000000",
        "field_type": "string",
        "inserted_at": "2026-01-01T00:00:00Z",
        "is_readonly": false,
        "is_required": false,
        "name": "string",
        "options": [
          {}
        ],
        "placeholder": "string",
        "position": 0,
        "settings": {},
        "updated_at": "2026-01-01T00:00:00Z",
        "validation_rules": {}
      },
      "id": "00000000-0000-0000-0000-000000000000",
      "type": "field-definitions"
    }
  ],
  "links": {
    "first": "string",
    "last": "string",
    "next": "string",
    "prev": "string",
    "self": "string"
  },
  "meta": {
    "page": 0,
    "page_size": 0,
    "total": 0,
    "total_pages": 0
  }
}
POST /api/v1/field-groups/{field_group_id}/definitions

Create a field definition

Parameters

  • Name
    field_group_id
    Type
    string (uuid)
    required
    In
    in path
    Description

Request body

  • Name
    data
    Type
    object
    required
    Description
POST /api/v1/field-groups/{field_group_id}/definitions
{
  "data": {
    "attributes": {
      "code": "string",
      "default_value": "string",
      "description": "string",
      "field_group_id": "00000000-0000-0000-0000-000000000000",
      "field_type": "string",
      "is_required": false,
      "name": "string",
      "options": [
        {}
      ],
      "placeholder": "string",
      "position": 0,
      "validation_rules": {}
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "field-definitions"
  }
}
201 Created
{
  "data": {
    "attributes": {
      "code": "string",
      "default_value": "string",
      "description": "string",
      "field_group_id": "00000000-0000-0000-0000-000000000000",
      "field_type": "string",
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_readonly": false,
      "is_required": false,
      "name": "string",
      "options": [
        {}
      ],
      "placeholder": "string",
      "position": 0,
      "settings": {},
      "updated_at": "2026-01-01T00:00:00Z",
      "validation_rules": {}
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "field-definitions"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
GET /api/v1/field-groups/{field_group_id}/definitions/{id}

Get a field definition

Parameters

  • Name
    field_group_id
    Type
    string (uuid)
    required
    In
    in path
    Description
  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
200 Field definition
{
  "data": {
    "attributes": {
      "code": "string",
      "default_value": "string",
      "description": "string",
      "field_group_id": "00000000-0000-0000-0000-000000000000",
      "field_type": "string",
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_readonly": false,
      "is_required": false,
      "name": "string",
      "options": [
        {}
      ],
      "placeholder": "string",
      "position": 0,
      "settings": {},
      "updated_at": "2026-01-01T00:00:00Z",
      "validation_rules": {}
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "field-definitions"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
PUT /api/v1/field-groups/{field_group_id}/definitions/{id}

Update a field definition

Parameters

  • Name
    field_group_id
    Type
    string (uuid)
    required
    In
    in path
    Description
  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description

Request body

  • Name
    data
    Type
    object
    required
    Description
PUT /api/v1/field-groups/{field_group_id}/definitions/{id}
{
  "data": {
    "attributes": {
      "code": "string",
      "default_value": "string",
      "description": "string",
      "field_group_id": "00000000-0000-0000-0000-000000000000",
      "field_type": "string",
      "is_required": false,
      "name": "string",
      "options": [
        {}
      ],
      "placeholder": "string",
      "position": 0,
      "validation_rules": {}
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "field-definitions"
  }
}
200 Updated
{
  "data": {
    "attributes": {
      "code": "string",
      "default_value": "string",
      "description": "string",
      "field_group_id": "00000000-0000-0000-0000-000000000000",
      "field_type": "string",
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_readonly": false,
      "is_required": false,
      "name": "string",
      "options": [
        {}
      ],
      "placeholder": "string",
      "position": 0,
      "settings": {},
      "updated_at": "2026-01-01T00:00:00Z",
      "validation_rules": {}
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "field-definitions"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
PATCH /api/v1/field-groups/{field_group_id}/definitions/{id}

Update a field definition

Parameters

  • Name
    field_group_id
    Type
    string (uuid)
    required
    In
    in path
    Description
  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description

Request body

  • Name
    data
    Type
    object
    required
    Description
PATCH /api/v1/field-groups/{field_group_id}/definitions/{id}
{
  "data": {
    "attributes": {
      "code": "string",
      "default_value": "string",
      "description": "string",
      "field_group_id": "00000000-0000-0000-0000-000000000000",
      "field_type": "string",
      "is_required": false,
      "name": "string",
      "options": [
        {}
      ],
      "placeholder": "string",
      "position": 0,
      "validation_rules": {}
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "field-definitions"
  }
}
200 Updated
{
  "data": {
    "attributes": {
      "code": "string",
      "default_value": "string",
      "description": "string",
      "field_group_id": "00000000-0000-0000-0000-000000000000",
      "field_type": "string",
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_readonly": false,
      "is_required": false,
      "name": "string",
      "options": [
        {}
      ],
      "placeholder": "string",
      "position": 0,
      "settings": {},
      "updated_at": "2026-01-01T00:00:00Z",
      "validation_rules": {}
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "field-definitions"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
DELETE /api/v1/field-groups/{field_group_id}/definitions/{id}

Delete a field definition

Parameters

  • Name
    field_group_id
    Type
    string (uuid)
    required
    In
    in path
    Description
  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
409 Field definition is in use
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}

Field Groups

GET /api/v1/field-groups

List field groups

Parameters

  • Name
    matter_type_id
    Type
    string (uuid)
    In
    in query
    Description
  • Name
    page_number
    Type
    integer
    In
    in query
    Description
  • Name
    page_size
    Type
    integer
    In
    in query
    Description
200 Field group list
{
  "data": [
    {
      "attributes": {
        "code": "string",
        "description": "string",
        "icon": "string",
        "inserted_at": "2026-01-01T00:00:00Z",
        "is_active": false,
        "is_system": false,
        "matter_type_ids": [
          "00000000-0000-0000-0000-000000000000"
        ],
        "name": "string",
        "position": 0,
        "updated_at": "2026-01-01T00:00:00Z"
      },
      "id": "00000000-0000-0000-0000-000000000000",
      "type": "field-groups"
    }
  ],
  "links": {
    "first": "string",
    "last": "string",
    "next": "string",
    "prev": "string",
    "self": "string"
  },
  "meta": {
    "page": 0,
    "page_size": 0,
    "total": 0,
    "total_pages": 0
  }
}
POST /api/v1/field-groups

Create a field group

Request body

  • Name
    data
    Type
    object
    required
    Description
POST /api/v1/field-groups
{
  "data": {
    "attributes": {
      "code": "string",
      "description": "string",
      "icon": "string",
      "is_active": false,
      "matter_type_ids": [
        "00000000-0000-0000-0000-000000000000"
      ],
      "name": "string",
      "position": 0
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "field-groups"
  }
}
201 Created
{
  "data": {
    "attributes": {
      "code": "string",
      "description": "string",
      "icon": "string",
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_active": false,
      "is_system": false,
      "matter_type_ids": [
        "00000000-0000-0000-0000-000000000000"
      ],
      "name": "string",
      "position": 0,
      "updated_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "field-groups"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
GET /api/v1/field-groups/{id}

Get a field group

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
200 Field group
{
  "data": {
    "attributes": {
      "code": "string",
      "description": "string",
      "icon": "string",
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_active": false,
      "is_system": false,
      "matter_type_ids": [
        "00000000-0000-0000-0000-000000000000"
      ],
      "name": "string",
      "position": 0,
      "updated_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "field-groups"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
PUT /api/v1/field-groups/{id}

Update a field group

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description

Request body

  • Name
    data
    Type
    object
    required
    Description
PUT /api/v1/field-groups/{id}
{
  "data": {
    "attributes": {
      "code": "string",
      "description": "string",
      "icon": "string",
      "is_active": false,
      "matter_type_ids": [
        "00000000-0000-0000-0000-000000000000"
      ],
      "name": "string",
      "position": 0
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "field-groups"
  }
}
200 Updated
{
  "data": {
    "attributes": {
      "code": "string",
      "description": "string",
      "icon": "string",
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_active": false,
      "is_system": false,
      "matter_type_ids": [
        "00000000-0000-0000-0000-000000000000"
      ],
      "name": "string",
      "position": 0,
      "updated_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "field-groups"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
PATCH /api/v1/field-groups/{id}

Update a field group

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description

Request body

  • Name
    data
    Type
    object
    required
    Description
PATCH /api/v1/field-groups/{id}
{
  "data": {
    "attributes": {
      "code": "string",
      "description": "string",
      "icon": "string",
      "is_active": false,
      "matter_type_ids": [
        "00000000-0000-0000-0000-000000000000"
      ],
      "name": "string",
      "position": 0
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "field-groups"
  }
}
200 Updated
{
  "data": {
    "attributes": {
      "code": "string",
      "description": "string",
      "icon": "string",
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_active": false,
      "is_system": false,
      "matter_type_ids": [
        "00000000-0000-0000-0000-000000000000"
      ],
      "name": "string",
      "position": 0,
      "updated_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "field-groups"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
DELETE /api/v1/field-groups/{id}

Delete a field group

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
409 Field group is in use
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}

Field Values

GET /api/v1/matters/{matter_id}/field-groups/{field_group_id}/values

Get field values for a matter + field group

Parameters

  • Name
    matter_id
    Type
    string (uuid)
    required
    In
    in path
    Description
  • Name
    field_group_id
    Type
    string (uuid)
    required
    In
    in path
    Description
200 Field values
{
  "data": [
    {
      "attributes": {
        "field_definition_id": "00000000-0000-0000-0000-000000000000",
        "field_record_id": "00000000-0000-0000-0000-000000000000",
        "inserted_at": "2026-01-01T00:00:00Z",
        "updated_at": "2026-01-01T00:00:00Z",
        "value_boolean": false,
        "value_contact_id": "00000000-0000-0000-0000-000000000000",
        "value_date": "2026-01-01",
        "value_datetime": "2026-01-01T00:00:00Z",
        "value_json": {},
        "value_number": 0.0,
        "value_text": "string"
      },
      "id": "00000000-0000-0000-0000-000000000000",
      "type": "field-values"
    }
  ],
  "meta": {
    "record_id": "00000000-0000-0000-0000-000000000000"
  }
}
PUT /api/v1/matters/{matter_id}/field-groups/{field_group_id}/values

Set field values for a matter + field group

Idempotent upsert of the whole value set: creates the field record when none exists, then applies each `{field_definition_id => value}` entry. All-or-nothing: an unknown or cross-group definition id fails the entire request with nothing written. Responds with the same shape as the index.

Parameters

  • Name
    matter_id
    Type
    string (uuid)
    required
    In
    in path
    Description
  • Name
    field_group_id
    Type
    string (uuid)
    required
    In
    in path
    Description

Request body

  • Name
    data
    Type
    object
    required
    Description
PUT /api/v1/matters/{matter_id}/field-groups/{field_group_id}/values
{
  "data": {
    "attributes": {
      "values": {}
    },
    "type": "field-values"
  }
}
200 Field values
{
  "data": [
    {
      "attributes": {
        "field_definition_id": "00000000-0000-0000-0000-000000000000",
        "field_record_id": "00000000-0000-0000-0000-000000000000",
        "inserted_at": "2026-01-01T00:00:00Z",
        "updated_at": "2026-01-01T00:00:00Z",
        "value_boolean": false,
        "value_contact_id": "00000000-0000-0000-0000-000000000000",
        "value_date": "2026-01-01",
        "value_datetime": "2026-01-01T00:00:00Z",
        "value_json": {},
        "value_number": 0.0,
        "value_text": "string"
      },
      "id": "00000000-0000-0000-0000-000000000000",
      "type": "field-values"
    }
  ],
  "meta": {
    "record_id": "00000000-0000-0000-0000-000000000000"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}

Folders

GET /api/v1/folders

List folders for a matter

Parameters

  • Name
    matter_id
    Type
    string (uuid)
    required
    In
    in query
    Description
  • Name
    page_number
    Type
    integer
    In
    in query
    Description
  • Name
    page_size
    Type
    integer
    In
    in query
    Description
200 Folder list
{
  "data": [
    {
      "attributes": {
        "contact_id": "00000000-0000-0000-0000-000000000000",
        "inserted_at": "2026-01-01T00:00:00Z",
        "is_system": false,
        "matter_id": "00000000-0000-0000-0000-000000000000",
        "name": "string",
        "parent_id": "00000000-0000-0000-0000-000000000000",
        "position": 0,
        "updated_at": "2026-01-01T00:00:00Z"
      },
      "id": "00000000-0000-0000-0000-000000000000",
      "type": "folders"
    }
  ],
  "links": {
    "first": "string",
    "last": "string",
    "next": "string",
    "prev": "string",
    "self": "string"
  },
  "meta": {
    "page": 0,
    "page_size": 0,
    "total": 0,
    "total_pages": 0
  }
}
POST /api/v1/folders

Create a folder

Request body

  • Name
    data
    Type
    object
    required
    Description
POST /api/v1/folders
{
  "data": {
    "attributes": {
      "contact_id": "00000000-0000-0000-0000-000000000000",
      "matter_id": "00000000-0000-0000-0000-000000000000",
      "name": "string",
      "parent_id": "00000000-0000-0000-0000-000000000000",
      "position": 0
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "folders"
  }
}
201 Created folder
{
  "data": {
    "attributes": {
      "contact_id": "00000000-0000-0000-0000-000000000000",
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_system": false,
      "matter_id": "00000000-0000-0000-0000-000000000000",
      "name": "string",
      "parent_id": "00000000-0000-0000-0000-000000000000",
      "position": 0,
      "updated_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "folders"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
GET /api/v1/folders/{id}

Get a folder

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
200 Folder
{
  "data": {
    "attributes": {
      "contact_id": "00000000-0000-0000-0000-000000000000",
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_system": false,
      "matter_id": "00000000-0000-0000-0000-000000000000",
      "name": "string",
      "parent_id": "00000000-0000-0000-0000-000000000000",
      "position": 0,
      "updated_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "folders"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
PUT /api/v1/folders/{id}

Update a folder

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description

Request body

  • Name
    data
    Type
    object
    required
    Description
PUT /api/v1/folders/{id}
{
  "data": {
    "attributes": {
      "contact_id": "00000000-0000-0000-0000-000000000000",
      "matter_id": "00000000-0000-0000-0000-000000000000",
      "name": "string",
      "parent_id": "00000000-0000-0000-0000-000000000000",
      "position": 0
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "folders"
  }
}
200 Updated folder
{
  "data": {
    "attributes": {
      "contact_id": "00000000-0000-0000-0000-000000000000",
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_system": false,
      "matter_id": "00000000-0000-0000-0000-000000000000",
      "name": "string",
      "parent_id": "00000000-0000-0000-0000-000000000000",
      "position": 0,
      "updated_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "folders"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
PATCH /api/v1/folders/{id}

Update a folder

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description

Request body

  • Name
    data
    Type
    object
    required
    Description
PATCH /api/v1/folders/{id}
{
  "data": {
    "attributes": {
      "contact_id": "00000000-0000-0000-0000-000000000000",
      "matter_id": "00000000-0000-0000-0000-000000000000",
      "name": "string",
      "parent_id": "00000000-0000-0000-0000-000000000000",
      "position": 0
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "folders"
  }
}
200 Updated folder
{
  "data": {
    "attributes": {
      "contact_id": "00000000-0000-0000-0000-000000000000",
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_system": false,
      "matter_id": "00000000-0000-0000-0000-000000000000",
      "name": "string",
      "parent_id": "00000000-0000-0000-0000-000000000000",
      "position": 0,
      "updated_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "folders"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
DELETE /api/v1/folders/{id}

Delete a folder

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
409 Dependency error
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
422 Delete error
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}

Invoices

GET /api/v1/invoices

List invoices

Parameters

  • Name
    fields
    Type
    object
    In
    in query
    Description
    JSON:API sparse fieldsets: fields[<type>]=a,b limits the attributes returned for that resource type.
  • Name
    filter
    Type
    object
    In
    in query
    Description
  • Name
    include
    Type
    string
    In
    in query
    Description
    Comma-separated related resources to embed in the top-level `included` array. Supported values: matter, contact.
  • Name
    page_number
    Type
    integer
    In
    in query
    Description
  • Name
    page_size
    Type
    integer
    In
    in query
    Description
  • Name
    sort
    Type
    string
    In
    in query
    Description
200 Invoice list
{
  "data": [
    {
      "attributes": {
        "accounting_provider": "string",
        "accounting_sync_status": "string",
        "balance_cents": 0,
        "contact_id": "00000000-0000-0000-0000-000000000000",
        "currency": "string",
        "delivered_at": "2026-01-01T00:00:00Z",
        "delivery_status": "string",
        "due_date": "2026-01-01",
        "inserted_at": "2026-01-01T00:00:00Z",
        "invoice_number": "string",
        "invoice_type": "string",
        "issue_date": "2026-01-01",
        "issued_at": "2026-01-01T00:00:00Z",
        "last_sync_error": "string",
        "line_items": [
          {
            "attributes": {
              "amount_cents": 0,
              "description": "string",
              "inserted_at": "2026-01-01T00:00:00Z",
              "invoice_id": "00000000-0000-0000-0000-000000000000",
              "line_type": "fee",
              "position": 0,
              "quantity": "string",
              "tax_rate": "string",
              "taxable": false,
              "unit_price_cents": 0,
              "updated_at": "2026-01-01T00:00:00Z"
            },
            "id": "00000000-0000-0000-0000-000000000000",
            "type": "invoice-line-items"
          }
        ],
        "matter_id": "00000000-0000-0000-0000-000000000000",
        "notes": "string",
        "paid_at": "2026-01-01T00:00:00Z",
        "paid_cents": 0,
        "payment_mode": "string",
        "payment_provider": "string",
        "payment_status": "string",
        "payment_terms": "string",
        "payments": [
          {
            "amount_cents": 0,
            "id": "00000000-0000-0000-0000-000000000000",
            "inserted_at": "2026-01-01T00:00:00Z",
            "method": "string",
            "paid_at": "2026-01-01T00:00:00Z",
            "reference": "string"
          }
        ],
        "sent_at": "2026-01-01T00:00:00Z",
        "status": "string",
        "subtotal_cents": 0,
        "tax_cents": 0,
        "total_cents": 0,
        "updated_at": "2026-01-01T00:00:00Z",
        "voided_at": "2026-01-01T00:00:00Z"
      },
      "id": "00000000-0000-0000-0000-000000000000",
      "type": "invoices"
    }
  ],
  "links": {
    "first": "string",
    "last": "string",
    "next": "string",
    "prev": "string",
    "self": "string"
  },
  "meta": {
    "page": 0,
    "page_size": 0,
    "total": 0,
    "total_pages": 0
  }
}
POST /api/v1/invoices

Create an invoice

Supports the optional Idempotency-Key request header (max 255 chars): retrying the POST with the same key and body replays the original response instead of creating a second invoice.

Request body

  • Name
    data
    Type
    object
    required
    Description
POST /api/v1/invoices
{
  "data": {
    "attributes": {
      "contact_id": "00000000-0000-0000-0000-000000000000",
      "matter_id": "00000000-0000-0000-0000-000000000000",
      "notes": "string",
      "payment_terms": "string",
      "tax_rate": "string"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "invoices"
  }
}
201 Created invoice
{
  "data": {
    "attributes": {
      "accounting_provider": "string",
      "accounting_sync_status": "string",
      "balance_cents": 0,
      "contact_id": "00000000-0000-0000-0000-000000000000",
      "currency": "string",
      "delivered_at": "2026-01-01T00:00:00Z",
      "delivery_status": "string",
      "due_date": "2026-01-01",
      "inserted_at": "2026-01-01T00:00:00Z",
      "invoice_number": "string",
      "invoice_type": "string",
      "issue_date": "2026-01-01",
      "issued_at": "2026-01-01T00:00:00Z",
      "last_sync_error": "string",
      "line_items": [
        {
          "attributes": {
            "amount_cents": 0,
            "description": "string",
            "inserted_at": "2026-01-01T00:00:00Z",
            "invoice_id": "00000000-0000-0000-0000-000000000000",
            "line_type": "fee",
            "position": 0,
            "quantity": "string",
            "tax_rate": "string",
            "taxable": false,
            "unit_price_cents": 0,
            "updated_at": "2026-01-01T00:00:00Z"
          },
          "id": "00000000-0000-0000-0000-000000000000",
          "type": "invoice-line-items"
        }
      ],
      "matter_id": "00000000-0000-0000-0000-000000000000",
      "notes": "string",
      "paid_at": "2026-01-01T00:00:00Z",
      "paid_cents": 0,
      "payment_mode": "string",
      "payment_provider": "string",
      "payment_status": "string",
      "payment_terms": "string",
      "payments": [
        {
          "amount_cents": 0,
          "id": "00000000-0000-0000-0000-000000000000",
          "inserted_at": "2026-01-01T00:00:00Z",
          "method": "string",
          "paid_at": "2026-01-01T00:00:00Z",
          "reference": "string"
        }
      ],
      "sent_at": "2026-01-01T00:00:00Z",
      "status": "string",
      "subtotal_cents": 0,
      "tax_cents": 0,
      "total_cents": 0,
      "updated_at": "2026-01-01T00:00:00Z",
      "voided_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "invoices"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
POST /api/v1/invoices/preview

Preview what an invoice for a matter would bill

Computes what "include unbilled work" would sweep onto a draft for the matter: counts, cents and the entries held back for having no price, without creating anything. The same predicate that refuses an issue at send time, so the preview and the refusal cannot disagree.

Request body

  • Name
    data
    Type
    object
    required
    Description
POST /api/v1/invoices/preview
{
  "data": {
    "attributes": {
      "matter_id": "00000000-0000-0000-0000-000000000000"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "invoices"
  }
}
200 Invoice preview
{
  "data": {
    "attributes": {
      "disbursement_cents": 0,
      "disbursement_count": 0,
      "empty": false,
      "matter_id": "00000000-0000-0000-0000-000000000000",
      "time_entry_cents": 0,
      "time_entry_count": 0,
      "total_cents": 0,
      "unpriced_count": 0
    },
    "type": "invoice-previews"
  }
}
GET /api/v1/invoices/{id}

Get an invoice

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
  • Name
    fields
    Type
    object
    In
    in query
    Description
    JSON:API sparse fieldsets: fields[<type>]=a,b limits the attributes returned for that resource type.
  • Name
    include
    Type
    string
    In
    in query
    Description
    Comma-separated related resources to embed in the top-level `included` array. Supported values: matter, contact.
200 Invoice
{
  "data": {
    "attributes": {
      "accounting_provider": "string",
      "accounting_sync_status": "string",
      "balance_cents": 0,
      "contact_id": "00000000-0000-0000-0000-000000000000",
      "currency": "string",
      "delivered_at": "2026-01-01T00:00:00Z",
      "delivery_status": "string",
      "due_date": "2026-01-01",
      "inserted_at": "2026-01-01T00:00:00Z",
      "invoice_number": "string",
      "invoice_type": "string",
      "issue_date": "2026-01-01",
      "issued_at": "2026-01-01T00:00:00Z",
      "last_sync_error": "string",
      "line_items": [
        {
          "attributes": {
            "amount_cents": 0,
            "description": "string",
            "inserted_at": "2026-01-01T00:00:00Z",
            "invoice_id": "00000000-0000-0000-0000-000000000000",
            "line_type": "fee",
            "position": 0,
            "quantity": "string",
            "tax_rate": "string",
            "taxable": false,
            "unit_price_cents": 0,
            "updated_at": "2026-01-01T00:00:00Z"
          },
          "id": "00000000-0000-0000-0000-000000000000",
          "type": "invoice-line-items"
        }
      ],
      "matter_id": "00000000-0000-0000-0000-000000000000",
      "notes": "string",
      "paid_at": "2026-01-01T00:00:00Z",
      "paid_cents": 0,
      "payment_mode": "string",
      "payment_provider": "string",
      "payment_status": "string",
      "payment_terms": "string",
      "payments": [
        {
          "amount_cents": 0,
          "id": "00000000-0000-0000-0000-000000000000",
          "inserted_at": "2026-01-01T00:00:00Z",
          "method": "string",
          "paid_at": "2026-01-01T00:00:00Z",
          "reference": "string"
        }
      ],
      "sent_at": "2026-01-01T00:00:00Z",
      "status": "string",
      "subtotal_cents": 0,
      "tax_cents": 0,
      "total_cents": 0,
      "updated_at": "2026-01-01T00:00:00Z",
      "voided_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "invoices"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
PUT /api/v1/invoices/{id}

Update an invoice

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
  • Name
    if-match
    Type
    string
    In
    in header
    Description
    Optional optimistic-concurrency precondition: the ETag from a previous GET/update of this invoice. A stale value is refused with 412 precondition_failed before anything is written.

Request body

  • Name
    data
    Type
    object
    required
    Description
PUT /api/v1/invoices/{id}
{
  "data": {
    "attributes": {
      "contact_id": "00000000-0000-0000-0000-000000000000",
      "matter_id": "00000000-0000-0000-0000-000000000000",
      "notes": "string",
      "payment_terms": "string"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "invoices"
  }
}
200 Updated invoice
{
  "data": {
    "attributes": {
      "accounting_provider": "string",
      "accounting_sync_status": "string",
      "balance_cents": 0,
      "contact_id": "00000000-0000-0000-0000-000000000000",
      "currency": "string",
      "delivered_at": "2026-01-01T00:00:00Z",
      "delivery_status": "string",
      "due_date": "2026-01-01",
      "inserted_at": "2026-01-01T00:00:00Z",
      "invoice_number": "string",
      "invoice_type": "string",
      "issue_date": "2026-01-01",
      "issued_at": "2026-01-01T00:00:00Z",
      "last_sync_error": "string",
      "line_items": [
        {
          "attributes": {
            "amount_cents": 0,
            "description": "string",
            "inserted_at": "2026-01-01T00:00:00Z",
            "invoice_id": "00000000-0000-0000-0000-000000000000",
            "line_type": "fee",
            "position": 0,
            "quantity": "string",
            "tax_rate": "string",
            "taxable": false,
            "unit_price_cents": 0,
            "updated_at": "2026-01-01T00:00:00Z"
          },
          "id": "00000000-0000-0000-0000-000000000000",
          "type": "invoice-line-items"
        }
      ],
      "matter_id": "00000000-0000-0000-0000-000000000000",
      "notes": "string",
      "paid_at": "2026-01-01T00:00:00Z",
      "paid_cents": 0,
      "payment_mode": "string",
      "payment_provider": "string",
      "payment_status": "string",
      "payment_terms": "string",
      "payments": [
        {
          "amount_cents": 0,
          "id": "00000000-0000-0000-0000-000000000000",
          "inserted_at": "2026-01-01T00:00:00Z",
          "method": "string",
          "paid_at": "2026-01-01T00:00:00Z",
          "reference": "string"
        }
      ],
      "sent_at": "2026-01-01T00:00:00Z",
      "status": "string",
      "subtotal_cents": 0,
      "tax_cents": 0,
      "total_cents": 0,
      "updated_at": "2026-01-01T00:00:00Z",
      "voided_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "invoices"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
PATCH /api/v1/invoices/{id}

Update an invoice

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
  • Name
    if-match
    Type
    string
    In
    in header
    Description
    Optional optimistic-concurrency precondition: the ETag from a previous GET/update of this invoice. A stale value is refused with 412 precondition_failed before anything is written.

Request body

  • Name
    data
    Type
    object
    required
    Description
PATCH /api/v1/invoices/{id}
{
  "data": {
    "attributes": {
      "contact_id": "00000000-0000-0000-0000-000000000000",
      "matter_id": "00000000-0000-0000-0000-000000000000",
      "notes": "string",
      "payment_terms": "string"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "invoices"
  }
}
200 Updated invoice
{
  "data": {
    "attributes": {
      "accounting_provider": "string",
      "accounting_sync_status": "string",
      "balance_cents": 0,
      "contact_id": "00000000-0000-0000-0000-000000000000",
      "currency": "string",
      "delivered_at": "2026-01-01T00:00:00Z",
      "delivery_status": "string",
      "due_date": "2026-01-01",
      "inserted_at": "2026-01-01T00:00:00Z",
      "invoice_number": "string",
      "invoice_type": "string",
      "issue_date": "2026-01-01",
      "issued_at": "2026-01-01T00:00:00Z",
      "last_sync_error": "string",
      "line_items": [
        {
          "attributes": {
            "amount_cents": 0,
            "description": "string",
            "inserted_at": "2026-01-01T00:00:00Z",
            "invoice_id": "00000000-0000-0000-0000-000000000000",
            "line_type": "fee",
            "position": 0,
            "quantity": "string",
            "tax_rate": "string",
            "taxable": false,
            "unit_price_cents": 0,
            "updated_at": "2026-01-01T00:00:00Z"
          },
          "id": "00000000-0000-0000-0000-000000000000",
          "type": "invoice-line-items"
        }
      ],
      "matter_id": "00000000-0000-0000-0000-000000000000",
      "notes": "string",
      "paid_at": "2026-01-01T00:00:00Z",
      "paid_cents": 0,
      "payment_mode": "string",
      "payment_provider": "string",
      "payment_status": "string",
      "payment_terms": "string",
      "payments": [
        {
          "amount_cents": 0,
          "id": "00000000-0000-0000-0000-000000000000",
          "inserted_at": "2026-01-01T00:00:00Z",
          "method": "string",
          "paid_at": "2026-01-01T00:00:00Z",
          "reference": "string"
        }
      ],
      "sent_at": "2026-01-01T00:00:00Z",
      "status": "string",
      "subtotal_cents": 0,
      "tax_cents": 0,
      "total_cents": 0,
      "updated_at": "2026-01-01T00:00:00Z",
      "voided_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "invoices"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
DELETE /api/v1/invoices/{id}

Delete a draft invoice

Only a draft with no payments recorded against it can be deleted. An issued invoice is a document the client has: void it instead.

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
409 Invoice not deletable
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
POST /api/v1/invoices/{id}/issue

Issue an invoice without emailing it

Marks a draft as issued (status "sent") with no email: the explicit no-inbox path; the PDF can be delivered manually. POST /invoices/:id/send is the emailed variant of the same transition.

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
200 Issued invoice
{
  "data": {
    "attributes": {
      "accounting_provider": "string",
      "accounting_sync_status": "string",
      "balance_cents": 0,
      "contact_id": "00000000-0000-0000-0000-000000000000",
      "currency": "string",
      "delivered_at": "2026-01-01T00:00:00Z",
      "delivery_status": "string",
      "due_date": "2026-01-01",
      "inserted_at": "2026-01-01T00:00:00Z",
      "invoice_number": "string",
      "invoice_type": "string",
      "issue_date": "2026-01-01",
      "issued_at": "2026-01-01T00:00:00Z",
      "last_sync_error": "string",
      "line_items": [
        {
          "attributes": {
            "amount_cents": 0,
            "description": "string",
            "inserted_at": "2026-01-01T00:00:00Z",
            "invoice_id": "00000000-0000-0000-0000-000000000000",
            "line_type": "fee",
            "position": 0,
            "quantity": "string",
            "tax_rate": "string",
            "taxable": false,
            "unit_price_cents": 0,
            "updated_at": "2026-01-01T00:00:00Z"
          },
          "id": "00000000-0000-0000-0000-000000000000",
          "type": "invoice-line-items"
        }
      ],
      "matter_id": "00000000-0000-0000-0000-000000000000",
      "notes": "string",
      "paid_at": "2026-01-01T00:00:00Z",
      "paid_cents": 0,
      "payment_mode": "string",
      "payment_provider": "string",
      "payment_status": "string",
      "payment_terms": "string",
      "payments": [
        {
          "amount_cents": 0,
          "id": "00000000-0000-0000-0000-000000000000",
          "inserted_at": "2026-01-01T00:00:00Z",
          "method": "string",
          "paid_at": "2026-01-01T00:00:00Z",
          "reference": "string"
        }
      ],
      "sent_at": "2026-01-01T00:00:00Z",
      "status": "string",
      "subtotal_cents": 0,
      "tax_cents": 0,
      "total_cents": 0,
      "updated_at": "2026-01-01T00:00:00Z",
      "voided_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "invoices"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
409 Invoice not draft
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
422 Issue refused
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
POST /api/v1/invoices/{id}/send

Send an invoice

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
200 Sent invoice
{
  "data": {
    "attributes": {
      "accounting_provider": "string",
      "accounting_sync_status": "string",
      "balance_cents": 0,
      "contact_id": "00000000-0000-0000-0000-000000000000",
      "currency": "string",
      "delivered_at": "2026-01-01T00:00:00Z",
      "delivery_status": "string",
      "due_date": "2026-01-01",
      "inserted_at": "2026-01-01T00:00:00Z",
      "invoice_number": "string",
      "invoice_type": "string",
      "issue_date": "2026-01-01",
      "issued_at": "2026-01-01T00:00:00Z",
      "last_sync_error": "string",
      "line_items": [
        {
          "attributes": {
            "amount_cents": 0,
            "description": "string",
            "inserted_at": "2026-01-01T00:00:00Z",
            "invoice_id": "00000000-0000-0000-0000-000000000000",
            "line_type": "fee",
            "position": 0,
            "quantity": "string",
            "tax_rate": "string",
            "taxable": false,
            "unit_price_cents": 0,
            "updated_at": "2026-01-01T00:00:00Z"
          },
          "id": "00000000-0000-0000-0000-000000000000",
          "type": "invoice-line-items"
        }
      ],
      "matter_id": "00000000-0000-0000-0000-000000000000",
      "notes": "string",
      "paid_at": "2026-01-01T00:00:00Z",
      "paid_cents": 0,
      "payment_mode": "string",
      "payment_provider": "string",
      "payment_status": "string",
      "payment_terms": "string",
      "payments": [
        {
          "amount_cents": 0,
          "id": "00000000-0000-0000-0000-000000000000",
          "inserted_at": "2026-01-01T00:00:00Z",
          "method": "string",
          "paid_at": "2026-01-01T00:00:00Z",
          "reference": "string"
        }
      ],
      "sent_at": "2026-01-01T00:00:00Z",
      "status": "string",
      "subtotal_cents": 0,
      "tax_cents": 0,
      "total_cents": 0,
      "updated_at": "2026-01-01T00:00:00Z",
      "voided_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "invoices"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Send error
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
POST /api/v1/invoices/{id}/void

Void an invoice

Withdraws a draft, sent or viewed invoice that has no money recorded against it, releasing the work it billed back into unbilled WIP. A part-paid invoice cannot be voided: issue a credit note instead.

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
200 Voided invoice
{
  "data": {
    "attributes": {
      "accounting_provider": "string",
      "accounting_sync_status": "string",
      "balance_cents": 0,
      "contact_id": "00000000-0000-0000-0000-000000000000",
      "currency": "string",
      "delivered_at": "2026-01-01T00:00:00Z",
      "delivery_status": "string",
      "due_date": "2026-01-01",
      "inserted_at": "2026-01-01T00:00:00Z",
      "invoice_number": "string",
      "invoice_type": "string",
      "issue_date": "2026-01-01",
      "issued_at": "2026-01-01T00:00:00Z",
      "last_sync_error": "string",
      "line_items": [
        {
          "attributes": {
            "amount_cents": 0,
            "description": "string",
            "inserted_at": "2026-01-01T00:00:00Z",
            "invoice_id": "00000000-0000-0000-0000-000000000000",
            "line_type": "fee",
            "position": 0,
            "quantity": "string",
            "tax_rate": "string",
            "taxable": false,
            "unit_price_cents": 0,
            "updated_at": "2026-01-01T00:00:00Z"
          },
          "id": "00000000-0000-0000-0000-000000000000",
          "type": "invoice-line-items"
        }
      ],
      "matter_id": "00000000-0000-0000-0000-000000000000",
      "notes": "string",
      "paid_at": "2026-01-01T00:00:00Z",
      "paid_cents": 0,
      "payment_mode": "string",
      "payment_provider": "string",
      "payment_status": "string",
      "payment_terms": "string",
      "payments": [
        {
          "amount_cents": 0,
          "id": "00000000-0000-0000-0000-000000000000",
          "inserted_at": "2026-01-01T00:00:00Z",
          "method": "string",
          "paid_at": "2026-01-01T00:00:00Z",
          "reference": "string"
        }
      ],
      "sent_at": "2026-01-01T00:00:00Z",
      "status": "string",
      "subtotal_cents": 0,
      "tax_cents": 0,
      "total_cents": 0,
      "updated_at": "2026-01-01T00:00:00Z",
      "voided_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "invoices"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
409 Invoice not voidable
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
GET /api/v1/invoices/{invoice_id}/line-items

List an invoice's line items

Parameters

  • Name
    invoice_id
    Type
    string (uuid)
    required
    In
    in path
    Description
200 Line item list
{
  "data": [
    {
      "attributes": {
        "amount_cents": 0,
        "description": "string",
        "inserted_at": "2026-01-01T00:00:00Z",
        "invoice_id": "00000000-0000-0000-0000-000000000000",
        "line_type": "fee",
        "position": 0,
        "quantity": "string",
        "tax_rate": "string",
        "taxable": false,
        "unit_price_cents": 0,
        "updated_at": "2026-01-01T00:00:00Z"
      },
      "id": "00000000-0000-0000-0000-000000000000",
      "type": "invoice-line-items"
    }
  ],
  "links": {
    "first": "string",
    "last": "string",
    "next": "string",
    "prev": "string",
    "self": "string"
  },
  "meta": {
    "page": 0,
    "page_size": 0,
    "total": 0,
    "total_pages": 0
  }
}
POST /api/v1/invoices/{invoice_id}/line-items

Add a line item to a draft invoice

Parameters

  • Name
    invoice_id
    Type
    string (uuid)
    required
    In
    in path
    Description

Request body

  • Name
    data
    Type
    object
    required
    Description
POST /api/v1/invoices/{invoice_id}/line-items
{
  "data": {
    "attributes": {
      "description": "string",
      "line_type": "fee",
      "position": 0,
      "quantity": "string",
      "tax_rate": "string",
      "taxable": false,
      "unit_price_cents": 0
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "invoice-line-items"
  }
}
201 Created line item
{
  "data": {
    "attributes": {
      "amount_cents": 0,
      "description": "string",
      "inserted_at": "2026-01-01T00:00:00Z",
      "invoice_id": "00000000-0000-0000-0000-000000000000",
      "line_type": "fee",
      "position": 0,
      "quantity": "string",
      "tax_rate": "string",
      "taxable": false,
      "unit_price_cents": 0,
      "updated_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "invoice-line-items"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
409 Invoice not editable
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
PUT /api/v1/invoices/{invoice_id}/line-items/{id}

Update a line item on a draft invoice

Parameters

  • Name
    invoice_id
    Type
    string (uuid)
    required
    In
    in path
    Description
  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description

Request body

  • Name
    data
    Type
    object
    required
    Description
PUT /api/v1/invoices/{invoice_id}/line-items/{id}
{
  "data": {
    "attributes": {
      "description": "string",
      "line_type": "fee",
      "position": 0,
      "quantity": "string",
      "tax_rate": "string",
      "taxable": false,
      "unit_price_cents": 0
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "invoice-line-items"
  }
}
200 Updated line item
{
  "data": {
    "attributes": {
      "amount_cents": 0,
      "description": "string",
      "inserted_at": "2026-01-01T00:00:00Z",
      "invoice_id": "00000000-0000-0000-0000-000000000000",
      "line_type": "fee",
      "position": 0,
      "quantity": "string",
      "tax_rate": "string",
      "taxable": false,
      "unit_price_cents": 0,
      "updated_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "invoice-line-items"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
409 Invoice not editable
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
PATCH /api/v1/invoices/{invoice_id}/line-items/{id}

Update a line item on a draft invoice

Parameters

  • Name
    invoice_id
    Type
    string (uuid)
    required
    In
    in path
    Description
  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description

Request body

  • Name
    data
    Type
    object
    required
    Description
PATCH /api/v1/invoices/{invoice_id}/line-items/{id}
{
  "data": {
    "attributes": {
      "description": "string",
      "line_type": "fee",
      "position": 0,
      "quantity": "string",
      "tax_rate": "string",
      "taxable": false,
      "unit_price_cents": 0
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "invoice-line-items"
  }
}
200 Updated line item
{
  "data": {
    "attributes": {
      "amount_cents": 0,
      "description": "string",
      "inserted_at": "2026-01-01T00:00:00Z",
      "invoice_id": "00000000-0000-0000-0000-000000000000",
      "line_type": "fee",
      "position": 0,
      "quantity": "string",
      "tax_rate": "string",
      "taxable": false,
      "unit_price_cents": 0,
      "updated_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "invoice-line-items"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
409 Invoice not editable
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
DELETE /api/v1/invoices/{invoice_id}/line-items/{id}

Remove a line item from a draft invoice

Parameters

  • Name
    invoice_id
    Type
    string (uuid)
    required
    In
    in path
    Description
  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
409 Invoice not editable
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
GET /api/v1/invoices/{invoice_id}/payments

List an invoice's payments

Parameters

  • Name
    invoice_id
    Type
    string (uuid)
    required
    In
    in path
    Description
200 Payment list
{
  "data": [
    {
      "attributes": {
        "amount_cents": 0,
        "inserted_at": "2026-01-01T00:00:00Z",
        "invoice_id": "00000000-0000-0000-0000-000000000000",
        "matter_id": "00000000-0000-0000-0000-000000000000",
        "method": "bank_transfer",
        "paid_at": "2026-01-01T00:00:00Z",
        "reference": "string",
        "status": "pending",
        "updated_at": "2026-01-01T00:00:00Z"
      },
      "id": "00000000-0000-0000-0000-000000000000",
      "type": "payments"
    }
  ],
  "links": {
    "first": "string",
    "last": "string",
    "next": "string",
    "prev": "string",
    "self": "string"
  },
  "meta": {
    "page": 0,
    "page_size": 0,
    "total": 0,
    "total_pages": 0
  }
}
POST /api/v1/invoices/{invoice_id}/payments

Record a payment against an issued invoice

Records money received. Refuses drafts and voided invoices (409). A payment larger than the balance is accepted: the invoice settles for its own total and the surplus is held as an explicit overpayment credit for the client.

Parameters

  • Name
    invoice_id
    Type
    string (uuid)
    required
    In
    in path
    Description

Request body

  • Name
    data
    Type
    object
    required
    Description
POST /api/v1/invoices/{invoice_id}/payments
{
  "data": {
    "attributes": {
      "amount_cents": 0,
      "method": "bank_transfer",
      "paid_at": "2026-01-01T00:00:00Z",
      "reference": "string"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "payments"
  }
}
201 Recorded payment
{
  "data": {
    "attributes": {
      "amount_cents": 0,
      "inserted_at": "2026-01-01T00:00:00Z",
      "invoice_id": "00000000-0000-0000-0000-000000000000",
      "matter_id": "00000000-0000-0000-0000-000000000000",
      "method": "bank_transfer",
      "paid_at": "2026-01-01T00:00:00Z",
      "reference": "string",
      "status": "pending",
      "updated_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "payments"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
409 Invoice not payable
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}

Key Date Types

GET /api/v1/key-date-types

List key date types

Parameters

  • Name
    matter_type_id
    Type
    string (uuid)
    In
    in query
    Description
  • Name
    page_number
    Type
    integer
    In
    in query
    Description
  • Name
    page_size
    Type
    integer
    In
    in query
    Description
200 Key date type list
{
  "data": [
    {
      "attributes": {
        "auto_complete": false,
        "code": "string",
        "color": "string",
        "default_reminder_days": 0,
        "description": "string",
        "icon": "string",
        "inserted_at": "2026-01-01T00:00:00Z",
        "is_milestone": false,
        "matter_type_ids": [
          "00000000-0000-0000-0000-000000000000"
        ],
        "name": "string",
        "position": 0,
        "updated_at": "2026-01-01T00:00:00Z"
      },
      "id": "00000000-0000-0000-0000-000000000000",
      "type": "key-date-types"
    }
  ],
  "links": {
    "first": "string",
    "last": "string",
    "next": "string",
    "prev": "string",
    "self": "string"
  },
  "meta": {
    "page": 0,
    "page_size": 0,
    "total": 0,
    "total_pages": 0
  }
}
POST /api/v1/key-date-types

Create a key date type

Request body

  • Name
    data
    Type
    object
    required
    Description
POST /api/v1/key-date-types
{
  "data": {
    "attributes": {
      "auto_complete": false,
      "code": "string",
      "color": "string",
      "default_reminder_days": 0,
      "description": "string",
      "icon": "string",
      "is_milestone": false,
      "matter_type_ids": [
        "00000000-0000-0000-0000-000000000000"
      ],
      "name": "string",
      "position": 0
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "key-date-types"
  }
}
201 Created
{
  "data": {
    "attributes": {
      "auto_complete": false,
      "code": "string",
      "color": "string",
      "default_reminder_days": 0,
      "description": "string",
      "icon": "string",
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_milestone": false,
      "matter_type_ids": [
        "00000000-0000-0000-0000-000000000000"
      ],
      "name": "string",
      "position": 0,
      "updated_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "key-date-types"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
GET /api/v1/key-date-types/{id}

Get a key date type

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
200 Key date type
{
  "data": {
    "attributes": {
      "auto_complete": false,
      "code": "string",
      "color": "string",
      "default_reminder_days": 0,
      "description": "string",
      "icon": "string",
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_milestone": false,
      "matter_type_ids": [
        "00000000-0000-0000-0000-000000000000"
      ],
      "name": "string",
      "position": 0,
      "updated_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "key-date-types"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
PUT /api/v1/key-date-types/{id}

Update a key date type

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description

Request body

  • Name
    data
    Type
    object
    required
    Description
PUT /api/v1/key-date-types/{id}
{
  "data": {
    "attributes": {
      "auto_complete": false,
      "code": "string",
      "color": "string",
      "default_reminder_days": 0,
      "description": "string",
      "icon": "string",
      "is_milestone": false,
      "matter_type_ids": [
        "00000000-0000-0000-0000-000000000000"
      ],
      "name": "string",
      "position": 0
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "key-date-types"
  }
}
200 Updated
{
  "data": {
    "attributes": {
      "auto_complete": false,
      "code": "string",
      "color": "string",
      "default_reminder_days": 0,
      "description": "string",
      "icon": "string",
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_milestone": false,
      "matter_type_ids": [
        "00000000-0000-0000-0000-000000000000"
      ],
      "name": "string",
      "position": 0,
      "updated_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "key-date-types"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
PATCH /api/v1/key-date-types/{id}

Update a key date type

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description

Request body

  • Name
    data
    Type
    object
    required
    Description
PATCH /api/v1/key-date-types/{id}
{
  "data": {
    "attributes": {
      "auto_complete": false,
      "code": "string",
      "color": "string",
      "default_reminder_days": 0,
      "description": "string",
      "icon": "string",
      "is_milestone": false,
      "matter_type_ids": [
        "00000000-0000-0000-0000-000000000000"
      ],
      "name": "string",
      "position": 0
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "key-date-types"
  }
}
200 Updated
{
  "data": {
    "attributes": {
      "auto_complete": false,
      "code": "string",
      "color": "string",
      "default_reminder_days": 0,
      "description": "string",
      "icon": "string",
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_milestone": false,
      "matter_type_ids": [
        "00000000-0000-0000-0000-000000000000"
      ],
      "name": "string",
      "position": 0,
      "updated_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "key-date-types"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
DELETE /api/v1/key-date-types/{id}

Delete a key date type

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
409 Key date type is in use
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}

Key Dates

GET /api/v1/key-dates

List key dates for a matter

Parameters

  • Name
    matter_id
    Type
    string (uuid)
    required
    In
    in query
    Description
  • Name
    page_number
    Type
    integer
    In
    in query
    Description
  • Name
    page_size
    Type
    integer
    In
    in query
    Description
200 Key date list
{
  "data": [
    {
      "attributes": {
        "completed_at": "2026-01-01T00:00:00Z",
        "completed_by_id": "00000000-0000-0000-0000-000000000000",
        "date": "2026-01-01",
        "inserted_at": "2026-01-01T00:00:00Z",
        "is_all_day": false,
        "key_date_type_id": "00000000-0000-0000-0000-000000000000",
        "matter_id": "00000000-0000-0000-0000-000000000000",
        "name": "string",
        "notes": "string",
        "source": "string",
        "source_id": "00000000-0000-0000-0000-000000000000",
        "status": "string",
        "time": "string",
        "updated_at": "2026-01-01T00:00:00Z"
      },
      "id": "00000000-0000-0000-0000-000000000000",
      "type": "key-dates"
    }
  ],
  "links": {
    "first": "string",
    "last": "string",
    "next": "string",
    "prev": "string",
    "self": "string"
  },
  "meta": {
    "page": 0,
    "page_size": 0,
    "total": 0,
    "total_pages": 0
  }
}
POST /api/v1/key-dates

Create a key date

Request body

  • Name
    data
    Type
    object
    required
    Description
POST /api/v1/key-dates
{
  "data": {
    "attributes": {
      "date": "2026-01-01",
      "is_all_day": false,
      "key_date_type_id": "00000000-0000-0000-0000-000000000000",
      "matter_id": "00000000-0000-0000-0000-000000000000",
      "name": "string",
      "notes": "string",
      "status": "string",
      "time": "string"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "key-dates"
  }
}
201 Created
{
  "data": {
    "attributes": {
      "completed_at": "2026-01-01T00:00:00Z",
      "completed_by_id": "00000000-0000-0000-0000-000000000000",
      "date": "2026-01-01",
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_all_day": false,
      "key_date_type_id": "00000000-0000-0000-0000-000000000000",
      "matter_id": "00000000-0000-0000-0000-000000000000",
      "name": "string",
      "notes": "string",
      "source": "string",
      "source_id": "00000000-0000-0000-0000-000000000000",
      "status": "string",
      "time": "string",
      "updated_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "key-dates"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
GET /api/v1/key-dates/{id}

Get a key date

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
200 Key date
{
  "data": {
    "attributes": {
      "completed_at": "2026-01-01T00:00:00Z",
      "completed_by_id": "00000000-0000-0000-0000-000000000000",
      "date": "2026-01-01",
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_all_day": false,
      "key_date_type_id": "00000000-0000-0000-0000-000000000000",
      "matter_id": "00000000-0000-0000-0000-000000000000",
      "name": "string",
      "notes": "string",
      "source": "string",
      "source_id": "00000000-0000-0000-0000-000000000000",
      "status": "string",
      "time": "string",
      "updated_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "key-dates"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
PUT /api/v1/key-dates/{id}

Update a key date

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description

Request body

  • Name
    data
    Type
    object
    required
    Description
PUT /api/v1/key-dates/{id}
{
  "data": {
    "attributes": {
      "date": "2026-01-01",
      "is_all_day": false,
      "key_date_type_id": "00000000-0000-0000-0000-000000000000",
      "matter_id": "00000000-0000-0000-0000-000000000000",
      "name": "string",
      "notes": "string",
      "status": "string",
      "time": "string"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "key-dates"
  }
}
200 Updated
{
  "data": {
    "attributes": {
      "completed_at": "2026-01-01T00:00:00Z",
      "completed_by_id": "00000000-0000-0000-0000-000000000000",
      "date": "2026-01-01",
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_all_day": false,
      "key_date_type_id": "00000000-0000-0000-0000-000000000000",
      "matter_id": "00000000-0000-0000-0000-000000000000",
      "name": "string",
      "notes": "string",
      "source": "string",
      "source_id": "00000000-0000-0000-0000-000000000000",
      "status": "string",
      "time": "string",
      "updated_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "key-dates"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
PATCH /api/v1/key-dates/{id}

Update a key date

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description

Request body

  • Name
    data
    Type
    object
    required
    Description
PATCH /api/v1/key-dates/{id}
{
  "data": {
    "attributes": {
      "date": "2026-01-01",
      "is_all_day": false,
      "key_date_type_id": "00000000-0000-0000-0000-000000000000",
      "matter_id": "00000000-0000-0000-0000-000000000000",
      "name": "string",
      "notes": "string",
      "status": "string",
      "time": "string"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "key-dates"
  }
}
200 Updated
{
  "data": {
    "attributes": {
      "completed_at": "2026-01-01T00:00:00Z",
      "completed_by_id": "00000000-0000-0000-0000-000000000000",
      "date": "2026-01-01",
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_all_day": false,
      "key_date_type_id": "00000000-0000-0000-0000-000000000000",
      "matter_id": "00000000-0000-0000-0000-000000000000",
      "name": "string",
      "notes": "string",
      "source": "string",
      "source_id": "00000000-0000-0000-0000-000000000000",
      "status": "string",
      "time": "string",
      "updated_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "key-dates"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
DELETE /api/v1/key-dates/{id}

Delete a key date

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
DELETE /api/v1/key-dates/{id}
curl -X DELETE \
     -H "Authorization: Bearer {token}" \
     https://app.matterfirst.com.au/api/v1/key-dates/{id}

Leads

GET /api/v1/leads

List leads

Parameters

  • Name
    fields
    Type
    object
    In
    in query
    Description
    JSON:API sparse fieldsets: fields[<type>]=a,b limits the attributes returned for that resource type.
  • Name
    filter
    Type
    object
    In
    in query
    Description
  • Name
    include
    Type
    string
    In
    in query
    Description
    Comma-separated related resources to embed in the top-level `included` array. Supported values: pipeline, pipeline_stage, matter_type, owner, conversion_matter.
  • Name
    page_number
    Type
    integer
    In
    in query
    Description
  • Name
    page_size
    Type
    integer
    In
    in query
    Description
  • Name
    sort
    Type
    string
    In
    in query
    Description
200 Lead list
{
  "data": [
    {
      "attributes": {
        "consultation_scheduled_at": "2026-01-01T00:00:00Z",
        "conversion_matter_id": "00000000-0000-0000-0000-000000000000",
        "converted_at": "2026-01-01T00:00:00Z",
        "current_reporting_step_id": "00000000-0000-0000-0000-000000000000",
        "inserted_at": "2026-01-01T00:00:00Z",
        "jurisdiction_country": "string",
        "jurisdiction_region": "string",
        "last_contacted_at": "2026-01-01T00:00:00Z",
        "lost_at": "2026-01-01T00:00:00Z",
        "lost_reason": "string",
        "matter_type_id": "00000000-0000-0000-0000-000000000000",
        "metadata": {},
        "name": "string",
        "next_follow_up_at": "2026-01-01T00:00:00Z",
        "owner_id": "00000000-0000-0000-0000-000000000000",
        "pipeline_id": "00000000-0000-0000-0000-000000000000",
        "pipeline_stage_id": "00000000-0000-0000-0000-000000000000",
        "priority": "low",
        "qualified_at": "2026-01-01T00:00:00Z",
        "referral_source": "string",
        "source": "portal",
        "source_detail": "string",
        "status": "open",
        "summary": "string",
        "updated_at": "2026-01-01T00:00:00Z"
      },
      "id": "00000000-0000-0000-0000-000000000000",
      "type": "leads"
    }
  ],
  "links": {
    "first": "string",
    "last": "string",
    "next": "string",
    "prev": "string",
    "self": "string"
  },
  "meta": {
    "page": 0,
    "page_size": 0,
    "total": 0,
    "total_pages": 0
  }
}
POST /api/v1/leads

Create a lead

Supports the optional Idempotency-Key request header (max 255 chars): retrying the POST with the same key and body replays the original response instead of creating a second lead.

Request body

  • Name
    data
    Type
    object
    required
    Description
POST /api/v1/leads
{
  "data": {
    "attributes": {
      "jurisdiction_country": "string",
      "jurisdiction_region": "string",
      "matter_type_id": "00000000-0000-0000-0000-000000000000",
      "metadata": {},
      "name": "string",
      "owner_id": "00000000-0000-0000-0000-000000000000",
      "priority": "low",
      "referral_source": "string",
      "source": "portal",
      "source_detail": "string",
      "summary": "string"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "leads"
  }
}
201 Created lead
{
  "data": {
    "attributes": {
      "consultation_scheduled_at": "2026-01-01T00:00:00Z",
      "conversion_matter_id": "00000000-0000-0000-0000-000000000000",
      "converted_at": "2026-01-01T00:00:00Z",
      "current_reporting_step_id": "00000000-0000-0000-0000-000000000000",
      "inserted_at": "2026-01-01T00:00:00Z",
      "jurisdiction_country": "string",
      "jurisdiction_region": "string",
      "last_contacted_at": "2026-01-01T00:00:00Z",
      "lost_at": "2026-01-01T00:00:00Z",
      "lost_reason": "string",
      "matter_type_id": "00000000-0000-0000-0000-000000000000",
      "metadata": {},
      "name": "string",
      "next_follow_up_at": "2026-01-01T00:00:00Z",
      "owner_id": "00000000-0000-0000-0000-000000000000",
      "pipeline_id": "00000000-0000-0000-0000-000000000000",
      "pipeline_stage_id": "00000000-0000-0000-0000-000000000000",
      "priority": "low",
      "qualified_at": "2026-01-01T00:00:00Z",
      "referral_source": "string",
      "source": "portal",
      "source_detail": "string",
      "status": "open",
      "summary": "string",
      "updated_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "leads"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
GET /api/v1/leads/{id}

Get a lead

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
  • Name
    fields
    Type
    object
    In
    in query
    Description
    JSON:API sparse fieldsets: fields[<type>]=a,b limits the attributes returned for that resource type.
  • Name
    include
    Type
    string
    In
    in query
    Description
    Comma-separated related resources to embed in the top-level `included` array. Supported values: pipeline, pipeline_stage, matter_type, owner, conversion_matter.
200 Lead
{
  "data": {
    "attributes": {
      "consultation_scheduled_at": "2026-01-01T00:00:00Z",
      "conversion_matter_id": "00000000-0000-0000-0000-000000000000",
      "converted_at": "2026-01-01T00:00:00Z",
      "current_reporting_step_id": "00000000-0000-0000-0000-000000000000",
      "inserted_at": "2026-01-01T00:00:00Z",
      "jurisdiction_country": "string",
      "jurisdiction_region": "string",
      "last_contacted_at": "2026-01-01T00:00:00Z",
      "lost_at": "2026-01-01T00:00:00Z",
      "lost_reason": "string",
      "matter_type_id": "00000000-0000-0000-0000-000000000000",
      "metadata": {},
      "name": "string",
      "next_follow_up_at": "2026-01-01T00:00:00Z",
      "owner_id": "00000000-0000-0000-0000-000000000000",
      "pipeline_id": "00000000-0000-0000-0000-000000000000",
      "pipeline_stage_id": "00000000-0000-0000-0000-000000000000",
      "priority": "low",
      "qualified_at": "2026-01-01T00:00:00Z",
      "referral_source": "string",
      "source": "portal",
      "source_detail": "string",
      "status": "open",
      "summary": "string",
      "updated_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "leads"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
PUT /api/v1/leads/{id}

Update a lead

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
  • Name
    if-match
    Type
    string
    In
    in header
    Description
    Optional optimistic-concurrency precondition: the ETag from a previous GET/update of this lead. A stale value is refused with 412 precondition_failed before anything is written.

Request body

  • Name
    data
    Type
    object
    required
    Description
PUT /api/v1/leads/{id}
{
  "data": {
    "attributes": {
      "jurisdiction_country": "string",
      "jurisdiction_region": "string",
      "matter_type_id": "00000000-0000-0000-0000-000000000000",
      "metadata": {},
      "name": "string",
      "owner_id": "00000000-0000-0000-0000-000000000000",
      "priority": "low",
      "referral_source": "string",
      "source": "portal",
      "source_detail": "string",
      "summary": "string"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "leads"
  }
}
200 Updated lead
{
  "data": {
    "attributes": {
      "consultation_scheduled_at": "2026-01-01T00:00:00Z",
      "conversion_matter_id": "00000000-0000-0000-0000-000000000000",
      "converted_at": "2026-01-01T00:00:00Z",
      "current_reporting_step_id": "00000000-0000-0000-0000-000000000000",
      "inserted_at": "2026-01-01T00:00:00Z",
      "jurisdiction_country": "string",
      "jurisdiction_region": "string",
      "last_contacted_at": "2026-01-01T00:00:00Z",
      "lost_at": "2026-01-01T00:00:00Z",
      "lost_reason": "string",
      "matter_type_id": "00000000-0000-0000-0000-000000000000",
      "metadata": {},
      "name": "string",
      "next_follow_up_at": "2026-01-01T00:00:00Z",
      "owner_id": "00000000-0000-0000-0000-000000000000",
      "pipeline_id": "00000000-0000-0000-0000-000000000000",
      "pipeline_stage_id": "00000000-0000-0000-0000-000000000000",
      "priority": "low",
      "qualified_at": "2026-01-01T00:00:00Z",
      "referral_source": "string",
      "source": "portal",
      "source_detail": "string",
      "status": "open",
      "summary": "string",
      "updated_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "leads"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
PATCH /api/v1/leads/{id}

Update a lead

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
  • Name
    if-match
    Type
    string
    In
    in header
    Description
    Optional optimistic-concurrency precondition: the ETag from a previous GET/update of this lead. A stale value is refused with 412 precondition_failed before anything is written.

Request body

  • Name
    data
    Type
    object
    required
    Description
PATCH /api/v1/leads/{id}
{
  "data": {
    "attributes": {
      "jurisdiction_country": "string",
      "jurisdiction_region": "string",
      "matter_type_id": "00000000-0000-0000-0000-000000000000",
      "metadata": {},
      "name": "string",
      "owner_id": "00000000-0000-0000-0000-000000000000",
      "priority": "low",
      "referral_source": "string",
      "source": "portal",
      "source_detail": "string",
      "summary": "string"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "leads"
  }
}
200 Updated lead
{
  "data": {
    "attributes": {
      "consultation_scheduled_at": "2026-01-01T00:00:00Z",
      "conversion_matter_id": "00000000-0000-0000-0000-000000000000",
      "converted_at": "2026-01-01T00:00:00Z",
      "current_reporting_step_id": "00000000-0000-0000-0000-000000000000",
      "inserted_at": "2026-01-01T00:00:00Z",
      "jurisdiction_country": "string",
      "jurisdiction_region": "string",
      "last_contacted_at": "2026-01-01T00:00:00Z",
      "lost_at": "2026-01-01T00:00:00Z",
      "lost_reason": "string",
      "matter_type_id": "00000000-0000-0000-0000-000000000000",
      "metadata": {},
      "name": "string",
      "next_follow_up_at": "2026-01-01T00:00:00Z",
      "owner_id": "00000000-0000-0000-0000-000000000000",
      "pipeline_id": "00000000-0000-0000-0000-000000000000",
      "pipeline_stage_id": "00000000-0000-0000-0000-000000000000",
      "priority": "low",
      "qualified_at": "2026-01-01T00:00:00Z",
      "referral_source": "string",
      "source": "portal",
      "source_detail": "string",
      "status": "open",
      "summary": "string",
      "updated_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "leads"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
DELETE /api/v1/leads/{id}

Delete a lead

Deletes the lead and the work it alone justified: its notes, its tasks and its unsent email drafts all go with it. Correspondence that actually happened (sent and received emails) and any referral survive, detached. A lead that has been converted to a matter is the provenance of that matter and cannot be deleted: archive it instead.

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
409 Lead converted
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
POST /api/v1/leads/{id}/archive

Archive a lead

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
200 Archived lead
{
  "data": {
    "attributes": {
      "consultation_scheduled_at": "2026-01-01T00:00:00Z",
      "conversion_matter_id": "00000000-0000-0000-0000-000000000000",
      "converted_at": "2026-01-01T00:00:00Z",
      "current_reporting_step_id": "00000000-0000-0000-0000-000000000000",
      "inserted_at": "2026-01-01T00:00:00Z",
      "jurisdiction_country": "string",
      "jurisdiction_region": "string",
      "last_contacted_at": "2026-01-01T00:00:00Z",
      "lost_at": "2026-01-01T00:00:00Z",
      "lost_reason": "string",
      "matter_type_id": "00000000-0000-0000-0000-000000000000",
      "metadata": {},
      "name": "string",
      "next_follow_up_at": "2026-01-01T00:00:00Z",
      "owner_id": "00000000-0000-0000-0000-000000000000",
      "pipeline_id": "00000000-0000-0000-0000-000000000000",
      "pipeline_stage_id": "00000000-0000-0000-0000-000000000000",
      "priority": "low",
      "qualified_at": "2026-01-01T00:00:00Z",
      "referral_source": "string",
      "source": "portal",
      "source_detail": "string",
      "status": "open",
      "summary": "string",
      "updated_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "leads"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Failed
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
POST /api/v1/leads/{id}/close-lost

Mark a lead as lost

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description

Request body

  • Name
    data
    Type
    object
    Description
POST /api/v1/leads/{id}/close-lost
{
  "data": {
    "attributes": {
      "reason": "string"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "leads"
  }
}
200 Lead marked lost
{
  "data": {
    "attributes": {
      "consultation_scheduled_at": "2026-01-01T00:00:00Z",
      "conversion_matter_id": "00000000-0000-0000-0000-000000000000",
      "converted_at": "2026-01-01T00:00:00Z",
      "current_reporting_step_id": "00000000-0000-0000-0000-000000000000",
      "inserted_at": "2026-01-01T00:00:00Z",
      "jurisdiction_country": "string",
      "jurisdiction_region": "string",
      "last_contacted_at": "2026-01-01T00:00:00Z",
      "lost_at": "2026-01-01T00:00:00Z",
      "lost_reason": "string",
      "matter_type_id": "00000000-0000-0000-0000-000000000000",
      "metadata": {},
      "name": "string",
      "next_follow_up_at": "2026-01-01T00:00:00Z",
      "owner_id": "00000000-0000-0000-0000-000000000000",
      "pipeline_id": "00000000-0000-0000-0000-000000000000",
      "pipeline_stage_id": "00000000-0000-0000-0000-000000000000",
      "priority": "low",
      "qualified_at": "2026-01-01T00:00:00Z",
      "referral_source": "string",
      "source": "portal",
      "source_detail": "string",
      "status": "open",
      "summary": "string",
      "updated_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "leads"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Failed
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
POST /api/v1/leads/{id}/contacts

Add a contact to a lead

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description

Request body

  • Name
    data
    Type
    object
    required
    Description
POST /api/v1/leads/{id}/contacts
{
  "data": {
    "attributes": {
      "contact_id": "00000000-0000-0000-0000-000000000000",
      "is_primary": false,
      "role": "string"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "lead-contacts"
  }
}
201 Created lead contact
{
  "data": {
    "attributes": {
      "contact_id": "00000000-0000-0000-0000-000000000000",
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_primary": false,
      "lead_id": "00000000-0000-0000-0000-000000000000",
      "role": "string",
      "updated_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "lead-contacts"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
POST /api/v1/leads/{id}/convert

Convert a lead to a matter

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description

Request body

  • Name
    data
    Type
    object
    Description
POST /api/v1/leads/{id}/convert
{
  "data": {
    "attributes": {
      "assigned_to_id": "00000000-0000-0000-0000-000000000000",
      "jurisdiction_country": "string",
      "jurisdiction_region": "string",
      "matter_type_id": "00000000-0000-0000-0000-000000000000",
      "team_id": "00000000-0000-0000-0000-000000000000"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "leads"
  }
}
200 Converted
{
  "data": {
    "attributes": {
      "consultation_scheduled_at": "2026-01-01T00:00:00Z",
      "conversion_matter_id": "00000000-0000-0000-0000-000000000000",
      "converted_at": "2026-01-01T00:00:00Z",
      "current_reporting_step_id": "00000000-0000-0000-0000-000000000000",
      "inserted_at": "2026-01-01T00:00:00Z",
      "jurisdiction_country": "string",
      "jurisdiction_region": "string",
      "last_contacted_at": "2026-01-01T00:00:00Z",
      "lost_at": "2026-01-01T00:00:00Z",
      "lost_reason": "string",
      "matter_type_id": "00000000-0000-0000-0000-000000000000",
      "metadata": {},
      "name": "string",
      "next_follow_up_at": "2026-01-01T00:00:00Z",
      "owner_id": "00000000-0000-0000-0000-000000000000",
      "pipeline_id": "00000000-0000-0000-0000-000000000000",
      "pipeline_stage_id": "00000000-0000-0000-0000-000000000000",
      "priority": "low",
      "qualified_at": "2026-01-01T00:00:00Z",
      "referral_source": "string",
      "source": "portal",
      "source_detail": "string",
      "status": "open",
      "summary": "string",
      "updated_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "leads"
  },
  "meta": {
    "conversion": {
      "matter_id": "00000000-0000-0000-0000-000000000000",
      "matter_name": "string"
    }
  }
}
422 Conversion failed
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
POST /api/v1/leads/{id}/defer

Defer a lead for later follow-up

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description

Request body

  • Name
    data
    Type
    object
    required
    Description
POST /api/v1/leads/{id}/defer
{
  "data": {
    "attributes": {
      "next_follow_up_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "leads"
  }
}
200 Deferred lead
{
  "data": {
    "attributes": {
      "consultation_scheduled_at": "2026-01-01T00:00:00Z",
      "conversion_matter_id": "00000000-0000-0000-0000-000000000000",
      "converted_at": "2026-01-01T00:00:00Z",
      "current_reporting_step_id": "00000000-0000-0000-0000-000000000000",
      "inserted_at": "2026-01-01T00:00:00Z",
      "jurisdiction_country": "string",
      "jurisdiction_region": "string",
      "last_contacted_at": "2026-01-01T00:00:00Z",
      "lost_at": "2026-01-01T00:00:00Z",
      "lost_reason": "string",
      "matter_type_id": "00000000-0000-0000-0000-000000000000",
      "metadata": {},
      "name": "string",
      "next_follow_up_at": "2026-01-01T00:00:00Z",
      "owner_id": "00000000-0000-0000-0000-000000000000",
      "pipeline_id": "00000000-0000-0000-0000-000000000000",
      "pipeline_stage_id": "00000000-0000-0000-0000-000000000000",
      "priority": "low",
      "qualified_at": "2026-01-01T00:00:00Z",
      "referral_source": "string",
      "source": "portal",
      "source_detail": "string",
      "status": "open",
      "summary": "string",
      "updated_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "leads"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Failed
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
POST /api/v1/leads/{id}/move-stage

Move a lead to a different pipeline stage

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description

Request body

  • Name
    data
    Type
    object
    required
    Description
POST /api/v1/leads/{id}/move-stage
{
  "data": {
    "attributes": {
      "stage_id": "00000000-0000-0000-0000-000000000000"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "leads"
  }
}
200 Moved lead
{
  "data": {
    "attributes": {
      "consultation_scheduled_at": "2026-01-01T00:00:00Z",
      "conversion_matter_id": "00000000-0000-0000-0000-000000000000",
      "converted_at": "2026-01-01T00:00:00Z",
      "current_reporting_step_id": "00000000-0000-0000-0000-000000000000",
      "inserted_at": "2026-01-01T00:00:00Z",
      "jurisdiction_country": "string",
      "jurisdiction_region": "string",
      "last_contacted_at": "2026-01-01T00:00:00Z",
      "lost_at": "2026-01-01T00:00:00Z",
      "lost_reason": "string",
      "matter_type_id": "00000000-0000-0000-0000-000000000000",
      "metadata": {},
      "name": "string",
      "next_follow_up_at": "2026-01-01T00:00:00Z",
      "owner_id": "00000000-0000-0000-0000-000000000000",
      "pipeline_id": "00000000-0000-0000-0000-000000000000",
      "pipeline_stage_id": "00000000-0000-0000-0000-000000000000",
      "priority": "low",
      "qualified_at": "2026-01-01T00:00:00Z",
      "referral_source": "string",
      "source": "portal",
      "source_detail": "string",
      "status": "open",
      "summary": "string",
      "updated_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "leads"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Blocked
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
POST /api/v1/leads/{id}/qualify

Mark a lead as qualified

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
200 Qualified lead
{
  "data": {
    "attributes": {
      "consultation_scheduled_at": "2026-01-01T00:00:00Z",
      "conversion_matter_id": "00000000-0000-0000-0000-000000000000",
      "converted_at": "2026-01-01T00:00:00Z",
      "current_reporting_step_id": "00000000-0000-0000-0000-000000000000",
      "inserted_at": "2026-01-01T00:00:00Z",
      "jurisdiction_country": "string",
      "jurisdiction_region": "string",
      "last_contacted_at": "2026-01-01T00:00:00Z",
      "lost_at": "2026-01-01T00:00:00Z",
      "lost_reason": "string",
      "matter_type_id": "00000000-0000-0000-0000-000000000000",
      "metadata": {},
      "name": "string",
      "next_follow_up_at": "2026-01-01T00:00:00Z",
      "owner_id": "00000000-0000-0000-0000-000000000000",
      "pipeline_id": "00000000-0000-0000-0000-000000000000",
      "pipeline_stage_id": "00000000-0000-0000-0000-000000000000",
      "priority": "low",
      "qualified_at": "2026-01-01T00:00:00Z",
      "referral_source": "string",
      "source": "portal",
      "source_detail": "string",
      "status": "open",
      "summary": "string",
      "updated_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "leads"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Failed
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
POST /api/v1/leads/{id}/reopen

Reopen a lost, deferred or archived lead

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
200 Reopened lead
{
  "data": {
    "attributes": {
      "consultation_scheduled_at": "2026-01-01T00:00:00Z",
      "conversion_matter_id": "00000000-0000-0000-0000-000000000000",
      "converted_at": "2026-01-01T00:00:00Z",
      "current_reporting_step_id": "00000000-0000-0000-0000-000000000000",
      "inserted_at": "2026-01-01T00:00:00Z",
      "jurisdiction_country": "string",
      "jurisdiction_region": "string",
      "last_contacted_at": "2026-01-01T00:00:00Z",
      "lost_at": "2026-01-01T00:00:00Z",
      "lost_reason": "string",
      "matter_type_id": "00000000-0000-0000-0000-000000000000",
      "metadata": {},
      "name": "string",
      "next_follow_up_at": "2026-01-01T00:00:00Z",
      "owner_id": "00000000-0000-0000-0000-000000000000",
      "pipeline_id": "00000000-0000-0000-0000-000000000000",
      "pipeline_stage_id": "00000000-0000-0000-0000-000000000000",
      "priority": "low",
      "qualified_at": "2026-01-01T00:00:00Z",
      "referral_source": "string",
      "source": "portal",
      "source_detail": "string",
      "status": "open",
      "summary": "string",
      "updated_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "leads"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
409 Invalid status
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
GET /api/v1/leads/{lead_id}/notes

List notes on a lead

Parameters

  • Name
    lead_id
    Type
    string (uuid)
    required
    In
    in path
    Description
  • Name
    page_number
    Type
    integer
    In
    in query
    Description
  • Name
    page_size
    Type
    integer
    In
    in query
    Description
200 Lead note list
{
  "data": [
    {
      "attributes": {
        "content": "string",
        "inserted_at": "2026-01-01T00:00:00Z",
        "lead_id": "00000000-0000-0000-0000-000000000000",
        "pinned": false,
        "updated_at": "2026-01-01T00:00:00Z",
        "user_id": "00000000-0000-0000-0000-000000000000",
        "visibility": "internal"
      },
      "id": "00000000-0000-0000-0000-000000000000",
      "type": "lead-notes"
    }
  ],
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
POST /api/v1/leads/{lead_id}/notes

Create a note on a lead

Parameters

  • Name
    lead_id
    Type
    string (uuid)
    required
    In
    in path
    Description

Request body

  • Name
    data
    Type
    object
    required
    Description
POST /api/v1/leads/{lead_id}/notes
{
  "data": {
    "attributes": {
      "content": "string",
      "pinned": false,
      "visibility": "internal"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "lead-notes"
  }
}
201 Created note
{
  "data": {
    "attributes": {
      "content": "string",
      "inserted_at": "2026-01-01T00:00:00Z",
      "lead_id": "00000000-0000-0000-0000-000000000000",
      "pinned": false,
      "updated_at": "2026-01-01T00:00:00Z",
      "user_id": "00000000-0000-0000-0000-000000000000",
      "visibility": "internal"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "lead-notes"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
GET /api/v1/leads/{lead_id}/notes/{id}

Get a note on a lead

Parameters

  • Name
    lead_id
    Type
    string (uuid)
    required
    In
    in path
    Description
  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
200 Lead note
{
  "data": {
    "attributes": {
      "content": "string",
      "inserted_at": "2026-01-01T00:00:00Z",
      "lead_id": "00000000-0000-0000-0000-000000000000",
      "pinned": false,
      "updated_at": "2026-01-01T00:00:00Z",
      "user_id": "00000000-0000-0000-0000-000000000000",
      "visibility": "internal"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "lead-notes"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
PUT /api/v1/leads/{lead_id}/notes/{id}

Update a note on a lead

Parameters

  • Name
    lead_id
    Type
    string (uuid)
    required
    In
    in path
    Description
  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description

Request body

  • Name
    data
    Type
    object
    required
    Description
PUT /api/v1/leads/{lead_id}/notes/{id}
{
  "data": {
    "attributes": {
      "content": "string",
      "pinned": false,
      "visibility": "internal"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "lead-notes"
  }
}
200 Updated note
{
  "data": {
    "attributes": {
      "content": "string",
      "inserted_at": "2026-01-01T00:00:00Z",
      "lead_id": "00000000-0000-0000-0000-000000000000",
      "pinned": false,
      "updated_at": "2026-01-01T00:00:00Z",
      "user_id": "00000000-0000-0000-0000-000000000000",
      "visibility": "internal"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "lead-notes"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
PATCH /api/v1/leads/{lead_id}/notes/{id}

Update a note on a lead

Parameters

  • Name
    lead_id
    Type
    string (uuid)
    required
    In
    in path
    Description
  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description

Request body

  • Name
    data
    Type
    object
    required
    Description
PATCH /api/v1/leads/{lead_id}/notes/{id}
{
  "data": {
    "attributes": {
      "content": "string",
      "pinned": false,
      "visibility": "internal"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "lead-notes"
  }
}
200 Updated note
{
  "data": {
    "attributes": {
      "content": "string",
      "inserted_at": "2026-01-01T00:00:00Z",
      "lead_id": "00000000-0000-0000-0000-000000000000",
      "pinned": false,
      "updated_at": "2026-01-01T00:00:00Z",
      "user_id": "00000000-0000-0000-0000-000000000000",
      "visibility": "internal"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "lead-notes"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
DELETE /api/v1/leads/{lead_id}/notes/{id}

Delete a note on a lead

Parameters

  • Name
    lead_id
    Type
    string (uuid)
    required
    In
    in path
    Description
  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
DELETE /api/v1/leads/{lead_id}/notes/{id}
curl -X DELETE \
     -H "Authorization: Bearer {token}" \
     https://app.matterfirst.com.au/api/v1/leads/{lead_id}/notes/{id}

Matter Roles

GET /api/v1/matters/{matter_id}/roles

List roles for a matter

Parameters

  • Name
    matter_id
    Type
    string (uuid)
    required
    In
    in path
    Description
200 Role list
{
  "data": [
    {
      "attributes": {
        "contact_id": "00000000-0000-0000-0000-000000000000",
        "inserted_at": "2026-01-01T00:00:00Z",
        "is_primary": false,
        "matter_id": "00000000-0000-0000-0000-000000000000",
        "notes": "string",
        "role_name": "string",
        "source": "string",
        "updated_at": "2026-01-01T00:00:00Z"
      },
      "id": "00000000-0000-0000-0000-000000000000",
      "type": "matter-roles"
    }
  ],
  "links": {
    "first": "string",
    "last": "string",
    "next": "string",
    "prev": "string",
    "self": "string"
  },
  "meta": {
    "page": 0,
    "page_size": 0,
    "total": 0,
    "total_pages": 0
  }
}
POST /api/v1/matters/{matter_id}/roles

Add a role to a matter

Parameters

  • Name
    matter_id
    Type
    string (uuid)
    required
    In
    in path
    Description

Request body

  • Name
    data
    Type
    object
    required
    Description
POST /api/v1/matters/{matter_id}/roles
{
  "data": {
    "attributes": {
      "contact_id": "00000000-0000-0000-0000-000000000000",
      "is_primary": false,
      "matter_id": "00000000-0000-0000-0000-000000000000",
      "notes": "string",
      "role_name": "string",
      "source": "string"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "matter-roles"
  }
}
201 Created role
{
  "data": {
    "attributes": {
      "contact_id": "00000000-0000-0000-0000-000000000000",
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_primary": false,
      "matter_id": "00000000-0000-0000-0000-000000000000",
      "notes": "string",
      "role_name": "string",
      "source": "string",
      "updated_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "matter-roles"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
GET /api/v1/matters/{matter_id}/roles/{id}

Get a matter role

Parameters

  • Name
    matter_id
    Type
    string (uuid)
    required
    In
    in path
    Description
  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
200 Role
{
  "data": {
    "attributes": {
      "contact_id": "00000000-0000-0000-0000-000000000000",
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_primary": false,
      "matter_id": "00000000-0000-0000-0000-000000000000",
      "notes": "string",
      "role_name": "string",
      "source": "string",
      "updated_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "matter-roles"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
PUT /api/v1/matters/{matter_id}/roles/{id}

Update a matter role

Parameters

  • Name
    matter_id
    Type
    string (uuid)
    required
    In
    in path
    Description
  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description

Request body

  • Name
    data
    Type
    object
    required
    Description
PUT /api/v1/matters/{matter_id}/roles/{id}
{
  "data": {
    "attributes": {
      "contact_id": "00000000-0000-0000-0000-000000000000",
      "is_primary": false,
      "matter_id": "00000000-0000-0000-0000-000000000000",
      "notes": "string",
      "role_name": "string",
      "source": "string"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "matter-roles"
  }
}
200 Updated role
{
  "data": {
    "attributes": {
      "contact_id": "00000000-0000-0000-0000-000000000000",
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_primary": false,
      "matter_id": "00000000-0000-0000-0000-000000000000",
      "notes": "string",
      "role_name": "string",
      "source": "string",
      "updated_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "matter-roles"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
PATCH /api/v1/matters/{matter_id}/roles/{id}

Update a matter role

Parameters

  • Name
    matter_id
    Type
    string (uuid)
    required
    In
    in path
    Description
  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description

Request body

  • Name
    data
    Type
    object
    required
    Description
PATCH /api/v1/matters/{matter_id}/roles/{id}
{
  "data": {
    "attributes": {
      "contact_id": "00000000-0000-0000-0000-000000000000",
      "is_primary": false,
      "matter_id": "00000000-0000-0000-0000-000000000000",
      "notes": "string",
      "role_name": "string",
      "source": "string"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "matter-roles"
  }
}
200 Updated role
{
  "data": {
    "attributes": {
      "contact_id": "00000000-0000-0000-0000-000000000000",
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_primary": false,
      "matter_id": "00000000-0000-0000-0000-000000000000",
      "notes": "string",
      "role_name": "string",
      "source": "string",
      "updated_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "matter-roles"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
DELETE /api/v1/matters/{matter_id}/roles/{id}

Remove a role from a matter

Parameters

  • Name
    matter_id
    Type
    string (uuid)
    required
    In
    in path
    Description
  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
DELETE /api/v1/matters/{matter_id}/roles/{id}
curl -X DELETE \
     -H "Authorization: Bearer {token}" \
     https://app.matterfirst.com.au/api/v1/matters/{matter_id}/roles/{id}

Matter Types

GET /api/v1/matter-types

List matter types

Parameters

  • Name
    page_number
    Type
    integer
    In
    in query
    Description
  • Name
    page_size
    Type
    integer
    In
    in query
    Description
200 Matter type list
{
  "data": [
    {
      "attributes": {
        "code": "string",
        "color": "string",
        "default_tags": [
          "string"
        ],
        "description": "string",
        "icon": "string",
        "inserted_at": "2026-01-01T00:00:00Z",
        "is_active": false,
        "name": "string",
        "reference_format": "string",
        "required_contact_types": [
          "string"
        ],
        "settings": {},
        "updated_at": "2026-01-01T00:00:00Z",
        "workflow_id": "00000000-0000-0000-0000-000000000000"
      },
      "id": "00000000-0000-0000-0000-000000000000",
      "type": "matter-types"
    }
  ],
  "links": {
    "first": "string",
    "last": "string",
    "next": "string",
    "prev": "string",
    "self": "string"
  },
  "meta": {
    "page": 0,
    "page_size": 0,
    "total": 0,
    "total_pages": 0
  }
}
POST /api/v1/matter-types

Create a matter type

Request body

  • Name
    data
    Type
    object
    required
    Description
POST /api/v1/matter-types
{
  "data": {
    "attributes": {
      "code": "string",
      "color": "string",
      "default_tags": [
        "string"
      ],
      "description": "string",
      "icon": "string",
      "is_active": false,
      "name": "string",
      "reference_format": "string",
      "settings": {},
      "workflow_id": "00000000-0000-0000-0000-000000000000"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "matter-types"
  }
}
201 Created matter type
{
  "data": {
    "attributes": {
      "code": "string",
      "color": "string",
      "default_tags": [
        "string"
      ],
      "description": "string",
      "icon": "string",
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_active": false,
      "name": "string",
      "reference_format": "string",
      "required_contact_types": [
        "string"
      ],
      "settings": {},
      "updated_at": "2026-01-01T00:00:00Z",
      "workflow_id": "00000000-0000-0000-0000-000000000000"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "matter-types"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
GET /api/v1/matter-types/{id}

Get a matter type

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
200 Matter type
{
  "data": {
    "attributes": {
      "code": "string",
      "color": "string",
      "default_tags": [
        "string"
      ],
      "description": "string",
      "icon": "string",
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_active": false,
      "name": "string",
      "reference_format": "string",
      "required_contact_types": [
        "string"
      ],
      "settings": {},
      "updated_at": "2026-01-01T00:00:00Z",
      "workflow_id": "00000000-0000-0000-0000-000000000000"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "matter-types"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
PUT /api/v1/matter-types/{id}

Update a matter type

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description

Request body

  • Name
    data
    Type
    object
    required
    Description
PUT /api/v1/matter-types/{id}
{
  "data": {
    "attributes": {
      "code": "string",
      "color": "string",
      "default_tags": [
        "string"
      ],
      "description": "string",
      "icon": "string",
      "is_active": false,
      "name": "string",
      "reference_format": "string",
      "settings": {},
      "workflow_id": "00000000-0000-0000-0000-000000000000"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "matter-types"
  }
}
200 Updated matter type
{
  "data": {
    "attributes": {
      "code": "string",
      "color": "string",
      "default_tags": [
        "string"
      ],
      "description": "string",
      "icon": "string",
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_active": false,
      "name": "string",
      "reference_format": "string",
      "required_contact_types": [
        "string"
      ],
      "settings": {},
      "updated_at": "2026-01-01T00:00:00Z",
      "workflow_id": "00000000-0000-0000-0000-000000000000"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "matter-types"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
PATCH /api/v1/matter-types/{id}

Update a matter type

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description

Request body

  • Name
    data
    Type
    object
    required
    Description
PATCH /api/v1/matter-types/{id}
{
  "data": {
    "attributes": {
      "code": "string",
      "color": "string",
      "default_tags": [
        "string"
      ],
      "description": "string",
      "icon": "string",
      "is_active": false,
      "name": "string",
      "reference_format": "string",
      "settings": {},
      "workflow_id": "00000000-0000-0000-0000-000000000000"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "matter-types"
  }
}
200 Updated matter type
{
  "data": {
    "attributes": {
      "code": "string",
      "color": "string",
      "default_tags": [
        "string"
      ],
      "description": "string",
      "icon": "string",
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_active": false,
      "name": "string",
      "reference_format": "string",
      "required_contact_types": [
        "string"
      ],
      "settings": {},
      "updated_at": "2026-01-01T00:00:00Z",
      "workflow_id": "00000000-0000-0000-0000-000000000000"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "matter-types"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
POST /api/v1/matter-types/{id}/deactivate

Deactivate a matter type

The declared end of a matter type's lifecycle (W2.6). Matter types have no delete on purpose, because matters keep referencing their type forever, so an unused type is deactivated instead: it keeps its history and stops being offered for new matters. Mirrors `POST /contact-types/:id/deactivate`.

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
200 Deactivated
{
  "data": {
    "attributes": {
      "code": "string",
      "color": "string",
      "default_tags": [
        "string"
      ],
      "description": "string",
      "icon": "string",
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_active": false,
      "name": "string",
      "reference_format": "string",
      "required_contact_types": [
        "string"
      ],
      "settings": {},
      "updated_at": "2026-01-01T00:00:00Z",
      "workflow_id": "00000000-0000-0000-0000-000000000000"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "matter-types"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}

Matter notes

GET /api/v1/matters/{matter_id}/notes

List notes on a matter

Parameters

  • Name
    matter_id
    Type
    string (uuid)
    required
    In
    in path
    Description
  • Name
    include
    Type
    string
    In
    in query
    Description
    Comma-separated related resources to embed in the top-level `included` array. Supported values: matter, user.
200 Note list
{
  "data": [
    {
      "attributes": {
        "content": "string",
        "inserted_at": "2026-01-01T00:00:00Z",
        "is_pinned": false,
        "matter_id": "00000000-0000-0000-0000-000000000000",
        "mentioned_user_ids": [
          "00000000-0000-0000-0000-000000000000"
        ],
        "updated_at": "2026-01-01T00:00:00Z",
        "user_id": "00000000-0000-0000-0000-000000000000"
      },
      "id": "00000000-0000-0000-0000-000000000000",
      "type": "notes"
    }
  ],
  "links": {
    "first": "string",
    "last": "string",
    "next": "string",
    "prev": "string",
    "self": "string"
  },
  "meta": {
    "page": 0,
    "page_size": 0,
    "total": 0,
    "total_pages": 0
  }
}
POST /api/v1/matters/{matter_id}/notes

Create a note on a matter

Parameters

  • Name
    matter_id
    Type
    string (uuid)
    required
    In
    in path
    Description

Request body

  • Name
    data
    Type
    object
    required
    Description
POST /api/v1/matters/{matter_id}/notes
{
  "data": {
    "attributes": {
      "content": "string"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "notes"
  }
}
201 Created note
{
  "data": {
    "attributes": {
      "content": "string",
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_pinned": false,
      "matter_id": "00000000-0000-0000-0000-000000000000",
      "mentioned_user_ids": [
        "00000000-0000-0000-0000-000000000000"
      ],
      "updated_at": "2026-01-01T00:00:00Z",
      "user_id": "00000000-0000-0000-0000-000000000000"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "notes"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
GET /api/v1/matters/{matter_id}/notes/{id}

Get a note

Parameters

  • Name
    matter_id
    Type
    string (uuid)
    required
    In
    in path
    Description
  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
  • Name
    include
    Type
    string
    In
    in query
    Description
    Comma-separated related resources to embed in the top-level `included` array. Supported values: matter, user.
200 Note
{
  "data": {
    "attributes": {
      "content": "string",
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_pinned": false,
      "matter_id": "00000000-0000-0000-0000-000000000000",
      "mentioned_user_ids": [
        "00000000-0000-0000-0000-000000000000"
      ],
      "updated_at": "2026-01-01T00:00:00Z",
      "user_id": "00000000-0000-0000-0000-000000000000"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "notes"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
PUT /api/v1/matters/{matter_id}/notes/{id}

Update a note

Parameters

  • Name
    matter_id
    Type
    string (uuid)
    required
    In
    in path
    Description
  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description

Request body

  • Name
    data
    Type
    object
    required
    Description
PUT /api/v1/matters/{matter_id}/notes/{id}
{
  "data": {
    "attributes": {
      "content": "string"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "notes"
  }
}
200 Updated note
{
  "data": {
    "attributes": {
      "content": "string",
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_pinned": false,
      "matter_id": "00000000-0000-0000-0000-000000000000",
      "mentioned_user_ids": [
        "00000000-0000-0000-0000-000000000000"
      ],
      "updated_at": "2026-01-01T00:00:00Z",
      "user_id": "00000000-0000-0000-0000-000000000000"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "notes"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
PATCH /api/v1/matters/{matter_id}/notes/{id}

Update a note

Parameters

  • Name
    matter_id
    Type
    string (uuid)
    required
    In
    in path
    Description
  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description

Request body

  • Name
    data
    Type
    object
    required
    Description
PATCH /api/v1/matters/{matter_id}/notes/{id}
{
  "data": {
    "attributes": {
      "content": "string"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "notes"
  }
}
200 Updated note
{
  "data": {
    "attributes": {
      "content": "string",
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_pinned": false,
      "matter_id": "00000000-0000-0000-0000-000000000000",
      "mentioned_user_ids": [
        "00000000-0000-0000-0000-000000000000"
      ],
      "updated_at": "2026-01-01T00:00:00Z",
      "user_id": "00000000-0000-0000-0000-000000000000"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "notes"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
DELETE /api/v1/matters/{matter_id}/notes/{id}

Delete a note

Parameters

  • Name
    matter_id
    Type
    string (uuid)
    required
    In
    in path
    Description
  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
DELETE /api/v1/matters/{matter_id}/notes/{id}
curl -X DELETE \
     -H "Authorization: Bearer {token}" \
     https://app.matterfirst.com.au/api/v1/matters/{matter_id}/notes/{id}
POST /api/v1/matters/{matter_id}/notes/{id}/pin

Pin a note

Parameters

  • Name
    matter_id
    Type
    string (uuid)
    required
    In
    in path
    Description
  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
200 Pinned note
{
  "data": {
    "attributes": {
      "content": "string",
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_pinned": false,
      "matter_id": "00000000-0000-0000-0000-000000000000",
      "mentioned_user_ids": [
        "00000000-0000-0000-0000-000000000000"
      ],
      "updated_at": "2026-01-01T00:00:00Z",
      "user_id": "00000000-0000-0000-0000-000000000000"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "notes"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
POST /api/v1/matters/{matter_id}/notes/{id}/unpin

Unpin a note

Parameters

  • Name
    matter_id
    Type
    string (uuid)
    required
    In
    in path
    Description
  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
200 Unpinned note
{
  "data": {
    "attributes": {
      "content": "string",
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_pinned": false,
      "matter_id": "00000000-0000-0000-0000-000000000000",
      "mentioned_user_ids": [
        "00000000-0000-0000-0000-000000000000"
      ],
      "updated_at": "2026-01-01T00:00:00Z",
      "user_id": "00000000-0000-0000-0000-000000000000"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "notes"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}

Matters

GET /api/v1/matters

List matters

Parameters

  • Name
    fields
    Type
    object
    In
    in query
    Description
    JSON:API sparse fieldsets: fields[<type>]=a,b limits the attributes returned for that resource type.
  • Name
    filter
    Type
    object
    In
    in query
    Description
  • Name
    include
    Type
    string
    In
    in query
    Description
    Comma-separated related resources to embed in the top-level `included` array. Supported values: matter_type, assigned_to, team.
  • Name
    page_number
    Type
    integer
    In
    in query
    Description
  • Name
    page_size
    Type
    integer
    In
    in query
    Description
  • Name
    sort
    Type
    string
    In
    in query
    Description
200 Matter list
{
  "data": [
    {
      "attributes": {
        "archived_at": "2026-01-01T00:00:00Z",
        "assigned_to_id": "00000000-0000-0000-0000-000000000000",
        "cancelled_at": "2026-01-01T00:00:00Z",
        "closed_at": "2026-01-01T00:00:00Z",
        "completed_at": "2026-01-01T00:00:00Z",
        "conflict_checks": [
          {
            "acknowledged_at": "2026-01-01T00:00:00Z",
            "acknowledged_by": "00000000-0000-0000-0000-000000000000",
            "check_type": "new_matter",
            "clearance_reason": "string",
            "cleared_at": "2026-01-01T00:00:00Z",
            "cleared_by_user_id": "00000000-0000-0000-0000-000000000000",
            "conflict_type": "same_party",
            "conflicting_matter_id": "00000000-0000-0000-0000-000000000000",
            "conflicting_matter_name": "string",
            "conflicting_matter_reference": "string",
            "contact_id": "00000000-0000-0000-0000-000000000000",
            "contact_name": "string",
            "disclosure_redacted": false,
            "highest_score": 0.0,
            "id": "00000000-0000-0000-0000-000000000000",
            "inserted_at": "2026-01-01T00:00:00Z",
            "rechecked_at": "2026-01-01T00:00:00Z",
            "status": "pending",
            "subject_name": "string",
            "updated_at": "2026-01-01T00:00:00Z"
          }
        ],
        "current_reporting_step_id": "00000000-0000-0000-0000-000000000000",
        "current_step_id": "00000000-0000-0000-0000-000000000000",
        "description": "string",
        "inserted_at": "2026-01-01T00:00:00Z",
        "is_blocked": false,
        "jurisdiction_country": "AU",
        "jurisdiction_country_label": "string",
        "jurisdiction_region": "NSW",
        "jurisdiction_region_label": "string",
        "lock_version": 0,
        "matter_type_id": "00000000-0000-0000-0000-000000000000",
        "metadata": {},
        "name": "string",
        "opened_at": "2026-01-01T00:00:00Z",
        "priority": "low",
        "reference": "string",
        "status": "open",
        "tags": [
          "string"
        ],
        "team_id": "00000000-0000-0000-0000-000000000000",
        "updated_at": "2026-01-01T00:00:00Z"
      },
      "id": "00000000-0000-0000-0000-000000000000",
      "type": "matters"
    }
  ],
  "links": {
    "first": "string",
    "last": "string",
    "next": "string",
    "prev": "string",
    "self": "string"
  },
  "meta": {
    "page": 0,
    "page_size": 0,
    "total": 0,
    "total_pages": 0
  }
}
POST /api/v1/matters

Create a matter

Supports the optional Idempotency-Key request header (max 255 chars): retrying the POST with the same key and body replays the original response instead of creating a second matter.

Request body

  • Name
    data
    Type
    object
    required
    Description
POST /api/v1/matters
{
  "data": {
    "attributes": {
      "assigned_to_id": "00000000-0000-0000-0000-000000000000",
      "description": "string",
      "jurisdiction_country": "AU",
      "jurisdiction_region": "NSW",
      "matter_type_id": "00000000-0000-0000-0000-000000000000",
      "name": "string",
      "priority": "low",
      "tags": [
        "string"
      ],
      "team_id": "00000000-0000-0000-0000-000000000000"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "matters"
  }
}
201 Created matter
{
  "data": {
    "attributes": {
      "archived_at": "2026-01-01T00:00:00Z",
      "assigned_to_id": "00000000-0000-0000-0000-000000000000",
      "cancelled_at": "2026-01-01T00:00:00Z",
      "closed_at": "2026-01-01T00:00:00Z",
      "completed_at": "2026-01-01T00:00:00Z",
      "conflict_checks": [
        {
          "acknowledged_at": "2026-01-01T00:00:00Z",
          "acknowledged_by": "00000000-0000-0000-0000-000000000000",
          "check_type": "new_matter",
          "clearance_reason": "string",
          "cleared_at": "2026-01-01T00:00:00Z",
          "cleared_by_user_id": "00000000-0000-0000-0000-000000000000",
          "conflict_type": "same_party",
          "conflicting_matter_id": "00000000-0000-0000-0000-000000000000",
          "conflicting_matter_name": "string",
          "conflicting_matter_reference": "string",
          "contact_id": "00000000-0000-0000-0000-000000000000",
          "contact_name": "string",
          "disclosure_redacted": false,
          "highest_score": 0.0,
          "id": "00000000-0000-0000-0000-000000000000",
          "inserted_at": "2026-01-01T00:00:00Z",
          "rechecked_at": "2026-01-01T00:00:00Z",
          "status": "pending",
          "subject_name": "string",
          "updated_at": "2026-01-01T00:00:00Z"
        }
      ],
      "current_reporting_step_id": "00000000-0000-0000-0000-000000000000",
      "current_step_id": "00000000-0000-0000-0000-000000000000",
      "description": "string",
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_blocked": false,
      "jurisdiction_country": "AU",
      "jurisdiction_country_label": "string",
      "jurisdiction_region": "NSW",
      "jurisdiction_region_label": "string",
      "lock_version": 0,
      "matter_type_id": "00000000-0000-0000-0000-000000000000",
      "metadata": {},
      "name": "string",
      "opened_at": "2026-01-01T00:00:00Z",
      "priority": "low",
      "reference": "string",
      "status": "open",
      "tags": [
        "string"
      ],
      "team_id": "00000000-0000-0000-0000-000000000000",
      "updated_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "matters"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
GET /api/v1/matters/{id}

Get a matter

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
  • Name
    fields
    Type
    object
    In
    in query
    Description
    JSON:API sparse fieldsets: fields[<type>]=a,b limits the attributes returned for that resource type.
  • Name
    include
    Type
    string
    In
    in query
    Description
    Comma-separated related resources to embed in the top-level `included` array. Supported values: matter_type, assigned_to, team.
200 Matter
{
  "data": {
    "attributes": {
      "archived_at": "2026-01-01T00:00:00Z",
      "assigned_to_id": "00000000-0000-0000-0000-000000000000",
      "cancelled_at": "2026-01-01T00:00:00Z",
      "closed_at": "2026-01-01T00:00:00Z",
      "completed_at": "2026-01-01T00:00:00Z",
      "conflict_checks": [
        {
          "acknowledged_at": "2026-01-01T00:00:00Z",
          "acknowledged_by": "00000000-0000-0000-0000-000000000000",
          "check_type": "new_matter",
          "clearance_reason": "string",
          "cleared_at": "2026-01-01T00:00:00Z",
          "cleared_by_user_id": "00000000-0000-0000-0000-000000000000",
          "conflict_type": "same_party",
          "conflicting_matter_id": "00000000-0000-0000-0000-000000000000",
          "conflicting_matter_name": "string",
          "conflicting_matter_reference": "string",
          "contact_id": "00000000-0000-0000-0000-000000000000",
          "contact_name": "string",
          "disclosure_redacted": false,
          "highest_score": 0.0,
          "id": "00000000-0000-0000-0000-000000000000",
          "inserted_at": "2026-01-01T00:00:00Z",
          "rechecked_at": "2026-01-01T00:00:00Z",
          "status": "pending",
          "subject_name": "string",
          "updated_at": "2026-01-01T00:00:00Z"
        }
      ],
      "current_reporting_step_id": "00000000-0000-0000-0000-000000000000",
      "current_step_id": "00000000-0000-0000-0000-000000000000",
      "description": "string",
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_blocked": false,
      "jurisdiction_country": "AU",
      "jurisdiction_country_label": "string",
      "jurisdiction_region": "NSW",
      "jurisdiction_region_label": "string",
      "lock_version": 0,
      "matter_type_id": "00000000-0000-0000-0000-000000000000",
      "metadata": {},
      "name": "string",
      "opened_at": "2026-01-01T00:00:00Z",
      "priority": "low",
      "reference": "string",
      "status": "open",
      "tags": [
        "string"
      ],
      "team_id": "00000000-0000-0000-0000-000000000000",
      "updated_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "matters"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
PUT /api/v1/matters/{id}

Update a matter

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
  • Name
    if-match
    Type
    string
    In
    in header
    Description
    Optional optimistic-concurrency precondition: the ETag from a previous GET/update of this matter. A stale value is refused with 412 precondition_failed before anything is written.

Request body

  • Name
    data
    Type
    object
    required
    Description
PUT /api/v1/matters/{id}
{
  "data": {
    "attributes": {
      "assigned_to_id": "00000000-0000-0000-0000-000000000000",
      "description": "string",
      "jurisdiction_country": "AU",
      "jurisdiction_region": "NSW",
      "metadata": {},
      "name": "string",
      "priority": "low",
      "status": "open",
      "tags": [
        "string"
      ],
      "team_id": "00000000-0000-0000-0000-000000000000"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "matters"
  }
}
200 Updated matter
{
  "data": {
    "attributes": {
      "archived_at": "2026-01-01T00:00:00Z",
      "assigned_to_id": "00000000-0000-0000-0000-000000000000",
      "cancelled_at": "2026-01-01T00:00:00Z",
      "closed_at": "2026-01-01T00:00:00Z",
      "completed_at": "2026-01-01T00:00:00Z",
      "conflict_checks": [
        {
          "acknowledged_at": "2026-01-01T00:00:00Z",
          "acknowledged_by": "00000000-0000-0000-0000-000000000000",
          "check_type": "new_matter",
          "clearance_reason": "string",
          "cleared_at": "2026-01-01T00:00:00Z",
          "cleared_by_user_id": "00000000-0000-0000-0000-000000000000",
          "conflict_type": "same_party",
          "conflicting_matter_id": "00000000-0000-0000-0000-000000000000",
          "conflicting_matter_name": "string",
          "conflicting_matter_reference": "string",
          "contact_id": "00000000-0000-0000-0000-000000000000",
          "contact_name": "string",
          "disclosure_redacted": false,
          "highest_score": 0.0,
          "id": "00000000-0000-0000-0000-000000000000",
          "inserted_at": "2026-01-01T00:00:00Z",
          "rechecked_at": "2026-01-01T00:00:00Z",
          "status": "pending",
          "subject_name": "string",
          "updated_at": "2026-01-01T00:00:00Z"
        }
      ],
      "current_reporting_step_id": "00000000-0000-0000-0000-000000000000",
      "current_step_id": "00000000-0000-0000-0000-000000000000",
      "description": "string",
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_blocked": false,
      "jurisdiction_country": "AU",
      "jurisdiction_country_label": "string",
      "jurisdiction_region": "NSW",
      "jurisdiction_region_label": "string",
      "lock_version": 0,
      "matter_type_id": "00000000-0000-0000-0000-000000000000",
      "metadata": {},
      "name": "string",
      "opened_at": "2026-01-01T00:00:00Z",
      "priority": "low",
      "reference": "string",
      "status": "open",
      "tags": [
        "string"
      ],
      "team_id": "00000000-0000-0000-0000-000000000000",
      "updated_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "matters"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
PATCH /api/v1/matters/{id}

Update a matter

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
  • Name
    if-match
    Type
    string
    In
    in header
    Description
    Optional optimistic-concurrency precondition: the ETag from a previous GET/update of this matter. A stale value is refused with 412 precondition_failed before anything is written.

Request body

  • Name
    data
    Type
    object
    required
    Description
PATCH /api/v1/matters/{id}
{
  "data": {
    "attributes": {
      "assigned_to_id": "00000000-0000-0000-0000-000000000000",
      "description": "string",
      "jurisdiction_country": "AU",
      "jurisdiction_region": "NSW",
      "metadata": {},
      "name": "string",
      "priority": "low",
      "status": "open",
      "tags": [
        "string"
      ],
      "team_id": "00000000-0000-0000-0000-000000000000"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "matters"
  }
}
200 Updated matter
{
  "data": {
    "attributes": {
      "archived_at": "2026-01-01T00:00:00Z",
      "assigned_to_id": "00000000-0000-0000-0000-000000000000",
      "cancelled_at": "2026-01-01T00:00:00Z",
      "closed_at": "2026-01-01T00:00:00Z",
      "completed_at": "2026-01-01T00:00:00Z",
      "conflict_checks": [
        {
          "acknowledged_at": "2026-01-01T00:00:00Z",
          "acknowledged_by": "00000000-0000-0000-0000-000000000000",
          "check_type": "new_matter",
          "clearance_reason": "string",
          "cleared_at": "2026-01-01T00:00:00Z",
          "cleared_by_user_id": "00000000-0000-0000-0000-000000000000",
          "conflict_type": "same_party",
          "conflicting_matter_id": "00000000-0000-0000-0000-000000000000",
          "conflicting_matter_name": "string",
          "conflicting_matter_reference": "string",
          "contact_id": "00000000-0000-0000-0000-000000000000",
          "contact_name": "string",
          "disclosure_redacted": false,
          "highest_score": 0.0,
          "id": "00000000-0000-0000-0000-000000000000",
          "inserted_at": "2026-01-01T00:00:00Z",
          "rechecked_at": "2026-01-01T00:00:00Z",
          "status": "pending",
          "subject_name": "string",
          "updated_at": "2026-01-01T00:00:00Z"
        }
      ],
      "current_reporting_step_id": "00000000-0000-0000-0000-000000000000",
      "current_step_id": "00000000-0000-0000-0000-000000000000",
      "description": "string",
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_blocked": false,
      "jurisdiction_country": "AU",
      "jurisdiction_country_label": "string",
      "jurisdiction_region": "NSW",
      "jurisdiction_region_label": "string",
      "lock_version": 0,
      "matter_type_id": "00000000-0000-0000-0000-000000000000",
      "metadata": {},
      "name": "string",
      "opened_at": "2026-01-01T00:00:00Z",
      "priority": "low",
      "reference": "string",
      "status": "open",
      "tags": [
        "string"
      ],
      "team_id": "00000000-0000-0000-0000-000000000000",
      "updated_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "matters"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
DELETE /api/v1/matters/{id}

Delete a matter

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
DELETE /api/v1/matters/{id}
curl -X DELETE \
     -H "Authorization: Bearer {token}" \
     https://app.matterfirst.com.au/api/v1/matters/{id}
GET /api/v1/matters/{matter_id}/activity

List a matter's activity timeline

The audit trail for the matter and everything on it (tasks, notes, documents, step moves), newest first, paginated. Serves the changed field NAMES only, never the changed values: the raw audit `changes` column is whatever a call site passed and cannot be made safe (P0-01).

Parameters

  • Name
    matter_id
    Type
    string (uuid)
    required
    In
    in path
    Description
  • Name
    user_id
    Type
    string (uuid)
    In
    in query
    Description
  • Name
    action
    Type
    string
    In
    in query
    Description
  • Name
    from
    Type
    string (date)
    In
    in query
    Description
  • Name
    to
    Type
    string (date)
    In
    in query
    Description
  • Name
    page_number
    Type
    integer
    In
    in query
    Description
  • Name
    page_size
    Type
    integer
    In
    in query
    Description
200 Activity entries
{
  "data": [
    {
      "attributes": {
        "action": "create",
        "changed_fields": [
          "string"
        ],
        "inserted_at": "2026-01-01T00:00:00Z",
        "metadata": {},
        "resource_id": "00000000-0000-0000-0000-000000000000",
        "resource_type": "string",
        "user_id": "00000000-0000-0000-0000-000000000000"
      },
      "id": "00000000-0000-0000-0000-000000000000",
      "type": "audit-logs"
    }
  ],
  "links": {
    "first": "string",
    "last": "string",
    "next": "string",
    "prev": "string",
    "self": "string"
  },
  "meta": {
    "page": 0,
    "page_size": 0,
    "total": 0,
    "total_pages": 0
  }
}

Referral Submissions

GET /api/v1/referral-contracts/{public_id}/spec

Get contract submission spec

Returns the OpenAPI spec describing the expected submission payload for a contract.

Parameters

  • Name
    public_id
    Type
    string
    required
    In
    in path
    Description
    Contract public ID
200 OpenAPI spec
{
  "info": {},
  "openapi": "string",
  "paths": {}
}
403 Access denied
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
404 Contract not found
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
POST /api/v1/referral-contracts/{public_id}/submissions

Submit a referral

Submit a referral against a contract. Authenticated with a partner API credential (mf_ref_ prefix).

Parameters

  • Name
    public_id
    Type
    string
    required
    In
    in path
    Description
    Contract public ID

Request body

  • Name
    data
    Type
    object
    Description
    Submission field data
  • Name
    external_reference
    Type
    string
    Description
    Partner-side reference ID
POST /api/v1/referral-contracts/{public_id}/submissions
{
  "data": {},
  "external_reference": "string"
}
201 Referral created
{
  "id": "00000000-0000-0000-0000-000000000000",
  "message": "string",
  "missing_fields": [
    "string"
  ],
  "status": "string"
}
403 Access denied
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
404 Contract not found
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
409 Duplicate external_reference
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
422 Validation error
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
POST /api/v1/referral-contracts/{public_id}/test

Test a referral submission

Validates a referral payload against the contract without creating any records. Use this to test your integration.

Parameters

  • Name
    public_id
    Type
    string
    required
    In
    in path
    Description
    Contract public ID

Request body

  • Name
    data
    Type
    object
    Description
    Submission field data
POST /api/v1/referral-contracts/{public_id}/test
{
  "data": {}
}
200 Validation result
{
  "message": "string",
  "missing_fields": [
    "string"
  ],
  "normalized": {},
  "valid": false
}
403 Access denied
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
404 Contract not found
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}

Reports

GET /api/v1/reports

List reports

Parameters

  • Name
    filter
    Type
    object
    In
    in query
    Description
  • Name
    page_number
    Type
    integer
    In
    in query
    Description
  • Name
    page_size
    Type
    integer
    In
    in query
    Description
  • Name
    sort
    Type
    string
    In
    in query
    Description
200 Report list
{
  "data": [
    {
      "attributes": {
        "configuration": {},
        "created_by_id": "00000000-0000-0000-0000-000000000000",
        "description": "string",
        "inserted_at": "2026-01-01T00:00:00Z",
        "is_shared": false,
        "is_system": false,
        "name": "string",
        "report_type": "string",
        "updated_at": "2026-01-01T00:00:00Z"
      },
      "id": "00000000-0000-0000-0000-000000000000",
      "type": "reports"
    }
  ],
  "links": {
    "first": "string",
    "last": "string",
    "next": "string",
    "prev": "string",
    "self": "string"
  },
  "meta": {
    "page": 0,
    "page_size": 0,
    "total": 0,
    "total_pages": 0
  }
}
POST /api/v1/reports

Create a report

Request body

  • Name
    data
    Type
    object
    required
    Description
POST /api/v1/reports
{
  "data": {
    "attributes": {
      "configuration": {},
      "description": "string",
      "is_shared": false,
      "name": "string",
      "report_type": "string"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "reports"
  }
}
201 Created
{
  "data": {
    "attributes": {
      "configuration": {},
      "created_by_id": "00000000-0000-0000-0000-000000000000",
      "description": "string",
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_shared": false,
      "is_system": false,
      "name": "string",
      "report_type": "string",
      "updated_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "reports"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
GET /api/v1/reports/{id}

Get a report

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
200 Report
{
  "data": {
    "attributes": {
      "configuration": {},
      "created_by_id": "00000000-0000-0000-0000-000000000000",
      "description": "string",
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_shared": false,
      "is_system": false,
      "name": "string",
      "report_type": "string",
      "updated_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "reports"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
PUT /api/v1/reports/{id}

Update a report

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description

Request body

  • Name
    data
    Type
    object
    required
    Description
PUT /api/v1/reports/{id}
{
  "data": {
    "attributes": {
      "configuration": {},
      "description": "string",
      "is_shared": false,
      "name": "string",
      "report_type": "string"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "reports"
  }
}
200 Updated
{
  "data": {
    "attributes": {
      "configuration": {},
      "created_by_id": "00000000-0000-0000-0000-000000000000",
      "description": "string",
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_shared": false,
      "is_system": false,
      "name": "string",
      "report_type": "string",
      "updated_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "reports"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
PATCH /api/v1/reports/{id}

Update a report

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description

Request body

  • Name
    data
    Type
    object
    required
    Description
PATCH /api/v1/reports/{id}
{
  "data": {
    "attributes": {
      "configuration": {},
      "description": "string",
      "is_shared": false,
      "name": "string",
      "report_type": "string"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "reports"
  }
}
200 Updated
{
  "data": {
    "attributes": {
      "configuration": {},
      "created_by_id": "00000000-0000-0000-0000-000000000000",
      "description": "string",
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_shared": false,
      "is_system": false,
      "name": "string",
      "report_type": "string",
      "updated_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "reports"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
DELETE /api/v1/reports/{id}

Delete a report

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
DELETE /api/v1/reports/{id}
curl -X DELETE \
     -H "Authorization: Bearer {token}" \
     https://app.matterfirst.com.au/api/v1/reports/{id}
POST /api/v1/reports/{id}/run

Run a report and return results

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description

Request body

  • Name
    data
    Type
    object
    Description
POST /api/v1/reports/{id}/run
{
  "data": {
    "attributes": {
      "parameters": {}
    }
  }
}
200 Report results
{
  "data": {}
}
422 Report could not be run
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}

Role Templates

GET /api/v1/role-templates

List role templates for a matter type

Parameters

  • Name
    matter_type_id
    Type
    string (uuid)
    required
    In
    in query
    Description
  • Name
    page_number
    Type
    integer
    In
    in query
    Description
  • Name
    page_size
    Type
    integer
    In
    in query
    Description
200 Role template list
{
  "data": [
    {
      "attributes": {
        "inserted_at": "2026-01-01T00:00:00Z",
        "is_primary": false,
        "is_required": false,
        "matter_type_ids": [
          "00000000-0000-0000-0000-000000000000"
        ],
        "max_count": 0,
        "position": 0,
        "role_name": "string",
        "updated_at": "2026-01-01T00:00:00Z"
      },
      "id": "00000000-0000-0000-0000-000000000000",
      "type": "role-templates"
    }
  ],
  "links": {
    "first": "string",
    "last": "string",
    "next": "string",
    "prev": "string",
    "self": "string"
  },
  "meta": {
    "page": 0,
    "page_size": 0,
    "total": 0,
    "total_pages": 0
  }
}
POST /api/v1/role-templates

Create a role template

Request body

  • Name
    data
    Type
    object
    required
    Description
POST /api/v1/role-templates
{
  "data": {
    "attributes": {
      "is_primary": false,
      "is_required": false,
      "matter_type_ids": [
        "00000000-0000-0000-0000-000000000000"
      ],
      "max_count": 0,
      "position": 0,
      "role_name": "string"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "role-templates"
  }
}
201 Created
{
  "data": {
    "attributes": {
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_primary": false,
      "is_required": false,
      "matter_type_ids": [
        "00000000-0000-0000-0000-000000000000"
      ],
      "max_count": 0,
      "position": 0,
      "role_name": "string",
      "updated_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "role-templates"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
GET /api/v1/role-templates/{id}

Get a role template

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
200 Role template
{
  "data": {
    "attributes": {
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_primary": false,
      "is_required": false,
      "matter_type_ids": [
        "00000000-0000-0000-0000-000000000000"
      ],
      "max_count": 0,
      "position": 0,
      "role_name": "string",
      "updated_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "role-templates"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
PUT /api/v1/role-templates/{id}

Update a role template

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description

Request body

  • Name
    data
    Type
    object
    required
    Description
PUT /api/v1/role-templates/{id}
{
  "data": {
    "attributes": {
      "is_primary": false,
      "is_required": false,
      "matter_type_ids": [
        "00000000-0000-0000-0000-000000000000"
      ],
      "max_count": 0,
      "position": 0,
      "role_name": "string"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "role-templates"
  }
}
200 Updated
{
  "data": {
    "attributes": {
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_primary": false,
      "is_required": false,
      "matter_type_ids": [
        "00000000-0000-0000-0000-000000000000"
      ],
      "max_count": 0,
      "position": 0,
      "role_name": "string",
      "updated_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "role-templates"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
PATCH /api/v1/role-templates/{id}

Update a role template

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description

Request body

  • Name
    data
    Type
    object
    required
    Description
PATCH /api/v1/role-templates/{id}
{
  "data": {
    "attributes": {
      "is_primary": false,
      "is_required": false,
      "matter_type_ids": [
        "00000000-0000-0000-0000-000000000000"
      ],
      "max_count": 0,
      "position": 0,
      "role_name": "string"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "role-templates"
  }
}
200 Updated
{
  "data": {
    "attributes": {
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_primary": false,
      "is_required": false,
      "matter_type_ids": [
        "00000000-0000-0000-0000-000000000000"
      ],
      "max_count": 0,
      "position": 0,
      "role_name": "string",
      "updated_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "role-templates"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
DELETE /api/v1/role-templates/{id}

Delete a role template

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
DELETE /api/v1/role-templates/{id}
curl -X DELETE \
     -H "Authorization: Bearer {token}" \
     https://app.matterfirst.com.au/api/v1/role-templates/{id}

Steps

POST /api/v1/matters/{matter_id}/change-step

Change matter to a different step

Parameters

  • Name
    matter_id
    Type
    string (uuid)
    required
    In
    in path
    Description

Request body

  • Name
    data
    Type
    object
    required
    Description
POST /api/v1/matters/{matter_id}/change-step
{
  "data": {
    "attributes": {
      "reason": "string",
      "to_step_id": "00000000-0000-0000-0000-000000000000"
    }
  }
}
200 Step changed
{
  "data": {
    "current_reporting_step_id": "00000000-0000-0000-0000-000000000000",
    "current_step_id": "00000000-0000-0000-0000-000000000000",
    "id": "00000000-0000-0000-0000-000000000000",
    "message": "string"
  }
}
422 Change error
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
GET /api/v1/matters/{matter_id}/step-history

Get step history for a matter

Parameters

  • Name
    matter_id
    Type
    string (uuid)
    required
    In
    in path
    Description
200 Step history
{
  "data": [
    {
      "attributes": {
        "changed_by_name": "string",
        "duration_seconds": 0,
        "from_reporting_step_id": "00000000-0000-0000-0000-000000000000",
        "from_reporting_step_label": "string",
        "from_step_name": "string",
        "inserted_at": "2026-01-01T00:00:00Z",
        "reason": "string",
        "reporting_transition": false,
        "to_reporting_step_id": "00000000-0000-0000-0000-000000000000",
        "to_reporting_step_label": "string",
        "to_step_name": "string"
      },
      "id": "00000000-0000-0000-0000-000000000000",
      "type": "step-changes"
    }
  ],
  "meta": {
    "count": 0,
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
GET /api/v1/matters/{matter_id}/transitions

Get available step transitions for a matter

Parameters

  • Name
    matter_id
    Type
    string (uuid)
    required
    In
    in path
    Description
200 Available transitions
{
  "data": [
    {
      "id": "00000000-0000-0000-0000-000000000000",
      "name": "string",
      "step_type": "string"
    }
  ]
}
GET /api/v1/workflows/{workflow_id}/steps

List steps for a workflow

Parameters

  • Name
    workflow_id
    Type
    string (uuid)
    required
    In
    in path
    Description
200 Step list
{
  "data": [
    {
      "attributes": {
        "color": "string",
        "description": "string",
        "icon": "string",
        "inserted_at": "2026-01-01T00:00:00Z",
        "is_initial": false,
        "is_terminal": false,
        "name": "string",
        "position": 0,
        "reporting_step_id": "00000000-0000-0000-0000-000000000000",
        "settings": {},
        "step_type": "sequential",
        "updated_at": "2026-01-01T00:00:00Z",
        "workflow_id": "00000000-0000-0000-0000-000000000000"
      },
      "id": "00000000-0000-0000-0000-000000000000",
      "type": "steps"
    }
  ],
  "links": {
    "first": "string",
    "last": "string",
    "next": "string",
    "prev": "string",
    "self": "string"
  },
  "meta": {
    "page": 0,
    "page_size": 0,
    "total": 0,
    "total_pages": 0
  }
}
POST /api/v1/workflows/{workflow_id}/steps

Create a step

Parameters

  • Name
    workflow_id
    Type
    string (uuid)
    required
    In
    in path
    Description

Request body

  • Name
    data
    Type
    object
    required
    Description
POST /api/v1/workflows/{workflow_id}/steps
{
  "data": {
    "attributes": {
      "color": "string",
      "description": "string",
      "icon": "string",
      "is_initial": false,
      "is_terminal": false,
      "name": "string",
      "position": 0,
      "reporting_step_id": "00000000-0000-0000-0000-000000000000",
      "settings": {},
      "step_type": "sequential",
      "workflow_id": "00000000-0000-0000-0000-000000000000"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "steps"
  }
}
201 Created step
{
  "data": {
    "attributes": {
      "color": "string",
      "description": "string",
      "icon": "string",
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_initial": false,
      "is_terminal": false,
      "name": "string",
      "position": 0,
      "reporting_step_id": "00000000-0000-0000-0000-000000000000",
      "settings": {},
      "step_type": "sequential",
      "updated_at": "2026-01-01T00:00:00Z",
      "workflow_id": "00000000-0000-0000-0000-000000000000"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "steps"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
GET /api/v1/workflows/{workflow_id}/steps/{id}

Get a step

Parameters

  • Name
    workflow_id
    Type
    string (uuid)
    required
    In
    in path
    Description
  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
200 Step
{
  "data": {
    "attributes": {
      "color": "string",
      "description": "string",
      "icon": "string",
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_initial": false,
      "is_terminal": false,
      "name": "string",
      "position": 0,
      "reporting_step_id": "00000000-0000-0000-0000-000000000000",
      "settings": {},
      "step_type": "sequential",
      "updated_at": "2026-01-01T00:00:00Z",
      "workflow_id": "00000000-0000-0000-0000-000000000000"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "steps"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
PUT /api/v1/workflows/{workflow_id}/steps/{id}

Update a step

Parameters

  • Name
    workflow_id
    Type
    string (uuid)
    required
    In
    in path
    Description
  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description

Request body

  • Name
    data
    Type
    object
    required
    Description
PUT /api/v1/workflows/{workflow_id}/steps/{id}
{
  "data": {
    "attributes": {
      "color": "string",
      "description": "string",
      "icon": "string",
      "is_initial": false,
      "is_terminal": false,
      "name": "string",
      "position": 0,
      "reporting_step_id": "00000000-0000-0000-0000-000000000000",
      "settings": {},
      "step_type": "sequential",
      "workflow_id": "00000000-0000-0000-0000-000000000000"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "steps"
  }
}
200 Updated step
{
  "data": {
    "attributes": {
      "color": "string",
      "description": "string",
      "icon": "string",
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_initial": false,
      "is_terminal": false,
      "name": "string",
      "position": 0,
      "reporting_step_id": "00000000-0000-0000-0000-000000000000",
      "settings": {},
      "step_type": "sequential",
      "updated_at": "2026-01-01T00:00:00Z",
      "workflow_id": "00000000-0000-0000-0000-000000000000"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "steps"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
PATCH /api/v1/workflows/{workflow_id}/steps/{id}

Update a step

Parameters

  • Name
    workflow_id
    Type
    string (uuid)
    required
    In
    in path
    Description
  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description

Request body

  • Name
    data
    Type
    object
    required
    Description
PATCH /api/v1/workflows/{workflow_id}/steps/{id}
{
  "data": {
    "attributes": {
      "color": "string",
      "description": "string",
      "icon": "string",
      "is_initial": false,
      "is_terminal": false,
      "name": "string",
      "position": 0,
      "reporting_step_id": "00000000-0000-0000-0000-000000000000",
      "settings": {},
      "step_type": "sequential",
      "workflow_id": "00000000-0000-0000-0000-000000000000"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "steps"
  }
}
200 Updated step
{
  "data": {
    "attributes": {
      "color": "string",
      "description": "string",
      "icon": "string",
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_initial": false,
      "is_terminal": false,
      "name": "string",
      "position": 0,
      "reporting_step_id": "00000000-0000-0000-0000-000000000000",
      "settings": {},
      "step_type": "sequential",
      "updated_at": "2026-01-01T00:00:00Z",
      "workflow_id": "00000000-0000-0000-0000-000000000000"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "steps"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
DELETE /api/v1/workflows/{workflow_id}/steps/{id}

Delete a step

Parameters

  • Name
    workflow_id
    Type
    string (uuid)
    required
    In
    in path
    Description
  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
409 Dependency error
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
422 Delete error
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}

Task Templates

GET /api/v1/task-templates

List task templates

Parameters

  • Name
    matter_type_id
    Type
    string (uuid)
    In
    in query
    Description
  • Name
    page_number
    Type
    integer
    In
    in query
    Description
  • Name
    page_size
    Type
    integer
    In
    in query
    Description
200 Task template list
{
  "data": [
    {
      "attributes": {
        "assignments": [
          {}
        ],
        "category": "string",
        "default_assignee": "string",
        "description": "string",
        "due_date_mode": "string",
        "due_key_date_type_id": "00000000-0000-0000-0000-000000000000",
        "due_offset_days": 0,
        "inserted_at": "2026-01-01T00:00:00Z",
        "is_active": false,
        "is_compliance": false,
        "is_portal_visible": false,
        "name": "string",
        "position": 0,
        "priority": "string",
        "updated_at": "2026-01-01T00:00:00Z"
      },
      "id": "00000000-0000-0000-0000-000000000000",
      "type": "task-templates"
    }
  ],
  "links": {
    "first": "string",
    "last": "string",
    "next": "string",
    "prev": "string",
    "self": "string"
  },
  "meta": {
    "page": 0,
    "page_size": 0,
    "total": 0,
    "total_pages": 0
  }
}
POST /api/v1/task-templates

Create a task template

Request body

  • Name
    data
    Type
    object
    required
    Description
POST /api/v1/task-templates
{
  "data": {
    "attributes": {
      "assignments": [
        {}
      ],
      "category": "string",
      "default_assignee": "string",
      "description": "string",
      "due_date_mode": "string",
      "due_key_date_type_id": "00000000-0000-0000-0000-000000000000",
      "due_offset_days": 0,
      "is_active": false,
      "is_compliance": false,
      "is_portal_visible": false,
      "name": "string",
      "position": 0,
      "priority": "string"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "task-templates"
  }
}
201 Created
{
  "data": {
    "attributes": {
      "assignments": [
        {}
      ],
      "category": "string",
      "default_assignee": "string",
      "description": "string",
      "due_date_mode": "string",
      "due_key_date_type_id": "00000000-0000-0000-0000-000000000000",
      "due_offset_days": 0,
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_active": false,
      "is_compliance": false,
      "is_portal_visible": false,
      "name": "string",
      "position": 0,
      "priority": "string",
      "updated_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "task-templates"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
GET /api/v1/task-templates/{id}

Get a task template

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
200 Task template
{
  "data": {
    "attributes": {
      "assignments": [
        {}
      ],
      "category": "string",
      "default_assignee": "string",
      "description": "string",
      "due_date_mode": "string",
      "due_key_date_type_id": "00000000-0000-0000-0000-000000000000",
      "due_offset_days": 0,
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_active": false,
      "is_compliance": false,
      "is_portal_visible": false,
      "name": "string",
      "position": 0,
      "priority": "string",
      "updated_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "task-templates"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
PUT /api/v1/task-templates/{id}

Update a task template

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description

Request body

  • Name
    data
    Type
    object
    required
    Description
PUT /api/v1/task-templates/{id}
{
  "data": {
    "attributes": {
      "assignments": [
        {}
      ],
      "category": "string",
      "default_assignee": "string",
      "description": "string",
      "due_date_mode": "string",
      "due_key_date_type_id": "00000000-0000-0000-0000-000000000000",
      "due_offset_days": 0,
      "is_active": false,
      "is_compliance": false,
      "is_portal_visible": false,
      "name": "string",
      "position": 0,
      "priority": "string"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "task-templates"
  }
}
200 Updated
{
  "data": {
    "attributes": {
      "assignments": [
        {}
      ],
      "category": "string",
      "default_assignee": "string",
      "description": "string",
      "due_date_mode": "string",
      "due_key_date_type_id": "00000000-0000-0000-0000-000000000000",
      "due_offset_days": 0,
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_active": false,
      "is_compliance": false,
      "is_portal_visible": false,
      "name": "string",
      "position": 0,
      "priority": "string",
      "updated_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "task-templates"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
PATCH /api/v1/task-templates/{id}

Update a task template

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description

Request body

  • Name
    data
    Type
    object
    required
    Description
PATCH /api/v1/task-templates/{id}
{
  "data": {
    "attributes": {
      "assignments": [
        {}
      ],
      "category": "string",
      "default_assignee": "string",
      "description": "string",
      "due_date_mode": "string",
      "due_key_date_type_id": "00000000-0000-0000-0000-000000000000",
      "due_offset_days": 0,
      "is_active": false,
      "is_compliance": false,
      "is_portal_visible": false,
      "name": "string",
      "position": 0,
      "priority": "string"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "task-templates"
  }
}
200 Updated
{
  "data": {
    "attributes": {
      "assignments": [
        {}
      ],
      "category": "string",
      "default_assignee": "string",
      "description": "string",
      "due_date_mode": "string",
      "due_key_date_type_id": "00000000-0000-0000-0000-000000000000",
      "due_offset_days": 0,
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_active": false,
      "is_compliance": false,
      "is_portal_visible": false,
      "name": "string",
      "position": 0,
      "priority": "string",
      "updated_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "task-templates"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
DELETE /api/v1/task-templates/{id}

Delete a task template

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
DELETE /api/v1/task-templates/{id}
curl -X DELETE \
     -H "Authorization: Bearer {token}" \
     https://app.matterfirst.com.au/api/v1/task-templates/{id}

Task comments

GET /api/v1/tasks/{task_id}/comments

List comments on a task

Parameters

  • Name
    task_id
    Type
    string (uuid)
    required
    In
    in path
    Description
  • Name
    include
    Type
    string
    In
    in query
    Description
    Comma-separated related resources to embed in the top-level `included` array. Supported values: task, user.
  • Name
    page_number
    Type
    integer
    In
    in query
    Description
  • Name
    page_size
    Type
    integer
    In
    in query
    Description
200 Comment list
{
  "data": [
    {
      "attributes": {
        "body": "string",
        "inserted_at": "2026-01-01T00:00:00Z",
        "matter_id": "00000000-0000-0000-0000-000000000000",
        "mentioned_user_ids": [
          "00000000-0000-0000-0000-000000000000"
        ],
        "portal_user_id": "00000000-0000-0000-0000-000000000000",
        "task_id": "00000000-0000-0000-0000-000000000000",
        "updated_at": "2026-01-01T00:00:00Z",
        "user_id": "00000000-0000-0000-0000-000000000000"
      },
      "id": "00000000-0000-0000-0000-000000000000",
      "type": "task-comments"
    }
  ],
  "links": {
    "first": "string",
    "last": "string",
    "next": "string",
    "prev": "string",
    "self": "string"
  },
  "meta": {
    "page": 0,
    "page_size": 0,
    "total": 0,
    "total_pages": 0
  }
}
POST /api/v1/tasks/{task_id}/comments

Create a comment on a task

Parameters

  • Name
    task_id
    Type
    string (uuid)
    required
    In
    in path
    Description

Request body

  • Name
    data
    Type
    object
    required
    Description
POST /api/v1/tasks/{task_id}/comments
{
  "data": {
    "attributes": {
      "body": "string",
      "mentioned_user_ids": [
        "00000000-0000-0000-0000-000000000000"
      ]
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "task-comments"
  }
}
201 Created comment
{
  "data": {
    "attributes": {
      "body": "string",
      "inserted_at": "2026-01-01T00:00:00Z",
      "matter_id": "00000000-0000-0000-0000-000000000000",
      "mentioned_user_ids": [
        "00000000-0000-0000-0000-000000000000"
      ],
      "portal_user_id": "00000000-0000-0000-0000-000000000000",
      "task_id": "00000000-0000-0000-0000-000000000000",
      "updated_at": "2026-01-01T00:00:00Z",
      "user_id": "00000000-0000-0000-0000-000000000000"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "task-comments"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
GET /api/v1/tasks/{task_id}/comments/{id}

Get a comment

Parameters

  • Name
    task_id
    Type
    string (uuid)
    required
    In
    in path
    Description
  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
  • Name
    include
    Type
    string
    In
    in query
    Description
    Comma-separated related resources to embed in the top-level `included` array. Supported values: task, user.
200 Comment
{
  "data": {
    "attributes": {
      "body": "string",
      "inserted_at": "2026-01-01T00:00:00Z",
      "matter_id": "00000000-0000-0000-0000-000000000000",
      "mentioned_user_ids": [
        "00000000-0000-0000-0000-000000000000"
      ],
      "portal_user_id": "00000000-0000-0000-0000-000000000000",
      "task_id": "00000000-0000-0000-0000-000000000000",
      "updated_at": "2026-01-01T00:00:00Z",
      "user_id": "00000000-0000-0000-0000-000000000000"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "task-comments"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
PUT /api/v1/tasks/{task_id}/comments/{id}

Update a comment

Parameters

  • Name
    task_id
    Type
    string (uuid)
    required
    In
    in path
    Description
  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description

Request body

  • Name
    data
    Type
    object
    required
    Description
PUT /api/v1/tasks/{task_id}/comments/{id}
{
  "data": {
    "attributes": {
      "body": "string",
      "mentioned_user_ids": [
        "00000000-0000-0000-0000-000000000000"
      ]
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "task-comments"
  }
}
200 Updated comment
{
  "data": {
    "attributes": {
      "body": "string",
      "inserted_at": "2026-01-01T00:00:00Z",
      "matter_id": "00000000-0000-0000-0000-000000000000",
      "mentioned_user_ids": [
        "00000000-0000-0000-0000-000000000000"
      ],
      "portal_user_id": "00000000-0000-0000-0000-000000000000",
      "task_id": "00000000-0000-0000-0000-000000000000",
      "updated_at": "2026-01-01T00:00:00Z",
      "user_id": "00000000-0000-0000-0000-000000000000"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "task-comments"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
PATCH /api/v1/tasks/{task_id}/comments/{id}

Update a comment

Parameters

  • Name
    task_id
    Type
    string (uuid)
    required
    In
    in path
    Description
  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description

Request body

  • Name
    data
    Type
    object
    required
    Description
PATCH /api/v1/tasks/{task_id}/comments/{id}
{
  "data": {
    "attributes": {
      "body": "string",
      "mentioned_user_ids": [
        "00000000-0000-0000-0000-000000000000"
      ]
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "task-comments"
  }
}
200 Updated comment
{
  "data": {
    "attributes": {
      "body": "string",
      "inserted_at": "2026-01-01T00:00:00Z",
      "matter_id": "00000000-0000-0000-0000-000000000000",
      "mentioned_user_ids": [
        "00000000-0000-0000-0000-000000000000"
      ],
      "portal_user_id": "00000000-0000-0000-0000-000000000000",
      "task_id": "00000000-0000-0000-0000-000000000000",
      "updated_at": "2026-01-01T00:00:00Z",
      "user_id": "00000000-0000-0000-0000-000000000000"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "task-comments"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
DELETE /api/v1/tasks/{task_id}/comments/{id}

Delete a comment

Parameters

  • Name
    task_id
    Type
    string (uuid)
    required
    In
    in path
    Description
  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
DELETE /api/v1/tasks/{task_id}/comments/{id}
curl -X DELETE \
     -H "Authorization: Bearer {token}" \
     https://app.matterfirst.com.au/api/v1/tasks/{task_id}/comments/{id}

Tasks

GET /api/v1/tasks

List tasks

Parameters

  • Name
    fields
    Type
    object
    In
    in query
    Description
    JSON:API sparse fieldsets: fields[<type>]=a,b limits the attributes returned for that resource type.
  • Name
    filter
    Type
    object
    In
    in query
    Description
  • Name
    include
    Type
    string
    In
    in query
    Description
    Comma-separated related resources to embed in the top-level `included` array. Supported values: matter, lead, assignee, parent_task.
  • Name
    page_number
    Type
    integer
    In
    in query
    Description
  • Name
    page_size
    Type
    integer
    In
    in query
    Description
  • Name
    sort
    Type
    string
    In
    in query
    Description
200 Task list
{
  "data": [
    {
      "attributes": {
        "assigned_to_id": "00000000-0000-0000-0000-000000000000",
        "blocked": false,
        "category": "string",
        "completed_at": "2026-01-01T00:00:00Z",
        "completed_by_id": "00000000-0000-0000-0000-000000000000",
        "completed_by_portal_user_id": "00000000-0000-0000-0000-000000000000",
        "created_by_id": "00000000-0000-0000-0000-000000000000",
        "description": "string",
        "due_date": "2026-01-01",
        "due_time": "string",
        "elapsed_seconds": 0,
        "estimated_minutes": 0,
        "finished_at": "2026-01-01T00:00:00Z",
        "inserted_at": "2026-01-01T00:00:00Z",
        "is_portal_visible": false,
        "is_recurring": false,
        "lead_id": "00000000-0000-0000-0000-000000000000",
        "matter_id": "00000000-0000-0000-0000-000000000000",
        "name": "string",
        "parent_task_id": "00000000-0000-0000-0000-000000000000",
        "position": 0,
        "priority": "low",
        "recurrence_rule": {},
        "source": "string",
        "started_at": "2026-01-01T00:00:00Z",
        "status": "pending",
        "step_id": "00000000-0000-0000-0000-000000000000",
        "tags": [
          "string"
        ],
        "updated_at": "2026-01-01T00:00:00Z"
      },
      "id": "00000000-0000-0000-0000-000000000000",
      "type": "tasks"
    }
  ],
  "links": {
    "first": "string",
    "last": "string",
    "next": "string",
    "prev": "string",
    "self": "string"
  },
  "meta": {
    "page": 0,
    "page_size": 0,
    "total": 0,
    "total_pages": 0
  }
}
POST /api/v1/tasks

Create a task

Supports the optional Idempotency-Key request header (max 255 chars): retrying the POST with the same key and body replays the original response instead of creating a second task.

Request body

  • Name
    data
    Type
    object
    required
    Description
POST /api/v1/tasks
{
  "data": {
    "attributes": {
      "assigned_to_id": "00000000-0000-0000-0000-000000000000",
      "category": "string",
      "description": "string",
      "due_date": "2026-01-01",
      "lead_id": "00000000-0000-0000-0000-000000000000",
      "matter_id": "00000000-0000-0000-0000-000000000000",
      "name": "string",
      "parent_task_id": "00000000-0000-0000-0000-000000000000",
      "priority": "low",
      "tags": [
        "string"
      ]
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "tasks"
  }
}
201 Created task
{
  "data": {
    "attributes": {
      "assigned_to_id": "00000000-0000-0000-0000-000000000000",
      "blocked": false,
      "category": "string",
      "completed_at": "2026-01-01T00:00:00Z",
      "completed_by_id": "00000000-0000-0000-0000-000000000000",
      "completed_by_portal_user_id": "00000000-0000-0000-0000-000000000000",
      "created_by_id": "00000000-0000-0000-0000-000000000000",
      "description": "string",
      "due_date": "2026-01-01",
      "due_time": "string",
      "elapsed_seconds": 0,
      "estimated_minutes": 0,
      "finished_at": "2026-01-01T00:00:00Z",
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_portal_visible": false,
      "is_recurring": false,
      "lead_id": "00000000-0000-0000-0000-000000000000",
      "matter_id": "00000000-0000-0000-0000-000000000000",
      "name": "string",
      "parent_task_id": "00000000-0000-0000-0000-000000000000",
      "position": 0,
      "priority": "low",
      "recurrence_rule": {},
      "source": "string",
      "started_at": "2026-01-01T00:00:00Z",
      "status": "pending",
      "step_id": "00000000-0000-0000-0000-000000000000",
      "tags": [
        "string"
      ],
      "updated_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "tasks"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
GET /api/v1/tasks/{id}

Get a task

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
  • Name
    fields
    Type
    object
    In
    in query
    Description
    JSON:API sparse fieldsets: fields[<type>]=a,b limits the attributes returned for that resource type.
  • Name
    include
    Type
    string
    In
    in query
    Description
    Comma-separated related resources to embed in the top-level `included` array. Supported values: matter, lead, assignee, parent_task.
200 Task
{
  "data": {
    "attributes": {
      "assigned_to_id": "00000000-0000-0000-0000-000000000000",
      "blocked": false,
      "category": "string",
      "completed_at": "2026-01-01T00:00:00Z",
      "completed_by_id": "00000000-0000-0000-0000-000000000000",
      "completed_by_portal_user_id": "00000000-0000-0000-0000-000000000000",
      "created_by_id": "00000000-0000-0000-0000-000000000000",
      "description": "string",
      "due_date": "2026-01-01",
      "due_time": "string",
      "elapsed_seconds": 0,
      "estimated_minutes": 0,
      "finished_at": "2026-01-01T00:00:00Z",
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_portal_visible": false,
      "is_recurring": false,
      "lead_id": "00000000-0000-0000-0000-000000000000",
      "matter_id": "00000000-0000-0000-0000-000000000000",
      "name": "string",
      "parent_task_id": "00000000-0000-0000-0000-000000000000",
      "position": 0,
      "priority": "low",
      "recurrence_rule": {},
      "source": "string",
      "started_at": "2026-01-01T00:00:00Z",
      "status": "pending",
      "step_id": "00000000-0000-0000-0000-000000000000",
      "tags": [
        "string"
      ],
      "updated_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "tasks"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
PUT /api/v1/tasks/{id}

Update a task

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
  • Name
    if-match
    Type
    string
    In
    in header
    Description
    Optional optimistic-concurrency precondition: the ETag from a previous GET/update of this task. A stale value is refused with 412 precondition_failed before anything is written.

Request body

  • Name
    data
    Type
    object
    required
    Description
PUT /api/v1/tasks/{id}
{
  "data": {
    "attributes": {
      "assigned_to_id": "00000000-0000-0000-0000-000000000000",
      "category": "string",
      "description": "string",
      "due_date": "2026-01-01",
      "lead_id": "00000000-0000-0000-0000-000000000000",
      "matter_id": "00000000-0000-0000-0000-000000000000",
      "name": "string",
      "parent_task_id": "00000000-0000-0000-0000-000000000000",
      "priority": "low",
      "tags": [
        "string"
      ]
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "tasks"
  }
}
200 Updated task
{
  "data": {
    "attributes": {
      "assigned_to_id": "00000000-0000-0000-0000-000000000000",
      "blocked": false,
      "category": "string",
      "completed_at": "2026-01-01T00:00:00Z",
      "completed_by_id": "00000000-0000-0000-0000-000000000000",
      "completed_by_portal_user_id": "00000000-0000-0000-0000-000000000000",
      "created_by_id": "00000000-0000-0000-0000-000000000000",
      "description": "string",
      "due_date": "2026-01-01",
      "due_time": "string",
      "elapsed_seconds": 0,
      "estimated_minutes": 0,
      "finished_at": "2026-01-01T00:00:00Z",
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_portal_visible": false,
      "is_recurring": false,
      "lead_id": "00000000-0000-0000-0000-000000000000",
      "matter_id": "00000000-0000-0000-0000-000000000000",
      "name": "string",
      "parent_task_id": "00000000-0000-0000-0000-000000000000",
      "position": 0,
      "priority": "low",
      "recurrence_rule": {},
      "source": "string",
      "started_at": "2026-01-01T00:00:00Z",
      "status": "pending",
      "step_id": "00000000-0000-0000-0000-000000000000",
      "tags": [
        "string"
      ],
      "updated_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "tasks"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
PATCH /api/v1/tasks/{id}

Update a task

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
  • Name
    if-match
    Type
    string
    In
    in header
    Description
    Optional optimistic-concurrency precondition: the ETag from a previous GET/update of this task. A stale value is refused with 412 precondition_failed before anything is written.

Request body

  • Name
    data
    Type
    object
    required
    Description
PATCH /api/v1/tasks/{id}
{
  "data": {
    "attributes": {
      "assigned_to_id": "00000000-0000-0000-0000-000000000000",
      "category": "string",
      "description": "string",
      "due_date": "2026-01-01",
      "lead_id": "00000000-0000-0000-0000-000000000000",
      "matter_id": "00000000-0000-0000-0000-000000000000",
      "name": "string",
      "parent_task_id": "00000000-0000-0000-0000-000000000000",
      "priority": "low",
      "tags": [
        "string"
      ]
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "tasks"
  }
}
200 Updated task
{
  "data": {
    "attributes": {
      "assigned_to_id": "00000000-0000-0000-0000-000000000000",
      "blocked": false,
      "category": "string",
      "completed_at": "2026-01-01T00:00:00Z",
      "completed_by_id": "00000000-0000-0000-0000-000000000000",
      "completed_by_portal_user_id": "00000000-0000-0000-0000-000000000000",
      "created_by_id": "00000000-0000-0000-0000-000000000000",
      "description": "string",
      "due_date": "2026-01-01",
      "due_time": "string",
      "elapsed_seconds": 0,
      "estimated_minutes": 0,
      "finished_at": "2026-01-01T00:00:00Z",
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_portal_visible": false,
      "is_recurring": false,
      "lead_id": "00000000-0000-0000-0000-000000000000",
      "matter_id": "00000000-0000-0000-0000-000000000000",
      "name": "string",
      "parent_task_id": "00000000-0000-0000-0000-000000000000",
      "position": 0,
      "priority": "low",
      "recurrence_rule": {},
      "source": "string",
      "started_at": "2026-01-01T00:00:00Z",
      "status": "pending",
      "step_id": "00000000-0000-0000-0000-000000000000",
      "tags": [
        "string"
      ],
      "updated_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "tasks"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
DELETE /api/v1/tasks/{id}

Delete a task

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
DELETE /api/v1/tasks/{id}
curl -X DELETE \
     -H "Authorization: Bearer {token}" \
     https://app.matterfirst.com.au/api/v1/tasks/{id}
POST /api/v1/tasks/{id}/cancel

Cancel a task

Sets the task's status to cancelled. Idempotent on an already-cancelled task; refused (409) on a completed one: reopen it first.

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
200 Cancelled task
{
  "data": {
    "attributes": {
      "assigned_to_id": "00000000-0000-0000-0000-000000000000",
      "blocked": false,
      "category": "string",
      "completed_at": "2026-01-01T00:00:00Z",
      "completed_by_id": "00000000-0000-0000-0000-000000000000",
      "completed_by_portal_user_id": "00000000-0000-0000-0000-000000000000",
      "created_by_id": "00000000-0000-0000-0000-000000000000",
      "description": "string",
      "due_date": "2026-01-01",
      "due_time": "string",
      "elapsed_seconds": 0,
      "estimated_minutes": 0,
      "finished_at": "2026-01-01T00:00:00Z",
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_portal_visible": false,
      "is_recurring": false,
      "lead_id": "00000000-0000-0000-0000-000000000000",
      "matter_id": "00000000-0000-0000-0000-000000000000",
      "name": "string",
      "parent_task_id": "00000000-0000-0000-0000-000000000000",
      "position": 0,
      "priority": "low",
      "recurrence_rule": {},
      "source": "string",
      "started_at": "2026-01-01T00:00:00Z",
      "status": "pending",
      "step_id": "00000000-0000-0000-0000-000000000000",
      "tags": [
        "string"
      ],
      "updated_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "tasks"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
409 Invalid status
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
POST /api/v1/tasks/{id}/complete

Mark a task as completed

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
200 Completed task
{
  "data": {
    "attributes": {
      "assigned_to_id": "00000000-0000-0000-0000-000000000000",
      "blocked": false,
      "category": "string",
      "completed_at": "2026-01-01T00:00:00Z",
      "completed_by_id": "00000000-0000-0000-0000-000000000000",
      "completed_by_portal_user_id": "00000000-0000-0000-0000-000000000000",
      "created_by_id": "00000000-0000-0000-0000-000000000000",
      "description": "string",
      "due_date": "2026-01-01",
      "due_time": "string",
      "elapsed_seconds": 0,
      "estimated_minutes": 0,
      "finished_at": "2026-01-01T00:00:00Z",
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_portal_visible": false,
      "is_recurring": false,
      "lead_id": "00000000-0000-0000-0000-000000000000",
      "matter_id": "00000000-0000-0000-0000-000000000000",
      "name": "string",
      "parent_task_id": "00000000-0000-0000-0000-000000000000",
      "position": 0,
      "priority": "low",
      "recurrence_rule": {},
      "source": "string",
      "started_at": "2026-01-01T00:00:00Z",
      "status": "pending",
      "step_id": "00000000-0000-0000-0000-000000000000",
      "tags": [
        "string"
      ],
      "updated_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "tasks"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
GET /api/v1/tasks/{id}/dependencies

List a task's dependencies

The tasks this task depends on. A `blocks` dependency prevents completion until the depended-on task is done; `related` is informational. Bounded by one task, so the list is not paginated.

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
200 Dependency list
{
  "data": [
    {
      "attributes": {
        "dependency_type": "blocks",
        "depends_on_id": "00000000-0000-0000-0000-000000000000",
        "inserted_at": "2026-01-01T00:00:00Z",
        "matter_id": "00000000-0000-0000-0000-000000000000",
        "task_id": "00000000-0000-0000-0000-000000000000"
      },
      "id": "00000000-0000-0000-0000-000000000000",
      "type": "task-dependencies"
    }
  ],
  "meta": {
    "count": 0,
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
POST /api/v1/tasks/{id}/dependencies

Add a dependency to a task

Makes this task depend on another task in the same firm. A `blocks` dependency that would close a cycle is refused (422): a circular block leaves both tasks permanently uncompletable.

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description

Request body

  • Name
    data
    Type
    object
    required
    Description
POST /api/v1/tasks/{id}/dependencies
{
  "data": {
    "attributes": {
      "dependency_type": "blocks",
      "depends_on_id": "00000000-0000-0000-0000-000000000000"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "tasks"
  }
}
201 Created dependency
{
  "data": {
    "attributes": {
      "dependency_type": "blocks",
      "depends_on_id": "00000000-0000-0000-0000-000000000000",
      "inserted_at": "2026-01-01T00:00:00Z",
      "matter_id": "00000000-0000-0000-0000-000000000000",
      "task_id": "00000000-0000-0000-0000-000000000000"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "task-dependencies"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
DELETE /api/v1/tasks/{id}/dependencies/{depends_on_id}

Remove a dependency from a task

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
  • Name
    depends_on_id
    Type
    string (uuid)
    required
    In
    in path
    Description
DELETE /api/v1/tasks/{id}/dependencies/{depends_on_id}
curl -X DELETE \
     -H "Authorization: Bearer {token}" \
     https://app.matterfirst.com.au/api/v1/tasks/{id}/dependencies/{depends_on_id}
POST /api/v1/tasks/{id}/reopen

Reopen a task

Moves a completed or cancelled task back to pending, clearing its completion bookkeeping. Refused (409) from any other status.

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
200 Reopened task
{
  "data": {
    "attributes": {
      "assigned_to_id": "00000000-0000-0000-0000-000000000000",
      "blocked": false,
      "category": "string",
      "completed_at": "2026-01-01T00:00:00Z",
      "completed_by_id": "00000000-0000-0000-0000-000000000000",
      "completed_by_portal_user_id": "00000000-0000-0000-0000-000000000000",
      "created_by_id": "00000000-0000-0000-0000-000000000000",
      "description": "string",
      "due_date": "2026-01-01",
      "due_time": "string",
      "elapsed_seconds": 0,
      "estimated_minutes": 0,
      "finished_at": "2026-01-01T00:00:00Z",
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_portal_visible": false,
      "is_recurring": false,
      "lead_id": "00000000-0000-0000-0000-000000000000",
      "matter_id": "00000000-0000-0000-0000-000000000000",
      "name": "string",
      "parent_task_id": "00000000-0000-0000-0000-000000000000",
      "position": 0,
      "priority": "low",
      "recurrence_rule": {},
      "source": "string",
      "started_at": "2026-01-01T00:00:00Z",
      "status": "pending",
      "step_id": "00000000-0000-0000-0000-000000000000",
      "tags": [
        "string"
      ],
      "updated_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "tasks"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
409 Invalid status
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
POST /api/v1/tasks/{id}/start

Start a task

Sets the task's status to in_progress and starts its timer. Idempotent on an already-running task.

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
200 Started task
{
  "data": {
    "attributes": {
      "assigned_to_id": "00000000-0000-0000-0000-000000000000",
      "blocked": false,
      "category": "string",
      "completed_at": "2026-01-01T00:00:00Z",
      "completed_by_id": "00000000-0000-0000-0000-000000000000",
      "completed_by_portal_user_id": "00000000-0000-0000-0000-000000000000",
      "created_by_id": "00000000-0000-0000-0000-000000000000",
      "description": "string",
      "due_date": "2026-01-01",
      "due_time": "string",
      "elapsed_seconds": 0,
      "estimated_minutes": 0,
      "finished_at": "2026-01-01T00:00:00Z",
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_portal_visible": false,
      "is_recurring": false,
      "lead_id": "00000000-0000-0000-0000-000000000000",
      "matter_id": "00000000-0000-0000-0000-000000000000",
      "name": "string",
      "parent_task_id": "00000000-0000-0000-0000-000000000000",
      "position": 0,
      "priority": "low",
      "recurrence_rule": {},
      "source": "string",
      "started_at": "2026-01-01T00:00:00Z",
      "status": "pending",
      "step_id": "00000000-0000-0000-0000-000000000000",
      "tags": [
        "string"
      ],
      "updated_at": "2026-01-01T00:00:00Z"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "tasks"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
GET /api/v1/tasks/{id}/subtasks

List a task's subtasks

The tasks whose parent_task_id is this task, paginated.

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
  • Name
    fields
    Type
    object
    In
    in query
    Description
    JSON:API sparse fieldsets: fields[<type>]=a,b limits the attributes returned for that resource type.
  • Name
    page_number
    Type
    integer
    In
    in query
    Description
  • Name
    page_size
    Type
    integer
    In
    in query
    Description
  • Name
    sort
    Type
    string
    In
    in query
    Description
200 Subtask list
{
  "data": [
    {
      "attributes": {
        "assigned_to_id": "00000000-0000-0000-0000-000000000000",
        "blocked": false,
        "category": "string",
        "completed_at": "2026-01-01T00:00:00Z",
        "completed_by_id": "00000000-0000-0000-0000-000000000000",
        "completed_by_portal_user_id": "00000000-0000-0000-0000-000000000000",
        "created_by_id": "00000000-0000-0000-0000-000000000000",
        "description": "string",
        "due_date": "2026-01-01",
        "due_time": "string",
        "elapsed_seconds": 0,
        "estimated_minutes": 0,
        "finished_at": "2026-01-01T00:00:00Z",
        "inserted_at": "2026-01-01T00:00:00Z",
        "is_portal_visible": false,
        "is_recurring": false,
        "lead_id": "00000000-0000-0000-0000-000000000000",
        "matter_id": "00000000-0000-0000-0000-000000000000",
        "name": "string",
        "parent_task_id": "00000000-0000-0000-0000-000000000000",
        "position": 0,
        "priority": "low",
        "recurrence_rule": {},
        "source": "string",
        "started_at": "2026-01-01T00:00:00Z",
        "status": "pending",
        "step_id": "00000000-0000-0000-0000-000000000000",
        "tags": [
          "string"
        ],
        "updated_at": "2026-01-01T00:00:00Z"
      },
      "id": "00000000-0000-0000-0000-000000000000",
      "type": "tasks"
    }
  ],
  "links": {
    "first": "string",
    "last": "string",
    "next": "string",
    "prev": "string",
    "self": "string"
  },
  "meta": {
    "page": 0,
    "page_size": 0,
    "total": 0,
    "total_pages": 0
  }
}

Time Entries

GET /api/v1/time-entries

List time entries

Parameters

  • Name
    fields
    Type
    object
    In
    in query
    Description
    JSON:API sparse fieldsets: fields[<type>]=a,b limits the attributes returned for that resource type.
  • Name
    filter
    Type
    object
    In
    in query
    Description
  • Name
    include
    Type
    string
    In
    in query
    Description
    Comma-separated related resources to embed in the top-level `included` array. Supported values: matter, user, invoice.
  • Name
    page_number
    Type
    integer
    In
    in query
    Description
  • Name
    page_size
    Type
    integer
    In
    in query
    Description
  • Name
    sort
    Type
    string
    In
    in query
    Description
200 Time entry list
{
  "data": [
    {
      "attributes": {
        "amount_cents": 0,
        "category": "string",
        "date": "2026-01-01",
        "description": "string",
        "duration_minutes": 0,
        "end_time": "2026-01-01T00:00:00Z",
        "inserted_at": "2026-01-01T00:00:00Z",
        "invoice_id": "00000000-0000-0000-0000-000000000000",
        "is_billable": false,
        "matter_id": "00000000-0000-0000-0000-000000000000",
        "rate_cents": 0,
        "source": "string",
        "start_time": "2026-01-01T00:00:00Z",
        "status": "string",
        "tags": [
          "string"
        ],
        "updated_at": "2026-01-01T00:00:00Z",
        "user_id": "00000000-0000-0000-0000-000000000000"
      },
      "id": "00000000-0000-0000-0000-000000000000",
      "type": "time-entries"
    }
  ],
  "links": {
    "first": "string",
    "last": "string",
    "next": "string",
    "prev": "string",
    "self": "string"
  },
  "meta": {
    "page": 0,
    "page_size": 0,
    "total": 0,
    "total_pages": 0
  }
}
POST /api/v1/time-entries

Create a time entry

Request body

  • Name
    data
    Type
    object
    required
    Description
POST /api/v1/time-entries
{
  "data": {
    "attributes": {
      "category": "string",
      "date": "2026-01-01",
      "description": "string",
      "duration_minutes": 0,
      "is_billable": false,
      "matter_id": "00000000-0000-0000-0000-000000000000",
      "rate_cents": 0,
      "tags": [
        "string"
      ],
      "user_id": "00000000-0000-0000-0000-000000000000"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "time-entries"
  }
}
201 Created time entry
{
  "data": {
    "attributes": {
      "amount_cents": 0,
      "category": "string",
      "date": "2026-01-01",
      "description": "string",
      "duration_minutes": 0,
      "end_time": "2026-01-01T00:00:00Z",
      "inserted_at": "2026-01-01T00:00:00Z",
      "invoice_id": "00000000-0000-0000-0000-000000000000",
      "is_billable": false,
      "matter_id": "00000000-0000-0000-0000-000000000000",
      "rate_cents": 0,
      "source": "string",
      "start_time": "2026-01-01T00:00:00Z",
      "status": "string",
      "tags": [
        "string"
      ],
      "updated_at": "2026-01-01T00:00:00Z",
      "user_id": "00000000-0000-0000-0000-000000000000"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "time-entries"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
GET /api/v1/time-entries/{id}

Get a time entry

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
  • Name
    fields
    Type
    object
    In
    in query
    Description
    JSON:API sparse fieldsets: fields[<type>]=a,b limits the attributes returned for that resource type.
  • Name
    include
    Type
    string
    In
    in query
    Description
    Comma-separated related resources to embed in the top-level `included` array. Supported values: matter, user, invoice.
200 Time entry
{
  "data": {
    "attributes": {
      "amount_cents": 0,
      "category": "string",
      "date": "2026-01-01",
      "description": "string",
      "duration_minutes": 0,
      "end_time": "2026-01-01T00:00:00Z",
      "inserted_at": "2026-01-01T00:00:00Z",
      "invoice_id": "00000000-0000-0000-0000-000000000000",
      "is_billable": false,
      "matter_id": "00000000-0000-0000-0000-000000000000",
      "rate_cents": 0,
      "source": "string",
      "start_time": "2026-01-01T00:00:00Z",
      "status": "string",
      "tags": [
        "string"
      ],
      "updated_at": "2026-01-01T00:00:00Z",
      "user_id": "00000000-0000-0000-0000-000000000000"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "time-entries"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
PUT /api/v1/time-entries/{id}

Update a time entry

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description

Request body

  • Name
    data
    Type
    object
    required
    Description
PUT /api/v1/time-entries/{id}
{
  "data": {
    "attributes": {
      "category": "string",
      "date": "2026-01-01",
      "description": "string",
      "duration_minutes": 0,
      "is_billable": false,
      "matter_id": "00000000-0000-0000-0000-000000000000",
      "rate_cents": 0,
      "tags": [
        "string"
      ]
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "time-entries"
  }
}
200 Updated time entry
{
  "data": {
    "attributes": {
      "amount_cents": 0,
      "category": "string",
      "date": "2026-01-01",
      "description": "string",
      "duration_minutes": 0,
      "end_time": "2026-01-01T00:00:00Z",
      "inserted_at": "2026-01-01T00:00:00Z",
      "invoice_id": "00000000-0000-0000-0000-000000000000",
      "is_billable": false,
      "matter_id": "00000000-0000-0000-0000-000000000000",
      "rate_cents": 0,
      "source": "string",
      "start_time": "2026-01-01T00:00:00Z",
      "status": "string",
      "tags": [
        "string"
      ],
      "updated_at": "2026-01-01T00:00:00Z",
      "user_id": "00000000-0000-0000-0000-000000000000"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "time-entries"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
PATCH /api/v1/time-entries/{id}

Update a time entry

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description

Request body

  • Name
    data
    Type
    object
    required
    Description
PATCH /api/v1/time-entries/{id}
{
  "data": {
    "attributes": {
      "category": "string",
      "date": "2026-01-01",
      "description": "string",
      "duration_minutes": 0,
      "is_billable": false,
      "matter_id": "00000000-0000-0000-0000-000000000000",
      "rate_cents": 0,
      "tags": [
        "string"
      ]
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "time-entries"
  }
}
200 Updated time entry
{
  "data": {
    "attributes": {
      "amount_cents": 0,
      "category": "string",
      "date": "2026-01-01",
      "description": "string",
      "duration_minutes": 0,
      "end_time": "2026-01-01T00:00:00Z",
      "inserted_at": "2026-01-01T00:00:00Z",
      "invoice_id": "00000000-0000-0000-0000-000000000000",
      "is_billable": false,
      "matter_id": "00000000-0000-0000-0000-000000000000",
      "rate_cents": 0,
      "source": "string",
      "start_time": "2026-01-01T00:00:00Z",
      "status": "string",
      "tags": [
        "string"
      ],
      "updated_at": "2026-01-01T00:00:00Z",
      "user_id": "00000000-0000-0000-0000-000000000000"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "time-entries"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
DELETE /api/v1/time-entries/{id}

Delete a time entry

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
DELETE /api/v1/time-entries/{id}
curl -X DELETE \
     -H "Authorization: Bearer {token}" \
     https://app.matterfirst.com.au/api/v1/time-entries/{id}

Webhooks

POST /api/v1/webhook-deliveries/{id}/retry

Retry a webhook delivery

Enqueues a fresh delivery of the same event and payload to the same endpoint, as a new delivery record with its own attempt counter.

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
202 Retry queued
{
  "data": {
    "attributes": {
      "attempt": 0,
      "duration_ms": 0,
      "error_message": "string",
      "event": "string",
      "inserted_at": "2026-01-01T00:00:00Z",
      "next_retry_at": "2026-01-01T00:00:00Z",
      "response_status": 0,
      "status": "pending",
      "updated_at": "2026-01-01T00:00:00Z",
      "webhook_endpoint_id": "00000000-0000-0000-0000-000000000000"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "webhook-deliveries"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
GET /api/v1/webhook-events

List subscribable webhook event names

Every event name a webhook endpoint may subscribe to. "*" and "<category>.*" wildcards are also accepted on an endpoint's `events`.

200 Webhook event catalog
{
  "data": [
    {
      "attributes": {
        "category": "string"
      },
      "id": "string",
      "type": "webhook-events"
    }
  ]
}
GET /api/v1/webhooks

List webhook endpoints

The signing secret is never included; see the create and rotate-secret operations.

200 Webhook endpoint list
{
  "data": [
    {
      "attributes": {
        "description": "string",
        "disabled_at": "2026-01-01T00:00:00Z",
        "events": [
          "string"
        ],
        "failure_count": 0,
        "inserted_at": "2026-01-01T00:00:00Z",
        "is_active": false,
        "last_triggered_at": "2026-01-01T00:00:00Z",
        "updated_at": "2026-01-01T00:00:00Z",
        "url": "string"
      },
      "id": "00000000-0000-0000-0000-000000000000",
      "type": "webhooks"
    }
  ],
  "links": {
    "first": "string",
    "last": "string",
    "next": "string",
    "prev": "string",
    "self": "string"
  },
  "meta": {
    "page": 0,
    "page_size": 0,
    "total": 0,
    "total_pages": 0
  }
}
POST /api/v1/webhooks

Create a webhook endpoint

The signing secret is generated server-side and returned ONCE, as `meta.secret` on this response. Store it: no read endpoint ever returns it again. Use POST /webhooks/{id}/rotate-secret to replace a lost or compromised secret.

Request body

  • Name
    data
    Type
    object
    required
    Description
POST /api/v1/webhooks
{
  "data": {
    "attributes": {
      "description": "string",
      "events": [
        "string"
      ],
      "is_active": false,
      "url": "string"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "webhooks"
  }
}
201 Created
{
  "data": {
    "attributes": {
      "description": "string",
      "disabled_at": "2026-01-01T00:00:00Z",
      "events": [
        "string"
      ],
      "failure_count": 0,
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_active": false,
      "last_triggered_at": "2026-01-01T00:00:00Z",
      "updated_at": "2026-01-01T00:00:00Z",
      "url": "string"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "webhooks"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
GET /api/v1/webhooks/{id}

Get a webhook endpoint

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
200 Webhook endpoint
{
  "data": {
    "attributes": {
      "description": "string",
      "disabled_at": "2026-01-01T00:00:00Z",
      "events": [
        "string"
      ],
      "failure_count": 0,
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_active": false,
      "last_triggered_at": "2026-01-01T00:00:00Z",
      "updated_at": "2026-01-01T00:00:00Z",
      "url": "string"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "webhooks"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
PUT /api/v1/webhooks/{id}

Update a webhook endpoint

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description

Request body

  • Name
    data
    Type
    object
    required
    Description
PUT /api/v1/webhooks/{id}
{
  "data": {
    "attributes": {
      "description": "string",
      "events": [
        "string"
      ],
      "is_active": false,
      "url": "string"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "webhooks"
  }
}
200 Updated
{
  "data": {
    "attributes": {
      "description": "string",
      "disabled_at": "2026-01-01T00:00:00Z",
      "events": [
        "string"
      ],
      "failure_count": 0,
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_active": false,
      "last_triggered_at": "2026-01-01T00:00:00Z",
      "updated_at": "2026-01-01T00:00:00Z",
      "url": "string"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "webhooks"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
PATCH /api/v1/webhooks/{id}

Update a webhook endpoint

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description

Request body

  • Name
    data
    Type
    object
    required
    Description
PATCH /api/v1/webhooks/{id}
{
  "data": {
    "attributes": {
      "description": "string",
      "events": [
        "string"
      ],
      "is_active": false,
      "url": "string"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "webhooks"
  }
}
200 Updated
{
  "data": {
    "attributes": {
      "description": "string",
      "disabled_at": "2026-01-01T00:00:00Z",
      "events": [
        "string"
      ],
      "failure_count": 0,
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_active": false,
      "last_triggered_at": "2026-01-01T00:00:00Z",
      "updated_at": "2026-01-01T00:00:00Z",
      "url": "string"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "webhooks"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
DELETE /api/v1/webhooks/{id}

Delete a webhook endpoint

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
DELETE /api/v1/webhooks/{id}
curl -X DELETE \
     -H "Authorization: Bearer {token}" \
     https://app.matterfirst.com.au/api/v1/webhooks/{id}
GET /api/v1/webhooks/{id}/deliveries

List delivery attempts for a webhook endpoint

Delivery metadata only: the stored payload and response bodies are not included; they can carry client data and belong to the receiving system.

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
  • Name
    page_number
    Type
    integer
    In
    in query
    Description
  • Name
    page_size
    Type
    integer
    In
    in query
    Description
200 Delivery list
{
  "data": [
    {
      "attributes": {
        "attempt": 0,
        "duration_ms": 0,
        "error_message": "string",
        "event": "string",
        "inserted_at": "2026-01-01T00:00:00Z",
        "next_retry_at": "2026-01-01T00:00:00Z",
        "response_status": 0,
        "status": "pending",
        "updated_at": "2026-01-01T00:00:00Z",
        "webhook_endpoint_id": "00000000-0000-0000-0000-000000000000"
      },
      "id": "00000000-0000-0000-0000-000000000000",
      "type": "webhook-deliveries"
    }
  ],
  "links": {
    "first": "string",
    "last": "string",
    "next": "string",
    "prev": "string",
    "self": "string"
  },
  "meta": {
    "page": 0,
    "page_size": 0,
    "total": 0,
    "total_pages": 0
  }
}
POST /api/v1/webhooks/{id}/rotate-secret

Rotate a webhook endpoint's signing secret

Replaces the signing secret. The NEW secret is returned once, as `meta.secret` on this response, and deliveries signed with the old secret stop verifying immediately. The audit log records that a rotation happened, never the value.

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
200 Rotated
{
  "data": {
    "attributes": {
      "description": "string",
      "disabled_at": "2026-01-01T00:00:00Z",
      "events": [
        "string"
      ],
      "failure_count": 0,
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_active": false,
      "last_triggered_at": "2026-01-01T00:00:00Z",
      "updated_at": "2026-01-01T00:00:00Z",
      "url": "string"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "webhooks"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
POST /api/v1/webhooks/{id}/test

Send a test delivery to a webhook endpoint

Queues a `test.ping` delivery, signed exactly as real deliveries are.

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
202 Test delivery queued
{
  "data": {
    "attributes": {
      "attempt": 0,
      "duration_ms": 0,
      "error_message": "string",
      "event": "string",
      "inserted_at": "2026-01-01T00:00:00Z",
      "next_retry_at": "2026-01-01T00:00:00Z",
      "response_status": 0,
      "status": "pending",
      "updated_at": "2026-01-01T00:00:00Z",
      "webhook_endpoint_id": "00000000-0000-0000-0000-000000000000"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "webhook-deliveries"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}

Workflows

GET /api/v1/workflows

List workflows

Parameters

  • Name
    page_number
    Type
    integer
    In
    in query
    Description
  • Name
    page_size
    Type
    integer
    In
    in query
    Description
200 Workflow list
{
  "data": [
    {
      "attributes": {
        "description": "string",
        "inserted_at": "2026-01-01T00:00:00Z",
        "is_active": false,
        "is_template": false,
        "name": "string",
        "updated_at": "2026-01-01T00:00:00Z",
        "version": 0
      },
      "id": "00000000-0000-0000-0000-000000000000",
      "type": "workflows"
    }
  ],
  "links": {
    "first": "string",
    "last": "string",
    "next": "string",
    "prev": "string",
    "self": "string"
  },
  "meta": {
    "page": 0,
    "page_size": 0,
    "total": 0,
    "total_pages": 0
  }
}
POST /api/v1/workflows

Create a workflow

Request body

  • Name
    data
    Type
    object
    required
    Description
POST /api/v1/workflows
{
  "data": {
    "attributes": {
      "description": "string",
      "is_active": false,
      "is_template": false,
      "name": "string"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "workflows"
  }
}
201 Created workflow
{
  "data": {
    "attributes": {
      "description": "string",
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_active": false,
      "is_template": false,
      "name": "string",
      "updated_at": "2026-01-01T00:00:00Z",
      "version": 0
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "workflows"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
GET /api/v1/workflows/{id}

Get a workflow

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
200 Workflow
{
  "data": {
    "attributes": {
      "description": "string",
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_active": false,
      "is_template": false,
      "name": "string",
      "updated_at": "2026-01-01T00:00:00Z",
      "version": 0
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "workflows"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
PUT /api/v1/workflows/{id}

Update a workflow

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description

Request body

  • Name
    data
    Type
    object
    required
    Description
PUT /api/v1/workflows/{id}
{
  "data": {
    "attributes": {
      "description": "string",
      "is_active": false,
      "is_template": false,
      "name": "string"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "workflows"
  }
}
200 Updated
{
  "data": {
    "attributes": {
      "description": "string",
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_active": false,
      "is_template": false,
      "name": "string",
      "updated_at": "2026-01-01T00:00:00Z",
      "version": 0
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "workflows"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
PATCH /api/v1/workflows/{id}

Update a workflow

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description

Request body

  • Name
    data
    Type
    object
    required
    Description
PATCH /api/v1/workflows/{id}
{
  "data": {
    "attributes": {
      "description": "string",
      "is_active": false,
      "is_template": false,
      "name": "string"
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "workflows"
  }
}
200 Updated
{
  "data": {
    "attributes": {
      "description": "string",
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_active": false,
      "is_template": false,
      "name": "string",
      "updated_at": "2026-01-01T00:00:00Z",
      "version": 0
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "workflows"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Validation errors
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
DELETE /api/v1/workflows/{id}

Delete a workflow

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description
409 Dependency error
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
422 Delete error
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}
POST /api/v1/workflows/{id}/clone

Clone a workflow

Parameters

  • Name
    id
    Type
    string (uuid)
    required
    In
    in path
    Description

Request body

  • Name
    data
    Type
    object
    required
    Description
POST /api/v1/workflows/{id}/clone
{
  "data": {
    "attributes": {
      "name": "string"
    }
  }
}
201 Cloned workflow
{
  "data": {
    "attributes": {
      "description": "string",
      "inserted_at": "2026-01-01T00:00:00Z",
      "is_active": false,
      "is_template": false,
      "name": "string",
      "updated_at": "2026-01-01T00:00:00Z",
      "version": 0
    },
    "id": "00000000-0000-0000-0000-000000000000",
    "type": "workflows"
  },
  "meta": {
    "timestamp": "2026-01-01T00:00:00Z"
  }
}
422 Clone error
{
  "errors": [
    {
      "detail": "string",
      "source": {
        "pointer": "string"
      },
      "status": "string",
      "title": "string"
    }
  ]
}