> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.brightmove.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.brightmove.com/_mcp/server.

## Authentication

The BrightMove API uses OAuth 2.0's `client_credentials` grant. Create a client under **User > API Keys** in the app
(or have an admin create one for you under the company admin panel) to get a `client_id`/`client_secret` pair, then
exchange it for a short-lived access token and send that token as a Bearer credential on every request. All requests
require authentication and will return `401 Unauthorized` otherwise.

**1. Get an access token**

```
curl --request POST \
  --url https://app.brightmove.com/ATS/oauth2/token \
  --user 'YOUR_CLIENT_ID:YOUR_CLIENT_SECRET' \
  --data grant_type=client_credentials
```

This returns a JSON response with a short-lived `access_token` (one hour by default):

```json
{
  "access_token": "eyJhbGciOiJSUzI1NiIs...",
  "token_type": "Bearer",
  "expires_in": 3599
}
```

**2. Call the API with the access token**

```
curl --request GET \
  --url https://app.brightmove.com/ATS/app/req/{guid} \
  --header 'Authorization: Bearer YOUR_ACCESS_TOKEN'
```

> **Tip**
>
> There is no refresh token for this grant type — the `client_id`/`client_secret` pair is itself the long-lived
> credential. When your access token expires, just request a new one the same way; there's no session or refresh
> flow to manage.

## Parameters

Many API methods take optional parameters. For `GET` requests, all parameters should be specified as a segment of the
endpoint URL:

```
curl --request GET \
  --url https://app.brightmove.com/ATS/app/req/{guid}
```

In this case, the guid for the Requirement to be retrieved is passed as a segment of the URL.

For `POST` and `DELETE` requests, parameters not included in the URL should be encoded as JSON with an Accept and
Content-Type of 'application/json':

```
curl --request POST \
  --url https://app.brightmove.com/ATS/app/req/find \
  --header 'accept: application/json' \
  --header 'content-type: application/json' \
  --data '{"queryString":"is_submittable: true"}'
```

## Pagination

An API method that performs query operations will typically be paginated to 50 items by default. You can specify further
pages with the `pageNumber` parameter and adjust the page size with the `pageSize` parameter. These should be specified
in the JSON encoded parameter:

```
curl --request POST \
  --url https://app.brightmove.com/ATS/app/req/find \
  --header 'accept: application/json' \
  --header 'content-type: application/json' \
  --data '{"queryString":"is_submittable: true", "pageNumber":1, "pageSize":"PAGE_SIZE_100"}'
```

## General Considerations

* All API access is over HTTPS, and accessed from `https://app.brightmove.com`.
* All data is sent and received as JSON (unless otherwise noted).
* All timestamps return in Unix time format with millisecond precision: `1597953763000`