arrow-left

All pages
gitbookPowered by GitBook
1 of 4

Loading...

Loading...

Loading...

Loading...

OAA Operations

API calls for managing and updating custom data sources

Use these REST API calls to manage and update custom providers and data sources with Open Authorization API.

hashtag
Create Custom Provider

Creates a custom provider and returns the provider ID.

hashtag
List Custom Providers

Lists all configured custom providers.

hashtag
Get Custom Provider by ID

Returns details for an individual custom provider.

hashtag
Delete Custom Provider

Delete a custom provider by ID.

hashtag
List Custom Provider Datasources

Return all data sources for a Custom Provider ID.

You can constrain large responses by adding a filter to the request query string. Include the operator (eq), and value, for example:

CURL <VEZA_URL>/api/v1/providers/custom?filter=name eq "GitHub"&order_by=state

circle-info

Veza expects that spaces in URLS are encoded as "+" (for example?name+eq+"GitHub"&order_by=state). Note that some libraries and clients will encode spaces as "%2B" by default, which will cause errors unless you override this behavior.

hashtag
Create Custom Provider Datasource

Register a new datasource for a custom provider. There can be more than one datasource for a single provider.

hashtag
Get Datasource by ID

Returns details for a single datasource.

hashtag
Delete Custom Provider Datasource

Unbind a datasource from a custom provider, and delete it.

circle-info

You can also delete OAA datasources from the Veza web interface. On the Integrations page, find the OAA datasource in the list and click the action menu (â‹®) to access the Delete option.

hashtag
Push Custom Provider Datasource

To push authorization metadata for a custom datasource, you can specify the source and provider IDs, and upload a payload with the entities and permissions in JSON format.

A warning is returned for any non-critical errors during payload processing. These can indicate incomplete or inaccurate data in the payload that do not prevent processing, but may warrant attention.

hashtag
Multipart Push Custom Provider Datasource

For large payloads that exceed 100 MB, use the multipart upload endpoint to upload the payload in chunks. See for details, examples, and Python SDK usage.

hashtag
Push Custom Provider Datasource CSV

For , this endpoint pushes CSV data to an existing datasource. Typically, you will first create the integration and define column mappings using the "Add Integration" flow in Veza.

CSV data must base64 encoded into the JSON body of the request.

hashtag
Compression

The populated template can be compressed and encoded, for significantly reduced payload size.

  • Specify the compression_type. Currently supported: GZIP.

  • If compression is selected, Veza will expect the payload json_data as a compressed, base64-encoded string.

To compress using shell commands:

Size is typically not an issue when updating custom datasources. However, you may want to compress large payloads. The maximum body size is 100MB (compressed or uncompressed).

hashtag
Escaping unsafe characters

Veza expects the populated template as a single JSON string, enclosed in the request body json_data field. Any "s and non-ASCII characters must be escaped.

To convert a template to JSON string using Python, the json.dumps() method could be used:

hashtag
Custom Provider Icons

You can optionally add an icon for your custom provider by uploading a PNG or SVG file (less than 64kb) as a base64-encoded string:

hashtag
Create Custom Provider Icon

Upload a custom icon to display for an OAA provider.

hashtag
Get Custom Provider Icon

Return the type and string-encoded icon for a custom provider.

hashtag
Delete Custom Provider Icon

Delete the icon associated with an OAA provider.

POST /api/v1/providers/custom/{id}/datasources/{data_source_id}:parts
{
    "csv_data": "abc123="
}
CSV_PAYLOAD=$(cat my_app_data.csv | base64)
curl --location https://example.vezacloud.com/api/v1/providers/custom/40bdd318-d320-4574-be90-ca556d59889a/datasources/9bc29dc6-8cd0-4926-992e-7d720305ae2f:push_csv \
--request POST \
--header "Content-Type: application/json" \
--header "Authorization: Bearer $VEZA_API_KEY" \
--data "{\"csv_data\": \"${CSV_PAYLOAD}\"}"
cat app_payload.json | gzip | base64 -o json_data.b64
payload = {"id": provider_id,
           "data_source_id": data_source_id,
           "json_data": json.dumps(template_contents)
           }
curl -X POST '{{VezaURL}}/api/v1/providers/custom/962d5eff-285c-4b08-a54e-400eead1e680:icon' \
-H "authorization: Bearer $API_KEY" \
-d '{"icon_base64": "PHN2ZyBmaWxsPSIjMDAwMDAwIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciICB2aWV3Qm94PSIwIDAgNjQgNjQiIHdpZHRoPSIzMnB4IiBoZWlnaHQ9IjMycHgiPjxwYXRoIGQ9Ik0zMiA2QzE3LjY0MSA2IDYgMTcuNjQxIDYgMzJjMCAxMi4yNzcgOC41MTIgMjIuNTYgMTkuOTU1IDI1LjI4Ni0uNTkyLS4xNDEtMS4xNzktLjI5OS0xLjc1NS0uNDc5VjUwLjg1YzAgMC0uOTc1LjMyNS0yLjI3NS4zMjUtMy42MzcgMC01LjE0OC0zLjI0NS01LjUyNS00Ljg3NS0uMjI5LS45OTMtLjgyNy0xLjkzNC0xLjQ2OS0yLjUwOS0uNzY3LS42ODQtMS4xMjYtLjY4Ni0xLjEzMS0uOTItLjAxLS40OTEuNjU4LS40NzEuOTc1LS40NzEgMS42MjUgMCAyLjg1NyAxLjcyOSAzLjQyOSAyLjYyMyAxLjQxNyAyLjIwNyAyLjkzOCAyLjU3NyAzLjcyMSAyLjU3Ny45NzUgMCAxLjgxNy0uMTQ2IDIuMzk3LS40MjYuMjY4LTEuODg4IDEuMTA4LTMuNTcgMi40NzgtNC43NzQtNi4wOTctMS4yMTktMTAuNC00LjcxNi0xMC40LTEwLjQgMC0yLjkyOCAxLjE3NS01LjYxOSAzLjEzMy03Ljc5MkMxOS4zMzMgMjMuNjQxIDE5IDIyLjQ5NCAxOSAyMC42MjVjMC0xLjIzNS4wODYtMi43NTEuNjUtNC4yMjUgMCAwIDMuNzA4LjAyNiA3LjIwNSAzLjMzOEMyOC40NjkgMTkuMjY4IDMwLjE5NiAxOSAzMiAxOXMzLjUzMS4yNjggNS4xNDUuNzM4YzMuNDk3LTMuMzEyIDcuMjA1LTMuMzM4IDcuMjA1LTMuMzM4LjU2NyAxLjQ3NC42NSAyLjk5LjY1IDQuMjI1IDAgMi4wMTUtLjI2OCAzLjE5LS40MzIgMy42OTdDNDYuNDY2IDI2LjQ3NSA0Ny42IDI5LjEyNCA0Ny42IDMyYzAgNS42ODQtNC4zMDMgOS4xODEtMTAuNCAxMC40IDEuNjI4IDEuNDMgMi42IDMuNTEzIDIuNiA1Ljg1djguNTU3Yy0uNTc2LjE4MS0xLjE2Mi4zMzgtMS43NTUuNDc5QzQ5LjQ4OCA1NC41NiA1OCA0NC4yNzcgNTggMzIgNTggMTcuNjQxIDQ2LjM1OSA2IDMyIDZ6TTMzLjgxMyA1Ny45M0MzMy4yMTQgNTcuOTcyIDMyLjYxIDU4IDMyIDU4IDMyLjYxIDU4IDMzLjIxMyA1Ny45NzEgMzMuODEzIDU3Ljkzek0zNy43ODYgNTcuMzQ2Yy0xLjE2NC4yNjUtMi4zNTcuNDUxLTMuNTc1LjU1NEMzNS40MjkgNTcuNzk3IDM2LjYyMiA1Ny42MSAzNy43ODYgNTcuMzQ2ek0zMiA1OGMtLjYxIDAtMS4yMTQtLjAyOC0xLjgxMy0uMDdDMzAuNzg3IDU3Ljk3MSAzMS4zOSA1OCAzMiA1OHpNMjkuNzg4IDU3LjljLTEuMjE3LS4xMDMtMi40MTEtLjI4OS0zLjU3NC0uNTU0QzI3LjM3OCA1Ny42MSAyOC41NzEgNTcuNzk3IDI5Ljc4OCA1Ny45eiIvPjwvc3ZnPg=="}'
Multipart Upload
CSV Upload Integrations

Okta SSO Last Login Enrichment

Enrich OAA custom application users with SSO last login timestamps from Okta

circle-exclamation

Early Access: This feature is not enabled by default. Contact your Veza support team to enable the INTEG_OAA_SSO_LAST_LOGIN flag for your tenant.

Veza can enrich custom application (OAA) users with SSO last login timestamps by correlating Okta sign-in activity with your application's local users. When enabled, each local user in the Veza graph gains a sso_last_login_at property showing the last time that user accessed the application through Okta SSO.

This is useful for identifying dormant accounts, auditing access patterns, and supporting access reviews.

hashtag
How it works

  1. You specify the Okta Application ID (okta_app_id) for your custom application.

  2. Veza matches your OAA local users to Okta users using a configurable matching property (set via the Veza API in Step 2).

  3. On each data push, Veza looks up Okta SSO activity for your application and writes the last login timestamp to matching local user nodes.

Enrichment runs in the OAA service after data submission. If Okta activity data is unavailable, the push completes normally without SSO timestamps — no data is lost.

hashtag
Prerequisites

  • An active Okta integration in Veza with . Audit log data is the source for sso_last_login_at timestamps.

  • A custom application (OAA) integration, using either API push or CSV upload.

  • Your OAA local users must have identities values that match a property on your Okta user profiles (such as email address or a custom attribute).

hashtag
Setup

hashtag
Step 1: Request feature enablement

Contact your Veza representative or support team and request:

Enable the INTEG_OAA_SSO_LAST_LOGIN feature flag on our tenant.

This flag is Veza-administered and cannot be self-enabled.

hashtag
Step 2: Set the matching property configuration

Configure which Okta user property Veza uses to correlate Okta users with your application's local users. You can set this yourself using the Veza API.

circle-exclamation

/api/private/ endpoints are not part of the public API contract and may change between releases.

The string you pass as value specifies which OktaUser attribute to use for identity mapping. The attribute value on each Okta user must match the identities field on the linked OAA local users.

  • For example, if local users have identities: ["[email protected]"] and OktaUser nodes have login: "[email protected]", use login.

  • Custom attributes (e.g., customprop_employee_id) are also supported.

To set the property, send a PUT request with an API key that has the admin or system_monitoring role:

Replace <okta_user_property_name> with the OktaUser property to match on (e.g., login, email, or a custom attribute such as customprop_idx_uid).

To verify the current value:

Look for the okta_sso_user_matching_property key in the response.

hashtag
Step 3: Find your Okta application ID

Locate the Okta Application ID (0oa…) for the application you want to enrich:

  1. Log in to your Okta Admin Console.

  2. Navigate to Applications > Applications.

  3. Select the application.

  4. Copy the application ID from the URL (format: 0oaXXXXXXXXXXXXXXXX

hashtag
Step 4: Add the Okta app ID to your custom application

The method depends on how you push data to Veza.

hashtag
API push (JSON)

Add the okta_app_id field to your application payload at the application level:

  • okta_app_id (application level): Your Okta Application ID.

  • identities (user level): One or more identity strings matched against the configured Okta user property.

hashtag
CSV upload

  1. Navigate to Integrations > Custom Application (CSV).

  2. Enter your Okta Application ID in the Okta App ID field in the application configuration form.

  3. Upload your CSV as usual, ensuring users have identity values that match their Okta profiles.

circle-info

The Okta App ID field in the CSV configuration form is only visible when the INTEG_OAA_SSO_LAST_LOGIN feature flag is enabled on your tenant.

hashtag
Verifying enrichment

After pushing data, verify enrichment is working:

  1. Open Query Builder in Veza.

  2. Query for your custom application's local users.

  3. Check the sso_last_login_at column on user nodes.

Users whose identities matched an Okta user with SSO activity for your application will have a sso_last_login_at timestamp. Users without a match (such as service accounts or users not in Okta) will not have this property — this is expected.

hashtag
Behavior notes

  • Matching is case-insensitive. [email protected] and [email protected] are treated as the same identity.

  • First match wins. If a user has multiple identities, the first one that matches an Okta user is used.

  • Enrichment is non-blocking. If Okta data is unavailable, the push completes without SSO timestamps. No data is lost.

hashtag
Troubleshooting

Issue
Possible cause
Resolution
).
  • Timestamps reflect Okta access pattern data. The sso_last_login_at value comes from Okta's recorded activity for your specific application.

  • Identity mismatch

    Ensure the user's identities values match the OktaUser property values (check casing and email format)

    sso_last_login_at missing on specific users

    No Okta SSO activity

    The user may not have accessed this application through Okta SSO

    sso_last_login_at missing on specific users

    No audit log activity for the app

    Check Audit Logs for entries where the identity (GPID) accessed the OktaApp matching your okta_app_id. Enrichment only occurs when Veza has recorded SSO activity for that identity and application. This requires on the Okta integration.

    Okta App ID field not visible in CSV form

    Feature flag not enabled

    Contact Veza support to enable the feature

    curl -X PUT \
      "https://<tenant>.vezacloud.com/api/private/namespaces/integrations/configurations/okta_sso_user_matching_property" \
      -H "Authorization: Bearer <api_key>" \
      -H "Content-Type: application/json" \
      -d '{"value": "<okta_user_property_name>"}'
    curl -s "https://<tenant>.vezacloud.com/api/private/namespaces/integrations/configurations" \
      -H "Authorization: Bearer <api_key>"
    {
      "name": "My Application",
      "application_type": "my_app_type",
      "okta_app_id": "0oaABCDEF1234567890",
      "local_users": [
        {
          "unique_id": "jdoe",
          "name": "Jane Doe",
          "identities": ["[email protected]"],
          "email": "[email protected]"
        }
      ]
    }

    sso_last_login_at not appearing on any users

    Feature flag not enabled

    Contact Veza support to verify INTEG_OAA_SSO_LAST_LOGIN is enabled

    sso_last_login_at not appearing on any users

    Matching property not configured

    Use the API in Step 2 to set okta_sso_user_matching_property, or contact Veza support to verify it is set

    audit logs enabled

    sso_last_login_at missing on specific users

    Audit Logs enabled
    post
    Authorizations
    AuthorizationstringRequired

    Veza API key for authentication. Generate keys in Administration > API Keys.

    Body
    namestringOptional
    custom_templatestringOptional
    provisioningbooleanOptional
    push_typeinteger · enumOptional
    internal_app_namestringOptional
    configuration_jsonstringOptional
    data_plane_idstringOptional
    custom_templatesstring[]Optional
    template_typestringOptional
    column_namestringOptional
    destination_typestringOptional
    destination_propertystringOptional
    namestringOptional
    typeinteger · enumOptional
    lcm_unique_identifierbooleanOptional
    as_listbooleanOptional
    templatestringOptional
    property_typeinteger · enumOptional
    is_requiredbooleanOptional
    application_namestringOptional
    application_typestringOptional
    identitystring[]Optional
    resource_typestringOptional
    okta_app_idstringOptional
    list_delimiterstringOptional
    idp_typestringOptional
    domainstringOptional
    hris_namestringOptional
    hris_typestringOptional
    hris_urlstringOptional
    destination_datasource_typestringOptional
    destination_datasource_oaa_app_typestringOptional
    typeinteger · enumOptional
    modeinteger · enumOptional
    transformationsinteger · enum[]Optional
    custom_valuestringOptional
    source_propertyinteger · enumOptional
    destination_propertyinteger · enumOptional
    custom_source_propertystringOptional
    custom_destination_propertystringOptional
    source_idstringOptional
    destination_idstringOptional
    typestringOptional
    oaa_app_typestringOptional
    use_emailbooleanOptional
    hris_provisioning_sourcebooleanOptional
    cmdb_instance_namestringOptional
    cmdb_instance_typestringOptional
    owner_id_column_namestringOptional
    asset_id_column_namestringOptional
    asset_type_column_namestringOptional
    owner_node_typestringOptional
    owner_id_propertystringOptional
    asset_type_valuestringOptional
    asset_node_typestringOptional
    asset_property_namestringOptional
    idstringRead-onlyOptional
    secret_idstringOptional
    vault_idstringOptional
    idstringRead-onlyOptional
    namestringOptional

    Must be unique within an insight point

    vault_providerstringOptional

    Provider type: "azure_key_vault", "aws_secrets_manager", etc.

    insight_point_idstringOptional

    Owning insight point ID, or "internal" for control plane vaults

    deletedbooleanOptional

    Soft-deleted flag for external vaults; restored by re-registering (internal vaults are hard-deleted)

    external_lifecycle_management_typeinteger · enumOptional

    For external OAA, how to manage lifecycle management requests

    Responses
    chevron-right
    200

    OK

    application/json
    idstringOptional

    Unique identifier for the provider instance.

    external_idstringOptional

    External identifier for the provider, typically set by the integration that created it.

    namestringOptional

    Display name of the provider.

    custom_templatestringOptional

    The OAA template type used to create this provider (e.g., "application", "idp").

    custom_templatesstring[]Optional

    List of OAA template types associated with this provider instance (e.g., "application", "idp", "hris").

    stateinteger · enumOptional

    Current provider state.

    application_typesstring[]Optional

    Application type classifications for this provider.

    resource_typesstring[]OptionalDeprecated

    Deprecated. Resource type classifications. Use application_types, idp_types, hris_types, or file_system_types instead.

    idp_typesstring[]Optional

    Identity provider type classifications (if this provider represents an IdP).

    file_system_typesstring[]Optional

    File system type classifications (if this provider represents a file system).

    hris_typesstring[]Optional

    HRIS system type classifications (if this provider represents an HR system).

    principal_typesstring[]Optional

    Principal (identity) type classifications for this provider.

    secret_store_typesstring[]Optional
    schema_definition_jsonstring · bytesOptional
    provisioningbooleanOptional

    Whether provisioning (write-back) operations are enabled for this provider.

    push_typeinteger · enumOptional
    rbac_idstringOptional
    internal_app_namestringOptional
    configuration_jsonstringOptional

    JSON string containing the provider's connection configuration parameters.

    data_plane_idstringOptional

    Identifier of the data plane that runs this provider's extraction. Empty for cloud-hosted extraction.

    lifecycle_management_stateinteger · enumOptional

    Current lifecycle management state for this provider (enum). Indicates whether provisioning and deprovisioning workflows are active.

    team_idstringOptional

    Identifier of the team that owns this provider instance.

    template_typestringOptional
    column_namestringOptional
    destination_typestringOptional
    destination_propertystringOptional
    namestringOptional
    typeinteger · enumOptional
    lcm_unique_identifierbooleanOptional
    as_listbooleanOptional
    templatestringOptional
    property_typeinteger · enumOptional
    is_requiredbooleanOptional
    application_namestringOptional
    application_typestringOptional
    identitystring[]Optional
    resource_typestringOptional
    okta_app_idstringOptional
    list_delimiterstringOptional
    idp_typestringOptional
    domainstringOptional
    hris_namestringOptional
    hris_typestringOptional
    hris_urlstringOptional
    destination_datasource_typestringOptional
    destination_datasource_oaa_app_typestringOptional
    typeinteger · enumOptional
    modeinteger · enumOptional
    transformationsinteger · enum[]Optional
    custom_valuestringOptional
    source_propertyinteger · enumOptional
    destination_propertyinteger · enumOptional
    custom_source_propertystringOptional
    custom_destination_propertystringOptional
    source_idstringOptional
    destination_idstringOptional
    typestringOptional
    oaa_app_typestringOptional
    use_emailbooleanOptional
    hris_provisioning_sourcebooleanOptional
    cmdb_instance_namestringOptional
    cmdb_instance_typestringOptional
    owner_id_column_namestringOptional
    asset_id_column_namestringOptional
    asset_type_column_namestringOptional
    owner_node_typestringOptional
    owner_id_propertystringOptional
    asset_type_valuestringOptional
    asset_node_typestringOptional
    asset_property_namestringOptional
    idstringRead-onlyOptional
    secret_idstringOptional
    vault_idstringOptional
    idstringRead-onlyOptional
    namestringOptional

    Must be unique within an insight point

    vault_providerstringOptional

    Provider type: "azure_key_vault", "aws_secrets_manager", etc.

    insight_point_idstringOptional

    Owning insight point ID, or "internal" for control plane vaults

    deletedbooleanOptional

    Soft-deleted flag for external vaults; restored by re-registering (internal vaults are hard-deleted)

    external_lifecycle_management_typeinteger · enumOptional

    For external OAA, how to manage lifecycle management requests

    cmdb_typesstring[]Optional
    chevron-right
    default

    Default error response

    application/json

    The Status type defines a logical error model that is suitable for different programming environments, including REST APIs and RPC APIs. It is used by gRPC. Each Status message contains three pieces of data: error code, error message, and error details. You can find out more about this error model and how to work with it in the API Design Guide.

    codeinteger · int32Optional

    The status code, which should be an enum value of [google.rpc.Code][google.rpc.Code].

    messagestringOptional

    A developer-facing error message, which should be in English. Any user-facing error message should be localized and sent in the [google.rpc.Status.details][google.rpc.Status.details] field, or localized by the client.

    @typestringOptional

    The type of the serialized message.

    Other propertiesanyOptional
    post
    /api/v1/providers/custom

    hashtag
    List custom providers

    get

    Retrieve all custom (OAA) providers configured in the tenant. Custom providers represent integrations built using the Open Authorization API (OAA), including both Veza-managed connectors and customer-built integrations. Use the filter parameter to narrow results by name, state, or custom_template (e.g., filter=name eq "My App"). Set page_size to control results per page (default varies), and use page_token from the response to retrieve subsequent pages.

    Authorizations
    AuthorizationstringRequired

    Veza API key for authentication. Generate keys in Administration > API Keys.

    Query parameters
    filterstringOptional
    order_bystringOptional
    page_sizeinteger · int32Optional

    The maximum number of results to be returned. Fewer results may be returned even when more pages exist.

    page_tokenstringOptional

    The token specifying the specific page of results to retrieve.

    Responses
    chevron-right
    200

    OK

    application/json

    Paginated list of custom (OAA) providers.

    idstringOptional

    Unique identifier for the provider instance.

    external_idstringOptional

    External identifier for the provider, typically set by the integration that created it.

    namestringOptional

    Display name of the provider.

    custom_templatestringOptional

    The OAA template type used to create this provider (e.g., "application", "idp").

    custom_templatesstring[]Optional

    List of OAA template types associated with this provider instance (e.g., "application", "idp", "hris").

    stateinteger · enumOptional

    Current provider state.

    application_typesstring[]Optional

    Application type classifications for this provider.

    resource_typesstring[]OptionalDeprecated

    Deprecated. Resource type classifications. Use application_types, idp_types, hris_types, or file_system_types instead.

    idp_typesstring[]Optional

    Identity provider type classifications (if this provider represents an IdP).

    file_system_typesstring[]Optional

    File system type classifications (if this provider represents a file system).

    hris_typesstring[]Optional

    HRIS system type classifications (if this provider represents an HR system).

    principal_typesstring[]Optional

    Principal (identity) type classifications for this provider.

    secret_store_typesstring[]Optional
    schema_definition_jsonstring · bytesOptional
    provisioningbooleanOptional

    Whether provisioning (write-back) operations are enabled for this provider.

    push_typeinteger · enumOptional
    rbac_idstringOptional
    internal_app_namestringOptional
    configuration_jsonstringOptional

    JSON string containing the provider's connection configuration parameters.

    data_plane_idstringOptional

    Identifier of the data plane that runs this provider's extraction. Empty for cloud-hosted extraction.

    lifecycle_management_stateinteger · enumOptional

    Current lifecycle management state for this provider (enum). Indicates whether provisioning and deprovisioning workflows are active.

    team_idstringOptional

    Identifier of the team that owns this provider instance.

    template_typestringOptional
    column_namestringOptional
    destination_typestringOptional
    destination_propertystringOptional
    namestringOptional
    typeinteger · enumOptional
    lcm_unique_identifierbooleanOptional
    as_listbooleanOptional
    templatestringOptional
    property_typeinteger · enumOptional
    is_requiredbooleanOptional
    application_namestringOptional
    application_typestringOptional
    identitystring[]Optional
    resource_typestringOptional
    okta_app_idstringOptional
    list_delimiterstringOptional
    idp_typestringOptional
    domainstringOptional
    hris_namestringOptional
    hris_typestringOptional
    hris_urlstringOptional
    destination_datasource_typestringOptional
    destination_datasource_oaa_app_typestringOptional
    typeinteger · enumOptional
    modeinteger · enumOptional
    transformationsinteger · enum[]Optional
    custom_valuestringOptional
    source_propertyinteger · enumOptional
    destination_propertyinteger · enumOptional
    custom_source_propertystringOptional
    custom_destination_propertystringOptional
    source_idstringOptional
    destination_idstringOptional
    typestringOptional
    oaa_app_typestringOptional
    use_emailbooleanOptional
    hris_provisioning_sourcebooleanOptional
    cmdb_instance_namestringOptional
    cmdb_instance_typestringOptional
    owner_id_column_namestringOptional
    asset_id_column_namestringOptional
    asset_type_column_namestringOptional
    owner_node_typestringOptional
    owner_id_propertystringOptional
    asset_type_valuestringOptional
    asset_node_typestringOptional
    asset_property_namestringOptional
    idstringRead-onlyOptional
    secret_idstringOptional
    vault_idstringOptional
    idstringRead-onlyOptional
    namestringOptional

    Must be unique within an insight point

    vault_providerstringOptional

    Provider type: "azure_key_vault", "aws_secrets_manager", etc.

    insight_point_idstringOptional

    Owning insight point ID, or "internal" for control plane vaults

    deletedbooleanOptional

    Soft-deleted flag for external vaults; restored by re-registering (internal vaults are hard-deleted)

    external_lifecycle_management_typeinteger · enumOptional

    For external OAA, how to manage lifecycle management requests

    cmdb_typesstring[]Optional
    next_page_tokenstringOptional

    Token to retrieve the next page of results. Empty when no more pages exist.

    has_morebooleanOptional

    If true, additional pages of results are available.

    chevron-right
    default

    Default error response

    application/json

    The Status type defines a logical error model that is suitable for different programming environments, including REST APIs and RPC APIs. It is used by gRPC. Each Status message contains three pieces of data: error code, error message, and error details. You can find out more about this error model and how to work with it in the API Design Guide.

    codeinteger · int32Optional

    The status code, which should be an enum value of [google.rpc.Code][google.rpc.Code].

    messagestringOptional

    A developer-facing error message, which should be in English. Any user-facing error message should be localized and sent in the [google.rpc.Status.details][google.rpc.Status.details] field, or localized by the client.

    @typestringOptional

    The type of the serialized message.

    Other propertiesanyOptional
    get
    /api/v1/providers/custom
    get
    Authorizations
    AuthorizationstringRequired

    Veza API key for authentication. Generate keys in Administration > API Keys.

    Path parameters
    idstringRequired
    Responses
    chevron-right
    200

    OK

    application/json
    idstringOptional

    Unique identifier for the provider instance.

    external_idstringOptional

    External identifier for the provider, typically set by the integration that created it.

    namestringOptional

    Display name of the provider.

    custom_templatestringOptional

    The OAA template type used to create this provider (e.g., "application", "idp").

    custom_templatesstring[]Optional

    List of OAA template types associated with this provider instance (e.g., "application", "idp", "hris").

    stateinteger · enumOptional

    Current provider state.

    application_typesstring[]Optional

    Application type classifications for this provider.

    resource_typesstring[]OptionalDeprecated

    Deprecated. Resource type classifications. Use application_types, idp_types, hris_types, or file_system_types instead.

    idp_typesstring[]Optional

    Identity provider type classifications (if this provider represents an IdP).

    file_system_typesstring[]Optional

    File system type classifications (if this provider represents a file system).

    hris_typesstring[]Optional

    HRIS system type classifications (if this provider represents an HR system).

    principal_typesstring[]Optional

    Principal (identity) type classifications for this provider.

    secret_store_typesstring[]Optional
    schema_definition_jsonstring · bytesOptional
    provisioningbooleanOptional

    Whether provisioning (write-back) operations are enabled for this provider.

    push_typeinteger · enumOptional
    rbac_idstringOptional
    internal_app_namestringOptional
    configuration_jsonstringOptional

    JSON string containing the provider's connection configuration parameters.

    data_plane_idstringOptional

    Identifier of the data plane that runs this provider's extraction. Empty for cloud-hosted extraction.

    lifecycle_management_stateinteger · enumOptional

    Current lifecycle management state for this provider (enum). Indicates whether provisioning and deprovisioning workflows are active.

    team_idstringOptional

    Identifier of the team that owns this provider instance.

    template_typestringOptional
    column_namestringOptional
    destination_typestringOptional
    destination_propertystringOptional
    namestringOptional
    typeinteger · enumOptional
    lcm_unique_identifierbooleanOptional
    as_listbooleanOptional
    templatestringOptional
    property_typeinteger · enumOptional
    is_requiredbooleanOptional
    application_namestringOptional
    application_typestringOptional
    identitystring[]Optional
    resource_typestringOptional
    okta_app_idstringOptional
    list_delimiterstringOptional
    idp_typestringOptional
    domainstringOptional
    hris_namestringOptional
    hris_typestringOptional
    hris_urlstringOptional
    destination_datasource_typestringOptional
    destination_datasource_oaa_app_typestringOptional
    typeinteger · enumOptional
    modeinteger · enumOptional
    transformationsinteger · enum[]Optional
    custom_valuestringOptional
    source_propertyinteger · enumOptional
    destination_propertyinteger · enumOptional
    custom_source_propertystringOptional
    custom_destination_propertystringOptional
    source_idstringOptional
    destination_idstringOptional
    typestringOptional
    oaa_app_typestringOptional
    use_emailbooleanOptional
    hris_provisioning_sourcebooleanOptional
    cmdb_instance_namestringOptional
    cmdb_instance_typestringOptional
    owner_id_column_namestringOptional
    asset_id_column_namestringOptional
    asset_type_column_namestringOptional
    owner_node_typestringOptional
    owner_id_propertystringOptional
    asset_type_valuestringOptional
    asset_node_typestringOptional
    asset_property_namestringOptional
    idstringRead-onlyOptional
    secret_idstringOptional
    vault_idstringOptional
    idstringRead-onlyOptional
    namestringOptional

    Must be unique within an insight point

    vault_providerstringOptional

    Provider type: "azure_key_vault", "aws_secrets_manager", etc.

    insight_point_idstringOptional

    Owning insight point ID, or "internal" for control plane vaults

    deletedbooleanOptional

    Soft-deleted flag for external vaults; restored by re-registering (internal vaults are hard-deleted)

    external_lifecycle_management_typeinteger · enumOptional

    For external OAA, how to manage lifecycle management requests

    cmdb_typesstring[]Optional
    chevron-right
    default

    Default error response

    application/json

    The Status type defines a logical error model that is suitable for different programming environments, including REST APIs and RPC APIs. It is used by gRPC. Each Status message contains three pieces of data: error code, error message, and error details. You can find out more about this error model and how to work with it in the API Design Guide.

    codeinteger · int32Optional

    The status code, which should be an enum value of [google.rpc.Code][google.rpc.Code].

    messagestringOptional

    A developer-facing error message, which should be in English. Any user-facing error message should be localized and sent in the [google.rpc.Status.details][google.rpc.Status.details] field, or localized by the client.

    @typestringOptional

    The type of the serialized message.

    Other propertiesanyOptional
    get
    /api/v1/providers/custom/{id}
    delete
    Authorizations
    AuthorizationstringRequired

    Veza API key for authentication. Generate keys in Administration > API Keys.

    Path parameters
    idstringRequired
    Responses
    chevron-right
    200

    OK

    application/json
    objectOptional
    chevron-right
    default

    Default error response

    application/json

    The Status type defines a logical error model that is suitable for different programming environments, including REST APIs and RPC APIs. It is used by gRPC. Each Status message contains three pieces of data: error code, error message, and error details. You can find out more about this error model and how to work with it in the API Design Guide.

    codeinteger · int32Optional

    The status code, which should be an enum value of [google.rpc.Code][google.rpc.Code].

    messagestringOptional

    A developer-facing error message, which should be in English. Any user-facing error message should be localized and sent in the [google.rpc.Status.details][google.rpc.Status.details] field, or localized by the client.

    @typestringOptional

    The type of the serialized message.

    Other propertiesanyOptional
    delete
    /api/v1/providers/custom/{id}
    get
    Authorizations
    AuthorizationstringRequired

    Veza API key for authentication. Generate keys in Administration > API Keys.

    Path parameters
    idstringRequired
    Query parameters
    filterstringOptional
    order_bystringOptional
    page_sizeinteger · int32Optional

    The maximum number of results to be returned. Fewer results may be returned even when more pages exist.

    page_tokenstringOptional

    The token specifying the specific page of results to retrieve.

    Responses
    chevron-right
    200

    OK

    application/json
    valuesobject[]Optional
    next_page_tokenstringOptional

    The pagination token to retrieve the next page of results.

    has_morebooleanOptional

    If true, more results are available.

    chevron-right
    default

    Default error response

    application/json

    The Status type defines a logical error model that is suitable for different programming environments, including REST APIs and RPC APIs. It is used by gRPC. Each Status message contains three pieces of data: error code, error message, and error details. You can find out more about this error model and how to work with it in the API Design Guide.

    codeinteger · int32Optional

    The status code, which should be an enum value of [google.rpc.Code][google.rpc.Code].

    messagestringOptional

    A developer-facing error message, which should be in English. Any user-facing error message should be localized and sent in the [google.rpc.Status.details][google.rpc.Status.details] field, or localized by the client.

    @typestringOptional

    The type of the serialized message.

    Other propertiesanyOptional
    get
    /api/v1/providers/custom/{id}/datasources
    post
    Authorizations
    AuthorizationstringRequired

    Veza API key for authentication. Generate keys in Administration > API Keys.

    Path parameters
    idstringRequired
    Body
    idstringOptional
    namestringOptional
    custom_templatestringOptional
    Responses
    chevron-right
    200

    OK

    application/json
    idstringOptional
    namestringOptional
    chevron-right
    default

    Default error response

    application/json

    The Status type defines a logical error model that is suitable for different programming environments, including REST APIs and RPC APIs. It is used by gRPC. Each Status message contains three pieces of data: error code, error message, and error details. You can find out more about this error model and how to work with it in the API Design Guide.

    codeinteger · int32Optional

    The status code, which should be an enum value of [google.rpc.Code][google.rpc.Code].

    messagestringOptional

    A developer-facing error message, which should be in English. Any user-facing error message should be localized and sent in the [google.rpc.Status.details][google.rpc.Status.details] field, or localized by the client.

    @typestringOptional

    The type of the serialized message.

    Other propertiesanyOptional
    post
    /api/v1/providers/custom/{id}/datasources
    get
    Authorizations
    AuthorizationstringRequired

    Veza API key for authentication. Generate keys in Administration > API Keys.

    Path parameters
    idstringRequired
    data_source_idstringRequired
    Responses
    chevron-right
    200

    OK

    application/json
    valueobjectOptional
    chevron-right
    default

    Default error response

    application/json

    The Status type defines a logical error model that is suitable for different programming environments, including REST APIs and RPC APIs. It is used by gRPC. Each Status message contains three pieces of data: error code, error message, and error details. You can find out more about this error model and how to work with it in the API Design Guide.

    codeinteger · int32Optional

    The status code, which should be an enum value of [google.rpc.Code][google.rpc.Code].

    messagestringOptional

    A developer-facing error message, which should be in English. Any user-facing error message should be localized and sent in the [google.rpc.Status.details][google.rpc.Status.details] field, or localized by the client.

    @typestringOptional

    The type of the serialized message.

    Other propertiesanyOptional
    get
    /api/v1/providers/custom/{id}/datasources/{data_source_id}
    delete
    Authorizations
    AuthorizationstringRequired

    Veza API key for authentication. Generate keys in Administration > API Keys.

    Path parameters
    idstringRequired
    data_source_idstringRequired
    Responses
    chevron-right
    200

    OK

    application/json
    objectOptional
    chevron-right
    default

    Default error response

    application/json

    The Status type defines a logical error model that is suitable for different programming environments, including REST APIs and RPC APIs. It is used by gRPC. Each Status message contains three pieces of data: error code, error message, and error details. You can find out more about this error model and how to work with it in the API Design Guide.

    codeinteger · int32Optional

    The status code, which should be an enum value of [google.rpc.Code][google.rpc.Code].

    messagestringOptional

    A developer-facing error message, which should be in English. Any user-facing error message should be localized and sent in the [google.rpc.Status.details][google.rpc.Status.details] field, or localized by the client.

    @typestringOptional

    The type of the serialized message.

    Other propertiesanyOptional
    delete
    /api/v1/providers/custom/{id}/datasources/{data_source_id}
    post
    Authorizations
    AuthorizationstringRequired

    Veza API key for authentication. Generate keys in Administration > API Keys.

    Path parameters
    idstringRequired
    data_source_idstringRequired
    Body
    idstringOptional
    data_source_idstringOptional
    json_datastringOptional
    compression_typeinteger · enumOptional
    priority_pushbooleanOptional
    Responses
    chevron-right
    200

    OK

    application/json
    messagestringOptional
    chevron-right
    default

    Default error response

    application/json

    The Status type defines a logical error model that is suitable for different programming environments, including REST APIs and RPC APIs. It is used by gRPC. Each Status message contains three pieces of data: error code, error message, and error details. You can find out more about this error model and how to work with it in the API Design Guide.

    codeinteger · int32Optional

    The status code, which should be an enum value of [google.rpc.Code][google.rpc.Code].

    messagestringOptional

    A developer-facing error message, which should be in English. Any user-facing error message should be localized and sent in the [google.rpc.Status.details][google.rpc.Status.details] field, or localized by the client.

    @typestringOptional

    The type of the serialized message.

    Other propertiesanyOptional
    post
    /api/v1/providers/custom/{id}/datasources/{data_source_id}:push
    post
    Authorizations
    AuthorizationstringRequired

    Veza API key for authentication. Generate keys in Administration > API Keys.

    Path parameters
    idstringRequired
    data_source_idstringRequired
    Body
    idstringOptional
    data_source_idstringOptional
    csv_datastringOptional
    namestringOptional
    typestringOptional
    compression_typeinteger · enumOptional
    priority_pushbooleanOptional
    Responses
    chevron-right
    200

    OK

    application/json
    messagestringOptional
    chevron-right
    default

    Default error response

    application/json

    The Status type defines a logical error model that is suitable for different programming environments, including REST APIs and RPC APIs. It is used by gRPC. Each Status message contains three pieces of data: error code, error message, and error details. You can find out more about this error model and how to work with it in the API Design Guide.

    codeinteger · int32Optional

    The status code, which should be an enum value of [google.rpc.Code][google.rpc.Code].

    messagestringOptional

    A developer-facing error message, which should be in English. Any user-facing error message should be localized and sent in the [google.rpc.Status.details][google.rpc.Status.details] field, or localized by the client.

    @typestringOptional

    The type of the serialized message.

    Other propertiesanyOptional
    post
    /api/v1/providers/custom/{id}/datasources/{data_source_id}:push_csv
    post
    Authorizations
    AuthorizationstringRequired

    Veza API key for authentication. Generate keys in Administration > API Keys.

    Path parameters
    idstringRequired
    data_source_idstringRequired
    Body
    idstringOptional
    data_source_idstringOptional
    json_datastringOptional
    compression_typeinteger · enumOptional
    priority_pushbooleanOptional
    Responses
    chevron-right
    200

    OK

    application/json
    messagestringOptional
    chevron-right
    default

    Default error response

    application/json

    The Status type defines a logical error model that is suitable for different programming environments, including REST APIs and RPC APIs. It is used by gRPC. Each Status message contains three pieces of data: error code, error message, and error details. You can find out more about this error model and how to work with it in the API Design Guide.

    codeinteger · int32Optional

    The status code, which should be an enum value of [google.rpc.Code][google.rpc.Code].

    messagestringOptional

    A developer-facing error message, which should be in English. Any user-facing error message should be localized and sent in the [google.rpc.Status.details][google.rpc.Status.details] field, or localized by the client.

    @typestringOptional

    The type of the serialized message.

    Other propertiesanyOptional
    post
    /api/v1/providers/custom/{id}/datasources/{data_source_id}:push
    post
    Authorizations
    AuthorizationstringRequired

    Veza API key for authentication. Generate keys in Administration > API Keys.

    Path parameters
    idstringRequired
    data_source_idstringRequired
    Body
    idstringOptional
    data_source_idstringOptional
    csv_datastringOptional
    namestringOptional
    typestringOptional
    compression_typeinteger · enumOptional
    priority_pushbooleanOptional
    Responses
    chevron-right
    200

    OK

    application/json
    messagestringOptional
    chevron-right
    default

    Default error response

    application/json

    The Status type defines a logical error model that is suitable for different programming environments, including REST APIs and RPC APIs. It is used by gRPC. Each Status message contains three pieces of data: error code, error message, and error details. You can find out more about this error model and how to work with it in the API Design Guide.

    codeinteger · int32Optional

    The status code, which should be an enum value of [google.rpc.Code][google.rpc.Code].

    messagestringOptional

    A developer-facing error message, which should be in English. Any user-facing error message should be localized and sent in the [google.rpc.Status.details][google.rpc.Status.details] field, or localized by the client.

    @typestringOptional

    The type of the serialized message.

    Other propertiesanyOptional
    post
    /api/v1/providers/custom/{id}/datasources/{data_source_id}:push_csv
    post
    Authorizations
    AuthorizationstringRequired

    Veza API key for authentication. Generate keys in Administration > API Keys.

    Path parameters
    idstringRequired
    Body
    idstringOptional
    icon_base64stringOptional
    Responses
    chevron-right
    200

    OK

    application/json
    objectOptional
    chevron-right
    default

    Default error response

    application/json

    The Status type defines a logical error model that is suitable for different programming environments, including REST APIs and RPC APIs. It is used by gRPC. Each Status message contains three pieces of data: error code, error message, and error details. You can find out more about this error model and how to work with it in the API Design Guide.

    codeinteger · int32Optional

    The status code, which should be an enum value of [google.rpc.Code][google.rpc.Code].

    messagestringOptional

    A developer-facing error message, which should be in English. Any user-facing error message should be localized and sent in the [google.rpc.Status.details][google.rpc.Status.details] field, or localized by the client.

    @typestringOptional

    The type of the serialized message.

    Other propertiesanyOptional
    post
    /api/v1/providers/custom/{id}:icon
    get
    Authorizations
    AuthorizationstringRequired

    Veza API key for authentication. Generate keys in Administration > API Keys.

    Path parameters
    idstringRequired
    Responses
    chevron-right
    200

    OK

    application/json
    mime_typestringOptional
    icon_base64stringOptional
    chevron-right
    default

    Default error response

    application/json

    The Status type defines a logical error model that is suitable for different programming environments, including REST APIs and RPC APIs. It is used by gRPC. Each Status message contains three pieces of data: error code, error message, and error details. You can find out more about this error model and how to work with it in the API Design Guide.

    codeinteger · int32Optional

    The status code, which should be an enum value of [google.rpc.Code][google.rpc.Code].

    messagestringOptional

    A developer-facing error message, which should be in English. Any user-facing error message should be localized and sent in the [google.rpc.Status.details][google.rpc.Status.details] field, or localized by the client.

    @typestringOptional

    The type of the serialized message.

    Other propertiesanyOptional
    get
    /api/v1/providers/custom/{id}:icon
    get
    Authorizations
    AuthorizationstringRequired

    Veza API key for authentication. Generate keys in Administration > API Keys.

    Query parameters
    app_or_idp_typestringOptionalDeprecated
    custom_schema_typestringOptional
    node_typestringOptional
    Responses
    chevron-right
    200

    OK

    application/json
    mime_typestringOptional
    icon_base64stringOptional
    provider_idstringOptional
    chevron-right
    default

    Default error response

    application/json

    The Status type defines a logical error model that is suitable for different programming environments, including REST APIs and RPC APIs. It is used by gRPC. Each Status message contains three pieces of data: error code, error message, and error details. You can find out more about this error model and how to work with it in the API Design Guide.

    codeinteger · int32Optional

    The status code, which should be an enum value of [google.rpc.Code][google.rpc.Code].

    messagestringOptional

    A developer-facing error message, which should be in English. Any user-facing error message should be localized and sent in the [google.rpc.Status.details][google.rpc.Status.details] field, or localized by the client.

    @typestringOptional

    The type of the serialized message.

    Other propertiesanyOptional
    get
    /api/v1/providers/custom:icon
    delete
    Authorizations
    AuthorizationstringRequired

    Veza API key for authentication. Generate keys in Administration > API Keys.

    Path parameters
    idstringRequired
    Responses
    chevron-right
    200

    OK

    application/json
    objectOptional
    chevron-right
    default

    Default error response

    application/json

    The Status type defines a logical error model that is suitable for different programming environments, including REST APIs and RPC APIs. It is used by gRPC. Each Status message contains three pieces of data: error code, error message, and error details. You can find out more about this error model and how to work with it in the API Design Guide.

    codeinteger · int32Optional

    The status code, which should be an enum value of [google.rpc.Code][google.rpc.Code].

    messagestringOptional

    A developer-facing error message, which should be in English. Any user-facing error message should be localized and sent in the [google.rpc.Status.details][google.rpc.Status.details] field, or localized by the client.

    @typestringOptional

    The type of the serialized message.

    Other propertiesanyOptional
    delete
    /api/v1/providers/custom/{id}:icon
    {
      "value": {
        "id": "text",
        "external_id": "text",
        "name": "text",
        "custom_template": "text",
        "custom_templates": [
          "text"
        ],
        "state": 1,
        "application_types": [
          "text"
        ],
        "idp_types": [
          "text"
        ],
        "file_system_types": [
          "text"
        ],
        "hris_types": [
          "text"
        ],
        "principal_types": [
          "text"
        ],
        "secret_store_types": [
          "text"
        ],
        "schema_definition_json": "text",
        "provisioning": true,
        "push_type": 1,
        "rbac_id": "text",
        "internal_app_name": "text",
        "configuration_json": "text",
        "data_plane_id": "text",
        "lifecycle_management_state": 1,
        "team_id": "text",
        "csv_mapping_configuration": {
          "template_type": "text",
          "column_mappings": [
            {
              "column_name": "text",
              "destination_type": "text",
              "destination_property": "text",
              "custom_property": {
                "name": "text",
                "type": 1,
                "lcm_unique_identifier": true
              },
              "as_list": true,
              "template": "text",
              "property_type": 1,
              "is_required": true
            }
          ],
          "application": {
            "application_name": "text",
            "application_type": "text",
            "identity": [
              "text"
            ],
            "resource_type": "text",
            "okta_app_id": "text"
          },
          "advanced": {
            "list_delimiter": "text"
          },
          "idp": {
            "idp_type": "text",
            "domain": "text"
          },
          "hris": {
            "hris_name": "text",
            "hris_type": "text",
            "hris_url": "text",
            "hris_identity_mapping": {
              "mappings": [
                {
                  "destination_datasource_type": "text",
                  "destination_datasource_oaa_app_type": "text",
                  "type": 1,
                  "mode": 1,
                  "transformations": [
                    1
                  ],
                  "custom_value": "text",
                  "property_matchers": [
                    {
                      "source_property": 1,
                      "destination_property": 1,
                      "custom_source_property": "text",
                      "custom_destination_property": "text"
                    }
                  ],
                  "id_matchers": [
                    {
                      "source_id": "text",
                      "destination_id": "text"
                    }
                  ],
                  "destination_datasources": [
                    {
                      "type": "text",
                      "oaa_app_type": "text"
                    }
                  ]
                }
              ],
              "use_email": true
            },
            "hris_provisioning_source": true
          },
          "cmdb": {
            "cmdb_instance_name": "text",
            "cmdb_instance_type": "text",
            "csc_global_config": {
              "owner_id_column_name": "text",
              "asset_id_column_name": "text",
              "asset_type_column_name": "text",
              "owner_node_type": "text",
              "owner_id_property": "text",
              "asset_connections": [
                {
                  "asset_type_value": "text",
                  "asset_node_type": "text",
                  "asset_property_name": "text"
                }
              ]
            }
          }
        },
        "secret_references": [
          {
            "id": "text",
            "secret_id": "text",
            "vault_id": "text",
            "vault": {
              "id": "text",
              "name": "text",
              "vault_provider": "text",
              "insight_point_id": "text",
              "deleted": true
            }
          }
        ],
        "external_lifecycle_management_type": 1,
        "cmdb_types": [
          "text"
        ]
      }
    }
    {
      "values": [
        {
          "id": "text",
          "external_id": "text",
          "name": "text",
          "custom_template": "text",
          "custom_templates": [
            "text"
          ],
          "state": 1,
          "application_types": [
            "text"
          ],
          "idp_types": [
            "text"
          ],
          "file_system_types": [
            "text"
          ],
          "hris_types": [
            "text"
          ],
          "principal_types": [
            "text"
          ],
          "secret_store_types": [
            "text"
          ],
          "schema_definition_json": "text",
          "provisioning": true,
          "push_type": 1,
          "rbac_id": "text",
          "internal_app_name": "text",
          "configuration_json": "text",
          "data_plane_id": "text",
          "lifecycle_management_state": 1,
          "team_id": "text",
          "csv_mapping_configuration": {
            "template_type": "text",
            "column_mappings": [
              {
                "column_name": "text",
                "destination_type": "text",
                "destination_property": "text",
                "custom_property": {
                  "name": "text",
                  "type": 1,
                  "lcm_unique_identifier": true
                },
                "as_list": true,
                "template": "text",
                "property_type": 1,
                "is_required": true
              }
            ],
            "application": {
              "application_name": "text",
              "application_type": "text",
              "identity": [
                "text"
              ],
              "resource_type": "text",
              "okta_app_id": "text"
            },
            "advanced": {
              "list_delimiter": "text"
            },
            "idp": {
              "idp_type": "text",
              "domain": "text"
            },
            "hris": {
              "hris_name": "text",
              "hris_type": "text",
              "hris_url": "text",
              "hris_identity_mapping": {
                "mappings": [
                  {
                    "destination_datasource_type": "text",
                    "destination_datasource_oaa_app_type": "text",
                    "type": 1,
                    "mode": 1,
                    "transformations": [
                      1
                    ],
                    "custom_value": "text",
                    "property_matchers": [
                      {
                        "source_property": 1,
                        "destination_property": 1,
                        "custom_source_property": "text",
                        "custom_destination_property": "text"
                      }
                    ],
                    "id_matchers": [
                      {
                        "source_id": "text",
                        "destination_id": "text"
                      }
                    ],
                    "destination_datasources": [
                      {
                        "type": "text",
                        "oaa_app_type": "text"
                      }
                    ]
                  }
                ],
                "use_email": true
              },
              "hris_provisioning_source": true
            },
            "cmdb": {
              "cmdb_instance_name": "text",
              "cmdb_instance_type": "text",
              "csc_global_config": {
                "owner_id_column_name": "text",
                "asset_id_column_name": "text",
                "asset_type_column_name": "text",
                "owner_node_type": "text",
                "owner_id_property": "text",
                "asset_connections": [
                  {
                    "asset_type_value": "text",
                    "asset_node_type": "text",
                    "asset_property_name": "text"
                  }
                ]
              }
            }
          },
          "secret_references": [
            {
              "id": "text",
              "secret_id": "text",
              "vault_id": "text",
              "vault": {
                "id": "text",
                "name": "text",
                "vault_provider": "text",
                "insight_point_id": "text",
                "deleted": true
              }
            }
          ],
          "external_lifecycle_management_type": 1,
          "cmdb_types": [
            "text"
          ]
        }
      ],
      "next_page_token": "text",
      "has_more": true
    }
    {
      "values": [
        {}
      ],
      "next_page_token": "text",
      "has_more": true
    }
    {
      "value": {
        "id": "text",
        "name": "text"
      }
    }
    {
      "warnings": [
        {
          "message": "text"
        }
      ]
    }
    {
      "warnings": [
        {
          "message": "text"
        }
      ]
    }
    {
      "warnings": [
        {
          "message": "text"
        }
      ]
    }
    {
      "warnings": [
        {
          "message": "text"
        }
      ]
    }
    {}
    POST /api/v1/providers/custom HTTP/1.1
    Host: your-tenant.vezacloud.com
    Authorization: Bearer YOUR_SECRET_TOKEN
    Content-Type: application/json
    Accept: */*
    Content-Length: 1684
    
    {
      "name": "text",
      "custom_template": "text",
      "provisioning": true,
      "push_type": 1,
      "internal_app_name": "text",
      "configuration_json": "text",
      "data_plane_id": "text",
      "custom_templates": [
        "text"
      ],
      "csv_mapping_configuration": {
        "template_type": "text",
        "column_mappings": [
          {
            "column_name": "text",
            "destination_type": "text",
            "destination_property": "text",
            "custom_property": {
              "name": "text",
              "type": 1,
              "lcm_unique_identifier": true
            },
            "as_list": true,
            "template": "text",
            "property_type": 1,
            "is_required": true
          }
        ],
        "application": {
          "application_name": "text",
          "application_type": "text",
          "identity": [
            "text"
          ],
          "resource_type": "text",
          "okta_app_id": "text"
        },
        "advanced": {
          "list_delimiter": "text"
        },
        "idp": {
          "idp_type": "text",
          "domain": "text"
        },
        "hris": {
          "hris_name": "text",
          "hris_type": "text",
          "hris_url": "text",
          "hris_identity_mapping": {
            "mappings": [
              {
                "destination_datasource_type": "text",
                "destination_datasource_oaa_app_type": "text",
                "type": 1,
                "mode": 1,
                "transformations": [
                  1
                ],
                "custom_value": "text",
                "property_matchers": [
                  {
                    "source_property": 1,
                    "destination_property": 1,
                    "custom_source_property": "text",
                    "custom_destination_property": "text"
                  }
                ],
                "id_matchers": [
                  {
                    "source_id": "text",
                    "destination_id": "text"
                  }
                ],
                "destination_datasources": [
                  {
                    "type": "text",
                    "oaa_app_type": "text"
                  }
                ]
              }
            ],
            "use_email": true
          },
          "hris_provisioning_source": true
        },
        "cmdb": {
          "cmdb_instance_name": "text",
          "cmdb_instance_type": "text",
          "csc_global_config": {
            "owner_id_column_name": "text",
            "asset_id_column_name": "text",
            "asset_type_column_name": "text",
            "owner_node_type": "text",
            "owner_id_property": "text",
            "asset_connections": [
              {
                "asset_type_value": "text",
                "asset_node_type": "text",
                "asset_property_name": "text"
              }
            ]
          }
        }
      },
      "secret_references": [
        {
          "secret_id": "text",
          "vault_id": "text"
        }
      ],
      "external_lifecycle_management_type": 1
    }
    GET /api/v1/providers/custom HTTP/1.1
    Host: your-tenant.vezacloud.com
    Authorization: Bearer YOUR_SECRET_TOKEN
    Accept: */*
    
    GET /api/v1/providers/custom/{id} HTTP/1.1
    Host: your-tenant.vezacloud.com
    Authorization: Bearer YOUR_SECRET_TOKEN
    Accept: */*
    
    {
      "value": {
        "id": "text",
        "external_id": "text",
        "name": "text",
        "custom_template": "text",
        "custom_templates": [
          "text"
        ],
        "state": 1,
        "application_types": [
          "text"
        ],
        "idp_types": [
          "text"
        ],
        "file_system_types": [
          "text"
        ],
        "hris_types": [
          "text"
        ],
        "principal_types": [
          "text"
        ],
        "secret_store_types": [
          "text"
        ],
        "schema_definition_json": "text",
        "provisioning": true,
        "push_type": 1,
        "rbac_id": "text",
        "internal_app_name": "text",
        "configuration_json": "text",
        "data_plane_id": "text",
        "lifecycle_management_state": 1,
        "team_id": "text",
        "csv_mapping_configuration": {
          "template_type": "text",
          "column_mappings": [
            {
              "column_name": "text",
              "destination_type": "text",
              "destination_property": "text",
              "custom_property": {
                "name": "text",
                "type": 1,
                "lcm_unique_identifier": true
              },
              "as_list": true,
              "template": "text",
              "property_type": 1,
              "is_required": true
            }
          ],
          "application": {
            "application_name": "text",
            "application_type": "text",
            "identity": [
              "text"
            ],
            "resource_type": "text",
            "okta_app_id": "text"
          },
          "advanced": {
            "list_delimiter": "text"
          },
          "idp": {
            "idp_type": "text",
            "domain": "text"
          },
          "hris": {
            "hris_name": "text",
            "hris_type": "text",
            "hris_url": "text",
            "hris_identity_mapping": {
              "mappings": [
                {
                  "destination_datasource_type": "text",
                  "destination_datasource_oaa_app_type": "text",
                  "type": 1,
                  "mode": 1,
                  "transformations": [
                    1
                  ],
                  "custom_value": "text",
                  "property_matchers": [
                    {
                      "source_property": 1,
                      "destination_property": 1,
                      "custom_source_property": "text",
                      "custom_destination_property": "text"
                    }
                  ],
                  "id_matchers": [
                    {
                      "source_id": "text",
                      "destination_id": "text"
                    }
                  ],
                  "destination_datasources": [
                    {
                      "type": "text",
                      "oaa_app_type": "text"
                    }
                  ]
                }
              ],
              "use_email": true
            },
            "hris_provisioning_source": true
          },
          "cmdb": {
            "cmdb_instance_name": "text",
            "cmdb_instance_type": "text",
            "csc_global_config": {
              "owner_id_column_name": "text",
              "asset_id_column_name": "text",
              "asset_type_column_name": "text",
              "owner_node_type": "text",
              "owner_id_property": "text",
              "asset_connections": [
                {
                  "asset_type_value": "text",
                  "asset_node_type": "text",
                  "asset_property_name": "text"
                }
              ]
            }
          }
        },
        "secret_references": [
          {
            "id": "text",
            "secret_id": "text",
            "vault_id": "text",
            "vault": {
              "id": "text",
              "name": "text",
              "vault_provider": "text",
              "insight_point_id": "text",
              "deleted": true
            }
          }
        ],
        "external_lifecycle_management_type": 1,
        "cmdb_types": [
          "text"
        ]
      }
    }
    DELETE /api/v1/providers/custom/{id} HTTP/1.1
    Host: your-tenant.vezacloud.com
    Authorization: Bearer YOUR_SECRET_TOKEN
    Accept: */*
    
    {}
    GET /api/v1/providers/custom/{id}/datasources HTTP/1.1
    Host: your-tenant.vezacloud.com
    Authorization: Bearer YOUR_SECRET_TOKEN
    Accept: */*
    
    POST /api/v1/providers/custom/{id}/datasources HTTP/1.1
    Host: your-tenant.vezacloud.com
    Authorization: Bearer YOUR_SECRET_TOKEN
    Content-Type: application/json
    Accept: */*
    Content-Length: 52
    
    {
      "id": "text",
      "name": "text",
      "custom_template": "text"
    }
    GET /api/v1/providers/custom/{id}/datasources/{data_source_id} HTTP/1.1
    Host: your-tenant.vezacloud.com
    Authorization: Bearer YOUR_SECRET_TOKEN
    Accept: */*
    
    DELETE /api/v1/providers/custom/{id}/datasources/{data_source_id} HTTP/1.1
    Host: your-tenant.vezacloud.com
    Authorization: Bearer YOUR_SECRET_TOKEN
    Accept: */*
    
    POST /api/v1/providers/custom/{id}/datasources/{data_source_id}:push HTTP/1.1
    Host: your-tenant.vezacloud.com
    Authorization: Bearer YOUR_SECRET_TOKEN
    Content-Type: application/json
    Accept: */*
    Content-Length: 98
    
    {
      "id": "text",
      "data_source_id": "text",
      "json_data": "text",
      "compression_type": 1,
      "priority_push": true
    }
    POST /api/v1/providers/custom/{id}/datasources/{data_source_id}:push_csv HTTP/1.1
    Host: your-tenant.vezacloud.com
    Authorization: Bearer YOUR_SECRET_TOKEN
    Content-Type: application/json
    Accept: */*
    Content-Length: 125
    
    {
      "id": "text",
      "data_source_id": "text",
      "csv_data": "text",
      "name": "text",
      "type": "text",
      "compression_type": 1,
      "priority_push": true
    }
    POST /api/v1/providers/custom/{id}/datasources/{data_source_id}:push HTTP/1.1
    Host: your-tenant.vezacloud.com
    Authorization: Bearer YOUR_SECRET_TOKEN
    Content-Type: application/json
    Accept: */*
    Content-Length: 98
    
    {
      "id": "text",
      "data_source_id": "text",
      "json_data": "text",
      "compression_type": 1,
      "priority_push": true
    }
    POST /api/v1/providers/custom/{id}/datasources/{data_source_id}:push_csv HTTP/1.1
    Host: your-tenant.vezacloud.com
    Authorization: Bearer YOUR_SECRET_TOKEN
    Content-Type: application/json
    Accept: */*
    Content-Length: 125
    
    {
      "id": "text",
      "data_source_id": "text",
      "csv_data": "text",
      "name": "text",
      "type": "text",
      "compression_type": 1,
      "priority_push": true
    }
    POST /api/v1/providers/custom/{id}:icon HTTP/1.1
    Host: your-tenant.vezacloud.com
    Authorization: Bearer YOUR_SECRET_TOKEN
    Content-Type: application/json
    Accept: */*
    Content-Length: 34
    
    {
      "id": "text",
      "icon_base64": "text"
    }
    GET /api/v1/providers/custom/{id}:icon HTTP/1.1
    Host: your-tenant.vezacloud.com
    Authorization: Bearer YOUR_SECRET_TOKEN
    Accept: */*
    
    {
      "mime_type": "text",
      "icon_base64": "text"
    }
    GET /api/v1/providers/custom:icon HTTP/1.1
    Host: your-tenant.vezacloud.com
    Authorization: Bearer YOUR_SECRET_TOKEN
    Accept: */*
    
    {
      "mime_type": "text",
      "icon_base64": "text",
      "provider_id": "text"
    }
    DELETE /api/v1/providers/custom/{id}:icon HTTP/1.1
    Host: your-tenant.vezacloud.com
    Authorization: Bearer YOUR_SECRET_TOKEN
    Accept: */*
    
    {}
    {
      "value": {}
    }
    {}

    Multipart Upload

    Upload large OAA payloads using chunked multipart requests

    hashtag
    Overview

    For OAA payloads that exceed 100 MB after compression, you can use multipart upload to split the payload into smaller chunks and upload them sequentially. The Veza platform assembles the chunks server-side before processing.

    Multipart upload is useful when:

    • The payload is too large for a single HTTP request

    • Network reliability is a concern for large transfers

    • You need to monitor upload progress for very large data sources

    circle-info

    The standard :push endpoint supports payloads up to 100 MB (compressed or uncompressed). Use multipart upload when your payload approaches or exceeds this limit, or when you need more reliable transfer for large payloads.

    hashtag
    How it works

    1. Start the upload by sending a start request — the server creates an upload session and returns an upload_id.

    2. Upload chunks sequentially, each base64-encoding a raw slice of the payload. Include the upload_id from step 1 and an incrementing sequence_number.

    Each chunk must be base64-encoded from raw bytes before sending. The server decodes and reassembles chunks in sequence order when the complete operation is received.

    hashtag
    API endpoint

    hashtag
    Start request body

    Field
    Type
    Description

    The response returns an upload_id (UUID string) to use in all subsequent requests for this upload session.

    hashtag
    Chunk request body

    Field
    Type
    Description

    hashtag
    Finalization request body

    Send a separate POST to the same endpoint after all chunks are uploaded:

    Field
    Type
    Description

    hashtag
    Example

    hashtag
    Using the Python SDK

    The oaaclient Python SDK handles multipart upload automatically when enabled:

    When enable_multipart is set to True, the SDK automatically switches to multipart for payloads exceeding 50 MB (uncompressed) and:

    • Splits the payload into chunks and base64-encodes each one individually

    • Starts an upload session and tracks the upload_id

    • Uploads each chunk sequentially with the correct sequence_number

    hashtag
    Notes

    • All chunks for a given upload_id must be uploaded before sending the completion operation.

    • You can re-upload a chunk with the same sequence_number and upload_id if needed — the last upload for a given sequence number is used. All chunks must be present before the completion operation is sent.

    Finalize by sending a complete request with the upload_id and total sequence_count.

    integer

    Sequence number for this chunk, starting from 1. Maximum 99 chunks per upload.

    data

    string

    Base64-encoded chunk of the raw payload

    integer

    Total number of chunks uploaded

    Sends the completion operation to trigger server-side assembly

    Chunk order is determined by sequence_number, not upload order.

    operation

    string

    Must be start

    operation

    string

    Must be upload

    upload_id

    string

    UUID returned by the start response

    operation

    string

    Must be complete

    upload_id

    string

    UUID from the start response

    sequence_number

    sequence_count

    POST /api/v1/providers/custom/{id}/datasources/{data_source_id}:parts
    PAYLOAD_FILE="large_payload.json"
    CHUNK_SIZE=10485760  # 10 MB per chunk
    
    # 1. Start the upload session
    RESPONSE=$(curl -s -X POST "https://$VEZA_URL/api/v1/providers/custom/$PROVIDER_ID/datasources/$DATASOURCE_ID:parts" \
      -H "authorization: Bearer $API_KEY" \
      -H "Content-Type: application/json" \
      -d '{"operation":"start"}')
    UPLOAD_ID=$(echo "$RESPONSE" | python3 -c "import sys,json; print(json.load(sys.stdin)['upload_id'])")
    
    # 2. Split into raw chunks and upload each
    SEQUENCE=0
    split -b $CHUNK_SIZE "$PAYLOAD_FILE" /tmp/oaa_chunk_
    for CHUNK_FILE in $(ls /tmp/oaa_chunk_* | sort); do
      SEQUENCE=$((SEQUENCE + 1))
      ENCODED=$(base64 -w 0 < "$CHUNK_FILE")  # use -b 0 on macOS
    
      curl -s -X POST "https://$VEZA_URL/api/v1/providers/custom/$PROVIDER_ID/datasources/$DATASOURCE_ID:parts" \
        -H "authorization: Bearer $API_KEY" \
        -H "Content-Type: application/json" \
        -d "{
          \"operation\": \"upload\",
          \"upload_id\": \"$UPLOAD_ID\",
          \"sequence_number\": $SEQUENCE,
          \"data\": \"$ENCODED\"
        }"
    done
    
    # 3. Finalize the upload
    curl -s -X POST "https://$VEZA_URL/api/v1/providers/custom/$PROVIDER_ID/datasources/$DATASOURCE_ID:parts" \
      -H "authorization: Bearer $API_KEY" \
      -H "Content-Type: application/json" \
      -d "{
        \"operation\": \"complete\",
        \"upload_id\": \"$UPLOAD_ID\",
        \"sequence_count\": $SEQUENCE
      }"
    
    rm /tmp/oaa_chunk_*
    from oaaclient.client import OAAClient
    
    client = OAAClient(url=veza_url, token=veza_api_key)
    client.enable_multipart = True
    
    # Push as usual - the SDK automatically chunks large payloads
    client.push_application(provider_name, data_source_name, application_object=app)

    OAA Push API

    Methods for working with Custom Data Providers and Sources

    This document provides a basic overview of the API requests for creating and updating an OAA data source. These steps and API calls can be adapted for your client or programming language of choice. You can also use the oaaclient Python module to handle Veza authentication, register the data source, and push the populated template.

    hashtag
    Overview

    While registering sources and pushing authorization metadata with Open Authorization API is relatively straightforward, it is important to understand how Veza organizes custom providers and data sources as endpoints:

    • You will first register a new custom application provider with a (specifying the app name and template).

      • The determines the type of entities the provider supports (application, identity_provider, or hris).

    You should typically name the provider based on the generic application provider (such as GitHub) and the data source after the top-level instance (such as GitHub - Organization). See the for more information about parsing and identifying entities using metadata from the source application.

    hashtag
    Authentication

    Your requests will need to include a Veza API Key. For OAA APIs, using a is recommended. Provide it as the bearer auth token in the header of each request, for example:

    Follow best practices for managing API keys: Do not save credentials in connector code. Consider using a secrets manager to securely store API keys and make them available at run time.

    hashtag
    First Run

    To add a custom application, you will need to:

    • Create a new custom provider and data source.

    • push the entity and authorization data in a JSON payload.

    hashtag
    Create a Custom Provider

    Use to register a new top-level custom provider. The custom_template determines what kind of entities you can push to the provider.

    Custom Application provider

    This is a common configuration with broad support for modeling applications with local identities, resources, and authorization:

    Custom Application with SCIM lifecycle management

    If your application exposes SCIM 2.0 endpoints, it can support automated provisioning and deprovisioning through :

    Custom Application with REST lifecycle management

    For applications that expose custom REST APIs (but not SCIM) for user provisioning. Veza sends REST requests to the application's endpoints through the Insight Point, which must have network access to the target application:

    circle-info

    Unlike SCIM mode, SEND_REST_PAYLOAD does not require an OAA connector definition. REST endpoints, HTTP methods, authentication, and payloads are configured in the Lifecycle Management policy. The Insight Point associated with the data source executes the REST calls.

    Custom Identity Provider

    This template is for modeling custom or unsupported identity providers as a source of users and groups:

    Identities and groups in the custom provider can mapped to local accounts in other systems, and assigned as entity owners. Custom IdPs can also be used a source of identity for Lifecycle Management policies.

    HRIS Provider

    This template is intended to model HR information systems. Set provisioning to true to use the HRIS as a system of record for Lifecycle Management policies:

    Provider creation response

    All provider creation requests return the Provider ID, which you will need to create and manage data sources:

    Provider creation fields

    Field
    Type
    Required
    Description
    circle-info
    • Name the provider generically after the application or SaaS provider. Use the same provider for all data sources for that application.

    • If you are creating providers dynamically, your OAA integration should check if the provider and data source exist before creating a new one.

    Using the Python SDK

    The oaaclient SDK provides create_provider() with an options parameter for advanced fields:

    hashtag
    Create a Data Source for the Provider

    Each provider needs at least one data source. Create one with

    The response will include the data source ID:

    • Datasources should be unique to the data collected by an OAA integration instance. For example, if an application has a "prod" and "dev" instance, creating a datasource for each will enable independent updates to each environment.

    • Name the data source uniquely based on the application instance to discover. Try to include the hostname or organization name in the data source. For example, don't use "GitHub" use "GitHub - Acme Inc" or "Portal - prod.corp.com"

    • Note that a provider id is required in both the request path and body.

    hashtag
    Push data source metadata

    Once the data source and provider are active, publish the payload with . The request body must include the Provider ID and Data Source ID.

    json_data must contain the populated OAA template as a single JSON string (escaping any unsafe characters such as ").

    hashtag
    Get Custom Providers

    hashtag
    Get Custom Data Sources

    hashtag
    Update Custom Data Source

    Specifying the Provider ID and Data Source ID, perform the same used for the initial push.

    To update an existing data source, use the operations and operations to get the provider and data source IDs.

    Each custom provider can have one or more data sources (such as different instances or domains), generated using Create Datasource.

    • The populated template can describe additional resources and sub-resources, such as individual databases, repositories, or views.

  • You can push authorization metadata for each custom data source.

  • All custom data sources are shown on the Configuration > Apps & Data Sources menu, and can be retrieved using List Custom Provider Datasources.

  • hris

    HR systems with employees, managers, and organizational groups

    Template type: application, identity_provider, or hris.

    external_lifecycle_management_type

    string

    No

    Enable lifecycle management: SCIM (standard SCIM 2.0 protocol) or SEND_REST_PAYLOAD (custom REST calls via Insight Point). Only for application template.

    provisioning

    boolean

    No

    Set to true to use as system of record for Lifecycle Management. Primarily for hris template.

    curl -X GET "https://$VEZA_URL/api/v1/providers/custom" \
    -H "authorization: Bearer $API_KEY"

    Template

    custom_template value

    Use case

    Custom Application

    application

    Applications and services with users, groups, roles, resources, and permissions

    Custom Identity Provider

    identity_provider

    Identity sources with users, groups, domains, and app assignments

    curl -X POST "https://$VEZA_URL/api/v1/providers/custom" \
    -H "authorization: Bearer $API_KEY" \
    -H "Content-Type: application/json" \
    -d '{"name":"GitHub","custom_template":"application"}'
    curl -X POST "https://$VEZA_URL/api/v1/providers/custom" \
    -H "authorization: Bearer $API_KEY" \
    -H "Content-Type: application/json" \
    -d '{
      "name": "Internal Portal",
      "custom_template": "application",
      "external_lifecycle_management_type": "SCIM"
    }'
    curl -X POST "https://$VEZA_URL/api/v1/providers/custom" \
    -H "authorization: Bearer $API_KEY" \
    -H "Content-Type: application/json" \
    -d '{
      "name": "Legacy Access System",
      "custom_template": "application",
      "external_lifecycle_management_type": "SEND_REST_PAYLOAD"
    }'
    curl -X POST "https://$VEZA_URL/api/v1/providers/custom" \
    -H "authorization: Bearer $API_KEY" \
    -H "Content-Type: application/json" \
    -d '{"name":"Corporate LDAP","custom_template":"identity_provider"}'
    curl -X POST "https://$VEZA_URL/api/v1/providers/custom" \
    -H "authorization: Bearer $API_KEY" \
    -H "Content-Type: application/json" \
    -d '{
      "name": "Workday",
      "custom_template": "hris",
      "provisioning": true
    }'
    {
      "value": {
        "id": "a6ef8d8d-d17b-4491-a67a-635ad70f1ba9",
        "name": "GitHub",
        "custom_template": "application",
        "state": "ENABLED",
        "application_types": [],
        "resource_types": [],
        "idp_types": [],
        "schema_definition_json": "e30="
      }
    }

    name

    string

    Yes

    Provider name. Use the generic application name (e.g., "GitHub", not "GitHub - Acme").

    custom_template

    string

    from oaaclient.client import OAAClient
    
    client = OAAClient(url=veza_url, token=veza_api_key)
    
    # Basic application provider
    provider = client.create_provider(name="GitHub", custom_template="application")
    
    # Application with SCIM lifecycle management
    provider = client.create_provider(
        name="Internal Portal", custom_template="application",
        options={"external_lifecycle_management_type": "SCIM"}
    )
    
    # HRIS as system of record
    provider = client.create_provider(
        name="Acme HR", custom_template="hris",
        options={"provisioning": True}
    )
    curl -X POST "https://${VEZA_URL}/api/v1/providers/custom/${PROVIDER_ID}/datasources" \
    -H 'accept: application/json' \
    -H 'authorization: Bearer '${API_KEY} \
    -d '{"id": "<PROVIDER ID>", "name":"DemoApp - Documentation Datasource"}'
    {
      "value": {
        "id": "1bd31da0-64ee-4dfe-82c9-cb9f0f2fc369",
        "name": "DemoApp - Documentation Datasource"
      }
    }
    body.json
    {
      "id": "532f6fe3-189f-4576-afdf-8913088961e4",
      "compression_type": "none",
      "data_source_id": "b6a32af6-b854-47e1-8325-e5984f78bb4d",
      "json_data": "{\"name\":\"CustomApp\",\"application_type\"...}"
    }
    curl -X POST "https://$VEZA_URL/api/v1/providers/custom/$PROVIDER_ID/datasources/$DATASOURCE_ID:push" \
    -H 'accept: application/json' \
    -H 'authorization: Bearer '$API_KEY \
    --compressed --data-binary @body.json
    curl -X GET "https://$VEZA_URL/api/v1/providers/custom" \
    -H 'accept: application/json' \
    -H 'authorization: Bearer '$API_KEY
    curl -X GET "https://$VEZA_URL/api/v1/providers/custom/$PROVIDER_ID" \
    -H 'accept: application/json' \
    -H 'authorization: Bearer '$API_KEY
    curl -X POST "https://$VEZA_URL/api/v1/providers/custom/$PROVIDER_ID/datasources/$DATASOURCE_ID:push" \
    -H 'accept: application/json' \
    -H 'authorization: Bearer '$API_KEY \
    --compressed --data-binary @payload.json
    POST request to /api/providers/custom
    template
    Best Practices
    Team API key
    Create Custom Provider
    Veza Lifecycle Management
    Create Custom Provider Datasource
    Push Custom Provider Datasource
    post operation
    List Provider
    List Datasources

    Yes

    HRIS