curl --request PUT \
--url https://api.photon.codes/v1/projects/{id}/platforms/voice/profiles/{profileId}/outbound \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--data '
{
"authentication": {},
"expectedVersion": 123
}
'import requests
url = "https://api.photon.codes/v1/projects/{id}/platforms/voice/profiles/{profileId}/outbound"
payload = {
"authentication": {},
"expectedVersion": 123
}
headers = {
"Idempotency-Key": "<idempotency-key>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {
'Idempotency-Key': '<idempotency-key>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({authentication: {}, expectedVersion: 123})
};
fetch('https://api.photon.codes/v1/projects/{id}/platforms/voice/profiles/{profileId}/outbound', 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/profiles/{profileId}/outbound",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'authentication' => [
],
'expectedVersion' => 123
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"Idempotency-Key: <idempotency-key>"
],
]);
$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/profiles/{profileId}/outbound"
payload := strings.NewReader("{\n \"authentication\": {},\n \"expectedVersion\": 123\n}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("Idempotency-Key", "<idempotency-key>")
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.put("https://api.photon.codes/v1/projects/{id}/platforms/voice/profiles/{profileId}/outbound")
.header("Idempotency-Key", "<idempotency-key>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"authentication\": {},\n \"expectedVersion\": 123\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.photon.codes/v1/projects/{id}/platforms/voice/profiles/{profileId}/outbound")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Idempotency-Key"] = '<idempotency-key>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"authentication\": {},\n \"expectedVersion\": 123\n}"
response = http.request(request)
puts response.read_body{
"outbound": {
"authentication": {
"algorithm": "sha-256",
"previousPasswordValidUntil": "2026-01-01T00:00:00.000Z",
"username": "<string>",
"validFrom": "2026-01-01T00:00:00.000Z"
},
"connection": {
"endpoints": [
{
"host": "<string>",
"port": 32768,
"transport": "udp"
}
],
"realm": "<string>"
}
},
"password": "<string>",
"profileVersion": 123
}{
"outbound": {
"authentication": {
"algorithm": "sha-256",
"previousPasswordValidUntil": "2026-01-01T00:00:00.000Z",
"username": "<string>",
"validFrom": "2026-01-01T00:00:00.000Z"
},
"connection": {
"endpoints": [
{
"host": "<string>",
"port": 32768,
"transport": "udp"
}
],
"realm": "<string>"
}
},
"password": "<string>",
"profileVersion": 123
}{
"code": "IDEMPOTENCY_KEY_REQUIRED",
"status": 400,
"title": "Idempotency Key Required",
"type": "https://photon.codes/docs/problems/idempotency-key-required"
}{
"code": "NOT_AUTHENTICATED",
"status": 401,
"title": "Not Authenticated",
"type": "https://photon.codes/docs/problems/not-authenticated"
}{
"code": "ENTITLEMENT_REQUIRED",
"reason": "card_required",
"status": 402,
"title": "Entitlement Required",
"type": "https://photon.codes/docs/problems/entitlement-required"
}{
"code": "FORBIDDEN",
"status": 403,
"title": "Forbidden",
"type": "https://photon.codes/docs/problems/forbidden"
}{
"code": "VOICE_PROFILE_NOT_FOUND",
"status": 404,
"title": "Voice Profile Not Found",
"type": "https://photon.codes/docs/problems/voice-profile-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"
}Configure Voice outbound credential
Configures a SIP credential for outbound calls from a profile when the shared profile version matches. Outbound calls are paid usage, so the organization needs a payment method and no invoices overdue 7 days or more; otherwise this returns 402 ENTITLEMENT_REQUIRED with a reason. authentication.algorithm is required: SHA-256 is recommended, while MD5 is a weaker legacy option supported over UDP, TCP, and TLS; TLS is strongly recommended because UDP and TCP do not encrypt SIP signaling. The profileId may identify the default or an additional profile. The new password is returned once and is never recoverable. Requires platforms:write bound to the path project.
curl --request PUT \
--url https://api.photon.codes/v1/projects/{id}/platforms/voice/profiles/{profileId}/outbound \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--data '
{
"authentication": {},
"expectedVersion": 123
}
'import requests
url = "https://api.photon.codes/v1/projects/{id}/platforms/voice/profiles/{profileId}/outbound"
payload = {
"authentication": {},
"expectedVersion": 123
}
headers = {
"Idempotency-Key": "<idempotency-key>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {
'Idempotency-Key': '<idempotency-key>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({authentication: {}, expectedVersion: 123})
};
fetch('https://api.photon.codes/v1/projects/{id}/platforms/voice/profiles/{profileId}/outbound', 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/profiles/{profileId}/outbound",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'authentication' => [
],
'expectedVersion' => 123
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"Idempotency-Key: <idempotency-key>"
],
]);
$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/profiles/{profileId}/outbound"
payload := strings.NewReader("{\n \"authentication\": {},\n \"expectedVersion\": 123\n}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("Idempotency-Key", "<idempotency-key>")
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.put("https://api.photon.codes/v1/projects/{id}/platforms/voice/profiles/{profileId}/outbound")
.header("Idempotency-Key", "<idempotency-key>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"authentication\": {},\n \"expectedVersion\": 123\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.photon.codes/v1/projects/{id}/platforms/voice/profiles/{profileId}/outbound")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Idempotency-Key"] = '<idempotency-key>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"authentication\": {},\n \"expectedVersion\": 123\n}"
response = http.request(request)
puts response.read_body{
"outbound": {
"authentication": {
"algorithm": "sha-256",
"previousPasswordValidUntil": "2026-01-01T00:00:00.000Z",
"username": "<string>",
"validFrom": "2026-01-01T00:00:00.000Z"
},
"connection": {
"endpoints": [
{
"host": "<string>",
"port": 32768,
"transport": "udp"
}
],
"realm": "<string>"
}
},
"password": "<string>",
"profileVersion": 123
}{
"outbound": {
"authentication": {
"algorithm": "sha-256",
"previousPasswordValidUntil": "2026-01-01T00:00:00.000Z",
"username": "<string>",
"validFrom": "2026-01-01T00:00:00.000Z"
},
"connection": {
"endpoints": [
{
"host": "<string>",
"port": 32768,
"transport": "udp"
}
],
"realm": "<string>"
}
},
"password": "<string>",
"profileVersion": 123
}{
"code": "IDEMPOTENCY_KEY_REQUIRED",
"status": 400,
"title": "Idempotency Key Required",
"type": "https://photon.codes/docs/problems/idempotency-key-required"
}{
"code": "NOT_AUTHENTICATED",
"status": 401,
"title": "Not Authenticated",
"type": "https://photon.codes/docs/problems/not-authenticated"
}{
"code": "ENTITLEMENT_REQUIRED",
"reason": "card_required",
"status": 402,
"title": "Entitlement Required",
"type": "https://photon.codes/docs/problems/entitlement-required"
}{
"code": "FORBIDDEN",
"status": 403,
"title": "Forbidden",
"type": "https://photon.codes/docs/problems/forbidden"
}{
"code": "VOICE_PROFILE_NOT_FOUND",
"status": 404,
"title": "Voice Profile Not Found",
"type": "https://photon.codes/docs/problems/voice-profile-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.
Headers
Identifies one logical mutation across retries.
1 - 255^[\x21-\x7e]{1,255}$Body
Was this page helpful?