arrow-left

All pages
gitbookPowered by GitBook
1 of 3

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.

Multipart Upload
CSV Upload Integrations
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=="}'

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

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.

  • provisioning

    boolean

    No

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

    is required in both the request path and body.

    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

    HRIS

    hris

    HR systems with employees, managers, and organizational groups

    name

    string

    Yes

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

    custom_template

    string

    Yes

    Template type: application, identity_provider, or hris.

    external_lifecycle_management_type

    string

    No

    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

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

    curl -X GET "https://$VEZA_URL/api/v1/providers/custom" \
    -H "authorization: Bearer $API_KEY"
    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="
      }
    }
    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
    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
    external_lifecycle_management_typeinteger · enumOptional

    For external OAA, how to manage lifecycle management requests

    Responses
    chevron-right
    200

    OK

    application/json
    chevron-right
    default

    Default error response

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

    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
    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
    chevron-right
    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
    chevron-right
    200

    OK

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

    OK

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

    OK

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

    OK

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

    OK

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

    OK

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

    OK

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

    OK

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

    OK

    application/json
    mime_typestringOptional
    icon_base64stringOptional
    chevron-right
    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
    chevron-right
    200

    OK

    application/json
    mime_typestringOptional
    icon_base64stringOptional
    provider_idstringOptional
    chevron-right
    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
    chevron-right
    200

    OK

    application/json
    objectOptional
    chevron-right
    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"
        ],
        "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"
          },
          "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
          }
        },
        "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
      }
    }
    {
      "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"
          ],
          "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"
            },
            "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
            }
          },
          "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
        }
      ],
      "next_page_token": "text",
      "has_more": true
    }
    {
      "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"
        ],
        "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"
          },
          "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
          }
        },
        "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
      }
    }
    {}
    {
      "values": [
        {}
      ],
      "next_page_token": "text",
      "has_more": true
    }
    {
      "value": {
        "id": "text",
        "name": "text"
      }
    }
    {
      "value": {}
    }
    {}
    {
      "warnings": [
        {
          "message": "text"
        }
      ]
    }
    {
      "warnings": [
        {
          "message": "text"
        }
      ]
    }
    {
      "warnings": [
        {
          "message": "text"
        }
      ]
    }
    {
      "warnings": [
        {
          "message": "text"
        }
      ]
    }
    {}
    {
      "mime_type": "text",
      "icon_base64": "text"
    }
    {
      "mime_type": "text",
      "icon_base64": "text",
      "provider_id": "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: 1328
    
    {
      "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"
        },
        "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
        }
      },
      "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: */*
    
    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: */*
    
    GET /api/v1/providers/custom:icon HTTP/1.1
    Host: your-tenant.vezacloud.com
    Authorization: Bearer YOUR_SECRET_TOKEN
    Accept: */*
    
    DELETE /api/v1/providers/custom/{id}:icon HTTP/1.1
    Host: your-tenant.vezacloud.com
    Authorization: Bearer YOUR_SECRET_TOKEN
    Accept: */*
    

    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.

    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

    sequence_number

    integer

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

    data

    string

    Base64-encoded chunk of the raw payload

    operation

    string

    Must be complete

    upload_id

    string

    UUID from the start response

    sequence_count

    integer

    Total number of chunks uploaded

    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)