arrow-left

All pages
gitbookPowered by GitBook
1 of 7

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

OAA Templates

JSON schemas for describing custom applications, identity providers, principals, and secret stores

OAA utilizes templates (JSON schema) for structuring authorization and identity metadata, combined with a REST API to register, update and manage the data. Once uploaded, Veza processes the template payload and incorporates the entities and permissions into the Authorization Metadata Graph.

Choosing the appropriate template is the first step in creating a new integration with OAA. The template provides a schema for describing the identities, resources, and authorization relationships local to the OAA data source.

hashtag
Custom Application

For most applications, SaaS Apps and systems the provides a generic and flexible model to capture authorization data for users and groups to the system and its resources.

A custom application is structured with the following main entities:

  • Application

    • Resource

      • Sub-resource

hashtag
Custom Identity Provider

Intended for modeling sources of users, group, and federated identity metadata, the can be used to enumerate users and groups that access other external applications and resources, similar to built-in connectors for Okta and AzureAD. These users and groups typically represent the top-level corporate identities within an organization.

A Custom Identity Provider can have the following entities:

  • Domains

  • Users

  • Groups

The Custom IdP template also includes the option to define AWS Roles that are assumable by users and groups and can work with Access Review Workflows to auto-assign resource managers.

hashtag
Custom Principal

For modeling sources of identities (users, groups, and tenants) that connect to other OAA data sources on the same provider, the provides a lightweight identity model. Unlike the Custom IdP, which models a full identity provider with domains, the Principal template is designed to feed users and groups into Custom Application or other templates on the same provider.

A Custom Principal is structured with:

  • Tenant

  • Users

  • Groups

hashtag
Secret Store

For modeling secret and credential management systems, the captures vaults, entries, permissions, and identity access mappings. Use this template to connect custom or self-hosted credential management systems that are not covered by a native Veza integration.

A Secret Store is structured with:

  • Secret Store

    • Permissions

    • Vaults

hashtag
Entity Enrichment

The adds custom property values to entities that already exist in the Veza authorization graph from other integrations. Use this template to attach supplemental metadata (such as compliance status, cost center, or internal identifiers) to entities discovered by native integrations.

An Entity Enrichment submission contains:

  • Enriched entity property definitions (schema declarations)

  • Enriched entities (entity references with property values)

Sub-resource

  • Additional sub-resources

  • Local Users

  • Local Groups

  • Local Roles

  • Local Permissions

  • Identity-to-permissions binding

  • Entries
    • Identities

  • Identity-to-Permission Bindings

  • Custom Application Template
    Custom Identity Provider Template
    Custom Principal Template
    Secret Store Template
    Entity Enrichment Template

    Entity Enrichment

    Template for setting custom property values on existing entities in the Veza authorization graph

    Use this template to set custom property values on existing entities in the Veza authorization graph using the Open Authorization API. Unlike other OAA templates that create new entities, the Entity Enrichment template adds metadata to entities that already exist from other integrations.

    Entity enrichment is useful when you have supplemental data about entities that Veza already discovers through native integrations. For example, you might enrich AWS IAM roles with internal compliance metadata, or tag Okta users with cost center information from a custom source.

    circle-info

    The Entity Enrichment template sets arbitrary custom properties via API push. This is distinct from Enrichment Rules, which are UI-configured rules that set a fixed set of built-in Veza classification attributes (identity type, owner, privileged status, and criticality) at extraction time. Use this template when you need to attach custom metadata beyond those built-in attributes.

    The template has two sections:

    • Enriched entity property definitions - declares the custom properties and their types for each entity type being enriched.

    • Enriched entities - the list of existing entities to enrich, with values for each declared property.

    To use the entity enrichment template, set the template type to entity_enrichment when creating a new data provider:

    hashtag
    Sample payload

    chevron-rightAWS IAM enrichment examplehashtag

    This example enriches AWS IAM roles with internal compliance metadata and AWS IAM users with a purpose description.

    hashtag
    Top-level payload

    Field
    Type
    Description

    hashtag
    Enriched entity property definitions

    Each entry declares the custom properties that will be added to a specific entity type, along with their data types. Property types determine how Veza stores and indexes values. For example, TIMESTAMP properties enable relative date filters in queries (such as "last 90 days").

    hashtag
    Property definition fields

    Field
    Type
    Description

    hashtag
    Supported property types

    Type
    Description

    hashtag
    Enriched entities

    The list of existing entities to enrich with property values. Each entity must appear exactly once with all properties that should be set. Including an entity with no properties clears all enriched property values from that entity. Only entities in the list are updated; other entities are not affected.

    hashtag
    Enriched entity fields

    Field
    Type
    Description

    hashtag
    Creating and updating enrichment data

    To create the OAA provider and push enrichment data:

    1. Create the provider with the entity_enrichment template type:

    2. Create a data source on the provider:

    3. Push the enrichment payload to the data source:

    Updates follow the same push workflow. Each push replaces the enrichment data for the entities included in the payload. Entities not included in the push are not affected.

    hashtag
    Limitations

    Property values vs. property definitions: You can clear a property value by omitting its key in a subsequent push, or by including the entity with an empty properties object. This clears the stored value but does not remove the property definition from the entity type. Once a property name is defined for an entity type, the definition persists in the graph and cannot be removed.

    Provider deletion: Deleting an enrichment provider does not remove enrichment data from the Veza graph. Data pushed through the provider remains associated with the enriched entities after the provider is deleted. Contact Veza support if you need to fully remove enrichment data from the graph.

    STRING_LIST

    List of string values

    string

    Veza data source ID for the entity. For AWS, combine the account ID with the data source type (e.g., 339083562601:awsiam)

    properties

    dictionary

    Map of property names to values. Keys must be defined in the property definitions, and values must match the declared type. Omitting a key that is defined in the property definitions removes that property value from the entity

    The push endpoint requires the payload as a JSON-encoded string in the
    json_data
    field.
    jq -Rs .
    reads
    payload.json
    and escapes it as a JSON string. See
    for compression options.

    enriched_entity_property_definitions

    array

    List of property definitions for each entity type

    enriched_entities

    array

    List of entities to enrich with property values

    entity_type

    string

    Veza entity type to enrich (e.g., AwsIamRole, OktaUser)

    enriched_properties

    dictionary

    Map of property names to their types. See supported types

    STRING

    Text value

    NUMBER

    Numeric value (integer or float)

    BOOLEAN

    true or false

    TIMESTAMP

    type

    string

    Veza entity type (must match an entity_type in the property definitions)

    id

    string

    Veza unique ID for the entity. For AWS entities, this is the ARN. Each entity must appear only once in the list

    {
      "enriched_entity_property_definitions": [
        {
          "entity_type": "AwsIamRole",
          "enriched_properties": {
            "my_company_id": "STRING",
            "company_purpose": "STRING",
            "is_compliance_validated": "BOOLEAN"
          }
        },
        {
          "entity_type": "AwsIamUser",
          "enriched_properties": {
            "company_purpose": "STRING"
          }
        }
      ],
      "enriched_entities": [
        {
          "type": "AwsIamRole",
          "id": "arn:aws:iam::339083562601:role/Administrator",
          "data_source_id": "339083562601:awsiam",
          "properties": {
            "my_company_id": "DCFB16CD-A044-4787-9165-1C926221F887",
            "company_purpose": "Built in Admin role",
            "is_compliance_validated": true
          }
        },
        {
          "type": "AwsIamRole",
          "id": "arn:aws:iam::650251689811:role/andrew_s3_all",
          "data_source_id": "339083562601:awsiam",
          "properties": {
            "my_company_id": "A3F40BAC-1871-4EFC-A0EE-CD77E3F513C27",
            "company_purpose": "Some role for Andrew",
            "is_compliance_validated": false
          }
        },
        {
          "type": "AwsIamUser",
          "id": "arn:aws:iam::339083562601:user/andrew",
          "data_source_id": "339083562601:awsiam",
          "properties": {
            "company_purpose": "Engineering service account"
          }
        }
      ]
    }

    Date/time value. Enables relative date filters in Veza queries

    data_source_id

    OAA API Operations
    curl -X POST "https://{VEZA_URL}/api/v1/providers/custom" \
    -H "authorization: Bearer {API_KEY}" \
    -H "Content-Type: application/json" \
    --data '{"name":"My Enrichment Provider","custom_template":"entity_enrichment"}'
    "enriched_entity_property_definitions": [
      {
        "entity_type": "AwsIamRole",
        "enriched_properties": {
          "my_company_id": "STRING",
          "is_compliance_validated": "BOOLEAN"
        }
      }
    ]
    "enriched_entities": [
      {
        "type": "AwsIamRole",
        "id": "arn:aws:iam::339083562601:role/Administrator",
        "data_source_id": "339083562601:awsiam",
        "properties": {
          "my_company_id": "DCFB16CD-A044-4787-9165-1C926221F887",
          "is_compliance_validated": true
        }
      }
    ]
    curl -X POST "https://{VEZA_URL}/api/v1/providers/custom" \
    -H "authorization: Bearer {API_KEY}" \
    -H "Content-Type: application/json" \
    --data '{"name":"Enrichment Provider","custom_template":"entity_enrichment"}'
    curl -X POST "https://{VEZA_URL}/api/v1/providers/custom/{PROVIDER_ID}/datasources" \
    -H "authorization: Bearer {API_KEY}" \
    -H "Content-Type: application/json" \
    --data '{"name":"Enrichment Data Source"}'
    curl -X POST "https://{VEZA_URL}/api/v1/providers/custom/{PROVIDER_ID}/datasources/{DATASOURCE_ID}:push" \
    -H "authorization: Bearer {API_KEY}" \
    -H "Content-Type: application/json" \
    --data "{\"json_data\": $(jq -Rs . payload.json)}"

    Custom HRIS Provider

    OAA Template for Human Resources Information Systems

    hashtag
    Overview

    Use this Open Authorization API template to publish employee metadata for Human Resources Information Systems (HRIS) platforms, typically used by organizations as a single source of truth for employee information.

    Unlike an Identity Provider, HR platforms typically do not provide access to other systems. Employee profiles within an HRIS platform are instead used to store important details such as employment status, who individuals report to, department, and country. Veza can use this metadata to:

    • Trigger events when there is a change in the integrated HRIS data source.

    • Correlate employees in the HRIS system with identities in your identity provider (IdP).

    • Enrich Access Reviews with details about linked HRIS employees for users under review.

    The template supports:

    • A top-level System entity representing the HRIS tenant, organization, or account.

    • Employee entities representing current and inactive workers

    • Group entities representing teams, departments, cost centers, or other units to which users are assigned.

    To enable this payload format, specify the hris custom template when with the API.

    hashtag
    HRIS template example

    hashtag
    Custom properties

    The HRIS template supports . After specifying a custom property definition in the payload, you can assign additional attributes to entities. These enable attribute filters for searches and access reviews in Veza, and enrich results with entity metadata unique to the source system or your organization.

    hashtag
    Identity mappings

    Veza maps HRIS employees to identities from integrated Identity Providers (IdPs) such as Okta by matching the idp_id, email, or id value in the HRIS payload with the IdP entity's Name, Principal Name, or Identity. The matching process checks these fields in the following sequence:

    1. idp_id

    2. email

    3. id

    If the idp_id is unset, Veza uses the email field for matching. If the email field is also absent, the id is used. Veza issues a warning if no matching entity is found.

    hashtag
    Custom HRIS System

    The account/tenant/etc. that contains the HR information.

    Property
    Attribute Name
    Type
    Required
    Unique
    Description

    hashtag
    Custom HRIS Employee

    Used to represent any person who has been employed by a company.

    Property
    Attribute Name
    Type
    Required
    Unique
    Description

    hashtag
    Custom HRIS Group

    Used to represent any subset of employees, such as PayGroup or Team. Employees can be in multiple Groups.

    Property
    Attribute Name
    Type
    Required
    Unique
    Description

    IDP Providers

    idp_providers

    String list

    N

    N

    List of destination IdP provider types to connect this system to (e.g. okta, azure_ad).

    Identity Mapping Configuration

    identity_mapping_configuration

    Object

    N

    N

    Configuration for mapping employees to identities in external data sources.

    Company

    company

    String

    N

    N

    The company (or subsidiary) the employee works for.

    First Name

    first_name

    String

    N

    N

    The employee's first name.

    Last Name

    last_name

    String

    N

    N

    The employee's last name.

    Preferred Name

    preferred_name

    String

    N

    N

    The employee's preferred first name.

    Display Full Name

    display_full_name

    String

    N

    N

    The employee's full name, to use for display purposes. If a preferred first name is available, the full name will include the preferred first name.

    Canonical Name

    canonical_name

    String

    N

    N

    The employee's canonical name.

    Username

    username

    String

    N

    N

    The employee's username that appears in the integration UI.

    Email

    email

    String

    N

    Y

    The employee's work email.

    IDP ID

    idp_id

    String

    N

    N

    The ID for this employee on the destination IDP provider used to automatically connect to it, if not supplied email is used.

    Personal Email

    personal_email

    String

    N

    N

    The employee's personal email.

    Home Location

    home_location

    String

    N

    N

    The employee's home location.

    Work Location

    work_location

    String

    N

    N

    The employee's work location.

    Cost Center

    cost_center

    EntityRef

    N

    N

    Reference to the group representing the cost center the employee is in (e.g. {"id": "cost-center-001"}).

    Department

    department

    EntityRef

    N

    N

    Reference to the group representing the department the employee is in (e.g. {"id": "engineering"}).

    Managers

    managers

    EntityRef list

    N

    N

    References to the employee's managers (e.g. [{"id": "987654"}]).

    Groups

    groups

    EntityRef list

    N

    N

    References to the groups this employee is in (e.g. [{"id": "all_employees"}]).

    Employment Status

    employment_status

    String

    N

    N

    The employment status of the employee. Possible values include - ACTIVE, PENDING, INACTIVE.

    Is Active

    is_active

    Boolean

    N

    N

    If the employee is active or not.

    Start Date

    start_date

    Timestamp

    N

    N

    The date that the employee started working. If an employee was rehired, the most recent start date will be returned.

    Termination Date

    termination_date

    Timestamp

    N

    N

    The employee's termination date.

    Job Title

    job_title

    String

    N

    N

    The title of the employee.

    Employment Types

    employment_types

    String list

    N

    N

    The employee's type of employment. Possible values include - FULL_TIME, PART_TIME, INTERN, CONTRACTOR, FREELANCE.

    Primary Time Zone

    primary_time_zone

    String

    N

    N

    The time zone which the employee primarily lives.

    Parent

    parent

    EntityRef

    N

    N

    Reference to the parent group (e.g. {"id": "parent-group-id"}).

    URL

    url

    String

    N

    N

    Employee Number

    employee_number

    String

    N

    Y

    Group Type

    group_type

    String

    Y

    N

    Lifecycle Management
    creating an OAA provider
    custom properties

    The url for this HRIS system.

    The employee's number that appears in the third-party integration.

    The type of group, possible values include - TEAM, DEPARTMENT, COST_CENTER, BUSINESS_UNIT, GROUP. This is intended as to not have each type as their own nodes.

    {
      "name": "HRIS Example",
      "hris_type": "HR Platform",
      "custom_property_definition": {
        "system_properties": {},
        "employee_properties": {
          "job_level": "STRING"
        },
        "group_properties": {}
      },
      "system": {
        "id": "7D8A21AE-6650-4357-842B-3FCEC8F29195",
        "name": "HRIS Example",
        "url": "https://hris.example.com",
      },
      "employees": [
        {
          "id": "123456",
          "name": "jdoe",
          "employee_number": "E123456",
          "first_name": "John",
          "last_name": "Doe",
          "canonical_name": "Doe, John",
          "email": "[email protected]",
          "home_location": "Anytown, CA",
          "work_location": "San Francisco, CA",
          "employment_status": "HIRED",
          "start_date": "2022-05-22T00:00:00Z",
          "job_title": "Software Developer",
          "employment_types": [
            "FULL_TIME"
          ],
          "custom_properties": {
            "job_level": "L3"
          },
          "is_active": true,
          "groups": [
            {
              "id": "all_employees"
            }
          ],
          "managers": [
            {
              "id": "987654"
            }
          ],
          "department": {
            "id": "engineering"
          }
        },
        {
          "id": "987654",
          "name": "jane.doe",
          "employee_number": "E987654",
          "first_name": "Jane",
          "last_name": "Doe",
          "canonical_name": "Doe, Jane",
          "email": "[email protected]",
          "home_location": "Anytown, CA",
          "work_location": "San Francisco, CA",
          "employment_status": "HIRED",
          "start_date": "2021-03-13T00:00:00Z",
          "job_title": "Software Developer",
          "employment_types": [
            "FULL_TIME"
          ],
          "custom_properties": {
            "job_level": "M2"
          },
          "is_active": true,
          "groups": [
            {
              "id": "all_employees"
            }
          ],
          "department": {
            "id": "engineering"
          }
        }
      ],
      "groups": [
        {
          "id": "all_employees",
          "name": "All Employees",
          "group_type": "Employee Group"
        },
        {
          "id": "engineering",
          "name": "Engineering",
          "group_type": "Department"
        }
      ]
    }
    {
      "name": "BambooHR",
      "hris_type": "BambooHR",
      "custom_property_definition": {
        "employee_properties": {
          "division": "STRING",
          "office_extension": "STRING"
        },
        "group_properties": {
          "headquarters_location": "STRING"
        }
      },
      "system": {
        "name": "BambooHR",
        "id": "BambooHR",
        "url": "https://vezai.bamboohr.com",
        "idp_providers": ["okta"]
      },
      "employees": [
        {
          "name": "Charlotte Abbott",
          "id": "1",
          "custom_properties": {
            "division": "North America",
            "office_extension": "1234"
          },
          "employee_number": "1",
          "email": "[email protected]",
          "work_location": "Lindon, Utah",
          "job_title": "Sr. HR Administrator"
        },
        {
          "name": "Cheryl Barnet",
          "id": "10",
          "custom_properties": {
            "division": "North America",
            "office_extension": "5678"
          },
          "employee_number": "10",
          "email": "[email protected]",
          "work_location": "Lindon, Utah",
          "job_title": "VP of Customer Success"
        }
      ],
      "groups": [
        {
          "name": "North America-Human Resources",
          "id": "North America-Human Resources",
          "group_type": "Department",
          "custom_properties": {
            "headquarters_location": "Lindon, Utah"
          }
        }
      ]
    }

    Secret Store

    Template for modeling secret storage systems with vaults, entries, and permissions

    circle-exclamation

    Secret Store is an Early Access feature. Contact your Veza account team to enable it for your organization.

    Use this template to model secret and credential management systems using the . The Secret Store template captures the authorization relationships for custom or self-hosted credential management systems that are not covered by a native Veza integration.

    The template models a hierarchical structure:

    Custom Principal

    Template for modeling a lightweight identity source with users, groups, and tenants

    Use this template to model a source of identities (users, groups, and tenants) using the . Principals represent identity sources that connect to other OAA template types on the same provider, enabling Veza to map users and groups to the applications and resources they access.

    The Custom Principal template differs from the in scope: a Principal is a lightweight identity source meant to feed users and groups into Custom Application or other templates on the same provider. Custom IdP models a full identity provider with domains and federated identity features.

    The template has three primary entities:

    • Tenant - the top-level container for the principal instance. Each submission has exactly one tenant.

    Secret Store - the top-level entity representing the secret management system instance

    • Permissions - define actions that identities can perform (e.g., Read, Write, Decrypt)

    • Vaults - logical containers for secrets within the store

      • Entries - individual secrets or credentials within a vault

        • Identities - optional identity mappings linking the entry to external identities

  • Identity-to-Permission Bindings - map identities to permissions on specific vaults

  • A custom property definition can define additional properties for the secret store, permissions, vaults, and entries.

    To use the secret store template, set the template type to secret_store when creating a new data provider:

    hashtag
    Sample Payloads

    chevron-rightHashiCorp Vault Examplehashtag

    This example demonstrates a secret store with two vaults, permissions, vault entries with identity mappings, and identity-to-permission bindings.

    hashtag
    Example: Custom PAM Integration

    Organizations with custom or self-hosted privileged access management (PAM) systems can use the Secret Store template to model their credential vaults, entries, and access permissions. This example shows how to map a typical PAM structure to the Secret Store template.

    chevron-rightCustom PAM Payloadhashtag

    This payload models a custom PAM system with two credential vaults, permission definitions, and identity-to-permission mappings reflecting typical DBA and platform engineer access patterns.

    This example demonstrates key patterns for working with the template:

    • Vaults group credentials by scope. Permissions are granted at the vault level. Grouping credentials by team or system (databases, cloud keys) is the natural unit of access control.

    • allow_identity_assume indicates whether this permission grants the ability to retrieve and use a credential's actual value.

    • rotation_policy and requires_approval** are custom properties that capture PAM-specific policies useful for access reviews and compliance reporting.

    hashtag
    Top-Level Payload

    Field
    Type
    Description

    secret_store_type

    string

    Type descriptor for the secret store (e.g., hashicorp_vault). Applied as a searchable property

    custom_property_definition

    object

    Defines custom properties for the store, permissions, vaults, and entries. See

    hashtag
    Secret Store object

    The secret store object is the top-level container for permissions, vaults, and identity mappings.

    hashtag
    Secret Store Properties

    Field
    Type
    Description

    name

    string

    Display name for the secret store

    id

    string

    Unique identifier. Defaults to name if not provided

    hashtag
    Permissions

    Permissions define the actions that identities can perform on the secret store and its vaults. Permissions are referenced by name in identity-to-permission bindings.

    hashtag
    Permission Properties

    Field
    Type
    Description

    name

    string

    Display name for the permission

    id

    string

    Unique identifier. Defaults to name if not provided

    hashtag
    Vaults

    Vaults are logical containers for secrets within the store. Each vault has a type and can contain multiple entries.

    hashtag
    Vault Properties

    Field
    Type
    Description

    name

    string

    Display name for the vault

    id

    string

    Unique identifier. Defaults to name if not provided

    hashtag
    Vault Entries

    Entries represent individual secrets or credentials within a vault. Entries optionally include identity mappings that link the credential to external identities in the authorization graph.

    hashtag
    Vault Entry Properties

    Field
    Type
    Description

    name

    string

    Display name for the entry

    id

    string

    Unique identifier. Defaults to name if not provided

    hashtag
    Vault Entry Identities

    Identity mappings on vault entries link a credential to external identities in the authorization graph. When the payload is parsed, Veza creates graph edges between the vault entry and the referenced identities. See Custom Identity Mappings for more information.

    hashtag
    Identity Properties

    Field
    Type
    Description

    type

    string

    The type of external identity (e.g., OktaUser, AzureADUser, AWSIAMUser)

    external_id

    string

    The external identifier for the identity (e.g., email address, ARN)

    hashtag
    Identity to Permissions

    Identity-to-permission mappings define which identities have which permissions on which vaults. Each mapping links an identity to one or more permission assignments.

    hashtag
    Identity-to-Permission Properties

    Field
    Type
    Description

    identity

    string

    The identity ID or name

    identity_type

    string

    The type of identity (e.g., local_user)

    hashtag
    Permission Assignments

    Each permission assignment binds a set of permissions to a set of vaults for the parent identity.

    Field
    Type
    Description

    vault

    array

    List of vault IDs or names that this assignment applies to

    permissions

    array

    List of permission names granted to the identity on these vaults

    hashtag
    Custom Property Definitions

    Custom properties allow you to attach additional metadata to secret store entities. Define properties in the custom_property_definition object, then set values on individual entities.

    Scope
    Description

    secret_store_properties

    Custom properties for the secret store entity

    permission_properties

    Custom properties for permission entities

    vault_properties

    Custom properties for vault entities

    entry_properties

    Property values must match their declared type. Supported types are described in Custom Properties.

    hashtag
    Incremental Updates

    After the initial metadata push (which must contain the full payload), you can modify, add, or remove the secret store, permissions, vaults, entries, and identity assignments without resubmitting other entities. An incremental update is enabled by setting "incremental_change": true in the push payload, and specifying the update operation for each entity to change.

    hashtag
    Creating and Updating a Secret Store

    To create the OAA provider and push data:

    1. Create the provider with the secret_store template type:

    2. Create a data source on the provider:

    3. Push the payload to the data source:

      The push endpoint requires the payload as a JSON-encoded string in the json_data field. jq -Rs . reads payload.json and escapes it as a JSON string.

    Updates follow the same push workflow. Veza processes the full payload and updates the Authorization Graph accordingly.

    Open Authorization API

    Users - the individual identities in the principal system. Users can belong to groups and have custom properties like is_active, email, and timestamps.

  • Groups - collections of users. Groups support hierarchical nesting through parent group references.

  • A custom property definition can define additional properties for tenants, users, and groups.

    To use the principal template, set custom_templates to a list that includes principal when creating the provider. Because a principal is almost always used alongside an application, include both templates:

    Then create a data source for the principal on that provider, specifying the principal template:

    hashtag
    Sample Payloads

    chevron-rightCustom Principal with Users and Groupshashtag

    This example demonstrates a corporate directory with users assigned to groups, custom properties, and hierarchical group nesting.

    hashtag
    Real-World Example: Atlassian Cloud Admin

    Veza's Atlassian Cloud connector uses the Custom Principal template to model the organization-level identity directory in Atlassian Cloud. The principal feeds users and groups into the Jira Cloud and Confluence Cloud application connectors on the same provider, linking identities to the resources they access.

    This approach separates identity management (who exists, what products they can access) from application-level authorization (what permissions they have in Jira projects or Confluence spaces). The principal captures the organization directory, while separate Custom Application submissions model Jira and Confluence.

    chevron-rightAtlassian Cloud Admin Payloadhashtag

    This payload models an Atlassian Cloud organization with managed and external users, product-access groups, and custom properties tracking account metadata.

    Key patterns from this integration:

    • user_type distinguishes managed users (in the organization's domain) from external collaborators, enabling access reviews to flag external access.

    • product_access as a STRING_LIST tracks which Atlassian products each user can access (Jira, Confluence, Bitbucket), providing visibility into license usage.

    • access_billable flags whether the user counts toward the organization's Atlassian license seat count.

    • Groups map to product access rather than organizational structure — groups like jira-software-users and confluence-users reflect Atlassian's product-based access model.

    • The principal connects to application templates on the same provider. Users and groups defined here appear as identities in Jira Cloud and Confluence Cloud Custom Application submissions, linking organization membership to application-level permissions.

    hashtag
    Top-Level Payload

    Field
    Type
    Description

    name

    string

    Name of the principal provider instance

    principal_type

    string

    Type descriptor for the principal provider (e.g., corporate_directory). Applied as a searchable property

    hashtag
    Tenant

    Each principal submission contains exactly one tenant, representing the top-level container for the identity source.

    hashtag
    Tenant Properties

    Field
    Type
    Description

    name

    string

    Display name for the tenant

    id

    string

    Unique identifier for the tenant

    hashtag
    Users

    Users represent individual identities in the principal system. Each user can be linked to external identities and assigned to groups.

    hashtag
    User Properties

    Field
    Type
    Description

    name

    string

    Display name for the user

    id

    string

    Unique identifier for the user. Defaults to name if not provided

    hashtag
    Groups

    Groups represent collections of users. Groups can have external identities and support hierarchical nesting through parent group references.

    hashtag
    Group Properties

    Field
    Type
    Description

    name

    string

    Display name for the group

    id

    string

    Unique identifier for the group. Defaults to name if not provided

    hashtag
    Custom Property Definitions

    Custom properties allow you to attach additional metadata to principal entities. Define properties in the custom_property_definition object, then set values on individual entities.

    Scope
    Description

    tenant_properties

    Custom properties for the tenant entity

    user_properties

    Custom properties for user entities

    group_properties

    Custom properties for group entities

    Property values must match their declared type. Supported types are described in Custom Properties.

    hashtag
    Incremental Updates

    After the initial metadata push (which must contain the full payload), you can modify, add, or remove the tenant, users, and groups without resubmitting other entities. An incremental update is enabled by setting "incremental_change": true in the push payload, and specifying the update operation for each entity to change.

    hashtag
    Creating and Updating a Custom Principal

    To create the OAA provider and push data:

    1. Create the provider with both the principal and application template types:

    2. Create a data source on the provider, specifying the principal template:

    3. Push the payload to the data source:

      The push endpoint requires the payload as a JSON-encoded string in the json_data field. jq -Rs . reads payload.json and escapes it as a JSON string.

    Updates follow the same push workflow. Veza processes the full payload and updates the Authorization Graph accordingly.

    Open Authorization API
    Custom Identity Provider
    {
      "secret_store_type": "hashicorp_vault",
      "custom_property_definition": {
        "secret_store_properties": {
          "environment": "STRING"
        },
        "permission_properties": {},
        "vault_properties": {
          "encryption_type": "STRING"
        },
        "entry_properties": {
          "rotation_enabled": "BOOLEAN"
        }
      },
      "secret_store": {
        "name": "Production Vault",
        "id": "prod-vault-001",
        "description": "Production environment secrets",
        "tags": [
          {
            "key": "department",
            "value": "engineering"
          }
        ],
        "custom_properties": {
          "environment": "production"
        },
        "permissions": [
          {
            "name": "Read",
            "id": "perm-read",
            "resource": "secrets/*",
            "allow_identity_assume": false
          },
          {
            "name": "Write",
            "id": "perm-write",
            "resource": "secrets/*",
            "allow_identity_assume": true
          }
        ],
        "secret_store_vaults": [
          {
            "name": "API Keys",
            "id": "vault-api-keys",
            "vault_type": "kv",
            "description": "API key storage",
            "tags": [
              {
                "key": "category",
                "value": "api-credentials"
              }
            ],
            "custom_properties": {
              "encryption_type": "AES-256"
            },
            "entries": [
              {
                "name": "Stripe API Key",
                "id": "entry-stripe",
                "description": "Stripe payment processing key",
                "custom_properties": {
                  "rotation_enabled": true
                },
                "identities": [
                  {
                    "type": "OktaUser",
                    "external_id": "[email protected]"
                  }
                ]
              }
            ]
          },
          {
            "name": "Database Credentials",
            "id": "vault-db-creds",
            "vault_type": "kv",
            "description": "Database connection credentials",
            "custom_properties": {
              "encryption_type": "AES-256"
            },
            "entries": [
              {
                "name": "PostgreSQL Admin",
                "id": "entry-postgres",
                "description": "PostgreSQL admin credentials",
                "custom_properties": {
                  "rotation_enabled": true
                }
              }
            ]
          }
        ],
        "identity_to_permissions": [
          {
            "identity": "admin-user",
            "identity_type": "local_user",
            "permission_assignments": [
              {
                "vault": [
                  "vault-api-keys",
                  "vault-db-creds"
                ],
                "permissions": [
                  "Read",
                  "Write"
                ]
              }
            ]
          },
          {
            "identity": "developer-user",
            "identity_type": "local_user",
            "permission_assignments": [
              {
                "vault": [
                  "vault-api-keys"
                ],
                "permissions": [
                  "Read"
                ]
              }
            ]
          }
        ]
      }
    }
    {
      "secret_store_type": "custom_pam",
      "custom_property_definition": {
        "vault_properties": {
          "rotation_policy": "STRING",
          "requires_approval": "BOOLEAN"
        },
        "entry_properties": {
          "credential_type": "STRING"
        }
      },
      "secret_store": {
        "name": "ACME Internal PAM",
        "id": "pam.acme-internal.example.com",
        "description": "Production internal credential management system",
        "tags": [
          {
            "key": "environment",
            "value": "production"
          }
        ],
        "permissions": [
          {
            "name": "View",
            "id": "perm-view",
            "allow_identity_assume": false
          },
          {
            "name": "Checkout",
            "id": "perm-checkout",
            "allow_identity_assume": true
          },
          {
            "name": "Rotate",
            "id": "perm-rotate",
            "allow_identity_assume": false
          },
          {
            "name": "Manage",
            "id": "perm-manage",
            "allow_identity_assume": false
          }
        ],
        "secret_store_vaults": [
          {
            "name": "Production Databases",
            "id": "vault-prod-databases",
            "vault_type": "database",
            "description": "Privileged database credentials for production systems",
            "custom_properties": {
              "rotation_policy": "30-day",
              "requires_approval": true
            },
            "entries": [
              {
                "name": "postgres-prod-admin",
                "id": "cred-pg-admin-001",
                "description": "PostgreSQL production superuser",
                "custom_properties": {
                  "credential_type": "service_account"
                },
                "identities": [
                  {
                    "type": "AzureADUser",
                    "external_id": "[email protected]"
                  }
                ]
              },
              {
                "name": "mysql-prod-readonly",
                "id": "cred-mysql-ro-001",
                "description": "MySQL production read-only service account",
                "custom_properties": {
                  "credential_type": "service_account"
                }
              }
            ]
          },
          {
            "name": "Cloud Platform Keys",
            "id": "vault-cloud-keys",
            "vault_type": "cloud_credentials",
            "description": "Cloud provider access keys",
            "custom_properties": {
              "rotation_policy": "90-day",
              "requires_approval": false
            },
            "entries": [
              {
                "name": "cloud-prod-admin",
                "id": "cred-cloud-admin-001",
                "description": "Production cloud IAM admin access key",
                "custom_properties": {
                  "credential_type": "access_key"
                },
                "identities": [
                  {
                    "type": "AzureADUser",
                    "external_id": "[email protected]"
                  }
                ]
              }
            ]
          }
        ],
        "identity_to_permissions": [
          {
            "identity": "[email protected]",
            "identity_type": "AzureADUser",
            "permission_assignments": [
              {
                "vault": ["vault-prod-databases"],
                "permissions": ["View", "Checkout"]
              }
            ]
          },
          {
            "identity": "[email protected]",
            "identity_type": "AzureADUser",
            "permission_assignments": [
              {
                "vault": ["vault-cloud-keys"],
                "permissions": ["View", "Checkout", "Rotate"]
              },
              {
                "vault": ["vault-prod-databases"],
                "permissions": ["View"]
              }
            ]
          }
        ]
      }
    }
    curl -X POST "https://{VEZA_URL}/api/v1/providers/custom" \
    -H "authorization: Bearer {API_KEY}" \
    -H "Content-Type: application/json" \
    --data '{"name":"MySecretStore","custom_template":"secret_store"}'
    curl -X POST "https://{VEZA_URL}/api/v1/providers/custom/{PROVIDER_ID}/datasources" \
    -H "authorization: Bearer {API_KEY}" \
    -H "Content-Type: application/json" \
    --data '{"name":"my_secret_store_source"}'
    curl -X POST "https://{VEZA_URL}/api/v1/providers/custom/{PROVIDER_ID}/datasources/{DATASOURCE_ID}:push" \
    -H "authorization: Bearer {API_KEY}" \
    -H "Content-Type: application/json" \
    --data "{\"json_data\": $(jq -Rs . payload.json)}"
    curl -X POST "https://{VEZA_URL}/api/v1/providers/custom" \
    -H "authorization: Bearer {API_KEY}" \
    -H "Content-Type: application/json" \
    --data '{"name":"MySecretStore","custom_template":"secret_store"}'
    "secret_store": {
      "name": "Production Vault",
      "id": "prod-vault-001",
      "description": "Production environment secrets",
      "tags": [],
      "custom_properties": {},
      "permissions": [],
      "secret_store_vaults": [],
      "identity_to_permissions": []
    }
    "permissions": [
      {
        "name": "Read",
        "id": "perm-read",
        "resource": "secrets/*",
        "allow_identity_assume": false
      }
    ]
    "secret_store_vaults": [
      {
        "name": "API Keys",
        "id": "vault-api-keys",
        "vault_type": "kv",
        "description": "API key storage",
        "tags": [],
        "custom_properties": {},
        "entries": []
      }
    ]
    "entries": [
      {
        "name": "Stripe API Key",
        "id": "entry-stripe",
        "description": "Stripe payment processing key",
        "custom_properties": {
          "rotation_enabled": true
        },
        "identities": [
          {
            "type": "OktaUser",
            "external_id": "[email protected]"
          }
        ]
      }
    ]
    "identities": [
      {
        "type": "OktaUser",
        "external_id": "[email protected]"
      }
    ]
    "identity_to_permissions": [
      {
        "identity": "admin-user",
        "identity_type": "local_user",
        "permission_assignments": [
          {
            "vault": ["vault-api-keys", "vault-db-creds"],
            "permissions": ["Read", "Write"]
          }
        ]
      }
    ]
    "custom_property_definition": {
      "secret_store_properties": {
        "environment": "STRING"
      },
      "permission_properties": {},
      "vault_properties": {
        "encryption_type": "STRING"
      },
      "entry_properties": {
        "rotation_enabled": "BOOLEAN"
      }
    }
    {
      "custom_property_definition": {
        "tenant_properties": {
          "region": "STRING"
        },
        "user_properties": {
          "department": "STRING",
          "mfa_enabled": "BOOLEAN"
        },
        "group_properties": {
          "is_security_group": "BOOLEAN"
        }
      },
      "name": "Example Corp",
      "principal_type": "corporate_directory",
      "tenant": {
        "name": "Example Corp",
        "id": "tenant-001",
        "tenant_unique_id": "tenant-001",
        "tags": [
          {
            "key": "environment",
            "value": "production"
          }
        ],
        "custom_properties": {
          "region": "us-west-2"
        }
      },
      "users": [
        {
          "name": "Alice Johnson",
          "id": "alice01",
          "email": "[email protected]",
          "user_unique_id": "alice01",
          "display_name": "Alice Johnson",
          "is_active": true,
          "created_date": "2024-01-15T09:00:00.000Z",
          "last_login": "2025-02-20T14:30:00.000Z",
          "identities": [
            "[email protected]"
          ],
          "groups": [
            {
              "id": "grp-engineering"
            }
          ],
          "custom_properties": {
            "department": "Engineering",
            "mfa_enabled": true
          }
        },
        {
          "name": "Bob Smith",
          "id": "bob02",
          "email": "[email protected]",
          "user_unique_id": "bob02",
          "is_active": true,
          "identities": [
            "[email protected]"
          ],
          "groups": [
            {
              "id": "grp-engineering"
            },
            {
              "id": "grp-admins"
            }
          ],
          "custom_properties": {
            "department": "Engineering"
          }
        }
      ],
      "groups": [
        {
          "name": "Engineering",
          "id": "grp-engineering",
          "group_unique_id": "grp-engineering",
          "group_type": "Department",
          "identities": [
            "[email protected]"
          ],
          "custom_properties": {
            "is_security_group": false
          }
        },
        {
          "name": "Admins",
          "id": "grp-admins",
          "group_unique_id": "grp-admins",
          "group_type": "Security",
          "custom_properties": {
            "is_security_group": true
          }
        },
        {
          "name": "Platform Team",
          "id": "grp-platform",
          "group_unique_id": "grp-platform",
          "group_type": "Team",
          "parent_group": {
            "id": "grp-engineering"
          }
        }
      ]
    }
    {
      "custom_property_definition": {
        "user_properties": {
          "account_type": "STRING",
          "account_status": "STRING",
          "access_billable": "BOOLEAN",
          "product_access": "STRING_LIST",
          "user_type": "STRING"
        },
        "group_properties": {
          "description": "STRING"
        }
      },
      "name": "Atlassian Cloud Admin",
      "principal_type": "Atlassian Cloud Admin",
      "tenant": {
        "name": "acme-corp",
        "id": "a1b2c3d4-5678-90ab-cdef-1234567890ab",
        "tenant_unique_id": "a1b2c3d4-5678-90ab-cdef-1234567890ab"
      },
      "users": [
        {
          "name": "Jane Doe",
          "id": "5b10ac8d82e05b22cc7d4ef5",
          "email": "[email protected]",
          "user_unique_id": "5b10ac8d82e05b22cc7d4ef5",
          "is_active": true,
          "identities": [
            "[email protected]"
          ],
          "groups": [
            {
              "id": "jira-software-users"
            },
            {
              "id": "confluence-users"
            }
          ],
          "custom_properties": {
            "account_type": "atlassian",
            "account_status": "active",
            "access_billable": true,
            "product_access": ["jira-software", "confluence"],
            "user_type": "managed"
          }
        },
        {
          "name": "[email protected]",
          "id": "7c20bd9e93f16c33dd8e5fg6",
          "email": "[email protected]",
          "user_unique_id": "7c20bd9e93f16c33dd8e5fg6",
          "is_active": true,
          "identities": [
            "[email protected]"
          ],
          "groups": [
            {
              "id": "jira-software-users"
            }
          ],
          "custom_properties": {
            "account_type": "atlassian",
            "account_status": "active",
            "access_billable": true,
            "product_access": ["jira-software"],
            "user_type": "external"
          }
        }
      ],
      "groups": [
        {
          "name": "jira-software-users",
          "id": "jira-software-users",
          "group_unique_id": "jira-software-users",
          "group_type": "product-access",
          "custom_properties": {
            "description": "Users with access to Jira Software"
          }
        },
        {
          "name": "confluence-users",
          "id": "confluence-users",
          "group_unique_id": "confluence-users",
          "group_type": "product-access",
          "custom_properties": {
            "description": "Users with access to Confluence"
          }
        },
        {
          "name": "org-admins",
          "id": "org-admins",
          "group_unique_id": "org-admins",
          "group_type": "admin",
          "custom_properties": {
            "description": "Organization administrators"
          }
        }
      ]
    }
    curl -X POST "https://{VEZA_URL}/api/v1/providers/custom" \
    -H "authorization: Bearer {API_KEY}" \
    -H "Content-Type: application/json" \
    --data '{"name":"ExampleCorp","custom_templates":["principal","application"]}'
    curl -X POST "https://{VEZA_URL}/api/v1/providers/custom/{PROVIDER_ID}/datasources" \
    -H "authorization: Bearer {API_KEY}" \
    -H "Content-Type: application/json" \
    --data '{"name":"Principal Data Source","custom_template":"principal"}'
    curl -X POST "https://{VEZA_URL}/api/v1/providers/custom" \
    -H "authorization: Bearer {API_KEY}" \
    -H "Content-Type: application/json" \
    --data '{"name":"ExampleCorp","custom_templates":["principal","application"]}'
    curl -X POST "https://{VEZA_URL}/api/v1/providers/custom/{PROVIDER_ID}/datasources" \
    -H "authorization: Bearer {API_KEY}" \
    -H "Content-Type: application/json" \
    --data '{"name":"Principal Data Source","custom_template":"principal"}'
    "tenant": {
      "name": "Example Corp",
      "id": "tenant-001",
      "tenant_unique_id": "tenant-001",
      "tags": [],
      "custom_properties": {}
    }
    "users": [
      {
        "name": "Alice Johnson",
        "id": "alice01",
        "email": "[email protected]",
        "user_unique_id": "alice01",
        "display_name": "Alice Johnson",
        "is_active": true,
        "created_date": "2024-01-15T09:00:00.000Z",
        "last_login": "2025-02-20T14:30:00.000Z",
        "identities": ["[email protected]"],
        "groups": [{"id": "grp-engineering"}],
        "tags": [],
        "custom_properties": {}
      }
    ]
    "groups": [
      {
        "name": "Engineering",
        "id": "grp-engineering",
        "group_unique_id": "grp-engineering",
        "group_type": "Department",
        "identities": ["[email protected]"],
        "tags": [],
        "custom_properties": {}
      },
      {
        "name": "Platform Team",
        "id": "grp-platform",
        "group_type": "Team",
        "parent_group": {
          "id": "grp-engineering"
        }
      }
    ]
    "custom_property_definition": {
      "tenant_properties": {
        "region": "STRING"
      },
      "user_properties": {
        "department": "STRING",
        "mfa_enabled": "BOOLEAN"
      },
      "group_properties": {
        "is_security_group": "BOOLEAN"
      }
    }

    secret_store

    object

    The object containing all entities

    identity_mapping_configuration

    object

    Optional configuration for mapping local identities to users from external data sources

    incremental_change

    boolean

    When true, enables (optional)

    description

    string

    Description shown in Veza entity details (optional)

    tags

    array

    Specify tags with a key and optional value

    custom_properties

    dictionary

    validated against the custom_property_definition

    operation

    string

    Operation type for (optional)

    permissions

    array

    Array of objects

    secret_store_vaults

    array

    Array of objects

    identity_to_permissions

    array

    Array of mappings

    resource

    string

    Resource path or pattern this permission applies to (optional)

    allow_identity_assume

    boolean

    Whether this permission allows identity assumption (optional)

    tags

    array

    Specify tags with a key and optional value

    custom_properties

    dictionary

    operation

    string

    Operation type for (optional)

    vault_type

    string

    Type descriptor for the vault (e.g., kv, transit, pki). Required

    description

    string

    Description shown in Veza entity details (optional)

    tags

    array

    Specify tags with a key and optional value

    custom_properties

    dictionary

    validated against the custom_property_definition

    operation

    string

    Operation type for (optional)

    entries

    array

    Array of objects

    description

    string

    Description shown in Veza entity details (optional)

    tags

    array

    Specify tags with a key and optional value

    custom_properties

    dictionary

    validated against the custom_property_definition

    operation

    string

    Operation type for (optional)

    identities

    array

    Array of objects (optional)

    permission_assignments

    array

    Array of objects

    Custom properties for vault entry entities

    Custom Properties

    custom_property_definition

    object

    Defines custom properties for tenants, users, and groups. See

    tenant

    object

    The object for this principal

    users

    array

    Array of objects

    groups

    array

    Array of objects

    incremental_change

    boolean

    When true, enables (optional)

    tenant_unique_id

    string

    Optional unique identifier, typically a URL or external ID. Defaults to id if not provided

    tags

    array

    Specify tags with a key and optional value

    custom_properties

    dictionary

    validated against the custom_property_definition

    operation

    enum

    For , the operation to apply (optional)

    email

    string

    Email address for the user (optional)

    user_unique_id

    string

    Optional unique identifier. Defaults to email if set, otherwise id

    display_name

    string

    Display name shown in Veza (optional)

    is_active

    boolean

    Whether the user account is active

    created_date

    string

    Date the user was created, in RFC 3339 format (e.g., 2024-01-15T09:00:00.000Z)

    deactivated_date

    string

    Date the user was deactivated, in RFC 3339 format (optional)

    last_login

    string

    Date of the user's last login, in RFC 3339 format (optional)

    identities

    array

    List of identity strings (e.g., email addresses) used for linking to external identity providers

    groups

    array

    List of group references as {"id": "group_id"} objects

    tags

    array

    Specify tags with a key and optional value

    custom_properties

    dictionary

    validated against the custom_property_definition

    operation

    enum

    For , the operation to apply (optional)

    group_unique_id

    string

    Optional unique identifier for the group. Defaults to id if not provided

    group_type

    string

    Type descriptor for the group (e.g., Security, Department, Team)

    parent_group

    object

    Reference to a parent group as {"id": "parent_group_id"} for hierarchical nesting (optional)

    identities

    array

    List of identity strings for linking to external identity providers

    tags

    array

    Specify tags with a key and optional value

    custom_properties

    dictionary

    validated against the custom_property_definition

    operation

    enum

    For , the operation to apply (optional)

    curl -X POST "https://{VEZA_URL}/api/v1/providers/custom/{PROVIDER_ID}/datasources/{DATASOURCE_ID}:push" \
    -H "authorization: Bearer {API_KEY}" \
    -H "Content-Type: application/json" \
    --data "{\"json_data\": $(jq -Rs . payload.json)}"
    secret store
    incremental updates
    Custom Properties
    incremental updates
    permission
    vault
    identity-to-permission
    Custom Properties
    incremental updates
    Custom Properties
    incremental updates
    vault entry
    Custom Properties
    incremental updates
    identity mapping
    permission assignment
    Custom Properties
    tenant
    user
    group
    incremental updates
    Custom Properties
    incremental updates
    Custom Properties
    incremental updates
    Custom Properties
    incremental updates
    spinner
    spinner

    Custom Identity Provider

    Template for pushing IdP domain, user, and group metadata

    Use this template to model authorization metadata for custom identity providers using the Open Authorization API.

    This document includes an example template and notes for designing and publishing a model of your IdP.

    • domain

    • users

    A can define additional properties, used to add supplemental metadata to entities in the payload.

    Veza will handle federated identities just as those in supported IdPs such as Okta or Entra ID, enabling search and access review for OAA entities alongside the rest of your data catalog.

    hashtag
    Sample Template and Features

    The metadata payload describes the Identity Provider domain, users, and groups to add to the Veza Access Graph:

    chevron-rightSimple Custom Identity Providerhashtag

    hashtag
    Modeling Assumable Amazon Web Services Roles

    For cases where federated IdP entities are granted AWS permissions via IAM roles, the template supports defining assumable roles per-user. Binding a custom IdP user or group to an AWS role or group ARN enables Veza to parse and display the resource-level actions permitted within AWS.

    Custom IdP users and groups can be assigned permissions in other OAA applications by setting the principal type to idp in identity_to_permissions in the payload.

    hashtag
    Source Identity Assignments

    For use cases where a custom IdP is federated with another identity provider user identities can be linked between the two. Authorizations granted to the user will also be granted the source identity. The link is created by providing the unique identity ID and provider type as part of the user entry.

    For provider_type the following values are accepted:

    hashtag
    Resource Manager Assignments

    New in Veza release 2022.2.1

    To assign an IdP user or group as the manager of any resource Veza has discovered, list the node type and node id in the entities_owned field, for example:

    When parsing the payload, resources in the data catalog will be updated with a SYSTEM_resource_managers tag to enable entitlement reviews. The owner(s) will be suggested as reviewers for Veza Workflows that target an individual named resource with the correct tag.

    hashtag
    Manager Assignments

    Users and groups can be mapped to the identity of another user they report to. When configured, the manager will be suggested as a review for Workflow certifications where the assigned reporter is the single query target "named entity."

    hashtag
    Custom Properties and Tags

    are the recommended method for adding additional metadata to custom identities and resources.

    The custom_property_definition object supports separate property namespaces for each entity type:

    Field
    Description

    Additionally, can be applied to the IdP domain, users, and groups:

    Use incremental updates to remove tags: Resubmitting a payload with different tags will apply any new tags, but not remove existing ones. To remove a tag already applied to an entity, you will need to use the remove_tag operation.

    hashtag
    Incremental Updates

    After the initial metadata push (which must contain the full payload), you can modify, add, or remove the domain, users, and groups without resubmitting other entities. An is enabled by setting "incremental_change": true in the json_data push payload, and specifying the update operation for each entity to change.

    hashtag
    Custom Identity Provider definition

    The identity provider object models one instance of the custom IdP:

    Field
    Type
    Description

    hashtag
    IdP Domain

    One domain is supported for each custom IdP. Users and groups are mapped to the IdP domain, and connected in Veza Search:

    Field
    Type
    Description

    hashtag
    IdP Users

    Each IdP user object contains the display name, login email, and identity, along with other identity-related properties:

    Field
    Type
    Description

    hashtag
    IdP Groups

    Add a group by name in the groups section of the template to enable mapping IdP users to those groups:

    Field
    Type
    Description

    IdP entities can be granted permissions on custom applications in the identity_to_permissions section of the .

    hashtag
    IdP Apps

    Use the apps section to define any applications used to manage access within the identity provider. Apps can be associated with users and groups to model application assignments across your organization.

    Field
    Type
    Description

    Users and Groups can be assigned to an application by setting the app_assignments in the user or group.

    Field
    Type
    Description

    hashtag
    Creating and Updating a Custom Identity Provider

    The steps to add a custom IdP are the same as for any other OAA provider: you will need to register the new provider and data source, and then push the domain, user, and group descriptions in a JSON payload.

    hashtag
    Register a custom identity provider

    To create a new custom provider using the identity_provider template, POST the name and template type to /providers/custom:

    The response will return the custom IdP ID, which you will need when pushing the metadata payload:

    hashtag
    Push a data source for the custom identity provider

    Note that the provider id is required in both the path and body of the request. The response will include the new data source ID.

    hashtag
    Push metadata for the data source

    The payload file must contain the provider and data source ID, and the authorization metadata as a single string, for example:

    hashtag
    Identity Mapping Configuration

    The identity_mapping_configuration parameter defines rules for connecting users in a custom IdP to users from other data sources in the Veza graph.

    This is useful when:

    • The connected data source does not natively support returning information about external identities

    • A correlation between IdP identities and local users can be assumed based on values like username, email, or another property value.

    The identity_mapping_configuration is a top-level property of the Custom IDP submission, and is optional. The mapping configuration can include multiple mappings to connect IDP users to users from different data source types, each based on its own mappings.

    hashtag
    Incremental Identity Mapping Updates

    You can update just the identity mappings without resubmitting the entire provider payload by using an incremental update. This is useful when you need to modify only the mapping configuration while leaving other provider data unchanged.

    chevron-rightExample: Incremental Identity Mapping Updatehashtag

    Set "incremental_change": true and use "operation": "modify" in the identity_mapping_configuration to update mapping rules without affecting other aspects of the provider.

    Example curl command to apply the incremental identity mapping update:

    hashtag
    Identity Mapping Configuration

    Field
    Type
    Description

    hashtag
    Identity Mapping Submission

    Field
    Type
    Description

    Supported transformations:

    • IGNORE_SPECIAL: Ignore special characters (_, -, .) when matching identities

    • IGNORE_DOMAIN: Match identities after removing domain portions (e.g., "@example.com")

    hashtag
    IdentityMappingPropertyMatchersSubmission

    Field
    Type
    Description

    custom

    Google Workspace

    google_workspace

    Okta

    okta

    One Login

    one_login

    app_assignment_properties

    Custom property definitions for app assignment entities.

    string

    Type descriptor for IdP, can be unique or share across multiple IdP (for example ldap, IPA)

    idp_description

    string

    Any notes to add as entity details (optional)

    domains

    Domain model

    users

    Dictionary of CustomIdPUser class instances

    groups

    Dictionary of CustomIdPGroup class instances

    incremental_change

    boolean

    When true, enables operations (optional).

    identity_mapping_configuration

    Configuration for mapping identities between IdP User and other User types from external data sources

    Dynamic Properties

    Up to 5 attributes to apply to the domain (deprecated, use instead)

    tags

    list

    Any tags to create and apply to the domain.

    operation

    enum

    For , the operation to use.

    string

    Optional unique identifier for user

    groups

    string list

    Assign groups memberships by group identity (optional)

    full_name

    string

    Full name to display in Veza

    department

    string

    Department to apply as a searchable property (optional).

    is_active

    boolean

    If available, will be applied to the entity as a searchable property (optional).

    is_guest

    boolean

    If available, will be applied to the entity as a searchable property (optional).

    assumed_role_arns

    array

    AWS IAM roles that can be assumed by the IdP user, in the format {"identity": ["arn:aws:iam::123456789012:role/S3Access"]} (optional).

    tags

    list

    Any tags to create and apply to the user.

    dynamic_properties

    Dynamic Properties

    Up to 5 attributes to apply to the user (deprecated, use instead)

    custom_properties

    Each element of the push payload can have property_values, validated against the custom_property_definition.

    manager_id

    string

    If the same as another user's identity, that user will be recommended for reviews. Entity details for the user will be updated on push to include the manager as a searchable property.

    entities_owned

    array

    If another resource is specified by entity type and entity id, a Veza tag will be created on the resource to indicate the owner.

    operation

    enum

    For , the operation to use (optional).

    source_identity

    Optionally link IdP user to user from another IdP for federation use cases.

    string

    Optional display name for group

    groups

    string list

    other custom IdP groups this group is a member of

    is_security_group

    boolean

    Sets the is security group searchable property for the entity in Veza (optional).

    tags

    Veza Tags list

    Any to create and apply to the group.

    custom_properties

    Each element of the push payload can have property_values, validated against the custom_property_definition.

    dynamic_properties

    Dynamic Properties

    Up to 5 attributes to apply to the domain. (deprecated, use instead)

    operation

    enum

    For , the operation to use (optional).

    assumed_role_arns

    array

    AWS IAM roles the group can assume, in the format {"identity": ["arn:aws:iam::123456789012:role/S3Access"]} (optional).

    source_identity

    Optionally link the IdP group to a group from another IdP for federation use cases (optional).

    entities_owned

    array

    Resources to assign this group as manager of (optional).

    app_assignments

    array

    App assignments for this group (optional). See .

    string

    Description for the App (optional).

    assumed_role_arns

    array

    AWS IAM roles the app can assume, in the format {"identity": ["arn:aws:iam::123456789012:role/S3Access"]} (optional).

    custom_properties

    Each element of the payload can have property_values, validated against the custom_property_definition.

    tags

    Veza Tags list

    Any to create and apply to the group.

    operation

    enum

    For , the operation to use (optional).

    string

    Unique ID of the App to assign the identity to.

    custom_properties

    Each element of the payload can have property_values, validated against the custom_property_definition.

    IdentityMappingPropertyMatchersSubmission

    List of properties to match on

    transformations

    list enum

    Optional transformations to perform on the property values, available values: ignore_special, ignore_domain

    string

    When using property or custom_propert the property name to match on

    custom_destination_property

    string

    When using property or custom_propert the property name to match on

    Provider

    provider_type string

    Active Directory

    active_directory

    Any

    any

    AzureAD

    azure_ad

    domain_properties

    Custom property definitions for IdP domain entities.

    user_properties

    Custom property definitions for IdP user entities.

    group_properties

    Custom property definitions for IdP group entities.

    app_properties

    name

    string

    Name to associate with the provider in Veza.

    custom_property_definition

    Custom Property Definition

    Defines the key and types for properties that can be applied to other objects in the push payload

    name

    string

    IdP Domain name

    custom_properties

    Custom Properties

    Each element of the push payload can have property_values, validated against the custom_property_definition.

    name

    string

    Primary ID for user

    email

    string

    Optional email for user

    name

    string

    IdP group name.

    identity

    string

    Unique ID used for user-group assignments.

    id

    string

    App unique identifier.

    name

    string

    IdP app name.

    id

    string

    Assignment unique identifier.

    name

    string

    Display name for the assignment.

    mappings

    IdentityMappingSubmission

    List of mappings to create between IDP Users and external data sources

    operation

    enum

    For incremental updates, the operation to use.

    destination_datasource_type

    string

    Veza Type for the destination data source, GITHUB_USERS, SQL_SERVER, CUSTOM_APPLICATION

    destination_datasource_oaa_app_type

    string

    Optional specifically for mapping to OAA Custom Application to provide a specific App Type

    source_property

    enum

    IDP User property to match on, unique_id, email, property or custom_property

    destination_property

    enum

    Destination User property to match on, unique_id, email, property or custom_property

    groups
    apps
    identity_mapping_configuration
    custom property definition
    custom application
    Custom Properties
    Veza tags
    incremental update
    incremental update
    custom app metadata payload
    {
      "name": "My IdP",
      "idp_type": "custom_idp",
      "domains": [
        {
          "name": "example.com",
          "tags": [],
        }
      ],
      "users": [
        {
          "name": "m_richardson",
          "email": "[email protected]",
          "identity": "m_richardson",
          "full_name": "Michelle Richardson",
          "department": null,
          "is_active": true,
          "is_guest": false,
          "groups": [
            {
              "identity": "everyone"
            },
            {
              "identity": "developers"
            }
          ],
          "assumed_role_arns": [
            {
              "identity": "arn:aws:iam::123456789012:role/role001"
            },
            {
              "identity": "arn:aws:iam::123456789012:role/role002"
            }
          ],
          "tags": [],
        },
        {
          "name": "evargas",
          "email": "[email protected]",
          "identity": "evargas",
          "full_name": "Elizabeth Vargas",
          "department": null,
          "is_active": true,
          "is_guest": false,
          "groups": [
            {
              "identity": "everyone"
            },
            {
              "identity": "developers"
            },
            {
              "identity": "sec-ops"
            }
          ],
          "assumed_role_arns": [],
          "tags": [],
        },
        {
          "name": "willis",
          "email": "[email protected]",
          "identity": "c_williams",
          "full_name": null,
          "department": null,
          "is_active": true,
          "is_guest": false,
          "groups": [
            {
              "identity": "everyone"
            }
          ],
          "assumed_role_arns": [],
          "tags": []
        }
      ],
      "groups": [
        {
          "name": "developers",
          "identity": "developers",
          "full_name": null,
          "is_security_group": null,
          "tags": []
        },
        {
          "name": "sec-ops",
          "identity": "sec-ops",
          "full_name": null,
          "is_security_group": null,
          "tags": []
        },
        {
          "name": "everyone",
          "identity": "everyone",
          "full_name": "All Company Employees",
          "is_security_group": null,
          "tags": []
        }
      ],
      "identity_mapping_configuration": {
        "mappings": [
          {
            "destination_datasource_type": "GITHUB_USERS",
            "property_matchers": [
              {
                "source_property": "EMAIL",
                "destination_property": "UNIQUE_ID"
              }
            ]
          },
          {
            "destination_datasource_type": "SQL_SERVER",
            "property_matchers": [
              {
                "source_property": "EMAIL",
                "destination_property": "EMAIL"
              }
            ],
            "transformations": [
              "IGNORE_DOMAIN"
            ]
          }
        ]
      }
    }

    OAA

    Custom property definitions for IdP app entities.

    idp_type

    dynamic_properties

    identity

    full_name

    description

    app_id

    property_matchers

    custom_source_property

    {
          "name": "Custom User",
          "assumed_role_arns": {
            "identity": [
              "arn:aws:iam::123456789012:role/S3Access"
              ]
            },
        }
    {
      "name": "Custom User",
      "identity": "00001",
      "source_identity": {
        "identity": "[email protected]",
        "provider_type": "okta"
      }
    }
    {
      "name": "Custom User",
      "identity": "000011",
      "entities_owned": [
        {
          "node_type": "S3Bucket",
          "id": "arn:aws:s3:::amazon-connect-53f87966654d"
        }
      ]
    }
    {
      "name": "Custom User",
      "identity": "000013",
      "manager_id": "000011"
    }
    "tags": [
      {
        "key": "Tag1key",
        "value": "optional_Tag1Val"
      }
    ]
    {
          "name": "willis",
          "email": "[email protected]",
          "identity": "000001",
          "full_name": "Charles Willis",
          "department": "Sales",
          "is_active": true,
          "is_guest": false,
          "groups": [
            {
              "identity": "everyone"
            }
          ],
          "assumed_role_arns": {
            "identity": [
              "arn:aws:iam::123456789012:role/S3Access"
              ]
          },
          "source_identity": {
            "identity": "[email protected]",
            "provider_type": "okta"
          },
          "tags": [],
          "custom_properties": {},
          "manager_id": "string",
          "entities_owned": {
            "node_type": "S3Bucket",
            "id": "arn:aws:s3:::amazon-connect-53f87966654d"
            }
        }
    "groups": [
      {
        "name": "developers",
        "identity": "developers",
        "full_name": null,
        "is_security_group": null,
        "assumed_role_arns": {
          "identity": ["arn:aws:iam::123456789012:role/S3Access"]
        },
        "tags": [],
        "groups": [
          { "group_1_identity": "parent" },
          { "group_2_identity": "parent" }
        ],
        "custom_properties": {}
      }
    ]
      "apps": [
        {
          "id": "app1",
          "name": "Application 1",
          "description": "This is a sample application",
          "assumed_role_arns": [
            {
              "identity": "arn:aws:iam::1234567890:role/DevAppRole"
            }
          ],
          "custom_properties": {
            "owner_org": "engineering"
          },
          "tags": []
        }
      ]
        {
          "name": "willis",
          "email": "[email protected]",
          "identity": "cwilliams",
          "groups": [
            {
              "identity": "everyone"
            }
          ],
          "custom_properties": {
            "region": "NorthAmerica",
            "is_contractor": true
          },
          "app_assignments": [
            {
              "id": "assignment1",
              "name": "Assignment",
              "app_id": "app1",
              "custom_properties": {
                "assigned_on": "2024-12-05T12:42:25+00:00"
              }
            }
          ]
        }
    curl -X POST 'https://<veza_url>/api/v1/providers/custom' \
    -H 'authorization: Bearer '<access_token> \
    --data-binary '{"name":"SimpleIdP","custom_template":"identity_provider"}'
    {
      "value": {
        "id": "532f6fe3-189f-4576-afdf-8913088961e4",
        "name": "Simple IdP",
        "custom_template": "identity_provider",
        "state": "ENABLED",
        "application_types": [],
        "resource_types": [],
        "idp_types": []
      }
    }
    curl -X POST 'https://<veza_url>/api/v1/providers/custom/532f6fe3-189f-4576-afdf-8913088961e4/datasources' \
    -H 'authorization: Bearer '<access_token> \
    --data-binary '{"id":"532f6fe3-189f-4576-afdf-8913088961e4", "name":"SimpleDataSource"}'
    {"value":{"id":"b6a32af6-b854-47e1-8325-e5984f78bb4d","name":"SimpleDataSource"}}
    curl -X POST 'https://<veza_url>/api/v1/providers/custom/532f6fe3-189f-4576-afdf-8913088961e4/datasources/b6a32af6-b854-47e1-8325-e5984f78bb4d:push' \
    -H 'authorization: Bearer '<access_token> \
    --compressed --data-binary @payload.json
    payload.json
    {
      "id": "532f6fe3-189f-4576-afdf-8913088961e4",
      "data_source_id": "b6a32af6-b854-47e1-8325-e5984f78bb4d",
      "json_data": "{\n\"name\":\"CustomIdentityProvider\",\n\"idp_type\": ... "
    }
    {
      "identity_mapping_configuration": {
        "mappings": [
          {
            "destination_datasource_type": "OKTA",
            "property_matchers": [
              {
                "source_property": "EMAIL",
                "destination_property": "EMAIL"
              }
            ],
            "transformations": [
              "IGNORE_SPECIAL"
            ]
          },
          {
            "destination_datasource_type": "AZURE_AD",
            "property_matchers": [
              {
                "source_property": "EMAIL",
                "destination_property": "EMAIL"
              }
            ],
            "transformations": [
              "IGNORE_DOMAIN"
            ]
          },
          {
            "destination_datasource_type": "GITHUB_USERS",
            "property_matchers": [
              {
                "source_property": "EMAIL",
                "destination_property": "UNIQUE_ID"
              }
            ]
          }
        ]
      }
    }
    {
      "incremental_change": true,
      "identity_mapping_configuration": {
        "operation": "modify",
        "mappings": [
          {
            "destination_datasource_type": "GITHUB_USERS",
            "property_matchers": [
              {
                "source_property": "EMAIL",
                "destination_property": "UNIQUE_ID"
              }
            ]
          },
          {
            "destination_datasource_type": "SQL_SERVER",
            "property_matchers": [
              {
                "source_property": "EMAIL",
                "destination_property": "EMAIL"
              }
            ],
            "transformations": [
              "IGNORE_DOMAIN"
            ]
          }
        ]
      }
    }
    curl --location 'https://<veza_url>/api/v1/providers/custom/816d6e51-6d6a-4279-ba41-2e7c732be880/datasources/716026b5-4b84-4b2f-a805-b41a6ec69cf3:push' \
    --header 'Content-Type: application/json' \
    --header 'Authorization: Bearer <API_KEY>' \
    --data '{
        "id": "816d6e51-6d6a-4279-ba41-2e7c732be880",
        "data_source_id": "716026b5-4b84-4b2f-a805-b41a6ec69cf3",
        "json_data": "{\"incremental_change\":true,\"identity_mapping_configuration\":{\"operation\":\"modify\",\"mappings\":[{\"destination_datasource_type\":\"GITHUB_USERS\",\"property_matchers\":[{\"source_property\":\"EMAIL\",\"destination_property\":\"UNIQUE_ID\"}]},{\"destination_datasource_type\":\"SQL_SERVER\",\"property_matchers\":[{\"source_property\":\"EMAIL\",\"destination_property\":\"EMAIL\"}],\"transformations\":[\"IGNORE_DOMAIN\"]}]}}"
    }'
    IdP Domain
    IdP Users
    IdP Group
    incremental update
    Identity Mapping Configuration
    custom properties
    Veza Tags
    incremental updates
    Veza Tags
    custom properties
    Custom Properties
    access
    Entities Owned
    incremental updates
    Source Identity
    tags
    Custom Properties
    custom properties
    incremental updates
    Source Identity
    Entities Owned
    IdP Apps
    Custom Properties
    tags
    incremental updates
    Custom Properties

    Custom Application

    Template for pushing custom data source entities and authorization

    hashtag
    Overview

    The Custom Application Template can be used to model most applications and services. It can describe many common entity types (such as users, groups, and resources), and should be the starting point for most custom connectors.

    The template has three primary elements, covered in detail in this document:

    • Applications - describes one or more application instances for the custom data source. An application may consist of any of the following entities:

      • Local Users - defines the users of the application. The local user entity can be used to store the properties of the user specific to the application (such as last_login_at) and can be linked to a source identity like Okta or AzureAD.

      • Local Groups - defines a group of users, permissions to the application or resources can be assigned to a group.

    • Permissions - define the applications specific permissions and map to Veza canonical permissions.

    • Identity to Permissions - Assign local and federated users and groups to permissions or roles to the application and resources.

    • Additionally, a may describe user-configured key:pair values that can be applied to entities in the payload.

    To use the generic app template, set the template type to application when creating a new data provider:

    hashtag
    Enabling Lifecycle Management with SCIM

    If your custom application exposes SCIM 2.0 compliant endpoints, you can enable automated provisioning and deprovisioning through Veza Lifecycle Management and Access Requests by setting the external_lifecycle_management_type parameter to SCIM:

    This enables Veza to automate user provisioning, deprovisioning, and group membership management for your custom application. For detailed configuration and supported operations, see .

    hashtag
    Sample Payload

    chevron-rightSimple Custom Applicationhashtag

    This example demonstrates using local users and groups to assign permissions directly to the application and resources.

    chevron-rightSample Application using Roleshashtag

    hashtag
    Custom Properties and Tags

    and can be applied to most objects in the OAA payload: the application and its local_users, local_groups, local_roles and resources/sub_resources.

    Define custom properties

    hashtag
    Set custom properties

    In the rest of the payload, for each object that should have additional properties, add a custom_properties array containing the property keys and values:

    Use incremental updates to remove tags: Resubmitting a payload with different tags will apply any new tags, but not remove existing ones. To remove a tag already applied to an entity, you will need to use the remove_tag operation.

    Validation and Troubleshooting

    The API response will provide information for invalid data submission. You can check Veza events for updates on parsing status. Errors won't typically occur during parsing, as the metadata is validated upon push. To ensure a valid payload, you should:

    • Confirm all string fields are are valid UTF-8 strings no larger than 256 bytes.

    • Check that all required fields are present. Tags and properties are optional. You can null empty groups, roles, and other "empty" but required keys.

    • A 200 OK response may include warnings when matching IDP identities can't be found

    hashtag
    Applications

    The OAA payload must contain at least one top-level application. To model data systems with multiple components (such as different servers or repositories), applications can have resources and sub-resources.

    You can also specify more than one application in the OAA payload, each with its own identities, permissions, roles, and resources.

    The application_typeis applied to all application resources and identities, and can be used as a filterable property in Veza search.

    hashtag
    Application Properties

    Field
    Type
    Description

    Optional fields: some values in the schema are optional. When submitting a payload without a required field, an error message will help identify the issue. The following guidelines apply:

    • Any type of data in a JSON payload can be null (not set).

    • Unused optional arrays and objects should be empty {} or [].

    • Unused optional strings, numbers, and booleans should be null.

    OAA apps need to contain at least one identity, which could be a local_group, local_role, or an IdP identity. Role assignments are made in the section.

    hashtag
    Resources

    Each application can contain one or more resources that users can access. Resources can have additional searchable properties and may contain additional sub-resources.

    Sub-resources describe additional layers of the application principals can have authorization to, and support the same properties as resources, including additionally nested sub-resources.

    hashtag
    Resource Properties

    An application can have any number of nested sub resources.

    Field
    Type
    Description

    * A specific resource type must have only resources with an id, or only resources without an id. When used identity_to_permissions assignments are made by the id value and name functions as a display name.

    hashtag
    Resource Connections

    In the system being modeled, application resources and sub-resources (such as virtual machines or Looker views) have access to other entities in the Veza Access Graph.

    If an application resource or sub-resource is able to assume the permissions of a local user, IAM role, or Enterprise application, you can specify the connections to another graph entity node_type and id:

    The following node types are currently available:

    • SnowflakeUser

    • GoogleCloudServiceAccount

    • AwsIamRole

    hashtag
    Identities

    Applications can have local users and groups for identities. For users and groups that correlate to an external Identity Provider (for example accounts automatically provisioned by the IdP), you can map the principal to the IdP entity name or login email in identities.

    hashtag
    Local Users

    Contains any users whose profiles and authentication are handled and stored by the custom application. Local users include their group assignments and any federated identities that should be mapped to the local user:

    Field
    Type
    Description

    hashtag
    local Groups

    If the application has any groups, describe each one in the local_groups array.

    Group assignments for entities are defined in identity_to_permissions.

    Field
    Type
    Description

    *Must match a discovered Okta or Azure entity Name, PrincipalName, or Identity

    hashtag
    Local Roles

    Local roles define collections of local permissions that can be assigned to multiple resources. In the applications section, roles are named and mapped to permissions. Role assignments are defined in identity_to_permissions.

    Field
    Type
    Description

    hashtag
    Local Access Credentials

    Access credentials represent API keys, tokens, certificates, or other non-human authentication methods used by applications or services.

    Field
    Type
    Description

    permissions

    Bind local permissions to the corresponding Veza canonical permission(s). Each native application permission should be included as an object, mapped to the corresponding data/non-data actions it allows.

    Canonical permission types are:

    • DataRead

    • DataWrite

    • MetadataRead

    Field
    Type
    Description

    To better model systems where roles can contain different permissions to different types of resources, permissions can apply to individual resource_types.

    • When the payload is parsed, individual permissions are created for each type of resource the permission applies to.

    • Without resource_types specified, the permission will function normally. When directly connecting principals and resources, resource_type is ignored.

    hashtag
    identity_to_permissions

    Contains an object for each local and IdP identity, and the individual permissions to applications and resources.

    • You can bind permissions to federated users and groups by providing the principal’s IDP login email or group name as the identity, and setting the identity_type to idp.

    • Permissions and role assignments can apply to the entire application or scoped to specific resources.

    Field
    Type
    Description
    • Each identity can be either a local_user, local_role, local_group, or local_access_creds name, or the identifier of an IdP user, group, or role (email address or group name).

    • identity_type

    application_permissions

    Binds the identity (IdP entity, local user, or local group) to local permission, by application and resources.

    Field
    Type
    Description

    role_assignments

    Local roles are assigned to identities in the role_assignments array. Roles can apply to the entire application or only to specific (sub) resources.

    Field
    Type
    Description

    hashtag
    Identities to Permissions mapping

    The identity_to_permissions array defines how identities are authorized to applications and resources. Each entry maps an identity to its application permissions and/or role assignments. See the section above for field details.

    Local Roles - defines a collection of permissions. A role can be used to link an identity (local user, group, or IdP) to an application or resource. An identity assigned to a role will be assigned all permissions from that role.

  • Local Access Credentials - defines API keys, tokens, certificates, or other non-human authentication methods used by applications or services.

  • Resources - for more fine grain authorization tracking resources can be used to represent components of the application that have their own authorization. Users and groups can be assigned permission or roles to resources.

    • Sub Resources - resources can additionally have sub-resources for additional levels of depth.

  • string

    Any additional notes to show in the entity details, limit 256 characters

    custom_properties

    dictionary

    contain property_values validated against the custom_property_definition

    tags

    array

    Specify tags with a key and optional value (optional)

    owners

    array

    See

    local_users

    array

    Contains zero or more local users (see ).

    local_groups

    array

    Contains zero or more (collections of users).

    local_roles

    array

    Defines permissions for any within the application.

    local_access_creds

    array

    Contains any for the application.

    local_agents

    array

    Contains any AI agent entities for the application.

    local_models

    array

    Contains any AI model entities for the application.

    resources

    array

    Contains any and sub-resources.

    okta_app_id

    string

    (Optional, early access) The Okta Application ID for this application. When set, Veza enriches local users with sso_last_login_at timestamps from Okta SSO activity. Requires the INTEG_OAA_SSO_LAST_LOGIN feature flag. See .

  • Strings and string lists intended to have constant values (enums) such as identity_type may have a default value when not set.

  • string

    Searchable label for the resource type. The application entity details in Veza will show the contained resource types as properties.

    description

    string

    Shown in Veza entity details, max 255 characters.

    custom_properties

    dictionary

    See .

    sub_resources

    array

    Used for additional resource layers, nested data sources, services, and so on.

    connections

    Optional list of resource connections to external entities discovered by Veza

    tags

    array

    Specify tags with a key and optional value (optional)

    owners

    array

    See

  • AzureADEnterpriseApplication

  • TrinoUser

  • string

    User email address (optional). Separate from identities, this is a display/metadata field on the user entity.

    identities

    identities array

    Maps the user to a federated identity by login email or group name. Use when your IdP provisions local accounts, or if the local user can be assumed by an external group. Must match a discovered Okta, Google Workspace, or Azure AD entity Name, PrincipalName, or Identity.

    groups

    groups array

    List of any memberships as strings. Must exist in local groups.

    access_creds

    array

    List of local_access_creds IDs associated with this user (optional).

    is_active

    boolean

    If activity state is available from the provider, use this field to make the value available as a searchable property (optional).

    user_type

    string

    Distinguishes between human and service_account user types (optional). Useful for identifying non-human accounts in access reviews.

    principal_id

    string

    The ID for this user in a linked principal template, used for automatic connection. If not supplied, the user id is used (optional).

    created_at

    RFC3339 string

    User creation date (optional), for example 1996-12-19T16:39:57-08:00.

    last_login_at

    RFC3339 string

    (optional)

    password_last_changed_at

    RFC3339 string

    (optional)

    deactivated_at

    RFC3339 string

    (optional)

    access_creds

    array

    List of access credential id values associated with this user (optional). Links the user to their API keys, tokens, or other credentials defined in local_access_creds.

    custom_properties

    dictionary

    See .

    tags

    array

    Specify tags with a key and optional value (optional).

    owners

    array

    See

    array

    If IdP users are members of the local group, or if the local group directly maps to an IdP group, list them here.*

    groups

    array

    List of local groups this group is a member of (for applications that support adding groups to other groups).

    access_creds

    array

    List of local_access_creds IDs associated with this group (optional).

    created_at

    RFC3339 string

    Group creation date (optional).

    custom_properties

    dictionary

    See .

    tags

    array

    Specify tags with a key and optional value (optional).

    owners

    array

    See .

    array

    Permissions associated with the role. Must exist in permissions.

    roles

    array

    List of sub-role names for nested role hierarchies (optional). An identity assigned to this role inherits all permissions from its sub-roles.

    custom_properties

    dictionary

    See .

    tags

    array

    Specify tags with a key and optional value (optional).

    owners

    array

    See .

    RFC3339 string

    When the credential was created (optional)

    expires_at

    RFC3339 string

    When the credential expires (optional)

    last_used_at

    RFC3339 string

    Last time the credential was used (optional)

    can_expire

    boolean

    Whether the credential can expire

    is_active

    boolean

    Whether the credential is currently active

    custom_properties

    dictionary

    See

    tags

    array

    See

    owners

    array

    See

  • MetadataWrite

  • NonData

  • DataCreate

  • DataDelete

  • MetadataCreate

  • MetadataDelete

  • Uncategorized

  • bool

    To more accurately model applications where permissions should apply to any children of a resource, set TRUE to define the permission as inheritable. This eliminates the need to include the permission at each sub level.

    resource_types

    array

    Optional list of resource type strings. When specified, separate permission nodes are created per resource type. See below.

    For each identity (matching a local user, group, or IdP identity), state the identity type and add the assigned permissions/roles:

    array

    List each local permission available to the identity (must be a valid permission name from the previous section).

    role_assignments

    array

    Any roles assigned to the identity, and the resources they apply to (role/resource must exist in applications).

    must be one of:
    idp
    (default),
    local_user
    ,
    local_group
    ,
    local_role
    , or
    local_access_creds
    .

    boolean

    Set to true to model environments where permissions apply to the top-level application as well as its resources.

    permission

    string

    Maps to a permission name from the second section. Must exist in permissions

    boolean

    Set to true to model environments where the role applies to the top-level application and all its resources.

    resources

    array

    List of resources and sub-resources where the role applies. Must exist in applications

    assignment_properties

    dictionary

    Custom properties on the role assignment itself (optional). Must be defined in role_assignment_properties within custom_property_definition. Useful for tracking assignment-specific metadata such as assignment date or expiration.

    name

    string

    Identifies the app in Veza Search. Used to bind permissions to the application

    application_type

    string

    Applied to all entities within the application as a searchable property. Multiple instances of an application can share the same type

    name

    string

    Resource name. Primary ID for mapping users to individual resource permissions.

    id

    string

    Optional value to use as the unique ID, instead of the resource name*.

    name

    string

    Name of the local user, shown in the Veza UI.

    id

    string

    Optional identifier to use for mapping users to groups, roles, and permissions.

    name

    string

    Name of the local group. Primary ID for mapping group to permissions.

    id

    string

    Optional identifier to use for permissions mapping.

    name

    string

    Name of the local role. Primary ID for mapping role to permissions.

    id

    string

    Optional identifier to use for permissions mapping.

    name

    string

    Name of the access credential

    id

    string

    Unique identifier for the credential

    name

    string

    Native permission name, such as “Push” (used to bind local and IdP identities to native permissions).

    permission_type

    enum

    List of canonical privilege(s) the permission represents.

    identity

    string

    Principal name or email address. Maps to IdP login email or group name.

    identity_type

    string

    Sets whether the identity corresponds to an IdP identity, or is local to the application

    application

    string

    Maps to an application name from the first section. Must exist in applications

    resources

    array

    List of application resource or sub-resource names to apply the permission. Must exist in applications

    application

    string

    The application where the role applies. Must exist in applications

    role

    string

    The role name. Must exist in local_roles

    custom property definition
    Custom Application with SCIM (OAA)
    Custom properties
    Veza Tags
    incremental update
    identity_to_permissions
    identity_to_permissions

    description

    resource_type

    email

    identities

    permissions

    created_at

    apply_to_sub_resources

    application_permissions

    apply_to_application

    apply_to_application

    curl -X POST "https://{VEZA_URL}/api/v1/providers/custom" \
    -H "authorization: Bearer {API_KEY}" \
    --compressed --data-binary '{"name":"DemoApp","custom_template":"application"}'
    curl -X POST "https://{VEZA_URL}/api/v1/providers/custom" \
    -H "authorization: Bearer {API_KEY}" \
    -H "Content-Type: application/json" \
    --data '{
      "name": "MyCustomApp",
      "custom_template": "application",
      "external_lifecycle_management_type": "SCIM"
    }'
    {
      "custom_property_definition": {
        "applications": [
          {
            "application_type": "sample",
            "application_properties": {},
            "local_user_properties": {},
            "local_group_properties": {},
            "local_role_properties": {},
            "resources": []
          }
        ]
      },
      "applications": [
        {
          "name": "Sample App",
          "application_type": "sample",
          "description": "This is a sample app",
          "local_users": [
            {
              "id": "0000000001",
              "name": "bob",
              "identities": [
                "[email protected]"
              ],
              "is_active": true,
              "created_at": "2022-01-26T20:48:12.460Z"
            },
            {
              "id": "0000000002",
              "name": "jane",
              "identities": [
                "[email protected]"
              ],
              "groups": [
                "admins"
              ],
              "created_at": "2021-08-13T06:28:13.250Z"
            }
          ],
          "local_groups": [
            {
              "id": "admins",
              "name": "Administrators"
            }
          ],
          "local_roles": [],
          "tags": [],
          "custom_properties": {},
          "resources": [
            {
              "id": "0001",
              "name": "Entity1",
              "resource_type": "thing",
              "description": "Some entity in the application",
              "sub_resources": [
                {
                  "name": "Child 1",
                  "resource_type": "child",
                  "description": "My information about resource"
                }
              ]
            },
            {
              "id": "0002",
              "name": "Entity2",
              "resource_type": "thing",
              "description": "Another entity in the application"
            }
          ]
        }
      ],
      "permissions": [
        {
          "name": "admin",
          "permission_type": [
            "DataRead",
            "DataWrite"
          ],
          "apply_to_sub_resources": false,
          "resource_types": []
        },
        {
          "name": "operator",
          "permission_type": [
            "DataRead",
            "MetadataRead"
          ],
          "apply_to_sub_resources": false,
          "resource_types": []
        },
        {
          "name": "manager",
          "permission_type": [
            "MetadataWrite"
          ],
          "apply_to_sub_resources": false,
          "resource_types": []
        }
      ],
      "identity_to_permissions": [
        {
          "identity": "0000000001",
          "identity_type": "local_user",
          "application_permissions": [
            {
              "application": "Sample App",
              "permission": "operator",
              "apply_to_application": true
            },
            {
              "application": "Sample App",
              "resources": [
                "0001"
              ],
              "permission": "manager"
            }
          ]
        },
        {
          "identity": "admins",
          "identity_type": "local_group",
          "application_permissions": [
            {
              "application": "Sample App",
              "permission": "admin",
              "apply_to_application": true
            }
          ]
        }
      ]
    }
    {
      "applications": [
        {
          "name": "Sample App",
          "application_type": "sample",
          "description": "This is a sample app",
          "local_users": [
            {
              "name": "bob",
              "identities": [
                "[email protected]"
              ],
              "is_active": true,
              "created_at": "2022-01-26T20:48:12.460Z",
              "id": "0000000001"
            },
            {
              "name": "jane",
              "identities": [
                "[email protected]"
              ],
              "created_at": "2021-08-13T06:28:13.250Z",
              "id": "0000000002"
            }
          ],
          "local_groups": [],
          "local_roles": [
            {
              "id": "admin",
              "name": "Administrator",
              "permissions": [
                "manage_users"
              ],
              "tags": [],
              "custom_properties": {}
            },
            {
              "id": "user",
              "name": "User",
              "permissions": [
                "view_tickets",
                "close_tickets"
              ],
              "tags": [],
              "custom_properties": {}
            }
          ],
          "tags": [],
          "custom_properties": {},
          "resources": []
        }
      ],
      "permissions": [
        {
          "name": "manage_users",
          "permission_type": [
            "MetadataWrite"
          ],
          "apply_to_sub_resources": false,
          "resource_types": []
        },
        {
          "name": "view_tickets",
          "permission_type": [
            "DataRead"
          ],
          "apply_to_sub_resources": false,
          "resource_types": []
        },
        {
          "name": "close_tickets",
          "permission_type": [
            "MetadataWrite"
          ],
          "apply_to_sub_resources": false,
          "resource_types": []
        }
      ],
      "identity_to_permissions": [
        {
          "identity": "0000000001",
          "identity_type": "local_user",
          "role_assignments": [
            {
              "application": "Sample App",
              "role": "user",
              "apply_to_application": true,
              "resources": []
            }
          ]
        },
        {
          "identity": "0000000002",
          "identity_type": "local_user",
          "role_assignments": [
            {
              "application": "Sample App",
              "role": "user",
              "apply_to_application": true,
              "resources": []
            },
            {
              "application": "Sample App",
              "role": "admin",
              "apply_to_application": true,
              "resources": []
            }
          ]
        }
      ]
    }
      "custom_property_definition": {
        "applications": [
          {
            "application_type": "sample",
            "application_properties": {},
            "local_user_properties": {
              "license_type": "STRING",
              "license_expires": "TIMESTAMP"
            },
            "local_group_properties": {},
            "local_role_properties": {},
            "role_assignment_properties": {},
            "access_cred_properties": {},
            "resources": []
          }
        ]
      }
          "local_users": [
            {
              "id": "001010",
              "name": "bob",
              "identities": [
                "[email protected]"
              ],
              "groups": null,
              "is_active": true,
              "created_at": "2022-01-26T20:48:12.460Z",
              "last_login_at": null,
              "deactivated_at": null,
              "password_last_changed_at": null,
              "tags": [],
              "custom_properties": {
                "license_type": "pro",
                "license_expires": "2023-01-01T00:00:00.000Z"
              }
            }
          ]
    {
      "applications": [
        {
          "name": "Custom App",
          "application_type": "Source Control",
          "description": "Has a resource for each repository",
          "custom_properties": {},
          "tags": [],
          "owners": [],
          "local_users": [],
          "local_groups": [],
          "local_roles": [],
          "resources": []
        }
      ]
    }
    "resources": [
      {
        "name": "Entity1",
        "id": "Unique ID",
        "resource_type": "thing",
        "description": "Some entity in the application",
        "sub_resources": [
          {
            "name": "Child 1",
            "resource_type": "child",
            "description": "My information about resource",
            "sub_resources": [],
            "custom_properties": {},
            "tags": [],
            "owners": []
          }
        ],
        "custom_properties": {},
        "tags": [],
        "owners": []
      },
      {
        "name": "Entity2",
        "id": "Another Unique ID",
        "resource_type": "thing",
        "description": "Another entity in the application",
        "sub_resources": [],
        "custom_properties": {},
        "tags": [],
        "owners": [],
      }
    ]
    {
      "name": "cog1",
      "resource_type": "cog",
      "connections": [
        {
          "id": "[email protected]",
          "node_type": "GoogleCloudServiceAccount"
         }
      ]
    }
    "local_users": [
      {
        "id": "egray",
        "name": "Evan Gray",
        "email": "[email protected]",
        "identities": ["[email protected]"],
        "groups": ["contractors"],
        "is_active": true,
        "created_at": "2020-12-19T16:39:57-08:00",
        "last_login_at": "2021-11-19T14:19:30-08:00",
        "password_last_changed_at": null,
        "deactivated_at": null,
        "custom_properties": {},
        "tags": [],
        "owners": []
       }
    ]
    "local_groups": [
      {
        "name": "US Contractors",
        "id": "us-contractors",
        "identities": ["[email protected]"],
        "groups": [
          "all-contractors",
          "all-workers"
        ],
        "tags": [],
        "owners": []
      }
    ]
    "local_roles": [
        {
            "name": "administrator",
            "id": "0001",
            "permissions": ["create","destroy"]
        },
        {
            "name": "operator",
            "id": "0002",
            "permissions": ["pull", "read"],
            "tags": [],
            "owners": []
        }
    ]
    "local_access_creds": [
      {
        "name": "Production API Key",
        "id": "prod-key-001",
        "created_at": "2023-01-15T08:00:00.000Z",
        "expires_at": "2024-01-15T08:00:00.000Z",
        "last_used_at": "2023-12-01T14:30:00.000Z",
        "can_expire": true,
        "is_active": true,
        "custom_properties": {},
        "tags": [],
        "owners": []
      }
    ]
    "permissions": [
       {
         "name": "Admin",
         "permission_type": [
           "DataRead",
           "DataWrite",
           "MetadataRead",
           "MetadataWrite"
         ]
       },
       {
         "name": "Operator",
         "permission_type": [
           "MetadataRead",
           "DataRead"
         ]
       },
       {
         "name": "Inactive",
         "permission_type": [
           "NonData"
         ]
       }
     ]
    "identity_to_permissions": [
         {
           "identity": "Evan Gray",
           "identity_type": "local_user",
           "application_permissions": [
              {
               "application": "Veza AI",
               "resources": ["terraform-dev", "prod"],
               "permission": "pull"
             },
             {
               "application": "Veza AI",
               "resources": ["terraform-dev", "prod"],
               "permission": "push"
             }
           ]
         }
       ]
    {
        "identity": "[email protected]",
        "identity_type": "idp",
        "application_permissions":
        [
            {
                "application": "source control",
                "resources": ["util-tools", "terraform"],
                "apply_to_application": false,
                "permission": "write"
            },
            {
                "application": "source control",
                "resources": [],
                "apply_to_application": true,
                "permission": "read"
            }
        ]
    }
    {
        "identity": "john_smith",
        "identity_type": "local_user",
        "role_assignments":[
            {
                "application": "custom application",
                "role": "administrator",
                "apply_to_application": true,
                "resources": []
            },
            {
                "application": "custom application",
                "role": "ops",
                "apply_to_application": false,
                "resources": ["oaa-vm-1"]
            }
        ]
    }
      "identity_to_permissions": [
        {
          "identity": "0000000001",
          "identity_type": "local_user",
          "role_assignments": [
            {
              "application": "Sample App",
              "role": "user",
              "apply_to_application": true,
              "resources": []
            }
          ]
        },
        {
          "identity": "0000000002",
          "identity_type": "local_user",
          "role_assignments": [
            {
              "application": "Sample App",
              "role": "user",
              "apply_to_application": true,
              "resources": []
            },
            {
              "application": "Sample App",
              "role": "admin",
              "apply_to_application": true,
              "resources": []
            }
          ]
        }
      ]
    
    Custom Properties
    Entity Owners
    local_identities
    local groups
    roles
    access credentials
    resources
    Okta SSO last login enrichment
    Custom Properties
    Resource Connections
    Entity Owners
    group
    Custom Properties
    tags
    Entity Owners
    Custom Properties
    Entity Owners
    Custom Properties
    Entity Owners
    Custom Properties
    Veza Tags
    Entity Owners