curl --request POST \
--url https://api.photon.codes/v1/projects/{id}/platforms/voice/lines/profile-assignments/batch \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"updates": [
{
"expectedVersion": 123,
"profileId": "<string>",
"resourceId": "<string>"
}
]
}
'import requests
url = "https://api.photon.codes/v1/projects/{id}/platforms/voice/lines/profile-assignments/batch"
payload = { "updates": [
{
"expectedVersion": 123,
"profileId": "<string>",
"resourceId": "<string>"
}
] }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
updates: [{expectedVersion: 123, profileId: '<string>', resourceId: '<string>'}]
})
};
fetch('https://api.photon.codes/v1/projects/{id}/platforms/voice/lines/profile-assignments/batch', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.photon.codes/v1/projects/{id}/platforms/voice/lines/profile-assignments/batch",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'updates' => [
[
'expectedVersion' => 123,
'profileId' => '<string>',
'resourceId' => '<string>'
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.photon.codes/v1/projects/{id}/platforms/voice/lines/profile-assignments/batch"
payload := strings.NewReader("{\n \"updates\": [\n {\n \"expectedVersion\": 123,\n \"profileId\": \"<string>\",\n \"resourceId\": \"<string>\"\n }\n ]\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(string(body))
}HttpResponse<String> response = Unirest.post("https://api.photon.codes/v1/projects/{id}/platforms/voice/lines/profile-assignments/batch")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"updates\": [\n {\n \"expectedVersion\": 123,\n \"profileId\": \"<string>\",\n \"resourceId\": \"<string>\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.photon.codes/v1/projects/{id}/platforms/voice/lines/profile-assignments/batch")
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 \"updates\": [\n {\n \"expectedVersion\": 123,\n \"profileId\": \"<string>\",\n \"resourceId\": \"<string>\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"assignments": [
{
"projectId": "<string>",
"resourceId": "<string>",
"resourceVersion": 123,
"updatedAt": "2026-01-01T00:00:00.000Z",
"profileId": "<string>",
"profileVersion": 123
}
]
}{
"code": "NOT_AUTHENTICATED",
"status": 401,
"title": "Not Authenticated",
"type": "https://photon.codes/docs/problems/not-authenticated"
}{
"code": "FORBIDDEN",
"status": 403,
"title": "Forbidden",
"type": "https://photon.codes/docs/problems/forbidden"
}{
"code": "RESOURCE_NOT_FOUND",
"status": 404,
"title": "Resource Not Found",
"type": "https://photon.codes/docs/problems/resource-not-found"
}{
"code": "PROJECT_CLOSING",
"status": 409,
"title": "Project Is Closing",
"type": "https://photon.codes/docs/problems/project-closing"
}{
"code": "VALIDATION_FAILED",
"issues": [
{
"code": "invalid_type",
"location": "json",
"message": "Expected a string.",
"path": "/name"
}
],
"status": 422,
"title": "Request Validation Failed",
"type": "https://photon.codes/docs/problems/validation-failed"
}{
"code": "RATE_LIMITED",
"status": 429,
"title": "Too Many Requests",
"type": "https://photon.codes/docs/problems/rate-limited"
}{
"code": "INTERNAL_ERROR",
"status": 500,
"title": "Internal Server Error",
"type": "https://photon.codes/docs/problems/internal-error"
}{
"code": "UPSTREAM_FAILURE",
"status": 502,
"title": "Upstream Service Failure",
"type": "https://photon.codes/docs/problems/upstream-failure"
}{
"code": "UPSTREAM_UNAVAILABLE",
"status": 503,
"title": "Upstream Service Unavailable",
"type": "https://photon.codes/docs/problems/upstream-unavailable"
}{
"code": "REQUEST_TIMEOUT",
"status": 504,
"title": "Request Timeout",
"type": "https://photon.codes/docs/problems/request-timeout"
}Batch update Voice line assignments
Atomically sets additional-profile overrides or switches lines back to the project default for up to 100 Voice-capable lines. A null profileId means use the default. Every expected resource version must match or no line changes. Requires platforms:write bound to the path project.
curl --request POST \
--url https://api.photon.codes/v1/projects/{id}/platforms/voice/lines/profile-assignments/batch \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"updates": [
{
"expectedVersion": 123,
"profileId": "<string>",
"resourceId": "<string>"
}
]
}
'import requests
url = "https://api.photon.codes/v1/projects/{id}/platforms/voice/lines/profile-assignments/batch"
payload = { "updates": [
{
"expectedVersion": 123,
"profileId": "<string>",
"resourceId": "<string>"
}
] }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
updates: [{expectedVersion: 123, profileId: '<string>', resourceId: '<string>'}]
})
};
fetch('https://api.photon.codes/v1/projects/{id}/platforms/voice/lines/profile-assignments/batch', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.photon.codes/v1/projects/{id}/platforms/voice/lines/profile-assignments/batch",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'updates' => [
[
'expectedVersion' => 123,
'profileId' => '<string>',
'resourceId' => '<string>'
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.photon.codes/v1/projects/{id}/platforms/voice/lines/profile-assignments/batch"
payload := strings.NewReader("{\n \"updates\": [\n {\n \"expectedVersion\": 123,\n \"profileId\": \"<string>\",\n \"resourceId\": \"<string>\"\n }\n ]\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(string(body))
}HttpResponse<String> response = Unirest.post("https://api.photon.codes/v1/projects/{id}/platforms/voice/lines/profile-assignments/batch")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"updates\": [\n {\n \"expectedVersion\": 123,\n \"profileId\": \"<string>\",\n \"resourceId\": \"<string>\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.photon.codes/v1/projects/{id}/platforms/voice/lines/profile-assignments/batch")
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 \"updates\": [\n {\n \"expectedVersion\": 123,\n \"profileId\": \"<string>\",\n \"resourceId\": \"<string>\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"assignments": [
{
"projectId": "<string>",
"resourceId": "<string>",
"resourceVersion": 123,
"updatedAt": "2026-01-01T00:00:00.000Z",
"profileId": "<string>",
"profileVersion": 123
}
]
}{
"code": "NOT_AUTHENTICATED",
"status": 401,
"title": "Not Authenticated",
"type": "https://photon.codes/docs/problems/not-authenticated"
}{
"code": "FORBIDDEN",
"status": 403,
"title": "Forbidden",
"type": "https://photon.codes/docs/problems/forbidden"
}{
"code": "RESOURCE_NOT_FOUND",
"status": 404,
"title": "Resource Not Found",
"type": "https://photon.codes/docs/problems/resource-not-found"
}{
"code": "PROJECT_CLOSING",
"status": 409,
"title": "Project Is Closing",
"type": "https://photon.codes/docs/problems/project-closing"
}{
"code": "VALIDATION_FAILED",
"issues": [
{
"code": "invalid_type",
"location": "json",
"message": "Expected a string.",
"path": "/name"
}
],
"status": 422,
"title": "Request Validation Failed",
"type": "https://photon.codes/docs/problems/validation-failed"
}{
"code": "RATE_LIMITED",
"status": 429,
"title": "Too Many Requests",
"type": "https://photon.codes/docs/problems/rate-limited"
}{
"code": "INTERNAL_ERROR",
"status": 500,
"title": "Internal Server Error",
"type": "https://photon.codes/docs/problems/internal-error"
}{
"code": "UPSTREAM_FAILURE",
"status": 502,
"title": "Upstream Service Failure",
"type": "https://photon.codes/docs/problems/upstream-failure"
}{
"code": "UPSTREAM_UNAVAILABLE",
"status": 503,
"title": "Upstream Service Unavailable",
"type": "https://photon.codes/docs/problems/upstream-unavailable"
}{
"code": "REQUEST_TIMEOUT",
"status": 504,
"title": "Request Timeout",
"type": "https://photon.codes/docs/problems/request-timeout"
}Authorizations
Account Service Key, prefixed with pho_ask_, sent as Authorization: Bearer <key>. Acts on behalf of its owning account, subject to the permissions and credential restrictions of each operation. Account access tokens and OAuth grants also use the Bearer header. In organizations that require SSO, Account Service Keys are not accepted for managing the organization's SSO settings, deleting the organization, or checking whether it can be deleted.
Path Parameters
Body
1 - 100 elementsShow child attributes
Show child attributes
Response
The updated line profile assignments.
Show child attributes
Show child attributes
Was this page helpful?