Partner API

Users

Create or update clients by your client id (external_id), read them back and pause / resume their trading. The same external_id always maps to the same client in your company.

GET/api/external/v1/users/{external_id}

#A user by your client id

Auth X-Api-Key clients:read Partner API

Scope clients:read.

Path parameters

external_id string required

Your client id (1-191 letters, digits, . _ @ : + -). Stored on the client as external_user_id.

Responses

200

The user.

404

not_found / user_not_found / account_not_found / symbol_not_found.

curl "https://api.your-brand.com/api/external/v1/users/cust_10042" \
  -H "X-Api-Key: $OCTOLIT_PARTNER_KEY"
Response 200
{
  "user": {
    "id": 1042,
    "first_name": "Ana",
    "last_name": "Ortiz",
    "full_name": "Ana Ortiz",
    "email": "ana.ortiz@example.com",
    "emails": [
      "ana.ortiz@example.com"
    ],
    "phone": "+357 99 123456",
    "phones": [
      "+357 99 123456"
    ],
    "brand": {
      "id": 1042,
      "name": "Main"
    },
    "desk": {
      "id": 1042,
      "name": "Main"
    },
    "sales_status": "string",
    "sales_status_changed_at": "2026-11-11T09:30:00Z",
    "kyc": {
      "id_status": "string",
      "billing_status": "string"
    },
    "active": true,
    "is_lead": true,
    "deleted": true,
    "country": "CY",
    "external_user_id": "abc123",
    "agents": [
      {
        "id": 1042,
        "name": "Main"
      }
    ],
    "created_at": "2026-11-11T09:30:00.000000Z",
    "updated_at": "2026-11-11T09:31:12.000000Z",
    "first_deposit_date": "2026-11-11T09:30:00Z",
    "comments": [
      null
    ],
    "custom_fields": {},
    "external_id": "cust_10042",
    "login_enabled": true,
    "trading_enabled": true,
    "accounts": 1
  }
}
PUT/api/external/v1/users/{external_id}

#Create or update a user by your client id

Auth X-Api-Key users:write Partner API

Scope users:write. Send any subset of the fields: a user that does not exist yet is created (201) in the brand named by brand_id (default: the company's first active brand); an existing user is updated (200). A user never moves between brands (409 brand_fixed); an e-mail that belongs to another client of the company is refused (409 email_taken). Names, e-mail and phone are added, never removed.

Path parameters

external_id string required

Your client id (1-191 letters, digits, . _ @ : + -). Stored on the client as external_user_id.

Request body (optional) · application/json

first_name string optional

0-120 characters.

last_name string optional

0-120 characters.

full_name string optional

0-120 characters.

email string<email> optional

0-254 characters.

phone string optional

With the country code

country string optional

ISO 3166-1 alpha-2. 2-2 characters.

brand_id integer optional

Only read when the user is created.

Responses

200

The user.

201

The user.

403

insufficient_scope, ip_not_allowed, api_disabled, company_inactive, brand_disabled, sso_disabled, trending_disabled (trading on behalf also: brand_inactive, client_inactive, trading_inactive, trading_denied).

409

email_taken, brand_fixed, limit_reached, already_linked, no_brand, no_app_domain.

422

invalid_request with details.errors = { field: reason }.

curl -X PUT "https://api.your-brand.com/api/external/v1/users/cust_10042" \
  -H "X-Api-Key: $OCTOLIT_PARTNER_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "first_name": "Ana",
  "last_name": "Ortiz",
  "full_name": "Ana Ortiz",
  "email": "ana.ortiz@example.com",
  "phone": "+357 99 123456",
  "country": "CY",
  "brand_id": 13
}'
Response 200
{
  "user": {
    "id": 1042,
    "first_name": "Ana",
    "last_name": "Ortiz",
    "full_name": "Ana Ortiz",
    "email": "ana.ortiz@example.com",
    "emails": [
      "ana.ortiz@example.com"
    ],
    "phone": "+357 99 123456",
    "phones": [
      "+357 99 123456"
    ],
    "brand": {
      "id": 1042,
      "name": "Main"
    },
    "desk": {
      "id": 1042,
      "name": "Main"
    },
    "sales_status": "string",
    "sales_status_changed_at": "2026-11-11T09:30:00Z",
    "kyc": {
      "id_status": "string",
      "billing_status": "string"
    },
    "active": true,
    "is_lead": true,
    "deleted": true,
    "country": "CY",
    "external_user_id": "abc123",
    "agents": [
      {
        "id": 1042,
        "name": "Main"
      }
    ],
    "created_at": "2026-11-11T09:30:00.000000Z",
    "updated_at": "2026-11-11T09:31:12.000000Z",
    "first_deposit_date": "2026-11-11T09:30:00Z",
    "comments": [
      null
    ],
    "custom_fields": {},
    "external_id": "cust_10042",
    "login_enabled": true,
    "trading_enabled": true,
    "accounts": 1
  }
}
Response 201
{
  "user": {
    "id": 1042,
    "first_name": "Ana",
    "last_name": "Ortiz",
    "full_name": "Ana Ortiz",
    "email": "ana.ortiz@example.com",
    "emails": [
      "ana.ortiz@example.com"
    ],
    "phone": "+357 99 123456",
    "phones": [
      "+357 99 123456"
    ],
    "brand": {
      "id": 1042,
      "name": "Main"
    },
    "desk": {
      "id": 1042,
      "name": "Main"
    },
    "sales_status": "string",
    "sales_status_changed_at": "2026-11-11T09:30:00Z",
    "kyc": {
      "id_status": "string",
      "billing_status": "string"
    },
    "active": true,
    "is_lead": true,
    "deleted": true,
    "country": "CY",
    "external_user_id": "abc123",
    "agents": [
      {
        "id": 1042,
        "name": "Main"
      }
    ],
    "created_at": "2026-11-11T09:30:00.000000Z",
    "updated_at": "2026-11-11T09:31:12.000000Z",
    "first_deposit_date": "2026-11-11T09:30:00Z",
    "comments": [
      null
    ],
    "custom_fields": {},
    "external_id": "cust_10042",
    "login_enabled": true,
    "trading_enabled": true,
    "accounts": 1
  }
}
POST/api/external/v1/users/{external_id}/trading/disable

#Pause trading for a user

Auth X-Api-Key trading:control Partner API

Scope trading:control. New positions, balance changes and transfers are refused for the user until trading/enable; open positions stay open and are still managed (stop loss, take profit, stop-out).

Path parameters

external_id string required

Your client id (1-191 letters, digits, . _ @ : + -). Stored on the client as external_user_id.

Responses

200

The user.

403

insufficient_scope, ip_not_allowed, api_disabled, company_inactive, brand_disabled, sso_disabled, trending_disabled (trading on behalf also: brand_inactive, client_inactive, trading_inactive, trading_denied).

404

not_found / user_not_found / account_not_found / symbol_not_found.

curl -X POST "https://api.your-brand.com/api/external/v1/users/cust_10042/trading/disable" \
  -H "X-Api-Key: $OCTOLIT_PARTNER_KEY"
Response 200
{
  "user": {
    "id": 1042,
    "first_name": "Ana",
    "last_name": "Ortiz",
    "full_name": "Ana Ortiz",
    "email": "ana.ortiz@example.com",
    "emails": [
      "ana.ortiz@example.com"
    ],
    "phone": "+357 99 123456",
    "phones": [
      "+357 99 123456"
    ],
    "brand": {
      "id": 1042,
      "name": "Main"
    },
    "desk": {
      "id": 1042,
      "name": "Main"
    },
    "sales_status": "string",
    "sales_status_changed_at": "2026-11-11T09:30:00Z",
    "kyc": {
      "id_status": "string",
      "billing_status": "string"
    },
    "active": true,
    "is_lead": true,
    "deleted": true,
    "country": "CY",
    "external_user_id": "abc123",
    "agents": [
      {
        "id": 1042,
        "name": "Main"
      }
    ],
    "created_at": "2026-11-11T09:30:00.000000Z",
    "updated_at": "2026-11-11T09:31:12.000000Z",
    "first_deposit_date": "2026-11-11T09:30:00Z",
    "comments": [
      null
    ],
    "custom_fields": {},
    "external_id": "cust_10042",
    "login_enabled": true,
    "trading_enabled": true,
    "accounts": 1
  }
}
POST/api/external/v1/users/{external_id}/trading/enable

#Resume trading for a user

Auth X-Api-Key trading:control Partner API

Scope trading:control.

Path parameters

external_id string required

Your client id (1-191 letters, digits, . _ @ : + -). Stored on the client as external_user_id.

Responses

200

The user.

403

insufficient_scope, ip_not_allowed, api_disabled, company_inactive, brand_disabled, sso_disabled, trending_disabled (trading on behalf also: brand_inactive, client_inactive, trading_inactive, trading_denied).

404

not_found / user_not_found / account_not_found / symbol_not_found.

curl -X POST "https://api.your-brand.com/api/external/v1/users/cust_10042/trading/enable" \
  -H "X-Api-Key: $OCTOLIT_PARTNER_KEY"
Response 200
{
  "user": {
    "id": 1042,
    "first_name": "Ana",
    "last_name": "Ortiz",
    "full_name": "Ana Ortiz",
    "email": "ana.ortiz@example.com",
    "emails": [
      "ana.ortiz@example.com"
    ],
    "phone": "+357 99 123456",
    "phones": [
      "+357 99 123456"
    ],
    "brand": {
      "id": 1042,
      "name": "Main"
    },
    "desk": {
      "id": 1042,
      "name": "Main"
    },
    "sales_status": "string",
    "sales_status_changed_at": "2026-11-11T09:30:00Z",
    "kyc": {
      "id_status": "string",
      "billing_status": "string"
    },
    "active": true,
    "is_lead": true,
    "deleted": true,
    "country": "CY",
    "external_user_id": "abc123",
    "agents": [
      {
        "id": 1042,
        "name": "Main"
      }
    ],
    "created_at": "2026-11-11T09:30:00.000000Z",
    "updated_at": "2026-11-11T09:31:12.000000Z",
    "first_deposit_date": "2026-11-11T09:30:00Z",
    "comments": [
      null
    ],
    "custom_fields": {},
    "external_id": "cust_10042",
    "login_enabled": true,
    "trading_enabled": true,
    "accounts": 1
  }
}