All pages
Powered by GitBook
1 of 4

Loading...

Loading...

Loading...

Loading...

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.

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 POST request to /api/providers/custom (specifying the app name and template).

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

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

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

  • You can for each custom data source.

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

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.

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.

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.

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:

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

Using the Python SDK

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

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.

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 ").

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.

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

Authentication

First Run

Create a Custom Provider

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.

  • 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.

Create a Data Source for the Provider

Push data source metadata

Get Custom Providers

Get Custom Data Sources

Update Custom Data Source

template
Create Datasource
push authorization metadata
List Custom Provider Datasources
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

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.

Create Custom Provider

Creates a custom provider and returns the provider ID.

List Custom Providers

Lists all configured custom providers.

Get Custom Provider by ID

Returns details for an individual custom provider.

Delete Custom Provider

Delete a custom provider by ID.

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

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

Returns details for a single datasource.

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

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.

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.

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.

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).

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:

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:

Upload a custom icon to display for an OAA provider.

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

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=="}'

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.

Create Custom Provider Datasource

Get Datasource by ID

Delete Custom Provider Datasource

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.

Push Custom Provider Datasource

Multipart Push Custom Provider Datasource

Push Custom Provider Datasource CSV

Compression

Escaping unsafe characters

Custom Provider Icons

Create Custom Provider Icon

Get Custom Provider Icon

Delete Custom Provider Icon

Multipart Upload
CSV Upload Integrations

Multipart Upload

Upload large OAA payloads using chunked multipart requests

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

  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.

Field
Type
Description

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

Field
Type
Description

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

Field
Type
Description

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

  • 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

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.

How it works

API endpoint

Start request body

Chunk request body

Finalization request body

Example

Using the Python SDK

Notes

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)

Okta SSO Last Login Enrichment

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

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.

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.

  • 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).

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.

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.

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: ["jane.doe@company.com"] and OktaUser nodes have login: "jane.doe@company.com", 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.

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

The method depends on how you push data to Veza.

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.

  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.

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.

  • Matching is case-insensitive. Jane.Doe@company.com and jane.doe@company.com 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.

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?page_size=100" \
      -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": ["jane.doe@company.com"],
          "email": "jane.doe@company.com"
        }
      ]
    }

    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

    Prerequisites

    Setup

    Step 1: Request feature enablement

    Step 2: Set the matching property configuration

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

    Step 3: Find your Okta application ID

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

    API push (JSON)

    CSV upload

    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.

    Verifying enrichment

    Behavior notes

    Troubleshooting

    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
    property_match_operatorinteger · enumOptional
    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
    typeinteger · enumOptional
    mappingstringOptional
    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

    enabledbooleanOptional
    subscribed_eventsinteger · enum[]Optional
    notify_integration_ownerbooleanOptional
    additional_recipientsstring[]Optional
    typeinteger · enumOptional
    idstringOptional
    Responses
    200

    OK

    application/json
    default

    Default error response

    application/json
    post
    /api/v1/providers/custom

    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
    200

    OK

    application/json
    default

    Default error response

    application/json
    get
    /api/v1/providers/custom
    get
    Authorizations
    AuthorizationstringRequired

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

    Path parameters
    idstringRequired
    Responses
    200

    OK

    application/json
    default

    Default error response

    application/json
    get
    /api/v1/providers/custom/{id}
    delete
    Authorizations
    AuthorizationstringRequired

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

    Path parameters
    idstringRequired
    Responses
    200

    OK

    application/json
    default

    Default error response

    application/json
    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
    200

    OK

    application/json
    default

    Default error response

    application/json
    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
    200

    OK

    application/json
    default

    Default error response

    application/json
    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
    200

    OK

    application/json
    default

    Default error response

    application/json
    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
    200

    OK

    application/json
    default

    Default error response

    application/json
    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
    200

    OK

    application/json
    default

    Default error response

    application/json
    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
    200

    OK

    application/json
    default

    Default error response

    application/json
    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
    200

    OK

    application/json
    default

    Default error response

    application/json
    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
    200

    OK

    application/json
    default

    Default error response

    application/json
    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
    200

    OK

    application/json
    default

    Default error response

    application/json
    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
    200

    OK

    application/json
    default

    Default error response

    application/json
    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
    200

    OK

    application/json
    default

    Default error response

    application/json
    get
    /api/v1/providers/custom:icon
    delete
    Authorizations
    AuthorizationstringRequired

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

    Path parameters
    idstringRequired
    Responses
    200

    OK

    application/json
    default

    Default error response

    application/json
    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"
                    }
                  ],
                  "property_match_operator": 1
                }
              ],
              "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",
            "secret_mapping": {
              "type": 1,
              "mapping": "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"
        ],
        "notification_preferences": {
          "enabled": true,
          "subscribed_events": [
            1
          ],
          "notify_integration_owner": true,
          "additional_recipients": [
            "text"
          ],
          "delivery_methods": [
            {
              "type": 1,
              "id": "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"
                      }
                    ],
                    "property_match_operator": 1
                  }
                ],
                "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",
              "secret_mapping": {
                "type": 1,
                "mapping": "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"
          ],
          "notification_preferences": {
            "enabled": true,
            "subscribed_events": [
              1
            ],
            "notify_integration_owner": true,
            "additional_recipients": [
              "text"
            ],
            "delivery_methods": [
              {
                "type": 1,
                "id": "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: 1934
    
    {
      "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"
                  }
                ],
                "property_match_operator": 1
              }
            ],
            "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",
          "secret_mapping": {
            "type": 1,
            "mapping": "text"
          },
          "vault_id": "text"
        }
      ],
      "external_lifecycle_management_type": 1,
      "notification_preferences": {
        "enabled": true,
        "subscribed_events": [
          1
        ],
        "notify_integration_owner": true,
        "additional_recipients": [
          "text"
        ],
        "delivery_methods": [
          {
            "type": 1,
            "id": "text"
          }
        ]
      }
    }
    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"
                    }
                  ],
                  "property_match_operator": 1
                }
              ],
              "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",
            "secret_mapping": {
              "type": 1,
              "mapping": "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"
        ],
        "notification_preferences": {
          "enabled": true,
          "subscribed_events": [
            1
          ],
          "notify_integration_owner": true,
          "additional_recipients": [
            "text"
          ],
          "delivery_methods": [
            {
              "type": 1,
              "id": "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": {}
    }
    {}