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

Get all your integrations on Pandium.

Query parameters
sort_byany ofOptional

format is {field}__ASC or {field}__DESC

stringOptional
or
nullOptional
limitany ofOptional

default is 100, max is 500

Default: 100
integerOptional
or
nullOptional
skipany ofOptional

paging support: this is the number of records to skip. Normally you want page_number*limit. default is 0

Default: 0
integerOptional
or
nullOptional
archivedany ofOptional

set this to true to fetch archived integrations

Default: false
booleanOptional
or
nullOptional
Responses
200
Successful Response
application/json
get
GET /v2/integrations HTTP/1.1
Host: 
Accept: */*
[
  {
    "id": 1,
    "created_date": "2025-07-01T01:42:30.883Z",
    "modified_date": "2025-07-01T01:42:30.883Z",
    "name": "text",
    "long_name": "text",
    "connectors": [
      {
        "name": "text",
        "isGlobal": true
      }
    ],
    "repository_path": "text",
    "repository_tracking_branch": "text",
    "repository_url": "text",
    "type": "Internal",
    "categories": [
      {
        "name": "text",
        "id": 1,
        "description": "text",
        "order_index": 1
      }
    ],
    "tags": [
      {
        "name": "text",
        "id": 1,
        "description": "text"
      }
    ],
    "flag": {
      "name": "text",
      "id": 1,
      "flag_color": "text"
    },
    "default_release_id": 1,
    "default_release_channel": "Latest"
  }
]

Get One Integration

get

Get a single integration by its ID.

Path parameters
integration_idintegerRequired

Unique identifier for an integration

Responses
200
Successful Response
application/json
get
GET /v2/integrations/{integration_id} HTTP/1.1
Host: 
Accept: */*
{
  "id": 1,
  "created_date": "2025-07-01T01:42:30.883Z",
  "modified_date": "2025-07-01T01:42:30.883Z",
  "name": "text",
  "long_name": "text",
  "connectors": [
    {
      "name": "text",
      "isGlobal": true
    }
  ],
  "repository_path": "text",
  "repository_tracking_branch": "text",
  "repository_url": "text",
  "type": "Internal",
  "categories": [
    {
      "name": "text",
      "id": 1,
      "description": "text",
      "order_index": 1
    }
  ],
  "tags": [
    {
      "name": "text",
      "id": 1,
      "description": "text"
    }
  ],
  "flag": {
    "name": "text",
    "id": 1,
    "flag_color": "text"
  },
  "default_release_id": 1,
  "default_release_channel": "Latest"
}

Get Integration Releases

get

Get all releases for a specific integration.

Path parameters
integration_idintegerRequired

Unique identifier for an integration

Responses
200
Successful Response
application/json
get
GET /v2/integrations/{integration_id}/releases HTTP/1.1
Host: 
Accept: */*
[
  {
    "id": 1,
    "name": "text",
    "repository_tracking_branch": "text",
    "run_command": "text",
    "tag": "text",
    "config_schema": {
      "ANY_ADDITIONAL_PROPERTY": "anything"
    },
    "config_version": "text",
    "created_date": "2025-07-01T01:42:30.883Z",
    "modified_date": "2025-07-01T01:42:30.883Z"
  }
]

Get One Integration Release

get

Get a single release for a specific integration.

Path parameters
integration_idintegerRequired

Unique identifier for an integration

release_idintegerRequired

Unique identifier for a release

Responses
200
Successful Response
application/json
get
GET /v2/integrations/{integration_id}/releases/{release_id} HTTP/1.1
Host: 
Accept: */*
{
  "id": 1,
  "name": "text",
  "repository_tracking_branch": "text",
  "run_command": "text",
  "tag": "text",
  "config_schema": {
    "ANY_ADDITIONAL_PROPERTY": "anything"
  },
  "config_version": "text",
  "created_date": "2025-07-01T01:42:30.883Z",
  "modified_date": "2025-07-01T01:42:30.883Z"
}

Get Default Integration Release

get

Get the default release for an integration

Path parameters
integration_idintegerRequired

Unique identifier for an integration

Responses
200
Successful Response
application/json
get
GET /v2/integrations/{integration_id}/releases/default HTTP/1.1
Host: 
Accept: */*
{
  "id": 1,
  "name": "text",
  "repository_tracking_branch": "text",
  "run_command": "text",
  "tag": "text",
  "config_schema": {
    "ANY_ADDITIONAL_PROPERTY": "anything"
  },
  "config_version": "text",
  "created_date": "2025-07-01T01:42:30.883Z",
  "modified_date": "2025-07-01T01:42:30.883Z"
}

Get Latest Release

get

Get the latest release for an Integration

Path parameters
integration_idstringRequired

Unique identifier for an id

Responses
200
Successful Response
application/json
get
GET /v2/integrations/{integration_id}/releases/latest HTTP/1.1
Host: 
Accept: */*
{
  "id": 1,
  "name": "text",
  "repository_tracking_branch": "text",
  "run_command": "text",
  "tag": "text",
  "config_schema": {
    "ANY_ADDITIONAL_PROPERTY": "anything"
  },
  "config_version": "text",
  "created_date": "2025-07-01T01:42:30.883Z",
  "modified_date": "2025-07-01T01:42:30.883Z"
}

Sync By Integration Id

post

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.

Path parameters
integration_idintegerRequired

Unique identifier for an integration

Query parameters
modestring · enumRequired

must be one of 'init' or 'normal'

Possible values:
user_namestringRequired

must correspond to the user id sent from your system to the Pandium In-App Marketplace when the user installed this integration

Body
any ofOptional

fields determined by the integration

or
nullOptional
Responses
202
Successful Response
application/json
post
POST /v2/integrations/{integration_id}/sync?mode=init&user_name=text HTTP/1.1
Host: 
Content-Type: application/json
Accept: */*
Content-Length: 38

{
  "ANY_ADDITIONAL_PROPERTY": "anything"
}
{
  "trigger_id": "9655159064915567"
}

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

Get all your tenants on Pandium.

Query parameters
sort_byany ofOptional

format is {field}__ASC or {field}__DESC

stringOptional
or
nullOptional
limitany ofOptional

default is 100, max is 500

Default: 100
integerOptional
or
nullOptional
skipany ofOptional

paging support: this is the number of records to skip. Normally you want page_number*limit. default is 0

Default: 0
integerOptional
or
nullOptional
integration_idany ofOptional

filter tenants by integration

Default: 0
integerOptional
or
nullOptional
user_nameany ofOptional

must correspond to a user id connected to at least one of the connected systems for a tenant

Default: ""
stringOptional
or
nullOptional
archivedany ofOptional

set this to true to fetch archived integrations

Default: false
booleanOptional
or
nullOptional
Responses
200
Successful Response
application/json
get
GET /v2/tenants HTTP/1.1
Host: 
Accept: */*
[
  {
    "id": 1,
    "name": "text",
    "archived": true,
    "integration_id": 1,
    "configs": {
      "ANY_ADDITIONAL_PROPERTY": "anything"
    },
    "created_date": "2025-07-01T01:42:30.883Z",
    "modified_date": "2025-07-01T01:42:30.883Z",
    "paused": true,
    "user_schedule": "text",
    "schedule": "text",
    "source": "api",
    "integration_release_id": 1,
    "integration_release_channel": "Latest",
    "status": {
      "last_run": {
        "ANY_ADDITIONAL_PROPERTY": "anything"
      },
      "current_run": {
        "ANY_ADDITIONAL_PROPERTY": "anything"
      },
      "last_successful_run": {
        "ANY_ADDITIONAL_PROPERTY": "anything"
      },
      "dynamic_configs": {
        "ANY_ADDITIONAL_PROPERTY": "anything"
      },
      "auth": {
        "connected": false
      }
    }
  }
]

Sync By Tenant Id

post

Request a sync when the tenant id is known.

Path parameters
tenant_idintegerRequired

Unique identifier for a tenant

Query parameters
modestring · enumRequired

must be one of 'init' or 'normal'

Possible values:
Body
any ofOptional

fields determined by the integration

or
nullOptional
Responses
202
Successful Response
application/json
post
POST /v2/tenants/{tenant_id}/sync?mode=init HTTP/1.1
Host: 
Content-Type: application/json
Accept: */*
Content-Length: 38

{
  "ANY_ADDITIONAL_PROPERTY": "anything"
}
{
  "trigger_id": "9655159064915567"
}

Patch Tenant

patch

Update a tenant's name, 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.

Path parameters
tenant_idintegerRequired

Unique identifier for a tenant

Body
nameany ofOptional

Lowercase alphanumeric string; '-' is allowed but not at the start or end of the string

stringOptional
or
nullOptional
configsany ofOptional
or
nullOptional
pausedany ofOptional
booleanOptional
or
nullOptional
archivedany ofOptional
booleanOptional
or
nullOptional
user_schedulestringOptional

must be a valid cron string

Example: */30 * * * *
Responses
200
Successful Response
application/json
patch
PATCH /v2/tenants/{tenant_id} HTTP/1.1
Host: 
Content-Type: application/json
Accept: */*
Content-Length: 125

{
  "name": "text",
  "configs": {
    "ANY_ADDITIONAL_PROPERTY": "anything"
  },
  "paused": true,
  "archived": true,
  "user_schedule": "*/30 * * * *"
}
{
  "id": 1,
  "name": "text",
  "archived": true,
  "integration_id": 1,
  "configs": {
    "ANY_ADDITIONAL_PROPERTY": "anything"
  },
  "created_date": "2025-07-01T01:42:30.883Z",
  "modified_date": "2025-07-01T01:42:30.883Z",
  "paused": true,
  "user_schedule": "text",
  "schedule": "text",
  "source": "api",
  "integration_release_id": 1,
  "integration_release_channel": "Latest",
  "status": {
    "last_run": {
      "ANY_ADDITIONAL_PROPERTY": "anything"
    },
    "current_run": {
      "ANY_ADDITIONAL_PROPERTY": "anything"
    },
    "last_successful_run": {
      "ANY_ADDITIONAL_PROPERTY": "anything"
    },
    "dynamic_configs": {
      "ANY_ADDITIONAL_PROPERTY": "anything"
    },
    "auth": {
      "connected": false
    }
  }
}

Delete Tenant

delete

Archive a tenant.

Path parameters
tenant_idintegerRequired

Unique identifier for a tenant

Responses
200
Successful Response
application/json
delete
DELETE /v2/tenants/{tenant_id} HTTP/1.1
Host: 
Accept: */*
{
  "ANY_ADDITIONAL_PROPERTY": "anything"
}

Get Tenant Release

get

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

Path parameters
tenant_idintegerRequired

unique identifier for a tenant

Responses
200
Successful Response
application/json
get
GET /v2/tenants/{tenant_id}/release HTTP/1.1
Host: 
Accept: */*
{
  "id": 1,
  "name": "text",
  "repository_tracking_branch": "text",
  "run_command": "text",
  "tag": "text",
  "config_schema": {
    "ANY_ADDITIONAL_PROPERTY": "anything"
  },
  "config_version": "text",
  "created_date": "2025-07-01T01:42:30.883Z",
  "modified_date": "2025-07-01T01:42:30.883Z"
}

Create One

post

Create a new, unconnected tenant. The tenant will be paused. If no schedule or release is provided, integration defaults will apply.

Body
namestringRequired

Lowercase alphanumeric string; '-' is allowed but not at the start or end of the string

integration_idintegerRequired
user_scheduleany ofOptional

Must be a valid cron string

Example: */30 * * * *
stringOptional
or
nullOptional
integration_release_idany ofOptional

You may pass in an integration release id OR a channel

integerOptional
or
nullOptional
integration_release_channelany ofOptional

You may pass in an integration release id OR a channel

stringOptional
or
nullOptional
configsany ofOptional

Will be validated against the tenant's integration release

or
nullOptional
Responses
200
Successful Response
application/json
post
POST /v2/tenants HTTP/1.1
Host: 
Content-Type: application/json
Accept: */*
Content-Length: 178

{
  "name": "text",
  "integration_id": 1,
  "user_schedule": "*/30 * * * *",
  "integration_release_id": 1,
  "integration_release_channel": "text",
  "configs": {
    "ANY_ADDITIONAL_PROPERTY": "anything"
  }
}
{
  "id": 1,
  "name": "text",
  "archived": true,
  "integration_id": 1,
  "configs": {
    "ANY_ADDITIONAL_PROPERTY": "anything"
  },
  "created_date": "2025-07-01T01:42:30.883Z",
  "modified_date": "2025-07-01T01:42:30.883Z",
  "paused": true,
  "user_schedule": "text",
  "schedule": "text",
  "source": "api",
  "integration_release_id": 1,
  "integration_release_channel": "Latest",
  "status": {
    "last_run": {
      "ANY_ADDITIONAL_PROPERTY": "anything"
    },
    "current_run": {
      "ANY_ADDITIONAL_PROPERTY": "anything"
    },
    "last_successful_run": {
      "ANY_ADDITIONAL_PROPERTY": "anything"
    },
    "dynamic_configs": {
      "ANY_ADDITIONAL_PROPERTY": "anything"
    },
    "auth": {
      "connected": false
    }
  }
}

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

post

Proxy a synchronous connector call.

Path parameters
tenant_idintegerRequired

Unique identifier for a tenant

connector_namestringRequired

Name of the tenant's authenticated connector

Body
headersany ofOptional

Headers needed for the proxied request

Example: {"revision":"10-15-2023","user-agent":"default"}
or
or
nullOptional
methodstringOptional

HTTP Method

Example: GET
query_paramsany ofOptional

Query params needed for the proxied request

Example: {"company_id":12345}
or
nullOptional
target_urlstringOptional

Endpoint for the proxied request

Example: www.example.com/users
bodyany ofOptional

Body of the proxied request

Example: {"order_ids":[1,2,3,4,5]}
or
nullOptional
Responses
200
Successful Response
application/json
post
POST /v2/tenants/{tenant_id}/connectors/{connector_name}/call HTTP/1.1
Host: 
Content-Type: application/json
Accept: */*
Content-Length: 181

{
  "headers": {
    "revision": "10-15-2023",
    "user-agent": "default"
  },
  "method": "GET",
  "query_params": {
    "company_id": 12345
  },
  "target_url": "www.example.com/users",
  "body": {
    "order_ids": [
      1,
      2,
      3,
      4,
      5
    ]
  }
}
{
  "data": {
    "ANY_ADDITIONAL_PROPERTY": "anything"
  }
}

Proxy Connector Call Soap

post

Proxy a synchronous connector call to a SOAP endpoint.

Path parameters
tenant_idintegerRequired

Unique identifier for a tenant

connector_namestringRequired

Name of the tenant's authenticated connector

Body
headersany ofOptional

Headers needed for the proxied request

Example: {"revision":"10-15-2023","user-agent":"default"}
or
or
nullOptional
methodstringOptional

HTTP Method

Example: GET
query_paramsany ofOptional

Query params needed for the proxied request

Example: {"company_id":12345}
or
nullOptional
target_urlstringOptional

Endpoint for the proxied request

Example: www.example.com/users
dataany ofOptional

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>
stringOptional
or
nullOptional
Responses
200
Successful Response
application/json
post
POST /v2/tenants/{tenant_id}/connectors/{connector_name}/soap HTTP/1.1
Host: 
Content-Type: application/json
Accept: */*
Content-Length: 195

{
  "headers": {
    "revision": "10-15-2023",
    "user-agent": "default"
  },
  "method": "GET",
  "query_params": {
    "company_id": 12345
  },
  "target_url": "www.example.com/users",
  "data": "<Envelope><Body>...</Body></Envelope>"
}
{
  "data": {
    "ANY_ADDITIONAL_PROPERTY": "anything"
  }
}

Proxy Connector Call Xml

post

Proxy a synchronous connector call to an XML endpoint.

Path parameters
tenant_idintegerRequired

Unique identifier for a tenant

connector_namestringRequired

Name of the tenant's authenticated connector

Body
headersany ofOptional

Headers needed for the proxied request

Example: {"revision":"10-15-2023","user-agent":"default"}
or
or
nullOptional
methodstringOptional

HTTP Method

Example: GET
query_paramsany ofOptional

Query params needed for the proxied request

Example: {"company_id":12345}
or
nullOptional
target_urlstringOptional

Endpoint for the proxied request

Example: www.example.com/users
dataany ofOptional

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>
stringOptional
or
nullOptional
Responses
200
Successful Response
application/json
post
POST /v2/tenants/{tenant_id}/connectors/{connector_name}/xml HTTP/1.1
Host: 
Content-Type: application/json
Accept: */*
Content-Length: 195

{
  "headers": {
    "revision": "10-15-2023",
    "user-agent": "default"
  },
  "method": "GET",
  "query_params": {
    "company_id": 12345
  },
  "target_url": "www.example.com/users",
  "data": "<Envelope><Body>...</Body></Envelope>"
}
{
  "data": {
    "ANY_ADDITIONAL_PROPERTY": "anything"
  }
}

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

get

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.

Path parameters
trigger_idstringRequired

Returned from Pandium after a sync request in the response payload

Responses
200
Successful Response
application/json
get
GET /v2/runs/triggers/{trigger_id}/status HTTP/1.1
Host: 
Accept: */*
{
  "status": "in progress"
}

Last updated

Was this helpful?