On this page
Roles and data access
Understand operation permissions together with entity and row access for users and tokens.
Roles and capabilities
Golden authorizes users and access tokens with three built-in roles. An identity can hold more than one role; the permissions from its assigned roles are combined.
Golden does not support custom roles or individual permission keys. Use the built-in role set that gives the caller the least access its workflow needs.
Roles are global; access to data is not. A role says what kind of operation a caller may perform. A data scope says which entities, and which rows of an entity, they may perform it on. Both have to permit an operation for it to succeed.
A STEWARD granted one entity is still a steward — scoping narrows where the
role applies, never what it may do. Administrators are not scoped.
Built-in roles
| Role | Customer-visible scope | Typical holder |
|---|---|---|
VIEWER | Read permitted entities, tables, records, duplicate candidates, and data context | Business users and read-only integrations |
STEWARD | All viewer access, plus supported duplicate decisions and record audit events | Data stewards |
ADMIN | Configuration, users, tokens, entities, resources, tables, tasks, schedules, and all steward operations | Product administrators |
The important boundary is that STEWARD is not a configuration administrator.
Creating entities or tables, saving resources, running table data operations,
and managing task schedules require ADMIN.
Common operations by role
| Operation | VIEWER | STEWARD | ADMIN |
|---|---|---|---|
| Search records and inspect table data | Yes | Yes | Yes |
| Read permitted entity and table definitions through the API | Yes | Yes | Yes |
| Inspect duplicate buckets and clusters | Yes | Yes | Yes |
| Merge, disconnect, or delete a candidate group | No | Yes | Yes |
| Ignore or restore an ignored group | No | No | Yes |
| Read record audit events | No | Yes | Yes |
| Upload and manage files | No | No | Yes |
| List resource inventory | No | No | Yes |
| Read or describe resource definitions | No | No | Yes |
| Resolve a data view or read permitted resource enumerations | Yes | Yes | Yes |
| Read product events and event statistics | No | No | Yes |
| Resolve an escalated duplicate case | No | No | Yes |
| Create or change entities, tables, and resources | No | No | Yes |
| Run table loads, transformations, or exports | No | No | Yes |
| View and manage tasks and schedules | No | No | Yes |
| Manage users and access tokens | No | No | Yes |
This table summarizes the supported surface. Confirm the documented operation and, where enabled, the running environment’s interactive explorer for the target release.
Access to entity records and duplicate groups is additionally subject to the caller’s data scope. Global operations such as file management retain their role requirements. An entity granted to nobody is visible to nobody but an administrator, whatever role the caller holds.
Choose roles for integrations
| Integration behavior | Suitable role |
|---|---|
| Search or read records | VIEWER |
| Apply duplicate-review decisions | STEWARD |
| Upsert or delete individual Golden records | STEWARD |
| Run entity synchronization or change configuration | ADMIN |
Do not assign ADMIN to a read-only integration for convenience. If one
workflow needs both reading and administration, consider separate tokens so the
routine read path does not carry administrative access.
Verify the assigned roles
Call GET /api/security/whoami with the credential you plan to use. The
response identifies the caller type and its roles set.
Then call GET /api/data-scopes/me with the same credential to see which
entities and rows it reaches. A 403 and an empty result are different
diagnoses: a 403 means the role does not permit the operation, while an
empty or missing result usually means the data scope does not reach that
data.
Data access
A role says what kind of operation a caller may perform. A data scope says which data they may perform it on. The two are independent, and both have to permit an operation for it to succeed.
Managing data scopes requires ADMIN, in Administration → Data access or
through /api/data-scopes and /api/entities/{entity}/access.
The two levels
| Grant | Effect |
|---|---|
| Whole entity | The principal sees every record of that entity |
| Rows of an entity | The principal sees only the records whose scope column holds one of the granted values |
An entity that has been granted to nobody is visible to nobody but an administrator. Golden is explicit about that rather than showing an empty screen:
Nothing here has been granted to you. Golden shows an entity — and its tables, its records and its duplicates — only when it has been granted to you. It is not a fault of your account and nothing on this screen can change it: an administrator grants access on each entity.
A denied read reports the same sentence for a record as for an entity: “This is not available to you. Either it is not there, or it has not been granted to you.” That ambiguity is deliberate — it keeps the existence of a record from leaking to somebody who cannot see it.
Grant access to an entity
Read who currently has it:
curl --fail-with-body --silent --show-error \
--header "Authorization: Bearer ${GOLDEN_ADMIN_TOKEN}" \
"${GOLDEN_URL}/api/entities/sample-customer-entity/access"
For example, after configuring province as the scope column and granting
two users access (these grants are not the initial sample configuration):
{
"entity": "sample-customer-entity",
"scopeColumn": "province",
"scopeIndexState": "VALID",
"principals": [
{ "principalType": "USER", "principalId": "u-…", "principalName": "A steward", "values": ["Madrid", "Toledo"] },
{ "principalType": "USER", "principalId": "u-…", "principalName": "Another steward", "values": null }
]
}
The first principal sees only the customers whose province is Madrid or
Toledo. The second, with values: null, sees the whole entity.
PUT to the same path takes {"principals": [...]} and replaces the list.
Read the current list, apply the intended change, and submit the complete
result. Omitted principals lose their grants.
Use values: null to grant the whole entity. A non-null list is a row grant;
[] is not a whole-entity grant. A row grant requires a configured scope
column. Read the effective scope afterwards and test with the target identity.
Choose a scope column
The scope column is the entity column whose values partition the data — a
region, a business unit, a brand. In the
Aurelia Utilities sample, province is the
natural choice: it holds twenty distinct values across the 378 customers.
curl --fail-with-body --silent --show-error \
--request PUT \
--header "Authorization: Bearer ${GOLDEN_ADMIN_TOKEN}" \
--header "Content-Type: application/json" \
--data '{"column":"province"}' \
"${GOLDEN_URL}/api/entities/sample-customer-entity/scope-column"
To see what values are available to grant:
curl --fail-with-body --silent --show-error \
--header "Authorization: Bearer ${GOLDEN_ADMIN_TOKEN}" \
"${GOLDEN_URL}/api/entities/sample-customer-entity/scope-values"
For example, with province configured as the scope column:
{
"entity": "sample-customer-entity",
"column": "province",
"values": ["A Coruña", "Alicante", "Asturias", "Barcelona", "…", "Valladolid", "Zaragoza"],
"truncated": false
}
Check truncated. A column with many distinct values returns a partial
list, and a value missing from it is not a value that cannot be granted.
Scope index state
Setting a scope column starts a concurrent index build. The PUT answers
immediately with scopeIndexState: "BUILDING", and the state becomes VALID
when the build completes.
| State | Meaning |
|---|---|
NONE | The entity has no scope column |
BUILDING | The build is running |
VALID | The index exists and is valid |
FAILED | The build failed, or the index is present but invalid |
Row filtering applies while the index is unavailable. A FAILED state can
affect query performance; it does not remove the caller’s data restrictions.
Check what a caller can see
Any fully authenticated caller can read their own effective scope:
curl --fail-with-body --silent --show-error \
--header "Authorization: Bearer ${GOLDEN_TOKEN}" \
"${GOLDEN_URL}/api/data-scopes/me"
An administrator receives an empty object: administrators are not scoped.
Bootstrapping an existing deployment
POST /api/data-scopes/bootstrap
This migration operation grants whole-entity access to every non-ADMIN
principal without an existing scope. Review its access impact before running
it. Afterward, restrict grants to the entities and rows each principal needs.
What data scopes do not cover
- Daily snapshots and on-demand measurements are table-wide. They report
aggregateScope: ENTITYwhatever the caller’s scope, so a person restricted to part of a table still sees aggregates over all of it. See Monitor product metrics. - Roles remain global. A
STEWARDscoped to one entity is still a steward on that entity; scoping does not downgrade what they may do, only where. - Administrators are unscoped by design.
Related reading
Quality measurements
ADMIN can request a measurement with POST /api/quality/measurements and
follow its background run. STEWARD and VIEWER cannot start it. All three
roles can read saved measurements when they have access to the table; a
restricted row scope does not narrow these aggregates. See
Quality metrics.