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

# Add or move an applicant's location

POST https://api.confirm.global/partner/v1/candidates/{external_ref}/locations
Content-Type: application/json

Puts an applicant you already sent at another location in the same
registry, or moves them there from a location they are at.

**Add.** Send `location_ref` alone. The applicant gets a new
application at that location; their other applications are
unchanged. You receive `candidate.location_added`.

**Move.** Also send `move_from_location_ref`. The new application is
created as for an add, and the application at the old location is
closed. A move is not a rejection: you receive one
`candidate.location_changed` and **no** `candidate.status_changed` →
`rejected` for the location they left. The applicant gets no message
about the closed application.

**Idempotent.** `201` when a new application was created; `200` with
`created: false` when the applicant already had one at that location,
in which case nothing about that application changes. Replaying a move
is safe: if the old location's application is still open, the replay
closes it.

**Screening is reused, and only the gaps are asked.** The new
application copies the applicant's completed screening when it covers
the new location. `screening` in the response says which case applied:

| `screening` | Meaning                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
| ----------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `reused`    | The applicant **passed** a screening in this registry that asked every question the new location asks. The new application starts at the step after screening, as if they had passed there, and that step's usual messages are sent (for example, an interview booking link). No call is placed.                                                                                                                                                                                         |
| `pending`   | The applicant has a completed screening in this registry, but it failed or was partial, or the new location asks questions it did not cover. The new application starts at screening, and a follow-up call covers what is missing (below). A failed screening elsewhere does not by itself reject the applicant here: knockouts are per location, and an earlier failed answer counts here only when this location asks the same question in the same words with the same knockout rule. |
| `none`      | No screening to reuse: the applicant has no completed screening in this registry yet, or the application already existed (`created: false`). A new application starts at the beginning of the pipeline, and is screened as described below.                                                                                                                                                                                                                                              |

**Follow-up calls.** For a new application with `screening` `pending`
or `none`, CONFIRM works out what is still unanswered:

* If the applicant's screening call has not been placed yet, the new
  location joins it.
* If a call for another of their locations is in progress, the new
  location waits for it to finish, then continues below.
* Otherwise a short follow-up call asks only the questions the
  applicant has not already answered. Earlier answers carry over only
  when the question is asked exactly the same way: a question that
  names a different address, for example, is asked again.
* If nothing is left to ask, no call is placed: the outcome at the new
  location is decided from the earlier answers.

There is no second heads-up SMS. The applicant must have given contact
consent and have a valid phone, as for any call. The result arrives as
`screening.completed` and `candidate.status_changed` for the new
location. `screening` in the response does not change with any of
this. See
[follow-up calls](/partner-guides/multiple-locations#follow-up-calls-for-locations-added-later).

**Callback URL.** The new application keeps the `webhook_url` the
applicant was posted with (on a move, the old location's), so its events
reach the same place.

**Paused locations are fine; closed ones are not.** A target location
closed with `PATCH /locations/{ref}` returns `409 location_closed`,
unless the applicant already has an application there (`200`).

Reference: https://docs.confirm.global/partner-api/candidates/add-candidate-location

## Authentication

- `Authorization` header (bearer token, required) — Partner API key sent as `Authorization: Bearer cfk_...`. Keys are partner-level — one key reaches every registry linked to your partner account and nothing else. CONFIRM issues and revokes them; a key is shown exactly once at creation because only its hash is stored, and revocation takes effect on the next request. Develop against the sandbox base URL with a sandbox key, where telephony is restricted to an allowlist you provide.

## Request

### Path parameters

- `external_ref` (string, required) — Your applicant identifier (the `external_ref` you sent to `POST /candidates`).

### Body (application/json)

This endpoint expects an object.

- `location_ref` (string, required) — The location to add the applicant to (its `external_ref`).
- `organization_ref` (string, optional) — The registry the location belongs to. Only required when the same location ref exists in more than one of your registries. The applicant is looked up in that registry.
- `move_from_location_ref` (string, optional) — Set to move instead of add: the location the applicant is leaving. Must be in the same registry as `location_ref`, the applicant must have an application there, and it must differ from `location_ref`.

## Response

### 201

Application created at the location. If the applicant already had one there you get **200** with `created: false` and that application.

- `candidate_id` (string, required)
- `application_id` (string, required) — The application at `location_ref`.
- `external_ref` (string, required) — Your applicant identifier, echoed back.
- `location_ref` (string, required) — The location, echoed back.
- `created` (boolean, required) — False when the applicant already had an application at this location.
- `screening` (enum, required) — How much of an existing screening the application reuses, at the moment it was created. See the table in the endpoint description. For `pending` and `none`, a follow-up call (or the applicant's not-yet-placed screening call) covers the rest; this value does not change when it does.
  - Allowed values: `reused`, `pending`, `none`
- `status` (enum, optional, nullable) — The applicant's coarse status at this location.
  - Allowed values: `screening`, `review`, `interview`, `hired`, `rejected`
- `moved_from` (CandidateLocationResultMovedFrom, optional, nullable) — On a move, the location the applicant left and its now-closed application. `null` on an add.
- `portal_url` (string, optional, nullable) — Complete deep link to the applicant in the registry's portal.

## Errors

### 400 Bad Request Error

`invalid_request`: a field is missing or blank (`details` lists each one), or `move_from_location_ref` is the same location as `location_ref`.

- `error` (ErrorError, required)

### 401 Unauthorized Error

Missing, malformed, or revoked API key (`error.type: authentication_error`).

- `error` (ErrorError, required)

### 404 Not Found Error

| `code` | Meaning | |---|---| | `unknown_location_ref` | No location with `location_ref` — or, on a move, no location with `move_from_location_ref` in the same registry. The error names the ref. | | `unknown_organization_ref` | `organization_ref` is not one of your registries. | | `unknown_candidate_ref` | No applicant with that `external_ref` in the location's registry. Create them with `POST /candidates`. | | `no_application_at_location` | On a move: the applicant has no application at `move_from_location_ref`. |

- `error` (ErrorError, required)

### 409 Conflict Error

The target location is closed and the applicant is not already at it (`location_closed`), or its ref exists in more than one of your registries and no `organization_ref` said which (`ambiguous_location_ref`).

- `error` (ErrorError, required)

### 429 Too Many Requests Error

Rate limit exceeded (`error.type: rate_limit_error`). Design target: 600 requests/min per key, burst 100/10s. Honor the `Retry-After` header.

- `error` (ErrorError, required)

## Types

### CandidateLocationResultMovedFrom

On a move, the location the applicant left and its now-closed application. `null` on an add.

- `location_ref` (string, optional)
- `application_id` (string, optional)

### ErrorError

- `type` (enum, required) — Broad error category.
  - Allowed values: `authentication_error`, `invalid_request_error`, `not_found_error`, `conflict_error`, `rate_limit_error`, `api_error`
- `code` (string, required) — Machine-readable error code, e.g. `invalid_request`, `unknown_location_ref` or `wrong_environment`. Branch on this; the strings are contract.
- `message` (string, required) — Human-readable explanation.
- `request_id` (string, required) — Identifier for this request — the same value as the response's `X-Request-Id` header. Include it when contacting CONFIRM support.
- `details` (list of ErrorErrorDetailsItems, optional) — Present on `invalid_request` (400): one entry per field that failed validation.
- `location_ref` (string, optional) — Present on `unknown_location_ref` (404) — the reference that wasn't found.
- `organization_ref` (string, optional) — Present on `unknown_organization_ref` (404) — the reference that wasn't found — and on `email_has_account` (409) — the registry the invitation was for.
- `external_ref` (string, optional) — Present on workspace-teardown refusals (403) — the workspace you asked to delete — and on applicant errors (`unknown_candidate_ref`, `no_application_at_location`, `outcome_conflict`) — the applicant ref.
- `organization_refs` (list of string, optional) — Present on `ambiguous_location_ref` (409) — the registries the ref exists in.
- `locations` (list of ErrorErrorLocationsItems, optional) — Present on `location_refs_span_organizations` (400) — each ref you sent with the registry it belongs to.

### ErrorErrorDetailsItems

- `field` (string, required) — Dotted path to the offending field, e.g. `address.postal_code`.
- `message` (string, required) — Why that field was rejected.

### ErrorErrorLocationsItems

- `location_ref` (string, optional)
- `organization_ref` (string, optional, nullable)

## Examples

### Location added, screening reused

**Response**

```json
{
  "candidate_id": "9f4c2e81-6d3a-4b7e-a1c2-8e5f0d743b16",
  "application_id": "0b6e3f72-5a19-4d8c-a2e4-7c1d9f8b3a60",
  "external_ref": "cl_app_84321",
  "location_ref": "cl_loc_88214",
  "created": true,
  "screening": "reused",
  "status": "interview",
  "moved_from": null,
  "portal_url": "https://app.confirm.global/c/suncoast-nurse-registry/candidates/9f4c2e81-6d3a-4b7e-a1c2-8e5f0d743b16"
}
```

**SDK Code**

```python Location added, screening reused
import requests

url = "https://api.confirm.global/partner/v1/candidates/cl_app_84321/locations"

headers = {"Authorization": "Bearer <token>"}

response = requests.post(url, headers=headers)

print(response.json())
```

```javascript Location added, screening reused
const url = 'https://api.confirm.global/partner/v1/candidates/cl_app_84321/locations';
const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go Location added, screening reused
package main

import (
	"fmt"
	"net/http"
	"io"
)

func main() {

	url := "https://api.confirm.global/partner/v1/candidates/cl_app_84321/locations"

	req, _ := http.NewRequest("POST", url, nil)

	req.Header.Add("Authorization", "Bearer <token>")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby Location added, screening reused
require 'uri'
require 'net/http'

url = URI("https://api.confirm.global/partner/v1/candidates/cl_app_84321/locations")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'

response = http.request(request)
puts response.read_body
```

```java Location added, screening reused
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.post("https://api.confirm.global/partner/v1/candidates/cl_app_84321/locations")
  .header("Authorization", "Bearer <token>")
  .asString();
```

```php Location added, screening reused
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.confirm.global/partner/v1/candidates/cl_app_84321/locations', [
  'headers' => [
    'Authorization' => 'Bearer <token>',
  ],
]);

echo $response->getBody();
```

```csharp Location added, screening reused
using RestSharp;

var client = new RestClient("https://api.confirm.global/partner/v1/candidates/cl_app_84321/locations");
var request = new RestRequest(Method.POST);
request.AddHeader("Authorization", "Bearer <token>");
IRestResponse response = client.Execute(request);
```

```swift Location added, screening reused
import Foundation

let headers = ["Authorization": "Bearer <token>"]

let request = NSMutableURLRequest(url: NSURL(string: "https://api.confirm.global/partner/v1/candidates/cl_app_84321/locations")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "POST"
request.allHTTPHeaderFields = headers

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```

### Moved, waiting on screening for the new location

**Response**

```json
{
  "candidate_id": "9f4c2e81-6d3a-4b7e-a1c2-8e5f0d743b16",
  "application_id": "0b6e3f72-5a19-4d8c-a2e4-7c1d9f8b3a60",
  "external_ref": "cl_app_84321",
  "location_ref": "cl_loc_88214",
  "created": true,
  "screening": "pending",
  "status": "screening",
  "moved_from": {
    "location_ref": "cl_loc_88213",
    "application_id": "51c0a7de-2f18-4a3e-96b7-1d0c8b2e4a77"
  },
  "portal_url": "https://app.confirm.global/c/suncoast-nurse-registry/candidates/9f4c2e81-6d3a-4b7e-a1c2-8e5f0d743b16"
}
```

**SDK Code**

```python Moved, waiting on screening for the new location
import requests

url = "https://api.confirm.global/partner/v1/candidates/cl_app_84321/locations"

headers = {"Authorization": "Bearer <token>"}

response = requests.post(url, headers=headers)

print(response.json())
```

```javascript Moved, waiting on screening for the new location
const url = 'https://api.confirm.global/partner/v1/candidates/cl_app_84321/locations';
const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go Moved, waiting on screening for the new location
package main

import (
	"fmt"
	"net/http"
	"io"
)

func main() {

	url := "https://api.confirm.global/partner/v1/candidates/cl_app_84321/locations"

	req, _ := http.NewRequest("POST", url, nil)

	req.Header.Add("Authorization", "Bearer <token>")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby Moved, waiting on screening for the new location
require 'uri'
require 'net/http'

url = URI("https://api.confirm.global/partner/v1/candidates/cl_app_84321/locations")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'

response = http.request(request)
puts response.read_body
```

```java Moved, waiting on screening for the new location
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.post("https://api.confirm.global/partner/v1/candidates/cl_app_84321/locations")
  .header("Authorization", "Bearer <token>")
  .asString();
```

```php Moved, waiting on screening for the new location
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.confirm.global/partner/v1/candidates/cl_app_84321/locations', [
  'headers' => [
    'Authorization' => 'Bearer <token>',
  ],
]);

echo $response->getBody();
```

```csharp Moved, waiting on screening for the new location
using RestSharp;

var client = new RestClient("https://api.confirm.global/partner/v1/candidates/cl_app_84321/locations");
var request = new RestRequest(Method.POST);
request.AddHeader("Authorization", "Bearer <token>");
IRestResponse response = client.Execute(request);
```

```swift Moved, waiting on screening for the new location
import Foundation

let headers = ["Authorization": "Bearer <token>"]

let request = NSMutableURLRequest(url: NSURL(string: "https://api.confirm.global/partner/v1/candidates/cl_app_84321/locations")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "POST"
request.allHTTPHeaderFields = headers

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```

### Add a second location

**Request**

```json
{
  "location_ref": "cl_loc_88214"
}
```

**Response**

```json
{
  "candidate_id": "9f4c2e81-6d3a-4b7e-a1c2-8e5f0d743b16",
  "application_id": "0b6e3f72-5a19-4d8c-a2e4-7c1d9f8b3a60",
  "external_ref": "cl_app_84321",
  "location_ref": "cl_loc_88214",
  "created": true,
  "screening": "reused",
  "status": "interview",
  "moved_from": null,
  "portal_url": "https://app.confirm.global/c/suncoast-nurse-registry/candidates/9f4c2e81-6d3a-4b7e-a1c2-8e5f0d743b16"
}
```

**SDK Code**

```python Add a second location
import requests

url = "https://api.confirm.global/partner/v1/candidates/cl_app_84321/locations"

payload = { "location_ref": "cl_loc_88214" }
headers = {
    "Authorization": "Bearer <token>",
    "Content-Type": "application/json"
}

response = requests.post(url, json=payload, headers=headers)

print(response.json())
```

```javascript Add a second location
const url = 'https://api.confirm.global/partner/v1/candidates/cl_app_84321/locations';
const options = {
  method: 'POST',
  headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
  body: '{"location_ref":"cl_loc_88214"}'
};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go Add a second location
package main

import (
	"fmt"
	"strings"
	"net/http"
	"io"
)

func main() {

	url := "https://api.confirm.global/partner/v1/candidates/cl_app_84321/locations"

	payload := strings.NewReader("{\n  \"location_ref\": \"cl_loc_88214\"\n}")

	req, _ := http.NewRequest("POST", url, payload)

	req.Header.Add("Authorization", "Bearer <token>")
	req.Header.Add("Content-Type", "application/json")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby Add a second location
require 'uri'
require 'net/http'

url = URI("https://api.confirm.global/partner/v1/candidates/cl_app_84321/locations")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n  \"location_ref\": \"cl_loc_88214\"\n}"

response = http.request(request)
puts response.read_body
```

```java Add a second location
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.post("https://api.confirm.global/partner/v1/candidates/cl_app_84321/locations")
  .header("Authorization", "Bearer <token>")
  .header("Content-Type", "application/json")
  .body("{\n  \"location_ref\": \"cl_loc_88214\"\n}")
  .asString();
```

```php Add a second location
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.confirm.global/partner/v1/candidates/cl_app_84321/locations', [
  'body' => '{
  "location_ref": "cl_loc_88214"
}',
  'headers' => [
    'Authorization' => 'Bearer <token>',
    'Content-Type' => 'application/json',
  ],
]);

echo $response->getBody();
```

```csharp Add a second location
using RestSharp;

var client = new RestClient("https://api.confirm.global/partner/v1/candidates/cl_app_84321/locations");
var request = new RestRequest(Method.POST);
request.AddHeader("Authorization", "Bearer <token>");
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "{\n  \"location_ref\": \"cl_loc_88214\"\n}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
```

```swift Add a second location
import Foundation

let headers = [
  "Authorization": "Bearer <token>",
  "Content-Type": "application/json"
]
let parameters = ["location_ref": "cl_loc_88214"] as [String : Any]

let postData = JSONSerialization.data(withJSONObject: parameters, options: [])

let request = NSMutableURLRequest(url: NSURL(string: "https://api.confirm.global/partner/v1/candidates/cl_app_84321/locations")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "POST"
request.allHTTPHeaderFields = headers
request.httpBody = postData as Data

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```

### Move to another location

**Request**

```json
{
  "location_ref": "cl_loc_88214",
  "move_from_location_ref": "cl_loc_88213"
}
```

**Response**

```json
{
  "candidate_id": "9f4c2e81-6d3a-4b7e-a1c2-8e5f0d743b16",
  "application_id": "0b6e3f72-5a19-4d8c-a2e4-7c1d9f8b3a60",
  "external_ref": "cl_app_84321",
  "location_ref": "cl_loc_88214",
  "created": true,
  "screening": "reused",
  "status": "interview",
  "moved_from": null,
  "portal_url": "https://app.confirm.global/c/suncoast-nurse-registry/candidates/9f4c2e81-6d3a-4b7e-a1c2-8e5f0d743b16"
}
```

**SDK Code**

```python Move to another location
import requests

url = "https://api.confirm.global/partner/v1/candidates/cl_app_84321/locations"

payload = {
    "location_ref": "cl_loc_88214",
    "move_from_location_ref": "cl_loc_88213"
}
headers = {
    "Authorization": "Bearer <token>",
    "Content-Type": "application/json"
}

response = requests.post(url, json=payload, headers=headers)

print(response.json())
```

```javascript Move to another location
const url = 'https://api.confirm.global/partner/v1/candidates/cl_app_84321/locations';
const options = {
  method: 'POST',
  headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
  body: '{"location_ref":"cl_loc_88214","move_from_location_ref":"cl_loc_88213"}'
};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go Move to another location
package main

import (
	"fmt"
	"strings"
	"net/http"
	"io"
)

func main() {

	url := "https://api.confirm.global/partner/v1/candidates/cl_app_84321/locations"

	payload := strings.NewReader("{\n  \"location_ref\": \"cl_loc_88214\",\n  \"move_from_location_ref\": \"cl_loc_88213\"\n}")

	req, _ := http.NewRequest("POST", url, payload)

	req.Header.Add("Authorization", "Bearer <token>")
	req.Header.Add("Content-Type", "application/json")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby Move to another location
require 'uri'
require 'net/http'

url = URI("https://api.confirm.global/partner/v1/candidates/cl_app_84321/locations")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n  \"location_ref\": \"cl_loc_88214\",\n  \"move_from_location_ref\": \"cl_loc_88213\"\n}"

response = http.request(request)
puts response.read_body
```

```java Move to another location
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.post("https://api.confirm.global/partner/v1/candidates/cl_app_84321/locations")
  .header("Authorization", "Bearer <token>")
  .header("Content-Type", "application/json")
  .body("{\n  \"location_ref\": \"cl_loc_88214\",\n  \"move_from_location_ref\": \"cl_loc_88213\"\n}")
  .asString();
```

```php Move to another location
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.confirm.global/partner/v1/candidates/cl_app_84321/locations', [
  'body' => '{
  "location_ref": "cl_loc_88214",
  "move_from_location_ref": "cl_loc_88213"
}',
  'headers' => [
    'Authorization' => 'Bearer <token>',
    'Content-Type' => 'application/json',
  ],
]);

echo $response->getBody();
```

```csharp Move to another location
using RestSharp;

var client = new RestClient("https://api.confirm.global/partner/v1/candidates/cl_app_84321/locations");
var request = new RestRequest(Method.POST);
request.AddHeader("Authorization", "Bearer <token>");
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "{\n  \"location_ref\": \"cl_loc_88214\",\n  \"move_from_location_ref\": \"cl_loc_88213\"\n}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
```

```swift Move to another location
import Foundation

let headers = [
  "Authorization": "Bearer <token>",
  "Content-Type": "application/json"
]
let parameters = [
  "location_ref": "cl_loc_88214",
  "move_from_location_ref": "cl_loc_88213"
] as [String : Any]

let postData = JSONSerialization.data(withJSONObject: parameters, options: [])

let request = NSMutableURLRequest(url: NSURL(string: "https://api.confirm.global/partner/v1/candidates/cl_app_84321/locations")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "POST"
request.allHTTPHeaderFields = headers
request.httpBody = postData as Data

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```