Skip to main content

Partner Directory API

Usageโ€‹

import { epilot } from '@epilot/sdk'

epilot.authorize(() => '<token>')
const { data } = await epilot.partnerDirectory.approvePartner(...)

Tree-shakeable importโ€‹

import { getClient, authorize } from '@epilot/sdk/partner-directory'

const partnerDirectoryClient = getClient()
authorize(partnerDirectoryClient, () => '<token>')
const { data } = await partnerDirectoryClient.approvePartner(...)

Operationsโ€‹

Partners

Partner Users

Schemas

approvePartnerโ€‹

Approves a pending partner request, allowing the partner to begin collaboration.

POST /v1/partners/{id}/approve

const { data } = await client.approvePartner({
id: '123e4567-e89b-12d3-a456-426614174000',
})
Response
{
"id": "e45a6dc2-3795-43a3-ae0f-6b6760f310fc",
"organization_id": "123",
"created_at": "2022-02-08T04:44:32.246Z",
"description": "Regional solar installation partner for Bavaria",
"company_name": "Acme Solar GmbH",
"invitation_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"invitation_email": "user@example.com",
"email": "contact@acme-solar.de",
"owner_email": "owner@acme-solar.de",
"signed_up_email": "admin@acme-solar.de",
"partner_org_id": "456789",
"status": "Pending"
}

rejectPartnerโ€‹

Rejects a pending partner request, declining the partnership.

POST /v1/partners/{id}/reject

const { data } = await client.rejectPartner({
id: '123e4567-e89b-12d3-a456-426614174000',
})
Response
{
"id": "e45a6dc2-3795-43a3-ae0f-6b6760f310fc",
"organization_id": "123",
"created_at": "2022-02-08T04:44:32.246Z",
"description": "Regional solar installation partner for Bavaria",
"company_name": "Acme Solar GmbH",
"invitation_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"invitation_email": "user@example.com",
"email": "contact@acme-solar.de",
"owner_email": "owner@acme-solar.de",
"signed_up_email": "admin@acme-solar.de",
"partner_org_id": "456789",
"status": "Pending"
}

searchAssignableโ€‹

Search for users and organizations that can be assigned to tasks, workflows, or entities.

POST /v1/partners/assignables:search

const { data } = await client.searchAssignable(
null,
{
q: 'john',
from: 0,
size: 25,
org_ids: ['123', '456'],
portalUsersEntityIdScope: 'f7c22299-ca72-4bca-8538-0a88eeefc947',
types: ['user', 'partner_user', 'partner_organization', 'ecp', 'group']
},
)
Response
{
"hits": 42,
"results": [
{
"type": "user",
"display_name": "John Smith",
"image_uri": {
"original": "https://epilot-staging-user-content.s3.eu-central-1.amazonaws.com/728/8043d909-71fc-4838-a363-1b15dc1d585c/epilot.png",
"thumbnail_32": "https://file.sls.epilot.io/v1/files/public/preview?w=32&h=32&key=/728/8043d909-71fc-4838-a363-1b15dc1d585c/epilot.png"
},
"org_id": "123",
"created_at": "2022-02-08T04:44:32.246Z",
"activated_at": "2022-02-08T04:44:32.246Z",
"status": "Active",
"user_id": "456",
"email": "john.smith@example.com"
}
]
}

batchGetAssignableโ€‹

Retrieve multiple assignable users or groups by their IDs in a single request.

POST /v1/partners/assignables:batchGet

const { data } = await client.batchGetAssignable(
null,
[
{
user_id: '456',
org_id: '123',
group_id: 'group-789'
}
],
)
Response
{
"hits": 3,
"results": [
{
"type": "user",
"display_name": "John Smith",
"image_uri": {
"original": "https://epilot-staging-user-content.s3.eu-central-1.amazonaws.com/728/8043d909-71fc-4838-a363-1b15dc1d585c/epilot.png",
"thumbnail_32": "https://file.sls.epilot.io/v1/files/public/preview?w=32&h=32&key=/728/8043d909-71fc-4838-a363-1b15dc1d585c/epilot.png"
},
"org_id": "123",
"created_at": "2022-02-08T04:44:32.246Z",
"activated_at": "2022-02-08T04:44:32.246Z",
"status": "Active",
"user_id": "456",
"email": "john.smith@example.com"
}
]
}

getPartnerByTokenโ€‹

Retrieves partner information using an invitation token.

GET /v1/partner-directory/public/getPartnerByToken

const { data } = await client.getPartnerByToken({
token: 'example',
})
Response
{
"id": "e45a6dc2-3795-43a3-ae0f-6b6760f310fc",
"organization_id": "123",
"created_at": "2022-02-08T04:44:32.246Z",
"description": "Regional solar installation partner for Bavaria",
"company_name": "Acme Solar GmbH",
"invitation_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"invitation_email": "user@example.com",
"email": "contact@acme-solar.de",
"owner_email": "owner@acme-solar.de",
"signed_up_email": "admin@acme-solar.de",
"partner_org_id": "456789",
"status": "Pending"
}

activatePartnerโ€‹

Activates a partner account using an invitation token.

POST /v1/partner-directory/public/activate

const { data } = await client.activatePartner(
{
token: 'example',
},
{
company_name: 'Acme Solar GmbH',
signed_up_email: 'admin@acme-solar.de',
organization_id: '456'
},
)

searchGeolocationForTextโ€‹

Converts an address string to geographic coordinates (latitude and longitude).

POST /v1/geolocation/text:search

const { data } = await client.searchGeolocationForText(
null,
{
address: 'Auweg 1, 93055 Regensburg, DE'
},
)
Response
{
"lat": 49.013,
"lng": 12.101,
"addressLabel": "Auweg 1, 93055 Regensburg, Germany",
"relevance": 0.95
}

invitePartnerV2โ€‹

Sends an invitation email to a partner organization to begin collaboration.

POST /v2/partners/{id}/invite

const { data } = await client.invitePartnerV2(
{
id: '123e4567-e89b-12d3-a456-426614174000',
},
{
language: 'de'
},
)
Response
{
"id": "e45a6dc2-3795-43a3-ae0f-6b6760f310fc",
"organization_id": "123",
"created_at": "2022-02-08T04:44:32.246Z",
"description": "Regional solar installation partner for Bavaria",
"company_name": "Acme Solar GmbH",
"invitation_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"invitation_email": "user@example.com",
"email": "contact@acme-solar.de",
"owner_email": "owner@acme-solar.de",
"signed_up_email": "admin@acme-solar.de",
"partner_org_id": "456789",
"status": "Pending"
}

getPartnerUsersโ€‹

Retrieves all users belonging to a partner organization along with their assigned roles.

GET /v2/partners/{orgId}/users

const { data } = await client.getPartnerUsers({
orgId: 'example',
})
Response
{
"results": [
{
"id": "456",
"name": "John Doe",
"email": "user@partner.com",
"status": "Active",
"image": {
"original": "https://example.com/path",
"thumbnail_32": "https://example.com/path"
},
"roles": [
{
"id": "123:partner_admin",
"slug": "partner_admin",
"name": "Partner Administrator"
}
]
}
]
}

createPartnerUserโ€‹

Creates a new user in a partner organization.

POST /v2/partners/{orgId}/users

const { data } = await client.createPartnerUser(
{
orgId: 'example',
},
{
email: 'newuser@partner.com',
language: 'de',
roles: ['123:partner_viewer']
},
)
Response
{
"id": "456",
"email": "user@example.com",
"display_name": "John Doe",
"status": "Active"
}

deletePartnerUserโ€‹

Removes a user from a partner organization.

DELETE /v2/partners/{orgId}/users/{userId}

const { data } = await client.deletePartnerUser({
orgId: 'example',
userId: 'example',
})
Response
{}

getPartnerRolesโ€‹

Retrieves all roles defined for a partner organization.

GET /v2/partners/{orgId}/roles

const { data } = await client.getPartnerRoles({
orgId: 'example',
})
Response
{
"results": [
{
"id": "123:partner_admin",
"slug": "partner_admin",
"name": "Partner Administrator",
"type": "share_role",
"grants": [
{
"action": "entity-read",
"resource": "entity:123:contact:*",
"effect": "allow",
"conditions": [
{
"attribute": "workflows.primary.task_name",
"operation": "equals",
"values": ["Qualification"]
}
]
}
]
}
]
}

createPartnerRoleโ€‹

Creates a new role for a partner organization.

POST /v2/partners/{orgId}/roles

const { data } = await client.createPartnerRole(
{
orgId: 'example',
},
{
name: 'Partner Administrator',
slug: 'partner_admin',
grants: [
{
action: 'entity-read',
resource: 'entity:123:contact:*',
effect: 'allow',
conditions: [
{
attribute: 'workflows.primary.task_name',
operation: 'equals',
values: ['Qualification']
}
],
dependencies: [
{
action: 'entity-read',
resource: 'entity:123:contact:*',
effect: 'allow',
conditions: [
{
attribute: 'workflows.primary.task_name',
operation: 'equals',
values: ['Qualification']
}
]
}
]
}
]
},
)
Response
{
"id": "123:partner_admin",
"slug": "partner_admin",
"name": "Partner Administrator",
"type": "share_role",
"grants": [
{
"action": "entity-read",
"resource": "entity:123:contact:*",
"effect": "allow",
"conditions": [
{
"attribute": "workflows.primary.task_name",
"operation": "equals",
"values": ["Qualification"]
}
]
}
]
}

updatePartnerRoleโ€‹

Updates an existing role in a partner organization.

PUT /v2/partners/{orgId}/roles/{roleId}

const { data } = await client.updatePartnerRole(
{
orgId: 'example',
roleId: 'example',
},
{
grants: [
{
action: 'entity-read',
resource: 'entity:123:contact:*',
effect: 'allow',
conditions: [
{
attribute: 'workflows.primary.task_name',
operation: 'equals',
values: ['Qualification']
}
],
dependencies: [
{
action: 'entity-read',
resource: 'entity:123:contact:*',
effect: 'allow',
conditions: [
{
attribute: 'workflows.primary.task_name',
operation: 'equals',
values: ['Qualification']
}
]
}
]
}
],
id: '123:owner',
name: 'Owner',
slug: 'owner'
},
)
Response
{
"id": "123:partner_admin",
"slug": "partner_admin",
"name": "Partner Administrator",
"type": "share_role",
"grants": [
{
"action": "entity-read",
"resource": "entity:123:contact:*",
"effect": "allow",
"conditions": [
{
"attribute": "workflows.primary.task_name",
"operation": "equals",
"values": ["Qualification"]
}
]
}
]
}

deletePartnerRoleโ€‹

Delete a role from a partner organization

DELETE /v2/partners/{orgId}/roles/{roleId}

const { data } = await client.deletePartnerRole({
orgId: 'example',
roleId: 'example',
})
Response
{
"id": "123:partner_admin",
"slug": "partner_admin",
"name": "Partner Administrator",
"type": "share_role",
"grants": [
{
"action": "entity-read",
"resource": "entity:123:contact:*",
"effect": "allow",
"conditions": [
{
"attribute": "workflows.primary.task_name",
"operation": "equals",
"values": ["Qualification"]
}
]
}
]
}

assignPartnerUserRolesโ€‹

Assigns one or more roles to a user in a partner organization.

POST /v2/partners/{orgId}/users/{userId}/roles

const { data } = await client.assignPartnerUserRoles(
{
orgId: 'example',
userId: 'example',
},
{
roleIds: ['123:partner_admin', '123:partner_viewer']
},
)
Response
{
"results": [
{
"roleId": "string",
"success": true,
"data": {},
"error": {}
}
]
}

unassignPartnerUserRolesโ€‹

Removes one or more roles from a user in a partner organization.

DELETE /v2/partners/{orgId}/users/{userId}/roles

const { data } = await client.unassignPartnerUserRoles(
{
orgId: 'example',
userId: 'example',
},
{
roleIds: ['123:partner_admin', '123:partner_viewer']
},
)
Response
{
"results": [
{
"roleId": "string",
"success": true,
"data": {},
"error": {}
}
]
}

Schemasโ€‹

InviteTokenโ€‹

A secure token used for partner invitation and activation. Sent via email to the invited partner.

type InviteToken = string

Partnerโ€‹

Represents a partner organization in the partner directory.

Partners go through a lifecycle from invitation to active collaboration:

  • Pending: Initial state when partner record is created
  • Invited: Invitation email has been sent to the partner
  • Request: Partner has requested to join
type Partner = {
id?: string
organization_id?: string
created_at?: string // date-time
description?: string
company_name?: string
invitation_token?: string
invitation_email?: string // email
email?: string // email
owner_email?: string // email
signed_up_email?: string // email
partner_org_id?: string
status?: "Pending" | "Request" | "Deleted" | "Invited" | "Rejected"
}

PartnerIdโ€‹

Unique identifier for a partner record (UUID format)

type PartnerId = string

OrganizationIdโ€‹

Unique identifier for an organization in the epilot platform

type OrganizationId = string

ActivatePartnerPayloadโ€‹

Payload for activating a partner account using an invitation token

type ActivatePartnerPayload = {
company_name?: string
signed_up_email: string // email
organization_id: string
}

PartnerInvitationPayloadโ€‹

Configuration options for sending a partner invitation

type PartnerInvitationPayload = {
language?: "en" | "de"
}

Assignableโ€‹

A user, organization, or group that can be assigned to tasks, workflows, or entities. The type field discriminates between different assignable types.

type Assignable = {
type: "user"
display_name: string
image_uri?: {
original: string // uri
thumbnail_32?: string // uri
}
org_id: string
created_at?: string // date-time
activated_at?: string // date-time
status?: "Active" | "Pending" | "Deactivated" | "Deleted"
user_id?: string
email?: string // email
} | {
type: "partner_user"
display_name: string
image_uri?: {
original: string // uri
thumbnail_32?: string // uri
}
org_id: string
created_at?: string // date-time
activated_at?: string // date-time
status?: "Active" | "Pending" | "Deactivated" | "Deleted"
partner_id?: string
user_id?: string
email?: string // email
} | {
type: "partner_organization"
display_name: string
image_uri?: {
original: string // uri
thumbnail_32?: string // uri
}
org_id: string
created_at?: string // date-time
activated_at?: string // date-time
status?: "Active" | "Pending" | "Deactivated" | "Deleted"
partner_id: string
email?: string // email
geolocations?: Array<{
address?: {
street?: { ... }
street_number?: { ... }
city?: { ... }
postal_code?: { ... }
country?: { ... }
}
lat: number
lng: number
addressLabel?: string
relevance?: number
}>
phone?: string
activity_radius?: number
} | {
type: "ecp"
display_name: string
image_uri?: {
original: string // uri
thumbnail_32?: string // uri
}
org_id: string
created_at?: string // date-time
activated_at?: string // date-time
status?: "Active" | "Pending" | "Deactivated" | "Deleted"
user_id: string
email?: string // email
} | {
type: "group"
display_name: string
image_uri?: {
original: string // uri
thumbnail_32?: string // uri
}
org_id: string
created_at?: string // date-time
activated_at?: string // date-time
status?: "Active" | "Pending" | "Deactivated" | "Deleted"
group_id?: string
}

BaseAssignableโ€‹

Common properties shared by all assignable types

type BaseAssignable = {
type: string
display_name: string
image_uri?: {
original: string // uri
thumbnail_32?: string // uri
}
org_id: string
created_at?: string // date-time
activated_at?: string // date-time
status?: "Active" | "Pending" | "Deactivated" | "Deleted"
}

AssignableUserโ€‹

A user within the caller's organization that can be assigned to tasks or entities

type AssignableUser = {
type: "user"
display_name: string
image_uri?: {
original: string // uri
thumbnail_32?: string // uri
}
org_id: string
created_at?: string // date-time
activated_at?: string // date-time
status?: "Active" | "Pending" | "Deactivated" | "Deleted"
user_id?: string
email?: string // email
}

AssignablePartnerUserโ€‹

A user from a partner organization that can be assigned to shared tasks or entities

type AssignablePartnerUser = {
type: "partner_user"
display_name: string
image_uri?: {
original: string // uri
thumbnail_32?: string // uri
}
org_id: string
created_at?: string // date-time
activated_at?: string // date-time
status?: "Active" | "Pending" | "Deactivated" | "Deleted"
partner_id?: string
user_id?: string
email?: string // email
}

AssignableGroupโ€‹

A user group that can be assigned to tasks or entities. All members of the group will be notified/assigned.

type AssignableGroup = {
type: "group"
display_name: string
image_uri?: {
original: string // uri
thumbnail_32?: string // uri
}
org_id: string
created_at?: string // date-time
activated_at?: string // date-time
status?: "Active" | "Pending" | "Deactivated" | "Deleted"
group_id?: string
}

AssignableOrganizationโ€‹

A partner organization that can be assigned to tasks or entities at the organization level. Useful when you want to assign work to a partner company rather than a specific individual.

type AssignableOrganization = {
type: "partner_organization"
display_name: string
image_uri?: {
original: string // uri
thumbnail_32?: string // uri
}
org_id: string
created_at?: string // date-time
activated_at?: string // date-time
status?: "Active" | "Pending" | "Deactivated" | "Deleted"
partner_id: string
email?: string // email
geolocations?: Array<{
address?: {
street?: { ... }
street_number?: { ... }
city?: { ... }
postal_code?: { ... }
country?: { ... }
}
lat: number
lng: number
addressLabel?: string
relevance?: number
}>
phone?: string
activity_radius?: number
}

AssignableEcpPlaceholderโ€‹

An End Customer Portal (ECP) user that can be assigned to tasks or entities. These are external users who access the system through the customer portal.

type AssignableEcpPlaceholder = {
type: "ecp"
display_name: string
image_uri?: {
original: string // uri
thumbnail_32?: string // uri
}
org_id: string
created_at?: string // date-time
activated_at?: string // date-time
status?: "Active" | "Pending" | "Deactivated" | "Deleted"
user_id: string
email?: string // email
}

SearchGeolocationโ€‹

Request payload for geocoding an address to coordinates

type SearchGeolocation = {
address: string
}

Geolocationโ€‹

Geographic coordinates with optional metadata

type Geolocation = {
lat: number
lng: number
addressLabel?: string
relevance?: number
}

Addressโ€‹

Structured postal address

type Address = {
street?: string
street_number?: string
city?: string
postal_code?: string
country?: string
}

AddressGeolocationโ€‹

Combined address and geographic coordinates for a location

type AddressGeolocation = {
address?: {
street?: string
street_number?: string
city?: string
postal_code?: string
country?: string
}
lat: number
lng: number
addressLabel?: string
relevance?: number
}

PartnerUserโ€‹

A user within a partner organization, including their assigned roles

type PartnerUser = {
id: string
name?: string
email: string // email
status: string
image?: {
original?: string // uri
thumbnail_32?: string // uri
}
roles: Array<{
id: string
slug: string
name: string
}>
}

CreatePartnerUserPayloadโ€‹

Request payload for creating a new user in a partner organization

type CreatePartnerUserPayload = {
email: string // email
language?: "en" | "de"
roles?: string[]
}

CreatePartnerRolePayloadโ€‹

Request payload for creating a new role in a partner organization

type CreatePartnerRolePayload = {
name: string
slug: string
grants: Array<{
action: string
resource?: string
effect?: "allow" | "deny"
conditions?: object[]
dependencies?: Array<{
action: { ... }
resource?: { ... }
effect?: { ... }
conditions?: { ... }
}>
}>
}

UpdatePartnerRolePayloadโ€‹

Request payload for updating an existing role in a partner organization

type UpdatePartnerRolePayload = {
grants: Array<{
action: string
resource?: string
effect?: "allow" | "deny"
conditions?: object[]
}>
id?: string
name: string
slug: string
}

Grantโ€‹

A permission grant that allows or denies a specific action on a resource.

Grants are the building blocks of roles and define what users can do within the system.

type Grant = {
action: string
resource?: string
effect?: "allow" | "deny"
conditions?: object[]
}

GrantWithDependenciesโ€‹

A grant with optional dependent grants that are automatically included when this grant is assigned

type GrantWithDependencies = {
action: string
resource?: string
effect?: "allow" | "deny"
conditions?: object[]
dependencies?: Array<{
action: string
resource?: string
effect?: "allow" | "deny"
conditions?: object[]
}>
}

GrantConditionโ€‹

An additional condition that must be met for a grant to apply. Conditions allow fine-grained control over when permissions are active.

type GrantCondition = object

EqualsConditionโ€‹

A condition that checks if an attribute equals one of the specified values. The grant only applies when the condition is satisfied.

type EqualsCondition = {
attribute: string
operation: "equals"
values: string[]
}

RoleIdโ€‹

Unique identifier for a role, combining organization ID and role slug. Format: <organization_id>:<slug>

type RoleId = string

BaseRoleForCreateโ€‹

Base schema for creating or updating a role

type BaseRoleForCreate = {
id?: string
name: string
slug: string
grants: Array<{
action: string
resource?: string
effect?: "allow" | "deny"
conditions?: object[]
}>
}

PartnerRoleโ€‹

A role definition for users in a partner organization

type PartnerRole = {
id: string
slug: string
name: string
type?: string
grants: Array<{
action: string
resource?: string
effect?: "allow" | "deny"
conditions?: object[]
}>
}

AssignRolesPayloadโ€‹

Request payload for assigning or unassigning roles to/from a user

type AssignRolesPayload = {
roleIds: string[]
}

Userโ€‹

A user account in the epilot platform

type User = {
id?: string
email?: string // email
display_name?: string
status?: "Active" | "Pending" | "Deactivated"
}