Pandium API

Introduction

Welcome to the Pandium API! Our API enables your team flexibility in managing your integrations hosted on Pandium. The Pandium API uses standard REST conventions and standard HTTP methods and response codes for a simple and intuitive workflow.

With the Pandium API, native Pandium resources (integrations, tenants, and runs) are accessible via a generated API key, and allow for triggering runs externally - no login to the Pandium Integration Hub needed. As we expand the Pandium API, check back for additional functionality, or stay up to date on our product updates page.

Base URL

Below you'll find the base URLs used when working with the Pandium API:

For using the Pandium API with a Production Pandium account: http://api.pandium.io/

For using the Pandium API with a Sandbox Pandium account: http://api.sandbox.pandium.com/

Authentication

To generate an API Key, navigate to the 'Settings' sidebar resource in the Pandium Integration Hub, then head over to the "API Access" tab. Here, you can give your key a name and generate it.

API Keys are only viewable at creation, so store and keep your key(s) secure.

API Access tab in the Integration Hub

To use the generated key, attach it to your request under an x-api-key header, like so:

curl --location --request POST 'x`tenants/<tenant_id>/run?mode=init' \
--header 'X-API-KEY: <pandium api key>'

Integrations

In Pandium, the integration object can be thought of as the primary record for any application on the platform. This record holds the necessary components to run syncs between systems, and the content that a given application utilizes for marketplace views.

Integration IDs can be found in the Integration Hub on the Integration Detail page.

Get Many Integrations

Get all your integrations on Pandium.

GET/v2/integrations
Query parameters
Response

Successful Response

Body
id*Id
created_dateCreated Date
modified_dateModified Date
name*Name
long_name*Long Name
connectorsConnectors
repository_pathRepository Path
repository_tracking_branchRepository Tracking Branch
repository_urlRepository Url
type*IntegrationType

An enumeration.

InternalExternalPandium
categoriesCategories
tagsTags
flagFlag
default_release_idDefault Release Id
default_release_channelIntegrationReleaseChannel

An enumeration.

LatestDefault
Request
const response = await fetch('/v2/integrations', {
    method: 'GET',
    headers: {},
});
const data = await response.json();
Response
[
  {
    "created_date": "2024-10-22T03:27:44.156Z",
    "modified_date": "2024-10-22T03:27:44.156Z",
    "name": "text",
    "long_name": "text",
    "connectors": [
      {
        "name": "text",
        "isGlobal": false
      }
    ],
    "repository_path": "text",
    "repository_tracking_branch": "text",
    "repository_url": "text",
    "type": "Internal",
    "categories": [
      {
        "name": "text",
        "description": "text"
      }
    ],
    "tags": [
      {
        "name": "text",
        "description": "text"
      }
    ],
    "flag": {
      "name": "text",
      "flag_color": "text"
    },
    "default_release_channel": "Latest"
  }
]

Get One Integration

Get a single integration by its ID.

GET/v2/integrations/{integration_id}
Path parameters
integration_id*Integration Id

Unique identifier for an integration

Response

Successful Response

Body
id*Id
created_dateCreated Date
modified_dateModified Date
name*Name
long_name*Long Name
connectorsConnectors
repository_pathRepository Path
repository_tracking_branchRepository Tracking Branch
repository_urlRepository Url
type*IntegrationType

An enumeration.

InternalExternalPandium
categoriesCategories
tagsTags
flagFlag
default_release_idDefault Release Id
default_release_channelIntegrationReleaseChannel

An enumeration.

LatestDefault
Request
const response = await fetch('/v2/integrations/{integration_id}', {
    method: 'GET',
    headers: {},
});
const data = await response.json();
Response
{
  "created_date": "2024-10-22T03:27:44.156Z",
  "modified_date": "2024-10-22T03:27:44.156Z",
  "name": "text",
  "long_name": "text",
  "connectors": [
    {
      "name": "text",
      "isGlobal": false
    }
  ],
  "repository_path": "text",
  "repository_tracking_branch": "text",
  "repository_url": "text",
  "type": "Internal",
  "categories": [
    {
      "name": "text",
      "description": "text"
    }
  ],
  "tags": [
    {
      "name": "text",
      "description": "text"
    }
  ],
  "flag": {
    "name": "text",
    "flag_color": "text"
  },
  "default_release_channel": "Latest"
}

Get Integration Releases

Get all releases for a specific integration.

GET/v2/integrations/{integration_id}/releases
Path parameters
integration_id*Integration Id

Unique identifier for an integration

Response

Successful Response

Body
id*Id
name*Name
repository_tracking_branchRepository Tracking Branch
run_commandRun Command
tagTag
config_schemaConfig Schema
config_version*Config Version
created_dateCreated Date
modified_dateModified Date
Request
const response = await fetch('/v2/integrations/{integration_id}/releases', {
    method: 'GET',
    headers: {},
});
const data = await response.json();
Response
[
  {
    "name": "text",
    "repository_tracking_branch": "text",
    "run_command": "text",
    "tag": "text",
    "config_version": "text",
    "created_date": "2024-10-22T03:27:44.156Z",
    "modified_date": "2024-10-22T03:27:44.156Z"
  }
]

Get One Integration Release

Get a single release for a specific integration.

GET/v2/integrations/{integration_id}/releases/{release_id}
Path parameters
integration_id*Integration Id

Unique identifier for an integration

release_id*Release Id

Unique identifier for a release

Response

Successful Response

Body
id*Id
name*Name
repository_tracking_branchRepository Tracking Branch
run_commandRun Command
tagTag
config_schemaConfig Schema
config_version*Config Version
created_dateCreated Date
modified_dateModified Date
Request
const response = await fetch('/v2/integrations/{integration_id}/releases/{release_id}', {
    method: 'GET',
    headers: {},
});
const data = await response.json();
Response
{
  "name": "text",
  "repository_tracking_branch": "text",
  "run_command": "text",
  "tag": "text",
  "config_version": "text",
  "created_date": "2024-10-22T03:27:44.156Z",
  "modified_date": "2024-10-22T03:27:44.156Z"
}

Get Default Integration Release

Get the default release for an integration

GET/v2/integrations/{integration_id}/releases/default
Path parameters
integration_id*Integration Id

Unique identifier for an integration

Response

Successful Response

Body
id*Id
name*Name
repository_tracking_branchRepository Tracking Branch
run_commandRun Command
tagTag
config_schemaConfig Schema
config_version*Config Version
created_dateCreated Date
modified_dateModified Date
Request
const response = await fetch('/v2/integrations/{integration_id}/releases/default', {
    method: 'GET',
    headers: {},
});
const data = await response.json();
Response
{
  "name": "text",
  "repository_tracking_branch": "text",
  "run_command": "text",
  "tag": "text",
  "config_version": "text",
  "created_date": "2024-10-22T03:27:44.156Z",
  "modified_date": "2024-10-22T03:27:44.156Z"
}

Get Latest Release

Get the latest release for an Integration

GET/v2/integrations/{integration_id}/releases/latest
Path parameters
integration_id*Integration Id

Unique identifier for an id

Response

Successful Response

Body
id*Id
name*Name
repository_tracking_branchRepository Tracking Branch
run_commandRun Command
tagTag
config_schemaConfig Schema
config_version*Config Version
created_dateCreated Date
modified_dateModified Date
Request
const response = await fetch('/v2/integrations/{integration_id}/releases/latest', {
    method: 'GET',
    headers: {},
});
const data = await response.json();
Response
{
  "name": "text",
  "repository_tracking_branch": "text",
  "run_command": "text",
  "tag": "text",
  "config_version": "text",
  "created_date": "2024-10-22T03:27:44.156Z",
  "modified_date": "2024-10-22T03:27:44.156Z"
}

Sync By Integration Id

Request a sync for an existing tenant based on an integration ID and a user name. For this to work, the user must have installed the integration via the Pandium In-App Marketplace, which creates a tenant associated with that user's username. To sync a tenant created in the Pandium Integration Hub, use the sync by tenant id endpoint.

POST/v2/integrations/{integration_id}/sync
Path parameters
integration_id*Integration Id

Unique identifier for an integration

Query parameters
Body
Body

fields determined by the integration

Response

Successful Response

Body
trigger_id*Trigger Id
Request
const response = await fetch('/v2/integrations/{integration_id}/sync?mode=%5Bobject+Object%5D&user_name=text', {
    method: 'POST',
    headers: {
      "Content-Type": "application/json"
    },
});
const data = await response.json();
Response
{
  "trigger_id": "text"
}

Tenants

In Pandium, a tenant is a single instance of an integration, associated with a single set of user credentials for each connected system.

Whenever a user installs an integration, a tenant is created within Pandium and is automatically given a tenant ID, which is viewable in the Integration Hub directly on the Tenant Detail page.

Get Many Tenants

Get all your tenants on Pandium.

GET/v2/tenants
Query parameters
Response

Successful Response

Body
id*Id
name*Name
namespace*Namespace
configsConfigs
created_dateCreated Date
pausedPaused
user_scheduleUser Schedule
scheduleSchedule
sourceSource
integration_idIntegration Id
integration_release_idIntegration Release Id
integration_release_channelIntegrationReleaseChannel

An enumeration.

LatestDefault
statusTenantStatus
Request
const response = await fetch('/v2/tenants', {
    method: 'GET',
    headers: {},
});
const data = await response.json();
Response
[
  {
    "name": "text",
    "namespace": "text",
    "created_date": "2024-10-22T03:27:44.156Z",
    "paused": true,
    "user_schedule": "text",
    "schedule": "text",
    "source": "admin",
    "integration_release_channel": "Latest",
    "status": {
      "auth": {
        "connected": false
      }
    }
  }
]

Sync By Tenant Id

Request a sync when the tenant id is known.

POST/v2/tenants/{tenant_id}/sync
Path parameters
tenant_id*Tenant Id

Unique identifier for a tenant

Query parameters
Body
Body

fields determined by the integration

Response

Successful Response

Body
trigger_id*Trigger Id
Request
const response = await fetch('/v2/tenants/{tenant_id}/sync?mode=%5Bobject+Object%5D', {
    method: 'POST',
    headers: {
      "Content-Type": "application/json"
    },
});
const data = await response.json();
Response
{
  "trigger_id": "text"
}

Patch Tenant

Update a tenant's configs, user_schedule, or paused status. Configs are validated against the tenant's current integration release and any dynamic configs. User_schedule is randomized to create the tenant's schedule.

PATCH/v2/tenants/{tenant_id}
Path parameters
tenant_id*Tenant Id

Unique identifier for a tenant

Body
configsConfigs
pausedPaused
user_scheduleUser Schedule

must be a valid cron string

Response

Successful Response

Body
id*Id
name*Name
namespace*Namespace
configsConfigs
created_dateCreated Date
pausedPaused
user_scheduleUser Schedule
scheduleSchedule
sourceSource
integration_idIntegration Id
integration_release_idIntegration Release Id
integration_release_channelIntegrationReleaseChannel

An enumeration.

LatestDefault
statusTenantStatus
Request
const response = await fetch('/v2/tenants/{tenant_id}', {
    method: 'PATCH',
    headers: {
      "Content-Type": "application/json"
    },
    body: JSON.stringify({}),
});
const data = await response.json();
Response
{
  "name": "text",
  "namespace": "text",
  "created_date": "2024-10-22T03:27:44.156Z",
  "paused": true,
  "user_schedule": "text",
  "schedule": "text",
  "source": "admin",
  "integration_release_channel": "Latest",
  "status": {
    "auth": {
      "connected": false
    }
  }
}

Delete Tenant

Archive a tenant.

DELETE/v2/tenants/{tenant_id}
Path parameters
tenant_id*Tenant Id

Unique identifier for a tenant

Response

Successful Response

Body
Response Delete Tenant V2 Tenants Tenant Id Delete
Request
const response = await fetch('/v2/tenants/{tenant_id}', {
    method: 'DELETE',
    headers: {},
});
const data = await response.json();
Response
{
  "message": "text"
}

Get Tenant Release

Get the tenant's current integration release. Available dynamic configs will be populated.

GET/v2/tenants/{tenant_id}/release
Path parameters
tenant_id*Tenant ID

unique identifier for a tenant

Response

Successful Response

Body
id*Id
name*Name
repository_tracking_branchRepository Tracking Branch
run_commandRun Command
tagTag
config_schemaConfig Schema
config_version*Config Version
created_dateCreated Date
modified_dateModified Date
Request
const response = await fetch('/v2/tenants/{tenant_id}/release', {
    method: 'GET',
    headers: {},
});
const data = await response.json();
Response
{
  "name": "text",
  "repository_tracking_branch": "text",
  "run_command": "text",
  "tag": "text",
  "config_version": "text",
  "created_date": "2024-10-22T03:27:44.156Z",
  "modified_date": "2024-10-22T03:27:44.156Z"
}

Proxy Endpoints

An endpoint that allows a user to make a call to an external API (REST, SOAP, or XML) on behalf of a tenant.

Proxy Connector Call Rest

Proxy a synchronous connector call.

POST/v2/tenants/{tenant_id}/connectors/{connector_name}/call
Path parameters
tenant_id*Tenant Id

Unique identifier for a tenant

connector_name*Connector Name

Name of the tenant's authenticated connector

Body
headersHeaders

Headers needed for the proxied request

methodMethod
Example: "GET"
query_paramsQuery Params

Query params needed for the proxied request

target_urlTarget Url

Endpoint for the proxied request

Example: "www.example.com/users"
bodyBody

Body of the proxied request

Response

Successful Response

Body
data*Data
Request
const response = await fetch('/v2/tenants/{tenant_id}/connectors/{connector_name}/call', {
    method: 'POST',
    headers: {
      "Content-Type": "application/json"
    },
    body: JSON.stringify({}),
});
const data = await response.json();
Response
{}

Proxy Connector Call Soap

Proxy a synchronous connector call to a SOAP endpoint.

POST/v2/tenants/{tenant_id}/connectors/{connector_name}/soap
Path parameters
tenant_id*Tenant Id

Unique identifier for a tenant

connector_name*Connector Name

Name of the tenant's authenticated connector

Body
headersHeaders

Headers needed for the proxied request

methodMethod
Example: "GET"
query_paramsQuery Params

Query params needed for the proxied request

target_urlTarget Url

Endpoint for the proxied request

Example: "www.example.com/users"
dataData

XML data for the proxied request. Authentication will be handled by Pandium and doesn't need to be included in the request.

Example: "<Envelope><Body>...</Body></Envelope>"
Response

Successful Response

Body
data*Data
Request
const response = await fetch('/v2/tenants/{tenant_id}/connectors/{connector_name}/soap', {
    method: 'POST',
    headers: {
      "Content-Type": "application/json"
    },
    body: JSON.stringify({}),
});
const data = await response.json();
Response
{}

Proxy Connector Call Xml

Proxy a synchronous connector call to an XML endpoint.

POST/v2/tenants/{tenant_id}/connectors/{connector_name}/xml
Path parameters
tenant_id*Tenant Id

Unique identifier for a tenant

connector_name*Connector Name

Name of the tenant's authenticated connector

Body
headersHeaders

Headers needed for the proxied request

methodMethod
Example: "GET"
query_paramsQuery Params

Query params needed for the proxied request

target_urlTarget Url

Endpoint for the proxied request

Example: "www.example.com/users"
dataData

XML data for the proxied request. Authentication will be handled by Pandium and doesn't need to be included in the request.

Example: "<Envelope><Body>...</Body></Envelope>"
Response

Successful Response

Body
data*Data
Request
const response = await fetch('/v2/tenants/{tenant_id}/connectors/{connector_name}/xml', {
    method: 'POST',
    headers: {
      "Content-Type": "application/json"
    },
    body: JSON.stringify({}),
});
const data = await response.json();
Response
{}

Runs

A run is a specific record of a sync: a single execution of integration code using the credentials provided by a tenant of that integration, at a specific point in time. The runs endpoints are by nature read-only.

More run information can be seen by viewing the logging information from within the Integration Hub.

Get Run Status From Trigger

Returns status information for a run associated with the provided trigger id, if that run exists. Triggers are are debounced, so run status information may not be immediately available. If no status information is yet available, this endpoint will return a 404.

GET/v2/runs/triggers/{trigger_id}/status
Path parameters
trigger_id*Trigger Id

Returned from Pandium after a sync request in the response payload

Response

Successful Response

Body
status*Status
Example: "in progress"
Request
const response = await fetch('/v2/runs/triggers/{trigger_id}/status', {
    method: 'GET',
    headers: {},
});
const data = await response.json();
Response
{
  "status": "in progress"
}

Last updated