Verify and apply a staged relationship decision
Requires a saved pending relationship decision and a completed same-connection dry_run started after staging that includes relationship objects. The matching inbound preview event must prove the exact source relationship payload and both donor identities. Rechecks pending fingerprint, mappings and available candidates under lock before applying. keep_separate may create/adopt a forward/reverse relationship pair; choose_relationship links the selected available pair. No provider write or donor merge occurs. Requires the integration platform global/configured client feature gate (normally integration_platform_foundation). Requires permission: one of access_account_settings.
curl --request POST \
--url https://api.gratona.com/v1/integrations/hub/conflicts/{conflict_id}/verify-relationship-identity \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"sync_run_id": 1
}
'import requests
url = "https://api.gratona.com/v1/integrations/hub/conflicts/{conflict_id}/verify-relationship-identity"
payload = { "sync_run_id": 1 }
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({sync_run_id: 1})
};
fetch('https://api.gratona.com/v1/integrations/hub/conflicts/{conflict_id}/verify-relationship-identity', 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.gratona.com/v1/integrations/hub/conflicts/{conflict_id}/verify-relationship-identity",
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([
'sync_run_id' => 1
]),
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.gratona.com/v1/integrations/hub/conflicts/{conflict_id}/verify-relationship-identity"
payload := strings.NewReader("{\n \"sync_run_id\": 1\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.gratona.com/v1/integrations/hub/conflicts/{conflict_id}/verify-relationship-identity")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"sync_run_id\": 1\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.gratona.com/v1/integrations/hub/conflicts/{conflict_id}/verify-relationship-identity")
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 \"sync_run_id\": 1\n}"
response = http.request(request)
puts response.read_body{
"status": "success",
"data": {
"id": 2,
"provider_key": "Example",
"conflict_type": "Example",
"status": "Example",
"hys_object_type": "Example",
"hys_object_id": 42,
"provider_object_type": "Example",
"provider_object_id": 42,
"conflicted_fields_json": {},
"hys_snapshot_json": {},
"provider_snapshot_json": {},
"detected_at": "2026-10-20T12:00:00Z",
"resolved_at": "2026-10-20T12:00:00Z",
"resolved_by": 42,
"resolution_json": {},
"relationship_identity": {
"kind": "relationship_identity",
"collision_reason": "Example",
"source": {
"provider_object_type": "Example",
"provider_object_id": "Example",
"source_provider_id": "Example",
"related_provider_id": "Example",
"source_name": "Example",
"related_name": "Example",
"relationship_type": "Example",
"reverse_relationship_type": "Example"
},
"current_mapping": {
"id": 42,
"hys_relationship_id": 42
},
"can_keep_separate": true,
"keep_separate_will_create": true,
"can_treat_as_same_or_reverse": true,
"expected_object_mapping_id": 42,
"stale_mapping_token": "<string>",
"pending_resolution": {
"decision": "Example",
"target_hys_object_id": 42,
"staged_at": "2023-11-07T05:31:56Z",
"verification_status": "Example"
},
"candidates": [
{
"id": 42,
"source_name": "Example",
"related_name": "Example",
"relationship_type": "Example",
"is_current": true,
"available": true
}
]
},
"recurring_schedule": {
"kind": "recurring_schedule",
"source": {
"provider_object_type": "Example",
"provider_object_id": "Example",
"donor_provider_id": "Example",
"currency": "Example",
"frequency": "Example",
"start_date": "Example",
"end_date": "Example",
"status": "Example",
"last_modified_at": "Example",
"amount": 125
},
"matched_donor": {
"id": 42,
"name": "Example"
},
"active_commitments": [
{
"id": 42,
"amount": 125,
"frequency": "Example",
"is_non_charging": true,
"is_external_processor": true
}
],
"active_commitment_count": 2,
"active_commitment_total": 125,
"mapped_commitment": {
"id": 42,
"amount": 125,
"frequency": "Example",
"is_non_charging": true,
"is_external_processor": true,
"mapping_id": 42
},
"can_mark_already_represented": true,
"expected_provider_object_id": "Example",
"source_snapshot_token": "<string>",
"active_commitment_token": "<string>"
}
},
"message": "Example"
}{
"message": "Unauthorized",
"status": "error"
}{
"message": "Not Found",
"status": "error"
}{
"errors": {},
"status": "error",
"message": "The given data was invalid."
}Authorizations
Passport bearer token authentication for legacy admin sessions.
Path Parameters
Conflict id in the current organization.
Body
Validated request fields for this operation.
Sync run id. Validation: required, integer, min:1.
x >= 11
Response
Operation result.
"success"
Conflict snapshots and optional domain-specific relationship identity/recurring schedule review details. Specialized resolution contracts are documented on their operations.
Show child attributes
Show child attributes
Operation receipt; inspect returned conflict status and resolution details.
"Example"
curl --request POST \
--url https://api.gratona.com/v1/integrations/hub/conflicts/{conflict_id}/verify-relationship-identity \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"sync_run_id": 1
}
'import requests
url = "https://api.gratona.com/v1/integrations/hub/conflicts/{conflict_id}/verify-relationship-identity"
payload = { "sync_run_id": 1 }
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({sync_run_id: 1})
};
fetch('https://api.gratona.com/v1/integrations/hub/conflicts/{conflict_id}/verify-relationship-identity', 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.gratona.com/v1/integrations/hub/conflicts/{conflict_id}/verify-relationship-identity",
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([
'sync_run_id' => 1
]),
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.gratona.com/v1/integrations/hub/conflicts/{conflict_id}/verify-relationship-identity"
payload := strings.NewReader("{\n \"sync_run_id\": 1\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.gratona.com/v1/integrations/hub/conflicts/{conflict_id}/verify-relationship-identity")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"sync_run_id\": 1\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.gratona.com/v1/integrations/hub/conflicts/{conflict_id}/verify-relationship-identity")
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 \"sync_run_id\": 1\n}"
response = http.request(request)
puts response.read_body{
"status": "success",
"data": {
"id": 2,
"provider_key": "Example",
"conflict_type": "Example",
"status": "Example",
"hys_object_type": "Example",
"hys_object_id": 42,
"provider_object_type": "Example",
"provider_object_id": 42,
"conflicted_fields_json": {},
"hys_snapshot_json": {},
"provider_snapshot_json": {},
"detected_at": "2026-10-20T12:00:00Z",
"resolved_at": "2026-10-20T12:00:00Z",
"resolved_by": 42,
"resolution_json": {},
"relationship_identity": {
"kind": "relationship_identity",
"collision_reason": "Example",
"source": {
"provider_object_type": "Example",
"provider_object_id": "Example",
"source_provider_id": "Example",
"related_provider_id": "Example",
"source_name": "Example",
"related_name": "Example",
"relationship_type": "Example",
"reverse_relationship_type": "Example"
},
"current_mapping": {
"id": 42,
"hys_relationship_id": 42
},
"can_keep_separate": true,
"keep_separate_will_create": true,
"can_treat_as_same_or_reverse": true,
"expected_object_mapping_id": 42,
"stale_mapping_token": "<string>",
"pending_resolution": {
"decision": "Example",
"target_hys_object_id": 42,
"staged_at": "2023-11-07T05:31:56Z",
"verification_status": "Example"
},
"candidates": [
{
"id": 42,
"source_name": "Example",
"related_name": "Example",
"relationship_type": "Example",
"is_current": true,
"available": true
}
]
},
"recurring_schedule": {
"kind": "recurring_schedule",
"source": {
"provider_object_type": "Example",
"provider_object_id": "Example",
"donor_provider_id": "Example",
"currency": "Example",
"frequency": "Example",
"start_date": "Example",
"end_date": "Example",
"status": "Example",
"last_modified_at": "Example",
"amount": 125
},
"matched_donor": {
"id": 42,
"name": "Example"
},
"active_commitments": [
{
"id": 42,
"amount": 125,
"frequency": "Example",
"is_non_charging": true,
"is_external_processor": true
}
],
"active_commitment_count": 2,
"active_commitment_total": 125,
"mapped_commitment": {
"id": 42,
"amount": 125,
"frequency": "Example",
"is_non_charging": true,
"is_external_processor": true,
"mapping_id": 42
},
"can_mark_already_represented": true,
"expected_provider_object_id": "Example",
"source_snapshot_token": "<string>",
"active_commitment_token": "<string>"
}
},
"message": "Example"
}{
"message": "Unauthorized",
"status": "error"
}{
"message": "Not Found",
"status": "error"
}{
"errors": {},
"status": "error",
"message": "The given data was invalid."
}