curl --request PUT \
--url https://api.getdialed.ai/v1/credentials/{credential_id} \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"auth_method": "basic_auth",
"credentials": {
"password": "REPLACE_ME",
"username": "api_user@example"
},
"name": "Five9 Production",
"platform_id": "five9",
"status": "active"
}
'import requests
url = "https://api.getdialed.ai/v1/credentials/{credential_id}"
payload = {
"auth_method": "basic_auth",
"credentials": {
"password": "REPLACE_ME",
"username": "api_user@example"
},
"name": "Five9 Production",
"platform_id": "five9",
"status": "active"
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
auth_method: 'basic_auth',
credentials: {password: 'REPLACE_ME', username: 'api_user@example'},
name: 'Five9 Production',
platform_id: 'five9',
status: 'active'
})
};
fetch('https://api.getdialed.ai/v1/credentials/{credential_id}', 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.getdialed.ai/v1/credentials/{credential_id}",
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([
'auth_method' => 'basic_auth',
'credentials' => [
'password' => 'REPLACE_ME',
'username' => 'api_user@example'
],
'name' => 'Five9 Production',
'platform_id' => 'five9',
'status' => 'active'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <api-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.getdialed.ai/v1/credentials/{credential_id}"
payload := strings.NewReader("{\n \"auth_method\": \"basic_auth\",\n \"credentials\": {\n \"password\": \"REPLACE_ME\",\n \"username\": \"api_user@example\"\n },\n \"name\": \"Five9 Production\",\n \"platform_id\": \"five9\",\n \"status\": \"active\"\n}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
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.getdialed.ai/v1/credentials/{credential_id}")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"auth_method\": \"basic_auth\",\n \"credentials\": {\n \"password\": \"REPLACE_ME\",\n \"username\": \"api_user@example\"\n },\n \"name\": \"Five9 Production\",\n \"platform_id\": \"five9\",\n \"status\": \"active\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.getdialed.ai/v1/credentials/{credential_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"auth_method\": \"basic_auth\",\n \"credentials\": {\n \"password\": \"REPLACE_ME\",\n \"username\": \"api_user@example\"\n },\n \"name\": \"Five9 Production\",\n \"platform_id\": \"five9\",\n \"status\": \"active\"\n}"
response = http.request(request)
puts response.read_body{
"auth_method": "basic_auth",
"created_at": "2026-08-01T12:00:00Z",
"created_by": "user_11223344",
"credentials_ref": "getdialed/acme/five9/cred_e5f6g7h8",
"id": "cred_e5f6g7h8",
"last_verified": "2026-08-22T09:00:00Z",
"name": "Five9 Production",
"org_id": "org_a1b2c3d4",
"platform_id": "five9",
"scopes": [],
"status": "active",
"telemetry": {
"five9__configuration_service": {
"last_stamped_at": "2026-08-22T09:00:00Z",
"last_succeeded_at": "2026-08-22T09:00:00Z",
"last_used_at": "2026-08-22T09:00:00Z"
}
},
"tenancy_id": "ten_1a2b3c4d5e6f7890",
"tenant": {
"id": "ten_1a2b3c4d5e6f7890",
"is_manual": false,
"label": "Acme VCC",
"platform_id": "five9"
}
}{
"detail": "platform_id cannot be changed on an existing credential. The stored provider account, the credential's identity and the shape of the stored secret all belong to one platform. Create a credential for the other platform instead."
}{
"detail": "Authentication required"
}{
"detail": "Admin role required"
}{
"detail": "Credential not found"
}{
"detail": "The new material belongs to a different provider account or identity than this credential is bound to. Create a separate credential for it instead of rotating this one."
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}{
"detail": "Rate limit exceeded: 100 per 1 minute"
}Update a credential
Update a credential’s name, status and authentication configuration. Admin only.
Supply credentials to ROTATE the stored secret. The new material replaces the old in place: the credential keeps its id and keeps pointing at the same stored secret, so every flow that uses this credential picks the new material up with no flow edit, no re-selection and no redeployment. Running workers refresh their cached copy within five minutes.
Rotating an OAuth2 credential also clears its cached access token, so the next run fetches a fresh token with the new material. Tokens the provider has already issued are not revoked here and remain valid until they expire on the provider’s own schedule.
Rotation keeps the credential’s provider-account binding, so the new material must belong to the same provider account and identity as the old. When the platform can identify the account credentials belong to, the new material is verified against it during the rotation: material that resolves to a different account or identity is refused with a 409 — create a separate credential for it instead.
Rotating clears the credential’s last verification time, because the recorded check described the previous material. Run a test to record a fresh one.
platform_id must match the stored value — a credential belongs to one platform for its whole life. Server-managed fields (the provider account binding, the stored-secret pointer, the observed-use record) cannot be set from a request body and are preserved. Cross-tenant access returns 404.
curl --request PUT \
--url https://api.getdialed.ai/v1/credentials/{credential_id} \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"auth_method": "basic_auth",
"credentials": {
"password": "REPLACE_ME",
"username": "api_user@example"
},
"name": "Five9 Production",
"platform_id": "five9",
"status": "active"
}
'import requests
url = "https://api.getdialed.ai/v1/credentials/{credential_id}"
payload = {
"auth_method": "basic_auth",
"credentials": {
"password": "REPLACE_ME",
"username": "api_user@example"
},
"name": "Five9 Production",
"platform_id": "five9",
"status": "active"
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
auth_method: 'basic_auth',
credentials: {password: 'REPLACE_ME', username: 'api_user@example'},
name: 'Five9 Production',
platform_id: 'five9',
status: 'active'
})
};
fetch('https://api.getdialed.ai/v1/credentials/{credential_id}', 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.getdialed.ai/v1/credentials/{credential_id}",
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([
'auth_method' => 'basic_auth',
'credentials' => [
'password' => 'REPLACE_ME',
'username' => 'api_user@example'
],
'name' => 'Five9 Production',
'platform_id' => 'five9',
'status' => 'active'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <api-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.getdialed.ai/v1/credentials/{credential_id}"
payload := strings.NewReader("{\n \"auth_method\": \"basic_auth\",\n \"credentials\": {\n \"password\": \"REPLACE_ME\",\n \"username\": \"api_user@example\"\n },\n \"name\": \"Five9 Production\",\n \"platform_id\": \"five9\",\n \"status\": \"active\"\n}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
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.getdialed.ai/v1/credentials/{credential_id}")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"auth_method\": \"basic_auth\",\n \"credentials\": {\n \"password\": \"REPLACE_ME\",\n \"username\": \"api_user@example\"\n },\n \"name\": \"Five9 Production\",\n \"platform_id\": \"five9\",\n \"status\": \"active\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.getdialed.ai/v1/credentials/{credential_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"auth_method\": \"basic_auth\",\n \"credentials\": {\n \"password\": \"REPLACE_ME\",\n \"username\": \"api_user@example\"\n },\n \"name\": \"Five9 Production\",\n \"platform_id\": \"five9\",\n \"status\": \"active\"\n}"
response = http.request(request)
puts response.read_body{
"auth_method": "basic_auth",
"created_at": "2026-08-01T12:00:00Z",
"created_by": "user_11223344",
"credentials_ref": "getdialed/acme/five9/cred_e5f6g7h8",
"id": "cred_e5f6g7h8",
"last_verified": "2026-08-22T09:00:00Z",
"name": "Five9 Production",
"org_id": "org_a1b2c3d4",
"platform_id": "five9",
"scopes": [],
"status": "active",
"telemetry": {
"five9__configuration_service": {
"last_stamped_at": "2026-08-22T09:00:00Z",
"last_succeeded_at": "2026-08-22T09:00:00Z",
"last_used_at": "2026-08-22T09:00:00Z"
}
},
"tenancy_id": "ten_1a2b3c4d5e6f7890",
"tenant": {
"id": "ten_1a2b3c4d5e6f7890",
"is_manual": false,
"label": "Acme VCC",
"platform_id": "five9"
}
}{
"detail": "platform_id cannot be changed on an existing credential. The stored provider account, the credential's identity and the shape of the stored secret all belong to one platform. Create a credential for the other platform instead."
}{
"detail": "Authentication required"
}{
"detail": "Admin role required"
}{
"detail": "Credential not found"
}{
"detail": "The new material belongs to a different provider account or identity than this credential is bound to. Create a separate credential for it instead of rotating this one."
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}{
"detail": "Rate limit exceeded: 100 per 1 minute"
}Authorizations
Path Parameters
Body
basic_auth, api_key, jwt, oauth2, aws_access_key Where an API-key credential puts its key.
This is presentation configuration, not secret material: it holds the header
NAME (and optionally a scheme such as Bearer prefixed to the value), or the
query-parameter NAME. A form renders straight from it.
It is declared ONCE, on the credential, so every task that selects this
credential injects the key identically and no task configuration ever
mentions authentication. Exactly one of header_name or query_param is
set; scheme is legal only alongside header_name.
Show child attributes
Show child attributes
active, expired, revoked Response
Successful Response
The provider account or customer-named tenant this credential belongs to.
Show child attributes
Show child attributes
{
"id": "ten_1a2b3c4d5e6f7890",
"is_manual": false,
"label": "Acme VCC",
"platform_id": "five9"
}
Where an API-key credential puts its key.
This is presentation configuration, not secret material: it holds the header
NAME (and optionally a scheme such as Bearer prefixed to the value), or the
query-parameter NAME. A form renders straight from it.
It is declared ONCE, on the credential, so every task that selects this
credential injects the key identically and no task configuration ever
mentions authentication. Exactly one of header_name or query_param is
set; scheme is legal only alongside header_name.
Show child attributes
Show child attributes
Show child attributes
Show child attributes