Governance API

The Governance module provides fine-grained access control and compliance features including role-based access control (RBAC), user groups, destination filters, and data access filters.

Endpoint Groups

GroupDescription
RolesSystem and custom role management
PermissionsGranular permission definitions
GroupsUser group management
MembersGroup membership management
Destination FiltersSync-time governance filters
SubsetsData access restrictions

Roles

Roles define sets of permissions that can be assigned to workspace members or groups. SignalSmith includes three built-in system roles (owner, admin, member) and supports custom roles.

MethodPathDescription
GET/api/v1/workspaces/{id}/rolesList all roles
POST/api/v1/workspaces/{id}/rolesCreate a custom role
GET/api/v1/workspaces/{id}/roles/{roleId}Get a role with permissions
PUT/api/v1/workspaces/{id}/roles/{roleId}Update a custom role
DELETE/api/v1/workspaces/{id}/roles/{roleId}Delete a custom role

List Roles

GET /api/v1/workspaces/{id}/roles

[
  {
    "id": "00000000-0000-0000-0000-000000000001",
    "workspace_id": null,
    "name": "owner",
    "description": "Full access to all workspace resources",
    "is_system": true,
    "permissions": ["sources.read", "sources.write", "sources.delete", "..."],
    "created_at": "2024-01-01T00:00:00Z",
    "updated_at": "2024-01-01T00:00:00Z"
  },
  {
    "id": "550e8400-e29b-41d4-a716-446655440000",
    "workspace_id": "660e8400-e29b-41d4-a716-446655440000",
    "name": "data_analyst",
    "description": "Read-only access to models and audiences",
    "is_system": false,
    "permissions": ["sources.read", "models.read", "audiences.read"],
    "created_at": "2024-01-15T09:30:00Z",
    "updated_at": "2024-01-15T09:30:00Z"
  }
]

Create Custom Role

POST /api/v1/workspaces/{id}/roles

Request Body

FieldTypeRequiredDescription
namestringYesRole name (must be unique within workspace)
descriptionstringNoDescription of the role’s purpose
permissionsarray of stringsYesPermission keys to grant
{
  "name": "data_analyst",
  "description": "Read-only access to models and audiences",
  "permissions": [
    "sources.read",
    "models.read",
    "audiences.read",
    "traits.read",
    "insights.read"
  ]
}

System Roles

RoleIDDescription
owner00000000-0000-0000-0000-000000000001Full access; can manage billing and workspace settings
admin00000000-0000-0000-0000-000000000002Full access except billing and ownership transfer
member00000000-0000-0000-0000-000000000003Standard access; cannot manage workspace settings

Permissions

Permissions are granular access control strings organized by category.

MethodPathDescription
GET/api/v1/workspaces/{id}/permissionsList all available permissions

Response

[
  {
    "id": "550e8400-e29b-41d4-a716-446655440000",
    "key": "sources.read",
    "category": "sources",
    "description": "View sources and connection details",
    "created_at": "2024-01-01T00:00:00Z"
  },
  {
    "id": "660e8400-e29b-41d4-a716-446655440000",
    "key": "sources.write",
    "category": "sources",
    "description": "Create and update sources",
    "created_at": "2024-01-01T00:00:00Z"
  }
]

Permission Categories

CategoryPermissionsDescription
sourcesread, write, deleteData warehouse connections
modelsread, write, deleteSQL models
destinationsread, write, deleteWrite targets
syncsread, write, delete, triggerData syncs
audiencesread, write, deleteAudience segments
traitsread, write, deleteComputed properties
identity_graphsread, write, delete, triggerIdentity resolution
journeysread, write, delete, activateAutomation workflows
eventsread, write, deleteEvent collection
loadersread, write, delete, triggerData loaders
governanceread, writeRBAC and compliance
insightsreadAnalytics and monitoring
workspaceread, write, membersWorkspace settings

Groups

Groups organize workspace members and can be assigned a role that applies to all members.

MethodPathDescription
GET/api/v1/workspaces/{id}/groupsList all groups
POST/api/v1/workspaces/{id}/groupsCreate a group
GET/api/v1/workspaces/{id}/groups/{groupId}Get a group
PUT/api/v1/workspaces/{id}/groups/{groupId}Update a group
DELETE/api/v1/workspaces/{id}/groups/{groupId}Delete a group

Create Group

POST /api/v1/workspaces/{id}/groups

{
  "name": "Marketing Team",
  "description": "Marketing department members",
  "role_id": "550e8400-e29b-41d4-a716-446655440000"
}

Group Object

FieldTypeDescription
idstring (UUID)Unique identifier
workspace_idstring (UUID)Owning workspace
namestringGroup name
descriptionstringDescription
role_idstring (UUID) or nullRole assigned to group members
role_namestringName of the assigned role
member_countintegerNumber of members in the group
created_atstring (ISO 8601)Creation timestamp
updated_atstring (ISO 8601)Last update timestamp

Members

Manage group membership.

MethodPathDescription
GET/api/v1/workspaces/{id}/groups/{groupId}/membersList group members
POST/api/v1/workspaces/{id}/groups/{groupId}/membersAdd a member
DELETE/api/v1/workspaces/{id}/groups/{groupId}/members/{accountId}Remove a member

Add Member

POST /api/v1/workspaces/{id}/groups/{groupId}/members

{
  "account_id": "770e8400-e29b-41d4-a716-446655440000"
}

Group Member Object

FieldTypeDescription
group_idstring (UUID)Group ID
account_idstring (UUID)Account ID
emailstringMember email
namestringMember name
avatar_urlstringMember avatar URL
created_atstring (ISO 8601)When the member was added

Destination Filters

Destination filters are sync-time governance filters that restrict which records can be sent to specific destination types. They act as guardrails to prevent sensitive data from reaching certain platforms.

MethodPathDescription
GET/api/v1/workspaces/{id}/destination-rulesList all rules
POST/api/v1/workspaces/{id}/destination-rulesCreate a rule
GET/api/v1/workspaces/{id}/destination-rules/{ruleId}Get a rule
PUT/api/v1/workspaces/{id}/destination-rules/{ruleId}Update a rule
DELETE/api/v1/workspaces/{id}/destination-rules/{ruleId}Delete a rule

Create Destination Rule

POST /api/v1/workspaces/{id}/destination-rules

{
  "name": "GDPR - No EU Customers to Facebook",
  "description": "Prevent EU customer data from being synced to Facebook Ads",
  "parent_model_id": "770e8400-e29b-41d4-a716-446655440000",
  "destination_type": "facebook_ads",
  "filter_tree": {
    "type": "condition",
    "condition_type": "property",
    "column": "country",
    "operator": "not_in",
    "value": ["DE", "FR", "IT", "ES", "NL", "BE", "AT", "SE", "DK", "FI"]
  },
  "enabled": true
}

Destination Rule Object

FieldTypeDescription
idstring (UUID)Unique identifier
workspace_idstring (UUID)Owning workspace
parent_model_idstring (UUID)Model the rule applies to
destination_typestringDestination type this rule restricts
namestringDisplay name
descriptionstringDescription
filter_treeobjectFilter criteria (same format as audience filters)
enabledbooleanWhether the rule is active
created_bystring (UUID)Account that created the rule
created_atstring (ISO 8601)Creation timestamp
updated_atstring (ISO 8601)Last update timestamp

Access Filters

Access Filters provide data-level access control by restricting which records a user or group can see. They use filter trees (same as audiences) to define visibility boundaries.

Subset Categories

Categories organize access filters into logical groups (e.g., Region, Brand, Business Unit).

MethodPathDescription
GET/api/v1/workspaces/{id}/subset-categoriesList categories
POST/api/v1/workspaces/{id}/subset-categoriesCreate a category
PUT/api/v1/workspaces/{id}/subset-categories/{catId}Update a category
DELETE/api/v1/workspaces/{id}/subset-categories/{catId}Delete a category

Access Filters

MethodPathDescription
GET/api/v1/workspaces/{id}/subsetsList all subsets
POST/api/v1/workspaces/{id}/subsetsCreate an access filter
GET/api/v1/workspaces/{id}/subsets/{subsetId}Get an access filter
PUT/api/v1/workspaces/{id}/subsets/{subsetId}Update an access filter
DELETE/api/v1/workspaces/{id}/subsets/{subsetId}Delete an access filter

Create Subset

{
  "name": "US Region",
  "description": "Only US customer records",
  "category_id": "550e8400-e29b-41d4-a716-446655440000",
  "parent_model_id": "770e8400-e29b-41d4-a716-446655440000",
  "filter_tree": {
    "type": "condition",
    "condition_type": "property",
    "column": "country",
    "operator": "equals",
    "value": "US"
  }
}

Subset Assignments

Assign access filters to users or groups to restrict their data visibility.

MethodPathDescription
GET/api/v1/workspaces/{id}/subset-assignmentsList assignments
POST/api/v1/workspaces/{id}/subset-assignmentsCreate an assignment
DELETE/api/v1/workspaces/{id}/subset-assignments/{assignmentId}Remove an assignment

Create Assignment

{
  "subset_id": "880e8400-e29b-41d4-a716-446655440000",
  "account_id": "990e8400-e29b-41d4-a716-446655440000"
}

Or for a group:

{
  "subset_id": "880e8400-e29b-41d4-a716-446655440000",
  "group_id": "aae8400-e29b-41d4-a716-446655440000"
}

Subset Object

FieldTypeDescription
idstring (UUID)Unique identifier
category_idstring (UUID)Parent category
workspace_idstring (UUID)Owning workspace
parent_model_idstring (UUID) or nullModel the access filter applies to
namestringDisplay name
descriptionstringDescription
filter_treeobjectFilter criteria
created_bystring (UUID)Account that created the access filter
created_atstring (ISO 8601)Creation timestamp
updated_atstring (ISO 8601)Last update timestamp