5. Golden records and review
A Golden record is the single, combined version of one real-world thing, such as a customer or an invoice, built from the records your connected systems hold about it. Each value records which system it came from.
Changes to Golden records do not apply silently. They arrive as proposed changes, and a person or an approval policy decides them.
In the API a Golden record is identified by its entityClusterId.
Read Golden records
In the app, open Golden records.
From the API:
curl "https://api.inferrex.com/v1/unified/records?entity_type=customer" \
-H "X-API-Key: $INFERREX_API_KEY"
Shape of one record:
{
id: string;
entity_cluster_id: string;
entity_type: string;
version: number;
data: Record<string, unknown>;
source_attribution: Record<string, {
provider: string;
connectionId: string;
externalId?: string;
recordVersion: number;
observedAt: string;
strategy?: string;
ruleApplied?: boolean;
confidence?: number;
contested?: boolean;
}>;
quality_score: string;
field_count: number;
source_count: number;
redacted_fields: string[];
}
| To do this | Call | MCP tool |
|---|---|---|
| List Golden records | GET /v1/unified/records |
unified_api_unified_list_action |
| Read one | GET /v1/unified/records/:entityClusterId |
unified_api_unified_get_action |
| Read every field, with why each value was chosen | GET /v1/golden-records/:entityClusterId/fields |
unified_api_get_golden_record_fields |
| Trace one value to its source and onward | GET /v1/golden-records/:entityClusterId/lineage |
golden_record_get_golden_field_lineage |
| List the source records that make it up | GET /v1/golden-records/:entityClusterId/sources |
golden_record_listsources |
Decide which system is trusted
Every rule and role is keyed by the system's own connection id. Two accounts with the same vendor are two independent systems.
Source of truth
For each kind of Golden record, each system has a role: system_of_record, contributor, reference or receiver.
curl https://api.inferrex.com/v1/golden-records/source-roles \
-H "X-API-Key: $INFERREX_API_KEY"
The answer lists, for each kind, the systems that supply it or receive it, each with its role in force, who set it, Inferrex's recommendation with reasons from your own data, and any change waiting for approval.
Set a role:
curl -X POST https://api.inferrex.com/v1/golden-records/source-roles \
-H "X-API-Key: $INFERREX_API_KEY" \
-H "Content-Type: application/json" \
-d '{"connectionId": "CONNECTION_ID", "entityType": "customer", "role": "system_of_record", "choice": "confirm"}'
choice is confirm (the role you send), choose (another role) or not_sure (use Inferrex's recommendation, kept as unconfirmed). The change applies at once unless your workspace has an approval policy for source-of-truth changes and the change's risk is above it. Then it waits for approval and the role in force keeps deciding.
Field rules
With no rule for a field, the source of truth's own value wins. To decide one field differently, create a field authority rule at /v1/field-authority-rules with an entity_type, a field_name and a strategy: provider_wins, freshest, most_complete, most_accurate or manual.
A starting setup
GET /v1/golden-records/setup-suggestion suggests a starting setup worked out from the Golden records and proposed changes you already have. POST /v1/golden-records/setup-suggestion/apply applies it. Read the suggestion before you apply it.
Decide proposed changes
In the app, proposed changes are at Golden records, Changes, and in Review under Golden-record changes.
List the ones waiting:
curl "https://api.inferrex.com/v1/canonical-proposals?status=pending" \
-H "X-API-Key: $INFERREX_API_KEY"
A proposal's status is pending, approved, rejected or expired. Each carries a risk_level, the field_diffs it would make (fieldName, changeType, oldValue, newValue) and any conflicts between systems.
Read one in full before you decide: GET /v1/canonical-proposals/:id.
Approve:
curl -X POST https://api.inferrex.com/v1/canonical-proposals/PROPOSAL_ID/approve \
-H "X-API-Key: $INFERREX_API_KEY" \
-H "Content-Type: application/json" \
-d '{"notes": "Checked against the source record"}'
Reject (a reason is required, and nothing is written):
curl -X POST https://api.inferrex.com/v1/canonical-proposals/PROPOSAL_ID/reject \
-H "X-API-Key: $INFERREX_API_KEY" \
-H "Content-Type: application/json" \
-d '{"reason": "The older address is the correct one"}'
What approval does:
- When approvers are required, your approval is recorded and the change stays pending until every required approver has approved.
- The final approval applies it. Inferrex writes the Golden record and sends the change back to the systems it came from.
403means your role and teams fill none of the approver places still open.409means you have already approved it, it is no longer pending, or it is out of date. When a newer proposal exists for the same record,details.newerProposalIdnames it. Review that one instead.
POST /v1/canonical-proposals/bulk-approve approves several at once. Its answer says how many were approved, which still need other approvers, and which were skipped because applying them would roll a record back. Use it only for changes you have read.
Who must approve
Approval policies live at /v1/approval-policies and in the app at Workspace settings, Approval policies. A policy names the kind of change (entity_type), the conditions under which a change is approved automatically (auto_approve_conditions) and the required_approvers.
Merge, split, restore and archive
Edits to a Golden record are previewed, then proposed, then approved like any other change.
-
Preview:
curl -X POST https://api.inferrex.com/v1/golden-records/ENTITY_CLUSTER_ID/edit-preview \ -H "X-API-Key: $INFERREX_API_KEY" \ -H "Content-Type: application/json" \ -d '{"kind": "merge", "otherId": "OTHER_ENTITY_CLUSTER_ID"}'kindismerge,split,restoreorarchive. A split takesmove: the source records to move out, as/sourceslists them. When the edit cannot be done,allowedis false andrefusal.messagesays why. -
Propose:
POST /v1/golden-records/:entityClusterId/editswith the same body and an optionalnote. The answer is{ proposalId, status, riskLevel, riskReasons }. -
Decide it with the approve or reject call above.
A merge can be split back, a split merged back, and a restore archived again, each by another edit.
Send a Golden record back to its systems
POST /v1/golden-records/:entityClusterId/sync sends a Golden record's values back to the systems it was built from, so they all agree. Send { "fields": [...] } to limit it to particular fields. This writes to your systems. It runs in the background, and the answer says how many systems and fields it is updating.
Archived records and deletes
Golden records Inferrex no longer builds are archived, not deleted: GET /v1/golden-records/archived. Each system has a delete choice for what happens when a source deletes a record: keep, mark_deleted, delete_now or retention (PUT /v1/connections/:id/source-delete-action). GET /v1/golden-records/deletions lists the deletes passed on to destinations.
Review
Review is one queue for every decision that waits for a person. Its tabs are Safety stops, Sign-ins, Failed writes, Repair questions, Golden-record changes and Approvals.
From the API, the same items come from these routes:
| Waiting item | Read | Act |
|---|---|---|
| Safety stops | GET /v1/circuit-breakers |
POST /v1/circuit-breakers/:id/approve, /reject, /partial-approve, /hold-open or /force-close |
| Sign-ins | GET /v1/workspace/secrets/failing, GET /v1/connections/:id/sign-in-status |
Replace the credentials or sign in again (chapter 2) |
| Failed writes | GET /v1/quarantine |
Usually nothing: the next sync retries. POST /v1/pipelines/:id/quarantine/:quarantineId/release sends one held record once more |
| Repair questions | GET /v1/heals?status=open |
POST /v1/heals/:id/answer |
| Golden-record changes | GET /v1/canonical-proposals?status=pending |
POST /v1/canonical-proposals/:id/approve or /reject |
| Flow promotions | GET /v1/pipeline-promotions |
POST /v1/pipeline-promotions/:promotionId/approve or /reject |
| Flow changes | GET /v1/pipelines/:id/changes |
POST /v1/pipelines/:id/changes/:changeId/approve or /reject |
| Source-of-truth changes | GET /v1/golden-records/source-roles |
POST /v1/golden-records/source-roles/:id/approve or /reject |
| First loads | GET /v1/initial-loads |
POST /v1/initial-loads/:id/approve |
To say who is looking at an item: PUT /v1/workspace/review-assignments with { "itemKind": "...", "itemId": "...", "assignee": "me" }. Nothing about the item itself changes.
Chapter 6 explains safety stops, failed writes and repairs.
Next: watch and health.