curl --request PATCH \
--url https://api.example.com/v1/connections/data/{connection_id}/config \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"config": {
"health_probe": "/services/rest/record/v1/metadata-catalog"
},
"if_match_updated_at": "<string>"
}
'import requests
url = "https://api.example.com/v1/connections/data/{connection_id}/config"
payload = {
"config": { "health_probe": "/services/rest/record/v1/metadata-catalog" },
"if_match_updated_at": "<string>"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
config: {health_probe: '/services/rest/record/v1/metadata-catalog'},
if_match_updated_at: '<string>'
})
};
fetch('https://api.example.com/v1/connections/data/{connection_id}/config', 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.example.com/v1/connections/data/{connection_id}/config",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'config' => [
'health_probe' => '/services/rest/record/v1/metadata-catalog'
],
'if_match_updated_at' => '<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.example.com/v1/connections/data/{connection_id}/config"
payload := strings.NewReader("{\n \"config\": {\n \"health_probe\": \"/services/rest/record/v1/metadata-catalog\"\n },\n \"if_match_updated_at\": \"<string>\"\n}")
req, _ := http.NewRequest("PATCH", 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.patch("https://api.example.com/v1/connections/data/{connection_id}/config")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"config\": {\n \"health_probe\": \"/services/rest/record/v1/metadata-catalog\"\n },\n \"if_match_updated_at\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/v1/connections/data/{connection_id}/config")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"config\": {\n \"health_probe\": \"/services/rest/record/v1/metadata-catalog\"\n },\n \"if_match_updated_at\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"type": "<string>",
"title": "<string>",
"status": 123,
"detail": "<string>",
"code": "<string>",
"request_id": "<string>"
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"detail": "<string>",
"code": "<string>",
"request_id": "<string>"
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"detail": "<string>",
"code": "<string>",
"request_id": "<string>"
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"detail": "<string>",
"code": "<string>",
"request_id": "<string>"
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"detail": "<string>",
"code": "<string>",
"request_id": "<string>"
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"detail": "<string>",
"code": "<string>",
"request_id": "<string>"
}Update connection settings
Change a connection’s non-secret settings without supplying its credentials.
The sibling of PATCH .../snapshot-config: that route carries the snapshot policy, this
one the connector’s own settings. Neither body has a secrets field, so a credential
cannot be sent, logged, or named in a generated tool schema. Data Management rebuilds the
credential set from the stored references to satisfy validators that require one (NetSuite
TBA, Snowflake, Databricks …), so a settings-only change never needs the credential resent.
Send if_match_updated_at carrying the connection’s current updatedAt (from
GET /v1/connections/data/{connection_id}) and the write is refused with 412 if the
connection changed since: the update sends a whole config object, so without a precondition
two concurrent callers would each silently replace the other’s change.
Merges rather than replaces: omitted keys keep their stored values and a null value clears
one key, except where the connection needs that key to work. Accepts only settings marked patchable_without_secret by
GET /v1/connections/data/types/{type} — those that select something inside an
already-authenticated account (a database, region, port, probe path). Settings that hold a
credential, name the host, choose the auth mode, or protect the connection in transit are
refused, and stay on PATCH /v1/connections/data/{connection_id} where the caller is
expected to supply the credential matching the new target.
curl --request PATCH \
--url https://api.example.com/v1/connections/data/{connection_id}/config \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"config": {
"health_probe": "/services/rest/record/v1/metadata-catalog"
},
"if_match_updated_at": "<string>"
}
'import requests
url = "https://api.example.com/v1/connections/data/{connection_id}/config"
payload = {
"config": { "health_probe": "/services/rest/record/v1/metadata-catalog" },
"if_match_updated_at": "<string>"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
config: {health_probe: '/services/rest/record/v1/metadata-catalog'},
if_match_updated_at: '<string>'
})
};
fetch('https://api.example.com/v1/connections/data/{connection_id}/config', 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.example.com/v1/connections/data/{connection_id}/config",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'config' => [
'health_probe' => '/services/rest/record/v1/metadata-catalog'
],
'if_match_updated_at' => '<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.example.com/v1/connections/data/{connection_id}/config"
payload := strings.NewReader("{\n \"config\": {\n \"health_probe\": \"/services/rest/record/v1/metadata-catalog\"\n },\n \"if_match_updated_at\": \"<string>\"\n}")
req, _ := http.NewRequest("PATCH", 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.patch("https://api.example.com/v1/connections/data/{connection_id}/config")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"config\": {\n \"health_probe\": \"/services/rest/record/v1/metadata-catalog\"\n },\n \"if_match_updated_at\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/v1/connections/data/{connection_id}/config")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"config\": {\n \"health_probe\": \"/services/rest/record/v1/metadata-catalog\"\n },\n \"if_match_updated_at\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"type": "<string>",
"title": "<string>",
"status": 123,
"detail": "<string>",
"code": "<string>",
"request_id": "<string>"
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"detail": "<string>",
"code": "<string>",
"request_id": "<string>"
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"detail": "<string>",
"code": "<string>",
"request_id": "<string>"
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"detail": "<string>",
"code": "<string>",
"request_id": "<string>"
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"detail": "<string>",
"code": "<string>",
"request_id": "<string>"
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"detail": "<string>",
"code": "<string>",
"request_id": "<string>"
}Authorizations
The access token received from the authorization server in the OAuth 2.0 flow.
Path Parameters
Body
Non-secret connector settings on their own, with no field that can carry a credential.
The sibling of ConnectionSnapshotConfigRequest: that one carries the snapshot policy,
this one the connector's own settings. Both exist because the combined connection PATCH
accepts secrets and so stays off the agent surface — which also withheld settings that
hold no credential at all, such as an HTTP connection's health_probe.
Which keys are accepted is not written here: it is ConnectorField.patchable_without_secret
in the connector registry, so the answer travels with the field definition rather than a
list that a rename could silently fall out of.
Settings to change, MERGED into the stored config — omitted keys keep their values, and a null value clears one key. (Unlike snapshot_config, which replaces in full.) Only settings that neither hold a credential nor change how the connection authenticates are accepted; GET /v1/connections/data/types/{type} marks each one patchable_without_secret. Re-pointing the connection at a different host, changing its auth mode, or weakening its transport security stay on the credentialed route.
{
"health_probe": "/services/rest/record/v1/metadata-catalog"
}
The connection's current updatedAt, from GET /v1/connections/data/{connection_id}. When given, this write is refused with 412 if the connection changed since that read, so it cannot overwrite an edit made in between. Omitted, the write applies unconditionally.
Response
Successful Response