NAV
python shell powershell
API Reference

Realtime Reference

Introduction

The Epsilon3 API is centered around REST principles, using standard HTTP response codes, verbs, and authentication. All API endpoints use resource-oriented URLs and JSON-encoded request and response bodies.

On-Prem Deployments

The URL to use for requests will vary depending on your setup, it will be the same as your web URL with the addition of the /api postfix, e.g. https://YOUR_WEB_URL/api.

Authentication

The API key is expected as the username component of a basic auth header

export EPSILON3_API_KEY=YOUR_API_KEY

curl -u ${EPSILON3_API_KEY}: ...
$env:EPSILON3_API_KEY = "YOUR_API_KEY"

$apiKey = $env:EPSILON3_API_KEY
$authHeader = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes("$apiKey:"))
Invoke-RestMethod -Headers @{"Authorization" = "Basic $authHeader" ...
# Export API key in shell outside of code with export EPSILON3_API_KEY=YOUR_API_KEY
import os

requests.post(
  url,
  auth=(os.environ.get('EPSILON3_API_KEY'), ''),
  ...
)

Authentication is performed using a per-workspace API key. Reach out to Epsilon3 support for API access.

Builds API

The Builds API can be used to manage your part templates (or bills of materials) and list your entire inventory.

Parts

Get Parts

Sample Request

import requests
import os

requests.get(
    url='https://api.epsilon3.io/v1/builds/parts',
    auth=(os.environ.get('EPSILON3_API_KEY'), '')
)
curl -X GET \
  https://api.epsilon3.io/v1/builds/parts \
  -u "$EPSILON3_API_KEY":
$apiUrl = "https://api.epsilon3.io/v1/builds/parts"
$apiKey = $env:EPSILON3_API_KEY
$authHeader = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes("$apiKey:"))
$headers = @{
    "Authorization" = "Basic $authHeader"
}

Invoke-RestMethod -Uri $apiUrl -Method Get -Headers $headers

GET https://api.epsilon3.io/v1/builds/parts

Retrieve all parts defined in your workspace.

Example Response Body

{
  "parts": [
    {
      "id": "vnWtKWleNWiuSQbBPNdE5F",
      "part_number": "P-1",
      "name": "Sample Part",
      "revision": "C",
      "tracking": "serial",
      "description": "This is a sample part assembled in house.",
      "assembly": false
    },
    ...
  ]
}

Get Part

GET https://api.epsilon3.io/v1/builds/parts/:partId?revisionId={revisionId}

Retrieve a single part using its ID.

Parameters

Example Request URL

GET https://api.epsilon3.io/v1/builds/parts/vnWtKWleNWiuSQbBPNdE5F

Example Response Body

{
  "id": "vnWtKWleNWiuSQbBPNdE5F",
  "revision": "C",
  "part_number": "P-1",
  "name": "Sample Part",
  "description": "This is a sample part assembled in house.",
  "tracking": "serial",
  "details": [
    {
      "id": "xagtLhLxMEPLTgEHDNiEBa",
      "name": "External Id",
      "value": "123"
    }
  ],
  "revisions": [
    {
      "revision": "C",
      "id": "W4e4WfDe6ZU8OZdvIaJIUw",
      "release_state": "released"
    },
    {
      "revision": "B",
      "id": "W4e4WfDe6ZU8OZdvIaJIUw",
      "release_state": "released"
    },
    {
      "revision": "A",
      "id": "aIv8S4kVCWuHui7Dax7Smy",
      "release_state": "released"
    }
  ],
  "components": [
    {
      "part_id": "xi4kPknhkM79WlWdaEXHth",
      "quantity": 1,
      "revision": "B",
      "revision_id": "3KV7aieAp7jkkE1wZl8WAp"
    }
  ],
  "assembly": false
}

Create Parts

POST https://api.epsilon3.io/v1/builds/parts

Add one or more parts to your workspace.

Request Body

parts: an array of objects, each containing the following set of fields

Response

The response status code will be 200 and return a list of the created parts.

Request URL

POST https://api.epsilon3.io/v1/builds/parts

Example Request Body

{
  "parts": [
    {
      "part_number": "P-1",
      "name": "Sample Part",
      "revision": "C",
      "tracking": "serial",
      "description": "This is a sample part assembled in house.",
      "assembly": false,
      "details": [
        {
          "id": "xagtLhLxMEPLTgEHDNiEBa",
          "value": "123"
        }
      ]
    },
    ...
  ]
}

Example Response Body

{
  "parts": [
    {
      "id": "vnWtKWleNWiuSQbBPNdE5F",
      "part_number": "P-1",
      "name": "Sample Part",
      "revision": "C",
      "tracking": "serial",
      "description": "This is a sample part assembled in house.",
      "components": [],
      "assembly": false,
      "details": [
        {
          "id": "xagtLhLxMEPLTgEHDNiEBa",
          "name": "External Id",
          "value": "123"
        }
      ],
      "revisions": [
        {
          "revision": "C",
          "id": "MkeDh0hepepkhKbczKGP0H",
          "release_state": "released"
        }
      ]
    },
    ...
  ]
}

Example request body with a component part

{
  "parts": [
    {
      "part_number": "P-2",
      "name": "Sample Part with components",
      "revision": "A",
      "tracking": "serial",
      "description": "This is a sample part assembled in house.",
      "components": [
        {
          "part_number": "P-1",
          "revision": "C",
          "quantity": 1
        }
      ],
      "assembly": false
    },
    ...
  ]
}

Example Response Body

{
  "parts": [
    {
      "id": "FMtBcwA5fYZwV4xOJwlRdZ",
      "part_number": "P-2",
      "name": "Sample Part with components",
      "revision": "A",
      "tracking": "serial",
      "description": "This is a sample part assembled in house.",
      "components": [
        {
          "part_id": "vnWtKWleNWiuSQbBPNdE5F",
          "revision": "C",
          "revision_id": "MkeDh0hepepkhKbczKGP0H",
          "quantity": 1
        }
      ],
      "assembly": false,
      "revisions": [
        {
          "revision": "A",
          "id": "k7jaxluqyThfl7PLBIkCbI",
          "release_state": "released"
        }
      ]
    },
    ...
  ]
}

Update Part

PATCH https://api.epsilon3.io/v1/builds/parts/:partId

Updates values of one or more fields for a specific part.

Request Body

The request body should be a JSON object that contains the specific fields of the part to be updated. The request body must contain at least one field. Following fields are supported:

Example Request Body

{
  "name": "Sample Part with components",
  "revision": "B",
  "tracking": "serial",
  "description": "This is a sample part assembled in house.",
  "assembly": true,
  "components": [
    {
      "part_number": "P-1",
      "quantity": 1,
      "revision": "C"
    }
  ],
  "details": [
    {
      "id": "xagtLhLxMEPLTgEHDNiEBa",
      "value": "123"
    }
  ]
}

Example Response Body

{
  "id": "FMtBcwA5fYZwV4xOJwlRdZ",
  "revision": "B",
  "part_number": "P-2",
  "name": "Sample Part with components",
  "tracking": "serial",
  "description": "This is a sample part assembled in house.",
  "assembly": true,
  "components": [
    {
      "part_id": "vnWtKWleNWiuSQbBPNdE5F",
      "revision": "C",
      "revision_id": "MkeDh0hepepkhKbczKGP0H",
      "quantity": 1,
    }
  ]
  "details": [
    {
      "id": "xagtLhLxMEPLTgEHDNiEBa",
      "name": "External Id",
      "value": "123"
    }
  ],
  "revisions": [
    {
      "revision": "B",
      "id": "W4e4WfDe6ZU8OZdvIaJIUw",
      "release_state": "released"
    },
    {
      "revision": "A",
      "id": "k7jaxluqyThfl7PLBIkCbI",
      "release_state": "released"
    }
  ],
}

Delete Part

DELETE https://api.epsilon3.io/v1/builds/parts

Bulk deletes parts using provided array of part ids. Deleting a part will also delete its associated revisions and items. NOTE: Deleted parts will be permanently deleted.

Request Body

{
  "ids": array (string)
}

Example Request Body

{
  "ids": ["SRHRaJV1qBiYZdQ3Tm7P6C", "vnWtKWleNWiuSQbBPNdE5F"]
}

Example Response Body

{
  "deleted_part_ids": ["SRHRaJV1qBiYZdQ3Tm7P6C"],
  "invalid_part_ids": ["vnWtKWleNWiuSQbBPNdE5F"]
}

Part Details

List Part Details

GET https://api.epsilon3.io/v1/builds/part-details

Retrieve all part details that can be set on a part

Request URL

GET https://api.epsilon3.io/v1/builds/part-details

Example Response Body

{
  "part_details": [
    {
      "id": "xagtLhLxMEPLTgEHDNiEBa",
      "name": "External Id"
    }
  ]
}

Inventory

List Inventory

GET https://api.epsilon3.io/v1/builds/inventory

Retrieve all inventory items defined in your workspace.

Parameters

Request URL

GET https://api.epsilon3.io/v1/builds/inventory

Example Response Body

{
  "items": [
    {
      "id": "Uqo1eK43QThNE78Rl3HTco",
      "part_id": "vnWtKWleNWiuSQbBPNdE5F",
      "part_revision_id": "MkeDh0hepepkhKbczKGP0H",
      "tracking_id": "P1-004",
      "quantity": 1,
      "location_id": "SRHRaJV1qBiYZdQ3Tm7P6C",
      "unit_cost_cents": 20000,
      "notes": "Passed all quality checks!",
      "created_at": "2023-07-18T14:49:08.713Z"
    },
    ...
  ]
}

Get Inventory Item

GET https://api.epsilon3.io/v1/builds/inventory/:itemId

Retrieve a specific inventory item using its ID.

Example Request URL

GET https://api.epsilon3.io/v1/builds/inventory/Uqo1eK43QThNE78Rl3HTco

Example Response Body

{
  "id": "Uqo1eK43QThNE78Rl3HTco",
  "part_id": "vnWtKWleNWiuSQbBPNdE5F",
  "part_revision_id": "MkeDh0hepepkhKbczKGP0H",
  "tracking_id": "P1-004",
  "quantity": 1,
  "location_id": "SRHRaJV1qBiYZdQ3Tm7P6C",
  "unit_cost_cents": 20000,
  "notes": "Passed all quality checks!",
  "created_at": "2023-07-18T14:49:08.713Z"
}

Add Inventory

POST https://api.epsilon3.io/v1/builds/inventory

Adds new items to inventory.

Request Body

Example Request Body

{
  "items": [
    {
      "part_id": "T7bpWix6bs86tEoCqIk26n",
      "part_revision_id": "m4ssiRUzCcN9mJUKjhvHvA",
      "tracking_id": "TP00001",
      "quantity": 1,
      "location_id": "sw9H7eqyaydlDF390IYliI",
      "unit_cost_cents": 50000,
      "notes": "All inspections passed!"
    },
    ...
  ]
}

Example Response Body

{
  "items": [
    {
      "id": "f4yEjyK8PQNkdRy6EvncFy",
      "part_id": "T7bpWix6bs86tEoCqIk26n",
      "part_revision_id": "m4ssiRUzCcN9mJUKjhvHvA",
      "tracking_id": "TP00001",
      "quantity": 1,
      "location_id": "sw9H7eqyaydlDF390IYliI",
      "unit_cost_cents": 50000,
      "notes": "Passed all quality checks!",
      "created_at": "2023-12-17T01:33:16.996Z"
    },
    ...
  ]
}

Update Inventory Item

PATCH https://api.epsilon3.io/v1/builds/inventory/:itemId

Updates values of one or more fields for a specific item.

Request Body

The request body should be a JSON object that contains the specific fields of the item to be updated. The request body must contain at least one field. Following fields are supported:

Example Request Body

{
  "quantity": 1,
  "location_id": "SRHRaJV1qBiYZdQ3Tm7P6C",
  "unit_cost_cents": 20000,
  "notes": "Passed all quality checks!"
}

Example Response Body

{
  "id": "Uqo1eK43QThNE78Rl3HTco",
  "part_id": "vnWtKWleNWiuSQbBPNdE5F",
  "part_revision_id": "MkeDh0hepepkhKbczKGP0H",
  "tracking_id": "P1-004",
  "quantity": 1,
  "location_id": "SRHRaJV1qBiYZdQ3Tm7P6C",
  "unit_cost_cents": 20000,
  "notes": "Passed all quality checks!",
  "created_at": "2023-07-18T14:49:08.713Z"
}

Delete Inventory

DELETE https://api.epsilon3.io/v1/builds/inventory

Bulk deletes inventory items using provided array of item ids.

Request Body

{
  "ids": array (string),
}

Example Request Body

{
  "ids": ["SRHRaJV1qBiYZdQ3Tm7P6C", "vnWtKWleNWiuSQbBPNdE5F"]
}

Example Response Body

{
  "deleted_item_ids": ["SRHRaJV1qBiYZdQ3Tm7P6C"],
  "invalid_item_ids": ["vnWtKWleNWiuSQbBPNdE5F"]
}

List Inventory Item Activity

GET https://api.epsilon3.io/v1/builds/inventory/:itemId/activity?startBeforeId={startBeforeId}

List up to twenty five most recent actions related to the specified inventory item. Use the optional startBeforeId query parameter to list older actions.

Parameters

Example Request URL

GET https://api.epsilon3.io/v1/builds/inventory/6nNJuH7hga4HYCNOL7htbb/activity?startBeforeId=99

Example Response Body

{
  "has_older": false,
  "activities": [
    {
      "id": "98",
      "item_id": "6nNJuH7hga4HYCNOL7htbb",
      "timestamp": "2024-10-18T20:02:38.901Z",
      "action": "Created",
      "actor_type": "user",
      "actor_id": "user@epsilon3.io",
      "old_value": null,
      "new_value": {
        "amount": 1,
        "status": "In Inventory",
        "location_id": "l7NZpXLTfysmFLg4oB95H6"
      }
    }
  ]
}

Update Inventory Item Usage

POST https://api.epsilon3.io/v1/builds/inventory/:itemId/usage

Updates usage for an inventory item. (Note: currently only reset is supported.)

Request Body

{
  "action": "reset",
  "usage_type": string
}

Sample Request

{
  "action": "reset",
  "usage_type": "cycles"
}
import requests
import os

requests.post(
    url='https://api.epsilon3.io/v1/builds/inventory/:itemId/usage',
    auth=(os.environ.get('EPSILON3_API_KEY'), ''),
    json={
      "action": "reset",
      "usage_type": "cycles",
    }
)
curl -X POST \
  https://api.epsilon3.io/v1/builds/inventory/:itemId/usage \
  -H 'Content-Type: application/json' \
  -u "$EPSILON3_API_KEY": \
  -d '{
    "action": "reset",
    "usage_type": "cycles",
  }'
$apiUrl = "https://api.epsilon3.io/v1/builds/inventory/:itemId/usage"
$apiKey = $env:EPSILON3_API_KEY
$authHeader = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes("$apiKey:"))
$headers = @{
    "Content-Type" = "application/json"
    "Authorization" = "Basic $authHeader"
}
$body = @{
    "action": "reset",
    "usage_type": "cycles",
} | ConvertTo-Json

Invoke-RestMethod -Uri $apiUrl -Method Post -Headers $headers

Response

The response status code will be 200 on successful reset.

Purchase Orders

List Purchase Orders

Sample Request

import requests
import os

requests.get(
    url='https://api.epsilon3.io/v1/builds/orders',
    auth=(os.environ.get('EPSILON3_API_KEY'), '')
)
curl -X GET \
  https://api.epsilon3.io/v1/builds/orders \
  -u "$EPSILON3_API_KEY":
$apiUrl = "https://api.epsilon3.io/v1/builds/orders"
$apiKey = $env:EPSILON3_API_KEY
$authHeader = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes("$apiKey:"))
$headers = @{
    "Authorization" = "Basic $authHeader"
}

Invoke-RestMethod -Uri $apiUrl -Method Get -Headers $headers

GET https://api.epsilon3.io/v1/builds/orders

Retrieve all purchase orders in your workspace.

Example Response Body

{
  "orders": [
    {
      "id": "hCga2bVz70tAXnjhHbvczA",
      "code": "PO-1",
      "state": "submitted",
      "delivery_date": "07/01/2024",
      "items": [
        {
          "part_id": "66qVqW9X5NKz7qPJhrlFtG",
          "name": "Rocket Engine",
          "revision": "1.00",
          "quantity": 1,
          "unit_cost": 8000
        }
      ],
      "ship_to_name": "Headquarters",
      "ship_to_address": "123 Alpha Way\nAnytown USA\n10101",
      "vendor": {
        "id": "4kGbI42h7cIo0Ai3dsC9m3",
        "name": "Acme Engines Ltd",
        "address": "1428 Satellite Loop\nAnytown USA\n10101",
        "contact": "elmer@acme.test",
        "notes": "Brick & Mortar are our specialties"
      },
      "created_at": "2024-06-19T02:06:14.204Z"
    }
  ]
}

Vendors

List Vendors

Sample Request

import requests
import os

requests.get(
    url='https://api.epsilon3.io/v1/builds/vendors',
    auth=(os.environ.get('EPSILON3_API_KEY'), '')
)
curl -X GET \
  https://api.epsilon3.io/v1/builds/vendors \
  -u "$EPSILON3_API_KEY":
$apiUrl = "https://api.epsilon3.io/v1/builds/vendors"
$apiKey = $env:EPSILON3_API_KEY
$authHeader = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes("$apiKey:"))
$headers = @{
    "Authorization" = "Basic $authHeader"
}

Invoke-RestMethod -Uri $apiUrl -Method Get -Headers $headers

GET https://api.epsilon3.io/v1/builds/vendors

Retrieve all vendors defined in your workspace.

Example Response Body

{
  "vendors": [
    {
      "id": "4kGbI42h7cIo0Ai3dsC9m3",
      "name": "Acme Engines Ltd",
      "notes": "Brick & Mortar are our specialties",
      "address": "1428 Satellite Loop\nAnytown USA\n10101",
      "contact": "elmer@acme.test",
      "team_id": "teamolympus",
      "created_at": "2024-07-17T20:21:38.417Z",
      "updated_at": "2024-07-17T20:21:38.417Z"
    }
  ]
}

Locations

List Locations

Sample Request

import requests
import os

requests.get(
    url='https://api.epsilon3.io/v1/builds/locations',
    auth=(os.environ.get('EPSILON3_API_KEY'), '')
)
curl -X GET \
  https://api.epsilon3.io/v1/builds/locations \
  -u "$EPSILON3_API_KEY":
$apiUrl = "https://api.epsilon3.io/v1/builds/locations"
$apiKey = $env:EPSILON3_API_KEY
$authHeader = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes("$apiKey:"))
$headers = @{
    "Authorization" = "Basic $authHeader"
}

Invoke-RestMethod -Uri $apiUrl -Method Get -Headers $headers

GET https://api.epsilon3.io/v1/builds/locations

Retrieve all inventory locations defined in your workspace.

Example Response Body

{
  "locations": [
    {
      "id": ""Yi8xjnVtFLh9Avf9hqdw5q"",
      "parent_location_id": null,
      "name": "Building 1",
      "code": "B1"
    },
    {
      "id": "zBT85pmgbrXf5OIIb2K3Kg",
      "parent_location_id": ""Yi8xjnVtFLh9Avf9hqdw5q"",
      "name": "Workstation A",
      "code": "WS1"
    }
  ]
}

Commanding API

Epsilon3’s commanding API supports creating, updating, retrieving, or deleting commands. Uploading commands to the commanding API allows the user to do the following in Epsilon3:

Create or update a command

Sample Request

import requests
import os

requests.post(
    url='https://api.epsilon3.io/v1/commands',
    auth=(os.environ.get('EPSILON3_API_KEY'), ''),
    json={
        "name": "test.command",
        "dictionary_id": 1,
        "arguments": [
            {
            "name": "arg1",
            "type": "enum",
            "values": [
                {
                    "string": "OFF",
                    "value": 0
                },
                {
                    "string": "ON",
                    "value": 1
                }]
            },
            {
                "name": "arg2",
                "type": "int",
                "optional": true
            }
        ]}
    )
curl -X POST \
  https://api.epsilon3.io/v1/commands \
  -H 'Content-Type: application/json' \
  -u "$EPSILON3_API_KEY": \
  -d '{
    "name": "test.command",
    "dictionary_id": 1,
    "arguments": [
      {
        "name": "arg1",
        "type": "enum",
        "values": [
            {
              "string": "OFF",
              "value": 0
            },
            {
              "string": "ON",
              "value": 1
            }
        ]
      },
      {
        "name": "arg2",
        "type": "int",
        "optional": true
      }
    ]
}'
$apiUrl = "https://api.epsilon3.io/v1/commands"
$apiKey = $env:EPSILON3_API_KEY
$authHeader = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes("$apiKey:"))
$headers = @{
    "Content-Type" = "application/json"
    "Authorization" = "Basic $authHeader"
}
$body = @{
    "name": "test.command",
    "dictionary_id": 1,
    "arguments": [
      {
        "name": "arg1",
        "type": "enum",
        "values": [
            {
              "string": "OFF",
              "value": 0
            },
            {
              "string": "ON",
              "value": 1
            }
        ]
      },
      {
        "name": "arg2",
        "type": "int",
        "optional": true
      }
    ]
} | ConvertTo-Json

Invoke-RestMethod -Uri $apiUrl -Method Post -Headers $headers -Body $body

Request Body (Command Object)

{
  "name": string,
  "dictionary-id": integer (optional),
  "arguments": array (optional)
}

Argument Object

{
  "name": string,
  "type": string,
  "optional": boolean (optional, defaults to false)
  "values": array (optional)
}

POST https://api.epsilon3.io/v1/commands

The name field should be unique per dictionary. The arguments field contains an array of one or more Argument objects. The optional dictionary_id field allows the command to be related to a dictionary. If no dictionary_id is provided, the command will be related to the default dictionary.

Supported argument types:

Enum Object

{
  "string": string,
  "value": number
}

Example Request Body (No Arguments)

{
  "name": "test.hatch.1.open"
}

Example Request Body (with a dictionary)

{
  "name": "test.hatch.1.open",
  "dictionary_id": 5
}

Example Request Body (Float)

{
  "name": "test.pressure.level",
  "arguments": [
    {
      "name": "psi",
      "type": "float"
    }
  ]
}

Example Request Body (Int)

{
  "name": "test.timer",
  "arguments": [
    {
      "name": "seconds",
      "type": "int"
    }
  ]
}

Example Request Body (String)

{
  "name": "test.alert",
  "arguments": [
    {
      "name": "message",
      "type": "string"
    }
  ]
}

Example Request Body (Enum)

{
  "name": "test.power.switch",
  "arguments": [
    {
      "name": "state",
      "type": "enum",
      "values": [
        {
          "string": "OFF",
          "value": 0
        },
        {
          "string": "ON",
          "value": 1
        }
    ]
    }
  ]
}

Example Request Body (File)

{
  "name": "test.config.file",
  "arguments": [
    {
      "name": "config.file",
      "type": "file"
    }
  ]
}

Response Body

{
  "id": integer,
  "name": string,
  "dictionary_id": integer,
  "description": string (optional),
  "arguments": array (optional),
  "created_at": string, timestamp in ISO-8601 format
}

List all available commands

Sample Request

import requests
import os

requests.get(
    url='https://api.epsilon3.io/v1/commands',
    auth=(os.environ.get('EPSILON3_API_KEY'), '')
)
curl -X GET \
  https://api.epsilon3.io/v1/commands \
  -u "$EPSILON3_API_KEY":
$apiUrl = "https://api.epsilon3.io/v1/commands"
$apiKey = $env:EPSILON3_API_KEY
$authHeader = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes("$apiKey:"))
$headers = @{
    "Authorization" = "Basic $authHeader"
}

Invoke-RestMethod -Uri $apiUrl -Method Get -Headers $headers

GET https://api.epsilon3.io/v1/commands

Response Body (List of Command Objects)

[{
  "id": integer,
  "name": string,
  "dictionary_id": integer,
  "description": string (optional)
  "arguments": array (optional)
  "created_at": string, timestamp in ISO-8601 format
}]

Retrieve a command by name

Sample Request

import requests
import os

requests.get(
    url='https://api.epsilon3.io/v1/commands',
    auth=(os.environ.get('EPSILON3_API_KEY'), ''),
    params={
      "name": "test.command",
      "dictionary-id": 1
    }
)
curl -X GET \
  "https://api.epsilon3.io/v1/commands/query?name=test.command&dictionary-id=1" \
  -u "$EPSILON3_API_KEY":
$apiUrl = "https://api.epsilon3.io/v1/commands/query?name=test.command&dictionary-id=1"
$apiKey = $env:EPSILON3_API_KEY
$authHeader = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes("$apiKey:"))
$headers = @{
    "Authorization" = "Basic $authHeader"
}

Invoke-RestMethod -Uri $apiUrl -Method Get -Headers $headers

GET https://api.epsilon3.io/v1/commands/query?name={name}&dictionary-id={dictionary-id}

The URL parameter name is required and must be URL encoded. An optional dictionary-id may be provided to choose a specific dictionary. If dictionary-id is not included, the default dictionary will be used.

Delete commands

Sample Request

import requests
import os

requests.delete(
    url='https://api.epsilon3.io/v1/commands',
    auth=(os.environ.get('EPSILON3_API_KEY'), ''),
    json={
      "ids": [1, 2, 3]
    }
)
curl -X DELETE \
  https://api.epsilon3.io/v1/commands \
  -H 'Content-Type: application/json' \
  -u "$EPSILON3_API_KEY": \
  -d '{
    "ids": [1, 2, 3]
  }'
$apiUrl = "https://api.epsilon3.io/v1/commands"
$apiKey = $env:EPSILON3_API_KEY
$authHeader = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes("$apiKey:"))
$headers = @{
    "Content-Type" = "application/json"
    "Authorization" = "Basic $authHeader"
}
$body = @{
    "ids": @(1, 2, 3)
  } | ConvertTo-Json

Invoke-RestMethod -Uri $apiUrl -Method Delete -Headers $headers -Body $body

DELETE https://api.epsilon3.io/v1/commands/

Request Body

{
  "ids": array (integer),
}

Example Request Body

{
  "ids": [123, 456]
}

Dictionary API

Dictionaries are used to organize your commands, telemetry parameters, and external data types. Epsilon3’s dictionary API supports creating, updating, retrieving, or deleting dictionary definitions. Creating a dictionary with the API allows the user to link commands, telemetry, and external data to that dictionary which enables the following in Epsilon3:

Create a dictionary

Sample Request

import requests
import os

requests.post(
    url='https://api.epsilon3.io/v1/dictionaries',
    auth=(os.environ.get('EPSILON3_API_KEY'), ''),
    json={
             "name": "Vehicle-1"
         }
    )
curl -X POST \
  https://api.epsilon3.io/v1/dictionaries \
  -H 'Content-Type: application/json' \
  -u "$EPSILON3_API_KEY": \
  -d '{
          "name": "Vehicle-1"
      }'
$apiUrl = "https://api.epsilon3.io/v1/dictionaries"
$apiKey = $env:EPSILON3_API_KEY
$authHeader = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes("$apiKey:"))
$headers = @{
    "Content-Type" = "application/json"
    "Authorization" = "Basic $authHeader"
}
$body = @{
          "name": "Vehicle-1"
      } | ConvertTo-Json

Invoke-RestMethod -Uri $apiUrl -Method Post -Headers $headers -Body $body

Request Body (Dictionary Object)

{
  "name": string
}

POST https://api.epsilon3.io/v1/dictionaries

The request body should contain a Dictionary object. The field name is required. The name field should be unique.

Response Body

{
  "id": integer,
}

List all available dictionaries

Sample Request

import requests
import os

requests.get(
    url='https://api.epsilon3.io/v1/dictionaries',
    auth=(os.environ.get('EPSILON3_API_KEY'), '')
)
curl -X GET \
  https://api.epsilon3.io/v1/dictionaries \
  -u "$EPSILON3_API_KEY":
$apiUrl = "https://api.epsilon3.io/v1/dictionaries"
$apiKey = $env:EPSILON3_API_KEY
$authHeader = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes("$apiKey:"))
$headers = @{
    "Authorization" = "Basic $authHeader"
}

Invoke-RestMethod -Uri $apiUrl -Method Get -Headers $headers

GET https://api.epsilon3.io/v1/dictionaries

Response Body

[{
  "id": integer,
  "name": string,
  "created_at": string, timestamp in ISO-8601 format
}]

Delete dictionaries

Sample Request

import requests
import os

requests.delete(
    url='https://api.epsilon3.io/v1/dictionaries',
    auth=(os.environ.get('EPSILON3_API_KEY'), ''),
    json={
      "ids": [1, 2, 3]
    }
)
curl -X DELETE \
  https://api.epsilon3.io/v1/dictionaries \
  -H 'Content-Type: application/json' \
  -u "$EPSILON3_API_KEY": \
  -d '{
    "ids": [1, 2, 3]
  }'
$apiUrl = "https://api.epsilon3.io/v1/dictionaries"
$apiKey = $env:EPSILON3_API_KEY
$authHeader = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes("$apiKey:"))
$headers = @{
    "Content-Type" = "application/json"
    "Authorization" = "Basic $authHeader"
}
$body = @{
    "ids": @(1, 2, 3)
  } | ConvertTo-Json

Invoke-RestMethod -Uri $apiUrl -Method Delete -Headers $headers -Body $body

DELETE https://api.epsilon3.io/v1/dictionaries

Request Body

{
  "ids": array (integer),
}

Example Request Body

{
  "ids": [2, 3, 10]
}

`

Events API

Events are used in schedules to plan operations and milestones. Epsilon3's events API currently supports the following capabilities.

Get Events

Sample Request

import requests
import os

requests.get(
    url='https://api.epsilon3.io/v1/planning/events',
    auth=(os.environ.get('EPSILON3_API_KEY'), ''),
    params={
      "start": "2023-07-26T00:00:00.000Z",
      "end": "2023-08-09T00:00:00.000Z",
      "eventType": "unscheduled",
      "exclude_recurrences": True,
    }
)
curl -X GET \
  "https://api.epsilon3.io/v1/planning/events?start=2023-07-26T00:00:00.000Z&end=2023-08-09T00:00:00.000Z&eventType=unscheduled&exclude_recurrences=true" \
  -u "$EPSILON3_API_KEY":
$apiUrl = "https://api.epsilon3.io/v1/planning/events?start=2023-07-26T00:00:00.000Z&end=2023-08-09T00:00:00.000Z&eventType=unscheduled&exclude_recurrences=true"
$apiKey = $env:EPSILON3_API_KEY
$authHeader = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes("$apiKey:"))
$headers = @{
    "Authorization" = "Basic $authHeader"
}

Invoke-RestMethod -Uri $apiUrl -Method Get -Headers $headers

GET /api/v1/planning/events

Retrieves events under

Query Parameters

Request URL

GET /api/v1/planning/events?start=2023-07-26T00:00:00.000Z&end=2023-08-09T00:00:00.000Z

Response Body

{
  "events": [
    {
      "id": "DVEYVZ2qp8sk2KgvA6zOkn",
      "name": "Galactic Innovators Summit",
      "start": "2023-08-30T13:00:00.000Z",
      "end": "2023-08-30T18:00:00.000Z",
      "procedure_id": null,
      "procedure_section_id": null,
      "run_id": null,
      "swimlane_id": null,
      "description": null,
      "duration": "PT5H"
    },
    {
      "id": "DphgSy369ewI3QbzIzhjz6",
      "name": "Space Exploration Workshop",
      "start": "2023-08-30T10:30:00.000Z",
      "end": "2023-08-30T12:30:00.000Z",
      "procedure_id": null,
      "procedure_section_id": null,
      "run_id": null,
      "swimlane_id": null,
      "description": null,
      "duration": "PT2H"
    }
  ]
}

Get Event

GET /api/v1/planning/events/:eventId

Retrieves a specific event.

Parameters

Request URL

GET /api/v1/planning/events/test_event_id

Response Body

{
  "id": "QuACGmyZHp7qMMOUM64SRg",
  "name": "Space Colony Simulation Test",
  "description": "Test Description",
  "start": "2023-07-30T09:00:00.000Z",
  "end": "2023-07-30T17:00:00.000Z",
  "duration": "PT8H",
  "procedure_id": "45KqIG4QZV1S5oOYZaxE9y",
  "procedure_section_id": null,
  "run_id": null,
  "swimlane_id": "DpSTO81RP9fZSUd8d8ffY4",
  "rrule": "RRULE:FREQ=DAILY;INTERVAL=3",
  "recurrence_id": "ChEIi3cXJVXCidYlVgMqTl",
  "recurrence_date": null,
  "notes": "Here are some notes with:\n- **Markdown components**",
  "dependencies": {
    "in": [
      {
        "id": "DhawCJ3URB7sNd8rRZ8r3H",
        "source": "1RXszDst3d16WeXn1GiNLB"
      }
    ],
    "out": [
      {
        "id": "jX88nSfgTK22KL7DZyUJjc",
        "target": "3rfiluxsbzKwGbJOW8VIAZ"
      }
    ]
  },
  "status": null,
  "predecessor_id": null
}

If the event doesn't exist, it will respond with a 404 status code.

Update Event

PATCH /api/v1/planning/events/:eventId

Updates a specific event.

Parameters

Request Body

The request body should be a JSON object that contains the details of the event to be updated. The following fields are supported:

Response The response status code will be 200 and return a copy of the updated event.

Request URL

PATCH /api/v1/planning/events/test_event_id

Example Request Body

{
  "id": "3rfiluxsbzKwGbJOW8VIAZ",
  "name": "Test Event",
  "description": "Test Description",
  "start": "2023-07-26T17:00:00Z",
  "duration": "PT6H4S",
  "dependencies": {
    "in": [
      {
        "source": "QuACGmyZHp7qMMOUM64SRg",
        "target": "3rfiluxsbzKwGbJOW8VIAZ"
      }
    ],
    "out": []
  }
}

Create Event

POST /api/v1/planning/events

Request URL

POST /api/v1/events

Example Request Body

{
  "name": "Test Event",
  "description": "Description goes here",
  "start": "2023-08-08T00:00:00.000Z",
  "duration": "PT6H4S",
  "procedure_id": "45KqIG4QZV1S5oOYZaxE9y",
  "procedure_section_id": null,
  "dependencies": { "in": [{ "source": "6NSi9FIBDN1xrWEV4Q8HQR" }], "out": [] },
  "swimlane_id": "DpSTO81RP9fZSUd8d8ffY4",
  "rrule": "RRULE:FREQ=DAILY;INTERVAL=1",
  "notes": "Here are some notes with **markdown**"
}

Creates a new event.

Parameters

No path parameters are required for this endpoint.

Request Body

The request body should be a JSON object that contains the details of the event to be created. The following fields are supported:

Response

The response status code will be 201 and return a JSON object containing the ID of the newly created event.

Delete Event

DELETE /api/v1/planning/events/:eventId

Request URL

DELETE /api/v1/planning/events/test_event_id

Deletes an event.

Parameters

Response

The response status code will be 204 for a successful response.

External Data API

Epsilon3’s external data API supports the following capabilities:

Create or update an external data item type

Sample Request

import requests
import os

requests.post(
    url='https://api.epsilon3.io/v1/external-data',
    auth=(os.environ.get('EPSILON3_API_KEY'), ''),
    json={
             "type": "x-axis",
             "label": "X Axis",
             "dictionary_id": 1
         }
    )
curl -X POST \
  https://api.epsilon3.io/v1/external-data \
  -H 'Content-Type: application/json' \
  -u "$EPSILON3_API_KEY": \
  -d '{
          "type": "x-axis",
          "label": "X Axis",
          "dictionary_id": 1
      }'
$apiUrl = "https://api.epsilon3.io/v1/external-data"
$apiKey = $env:EPSILON3_API_KEY
$authHeader = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes("$apiKey:"))
$headers = @{
    "Content-Type" = "application/json"
    "Authorization" = "Basic $authHeader"
}
$body = @{
          "type": "x-axis",
          "label": "X Axis",
          "dictionary_id": 1
      } | ConvertTo-Json

Invoke-RestMethod -Uri $apiUrl -Method Post -Headers $headers -Body $body

Request Body

{
  "type": string,
  "label": string,
  "dictionary_id": integer (optional)
}

POST https://api.epsilon3.io/v1/external-data

The request body should contain an External Data Item object with the following required fields: type & label. The optional dictionary_id field allows the External Data Item to be related to a dictionary. If no dictionary_id is provided, the external data item will be related to the default dictionary.

List all external data items

Sample Request

import requests
import os

requests.get(
    url='https://api.epsilon3.io/v1/external-data',
    auth=(os.environ.get('EPSILON3_API_KEY'), '')
)
curl -X GET \
  https://api.epsilon3.io/v1/external-data \
  -u "$EPSILON3_API_KEY":
$apiUrl = "https://api.epsilon3.io/v1/external-data"
$apiKey = $env:EPSILON3_API_KEY
$authHeader = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes("$apiKey:"))
$headers = @{
    "Authorization" = "Basic $authHeader"
}

Invoke-RestMethod -Uri $apiUrl -Method Get -Headers $headers

GET https://api.epsilon3.io/v1/external-data

Example Response

[
  {
    "type": "work_order",
    "label": "Work Order",
    "dictionary_id": 1
  },
  {
    "type": "part_number",
    "label": "Part Number",
    "dictionary_id": 1
  },
  {
    "type": "support_ticket",
    "label": "Support Ticket",
    "dictionary_id": 1
  }
]

Delete external data

Sample Request

import requests
import os

requests.delete(
    url='https://api.epsilon3.io/v1/external-data',
    auth=(os.environ.get('EPSILON3_API_KEY'), ''),
    json={
      "ids": [1, 2, 3]
    }
)
curl -X DELETE \
  https://api.epsilon3.io/v1/external-data \
  -H 'Content-Type: application/json' \
  -u "$EPSILON3_API_KEY": \
  -d '{
    "ids": [1, 2, 3]
  }'
$apiUrl = "https://api.epsilon3.io/v1/external-data"
$apiKey = $env:EPSILON3_API_KEY
$authHeader = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes("$apiKey:"))
$headers = @{
    "Content-Type" = "application/json"
    "Authorization" = "Basic $authHeader"
}
$body = @{
    "ids": @(1, 2, 3)
  } | ConvertTo-Json

Invoke-RestMethod -Uri $apiUrl -Method Delete -Headers $headers -Body $body

DELETE `https://api.epsilon3.io/v1/external-data

Request Body

{
  "ids": array (integer),
}

Example Request Body

{
  "ids": [123, 456]
}

Issues API

Support managing Issues though their entire lifecycle.

Create an issue

This endpoint creates a new issue.

Sample Request

import requests
import os

requests.post(
    url='https://api.epsilon3.io/v1/issues',
    auth=(os.environ.get('EPSILON3_API_KEY'), ''),
    json={
          "title": "Sample title",
          "notes": "Some notes",
          "run_id": "up9goX1AgzCuffxUXbpI1K",
          "severity_id": "123",
          "status_id": "123",
          "assignee": "test@epsilon3.io",
          "project_id": "h78svHgfi4",
          "reference_id": "bIkugfdu94hG42jWkfbh2",
          "reference_type": "run",
          "details": [{
            "id": "10",
            "value": { "recorded": "Sample value"}
          }]
        }
    )
curl -X POST \
  https://api.epsilon3.io/v1/issues \
  -H 'Content-Type: application/json' \
  -u "$EPSILON3_API_KEY": \
  -d '{
      "title": "Sample title",
      "notes": "Some notes",
      "run_id": "up9goX1AgzCuffxUXbpI1K",
      "severity_id": "123",
      "status_id": "123",
      "assignee": "test@epsilon3.io",
      "project_id": "h78svHgfi4",
      "reference_id": "bIkugfdu94hG42jWkfbh2",
      "reference_type": "run",
      "details": [{
        "id": "10",
        "value": { "recorded": "Sample value"}
      }]
      }'
$apiUrl = "https://api.epsilon3.io/v1/issues"
$apiKey = $env:EPSILON3_API_KEY
$authHeader = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes("$apiKey:"))
$headers = @{
    "Content-Type" = "application/json"
    "Authorization" = "Basic $authHeader"
}
$body = @{
          "title": "Sample title",
          "notes": "Some notes",
          "run_id": "up9goX1AgzCuffxUXbpI1K",
          "severity_id": "123",
          "status_id": "123",
          "assignee": "test@epsilon3.io",
          "project_id": "h78svHgfi4",
          "reference_id": "bIkugfdu94hG42jWkfbh2",
          "reference_type": "run",
          "details": [{
            "id": "10",
            "value": { "recorded": "Sample value"}
          }]
         } | ConvertTo-Json

Invoke-RestMethod -Uri $apiUrl -Method Post -Headers $headers -Body $body

Request Body

{
  "title": string,
  "notes": (optional) string,
  "run_id": (optional) string,
  "severity_id": (optional) string,
  "status_id": (optional) string,
  "assignee": (optional) string,
  "project_id": string | null,
  "reference_id": (optional) string,
  "reference_type": (optional) string,
  "details": (optional) [{
    "id": string,
    "value": { "recorded": string }
  }]
}

POST https://api.epsilon3.io/v1/issues

Example Response Body

{
  "id": 123
}

Update an issue

This endpoint updates an issue.

Sample Request

import requests
import os

requests.patch(
    url='https://api.epsilon3.io/v1/issues/123',
    auth=(os.environ.get('EPSILON3_API_KEY'), ''),
    json={
          "title": "Sample title",
          "notes": "Some notes",
          "run_id": "up9goX1AgzCuffxUXbpI1K",
          "severity_id": "123",
          "status_id": "123",
          "assignee": "test@epsilon3.io",
          "project_id": "h78svHgfi4",
          "reference_id": "bIkugfdu94hG42jWkfbh2",
          "reference_type": "run",
          "details": [{
            "id": "10",
            "value": { "recorded": "Sample value"}
          }]
        }
    )
curl -X PATCH \
  https://api.epsilon3.io/v1/issues/123 \
  -H 'Content-Type: application/json' \
  -u "$EPSILON3_API_KEY": \
  -d '{
          "title": "Sample title",
          "notes": "Some notes",
          "run_id": "up9goX1AgzCuffxUXbpI1K",
          "severity_id": "123",
          "status_id": "123",
          "assignee": "test@epsilon3.io",
          "project_id": "h78svHgfi4",
          "reference_id": "bIkugfdu94hG42jWkfbh2",
          "reference_type": "run",
          "details": [{
            "id": "10",
            "value": { "recorded": "Sample value"}
          }]
      }'
$apiUrl = "https://api.epsilon3.io/v1/issues/123"
$apiKey = $env:EPSILON3_API_KEY
$authHeader = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes("$apiKey:"))
$headers = @{
    "Content-Type" = "application/json"
    "Authorization" = "Basic $authHeader"
}
$body = @{
          "title": "Sample title",
          "notes": "Some notes",
          "run_id": "up9goX1AgzCuffxUXbpI1K",
          "severity_id": "123",
          "status_id": "123",
          "assignee": "test@epsilon3.io",
          "project_id": "h78svHgfi4",
          "reference_id": "bIkugfdu94hG42jWkfbh2",
          "reference_type": "run",
          "details": [{
            "id": "10",
            "value": { "recorded": "Sample value"}
          }]
         } | ConvertTo-Json

Invoke-RestMethod -Uri $apiUrl -Method Patch -Headers $headers -Body $body

Request Body

{
  "title": (optional) string,
  "notes": (optional) string,
  "run_id": (optional) string,
  "severity_id": (optional) string,
  "status_id": (optional) string,
  "assignee": (optional) string,
  "project_id": string | null,
  "details": (optional) [{
    "id": string,
    "value": { "recorded": string }
  }]
  steps: [{
          "id": string,
          "name": string,
          "signoffs": [{
                        "id": string,
                        "operators": Array<string>,
                      }]
          "content": [{
                        "id": string,
                        "type": 'alert',
                        "subtype": 'note' | 'caution' | 'warning',
                        "text": string,
                      } | {
                        "id": string,
                        "type": 'procedure_link',
                        "procedure": string,
                        "section": string,
                        "run": (optional) string,
                      }]
      }];
}

PATCH https://api.epsilon3.io/v1/issues/123

Retrieve single issue

This endpoint allows you to retrieve a single issue with all of its associated data.

Sample Request

import requests
import os

requests.get(
    url='https://api.epsilon3.io/v1/issues/123',
    auth=(os.environ.get('EPSILON3_API_KEY'), ''),
)
curl -X GET \
  "https://api.epsilon3.io/v1/issues/123" \
  -u "$EPSILON3_API_KEY":
$apiUrl = "https://api.epsilon3.io/v1/issues/123"
$apiKey = $env:EPSILON3_API_KEY
$authHeader = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes("$apiKey:"))
$headers = @{
    "Authorization" = "Basic $authHeader"
}

Invoke-RestMethod -Uri $apiUrl -Method Get -Headers $headers

GET https://api.epsilon3.io/v1/issues/:issue-id

Example Response Body

{
  title: string,
  notes?: string,
  created_by: string,
  run_id?: string,
  reference_id: string,
  reference_type: 'step' | 'run' | 'item' | 'part' | 'order' | 'unlinked',
  severity: {
              "id": number,
              "name": string,
              "color": string,
              "pausesRun": boolean,
            };
  status: {
            "id": number,
            "status": draft | active | closed,
            "name": string,
            "color": string,
          };
  sub_status: null | {
                       "id": number,
                       "status_id": number,
                       "value": string,
                       "label": string,
                       "color": string,
                     },
  attachments?: [{
                   "attachment_id": string,
                   "name": string,
                   "content_type": string,
                }],
  assignees?: Array<string>,
  activity?: Array<Activity | RunActions>,
  details?: [{
               "id"
               "value": (optional) { recorded: string | null },
            }];
  steps: [{
            "id": string,
            "name": string,
            "signoffs": [{
                          "id": string,
                          "operators": Array<string>,
                        }]
            "content": [{
                          "id": string,
                          "type": 'alert',
                          "subtype": 'note' | 'caution' | 'warning',
                          "text": string,
                        } | {
                          "id": string,
                          "type": 'procedure_link',
                          "procedure": string,
                          "section": string,
                          "run": (optional) string,
                        }]
        }];
  project_id?: string;
}

Retrieve list of issues

This endpoint allows you to retrieve all available issues with basic information.

Sample Request

import requests
import os

requests.get(
    url='https://api.epsilon3.io/v1/issues?status_types[]=draft&status_types[]=active',
    auth=(os.environ.get('EPSILON3_API_KEY'), ''),
)
curl -X GET \
  "https://api.epsilon3.io/v1/issues?status_types[]=draft&status_types[]=active" \
  -u "$EPSILON3_API_KEY":
$apiUrl = "https://api.epsilon3.io/v1/issues?status_types[]=draft&status_types[]=active"
$apiKey = $env:EPSILON3_API_KEY
$authHeader = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes("$apiKey:"))
$headers = @{
    "Authorization" = "Basic $authHeader"
}

Invoke-RestMethod -Uri $apiUrl -Method Get -Headers $headers

GET https://api.epsilon3.io/v1/issues

Query parameter Value
run_id String
status_types Array - draft | active | closed
reference_id string
reference_type string

Query parameter example usage GET https://api.epsilon3.io/v1/issues?status_types[]=draft&status_types[]=active&run_id=sampleRunId

Example Response Body

{
  "data": [
            {
              id: number,
              title: string,
              status: {
                      "id": number,
                      "status": draft | active | closed,
                      "name": string,
                      "color": string,
                    };
              subStatus: null | {
                                "id": number,
                                "status_id": number,
                                "value": string,
                                "label": string,
                                "color": string,
                              },
              created_at: string,
              created_by: string,
              run_id: (optional) string,
              reference_id: string,
              reference_type: 'step' | 'run' | 'item' | 'part' | 'order' | 'unlinked',
              assignees: (optional) string,
              severity?: {
                           "id": number,
                           "name": string,
                           "color": string,
                           "pausesRun": boolean,
                         },
              projectId?: string,
          }
        ]
    }

Retrieve issues metadata options

This endpoint allows you to retrieve all options that you can set as values on an issue. These options are not customizable at this time.

Sample Request

import requests
import os

requests.get(
    url='https://api.epsilon3.io/v1/issues/metadata-options',
    auth=(os.environ.get('EPSILON3_API_KEY'), ''),
)
curl -X GET \
  "https://api.epsilon3.io/v1/issues/metadata-options" \
  -u "$EPSILON3_API_KEY":
$apiUrl = "https://api.epsilon3.io/v1/issues/metadata-options"
$apiKey = $env:EPSILON3_API_KEY
$authHeader = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes("$apiKey:"))
$headers = @{
    "Authorization" = "Basic $authHeader"
}

Invoke-RestMethod -Uri $apiUrl -Method Get -Headers $headers

GET https://api.epsilon3.io/v1/issues/metadata-options

Example Response Body

{
  "status": [
    {
      "id": number,
      "status": draft | active | closed,
      "name": string,
      "color": string,
    }
  ],
  "sub_status": [
    {
      "id": number,
      "status_id": number,
      "value": string,
      "label": string,
      "color": string,
    }
  ],
  "severity": [
    {
      "id": number,
      "name": string,
      "color": string,
      "pausesRun": boolean,
    }
  ],
}

Sign off step in an issue

This endpoint adds a signoff to resolution steps within an issue.

Sample Request

import requests
import os

requests.post(
    url='https://api.epsilon3.io/v1/issues/steps/signoff',
    auth=(os.environ.get('EPSILON3_API_KEY'), ''),
    json={
           "step_index": 0,
           "signoff_id": "so_vYY3vnQ2jr",
           "operator": "",
           "timestamp": "2024-10-30T20:16:58.759Z"
         }
    )
curl -X POST \
  https://api.epsilon3.io/v1/issues/steps/signoff \
  -H 'Content-Type: application/json' \
  -u "$EPSILON3_API_KEY": \
  -d '{
         "step_index": 0,
         "signoff_id": "so_vYY3vnQ2jr",
         "operator": "",
         "timestamp": "2024-10-30T20:16:58.759Z"
       }'
$apiUrl = "https://api.epsilon3.io/v1/issues/steps/signoff"
$apiKey = $env:EPSILON3_API_KEY
$authHeader = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes("$apiKey:"))
$headers = @{
    "Content-Type" = "application/json"
    "Authorization" = "Basic $authHeader"
}
$body = @{
            "step_index": 0,
            "signoff_id": "so_vYY3vnQ2jr",
            "operator": "",
            "timestamp": "2024-10-30T20:16:58.759Z"
          } | ConvertTo-Json

Invoke-RestMethod -Uri $apiUrl -Method Post -Headers $headers -Body $body

Request Body

{
    "step_index": integer,
    "signoff_id": string,
    "operator": string,
    "timestamp": string - ISO8601 datetime
}

POST https://api.epsilon3.io/v1/issues/steps/signoff

Procedures API

Audit procedures with invalid data

This endpoint audits procedures and returns the location of invalid telemetry, commanding or external data blocks.

Sample Request

import requests
import os

requests.get(
    url='https://api.epsilon3.io/v1/procedures/auditInvalid',
    auth=(os.environ.get('EPSILON3_API_KEY'), '')
)
curl -X GET \
  https://api.epsilon3.io/v1/procedures/auditInvalid \
  -u "$EPSILON3_API_KEY":
$apiUrl = "https://api.epsilon3.io/v1/auditInvalid"
$apiKey = $env:EPSILON3_API_KEY
$authHeader = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes("$apiKey:"))
$headers = @{
    "Authorization" = "Basic $authHeader"
}

Invoke-RestMethod -Uri $apiUrl -Method Get -Headers $headers

GET https://api.epsilon3.io/v1/procedures/auditInvalid

Response Body

{ "procedures": [
  {
    "id": string,
    "name": string,
    "invalid_blocks": {
      "section_content": [
        {
          "section_id": string,
          "section_name": string,
          "step_id": string,
          "step_name": string,
          "content_type": string, ( input | telemetry | commanding | external_item )
          "content_name": string,
          "content_id": string,
          "reason": string, ( e.g. "Invalid external data" )
        }
      ],
      "procedure_variables": [
        {
          "variable_id": string,
          "variable_name": string,
          "external_search_data_type": string,
          "reason": string, ( e.g. "Invalid commanding" )
        }
      ]
    }
  }
]}

List procedure summaries

Retrieves a summarized view of all available procedures.

Sample Request

import requests
import os

requests.get(
    url='https://api.epsilon3.io/v1/procedures/summary',
    auth=(os.environ.get('EPSILON3_API_KEY'), '')
)
curl -X GET \
  https://api.epsilon3.io/v1/procedures/summary \
  -u "$EPSILON3_API_KEY":
$apiUrl = "https://api.epsilon3.io/v1/procedures/summary"
$apiKey = $env:EPSILON3_API_KEY
$authHeader = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes("$apiKey:"))
$headers = @{
    "Authorization" = "Basic $authHeader"
}

Invoke-RestMethod -Uri $apiUrl -Method Get -Headers $headers

GET `https://api.epsilon3.io/v1/procedures/summary

Response Body

{ "data": [
  {
    "_id": string;
    "_rev": string;
    "name": string;
    "procedure_id": (optional) string;
    "state": "draft" | "in_review" | "released");
    "code": string;
    "version": string;
    "project_id": (optional) string;
    "project_name": (optional) string;
    "project_code": (optional) string;
    "archived": boolean;
    "editedAt": string;
    "reviewer_groups": (optional) Array<ReviewerGroup>;
    "tags": (optional) Array<Tag>;
  }
]}

Retrieve a procedure

Retrieves all available information for an individual procedure by ID.

Sample Request

import requests
import os

requests.get(
    url='https://api.epsilon3.io/v1/procedures/sampleProcedureId',
    auth=(os.environ.get('EPSILON3_API_KEY'), '')
)
curl -X GET \
  https://api.epsilon3.io/v1/procedures/sampleProcedureId \
  -u "$EPSILON3_API_KEY":
$apiUrl = "https://api.epsilon3.io/v1/procedures/sampleProcedureId"
$apiKey = $env:EPSILON3_API_KEY
$authHeader = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes("$apiKey:"))
$headers = @{
    "Authorization" = "Basic $authHeader"
}

Invoke-RestMethod -Uri $apiUrl -Method Get -Headers $headers

GET https://api.epsilon3.io/v1/procedures/:procedure-id

Response Body

  {
    "_id": string;
    "_rev": (optional) string;
    "procedure_id": (optional) string;
    "project_id": (optional) string;
    "project_name": (optional) string;
    "project_code": (optional) string;
    "code": string;
    "name": string;
    "variables": (optional) Array<DraftVariable>;
    "headers": (optional) Array<DraftHeader>;
    "version": (optional) string;
    "description": string;
    "archived": boolean;
    "state": (optional) "draft" | "in_review";
    "sections": Array<DraftSection>;
    "reviewer_groups": (optional) Array<ReviewerGroup>;
    "reviewer_actions_history": (optional) Array<ReviewerAction>;
    "locked_by": (optional) string;
    "locked_at": (optional) string;
    "redline_actions": (optional) Array<RedlineAction>;
    "editedAt": (optional) string;
    "editedUserId": (optional) string;
    "owner": (optional) string;
    "procedure_rev_num": (optional) number;
    "release_note": (optional) ReleaseNote;
    "comments": (optional) Array<ReviewComment>;
    "approvals": (optional) Array<Approval>;
    "tags": (optional) Array<Tag>;
    "settings": (optional) Settings;
    "reviewers": (optional) Array<Reviewer>;
    "end_run_signoffs_groups": (optional) Array<{
          id: string;
          operators: Array<string>;
        }>;
    "default_view_mode": (optional) string;
    "dictionary_id": (optional) number;
    "is_strict_signoff_enabled": (optional) boolean;
  }

Complimentary schemas

ReviewerGroup

{
  "id": string;
  "reviewers": Array<Reviewer>;
  "actions": Array<ReviewerAction>;
};

Reviewer

{
  "id": string;
  "reviewer_ids": Array<ReviewerId>;
  "is_required": (optional) true;
}

ReviewerId

{
  type: string;
  value: string;
};

ReviewerAction

{
  "type": string;
  "reviewer_id": string;
  "user_id": string;
  "approved_at": string;
}

Tag

{
  "key": string;
  "name": string;
}

DraftVariable

{
  "id": string;
  "name": string;
  "type": 'input',
  "rule": (optional) Rule;
  "units": (optional) string;
  "input_type": (optional) 'text' | 'number' | 'checkbox';
  "inputType": (optional) 'text' | 'number' | 'checkbox' | 'timestamp' | 'attachment' | 'list' | 'select' | 'external_item' | 'external_search' | 'multiple_choice';
  "redlines": (optional) Array<BlockRedline>;
  "version": (optional) 2;
  "dateTimeType": (optional) 'date' | 'time' | 'datetime';
  "include_in_summary": (optional) boolean;
  "list": (optional) string;
  "options": (optional) Array<string>;
  "external_item_type": (optional) string;
  "dictionary_id": (optional) number;
  "external_search_type": (optional) {
    "data_type_dictionary_id": (optional) number;
    "data_type": string;
    "filter_options": Array<string>;
  };
}

BlockRedline

DraftVariable | {
  "id": string;
  "type": 'alert' | 'text';
  "subtype": (optional) 'note' | 'caution' | 'warning';
  "text": (optional) string;
}

DraftHeader

{
  "id": string;
  "name": string;
  "content": Array<DraftHeaderBlock>;
  "header_field_redlines": (optional) {
    [field: string]: Array<DraftFieldRedline>;
  };
  "redlines": (optional) Array<DraftHeaderBlock | DraftFieldRedline>;
};

DraftHeaderBlock

{
  "id": string;
  "type": "alert" | "attachment" | "text";
  "subtype": (optional) "note" | "caution" | "warning";
  "text": string;
  "redlines": (optional) Array<BlockRedline>;
}

DraftFieldRedline

{
  redline_id: (optional) string;
  created_at: (optional) string;
  user_id: (optional) string;
  redlineIndex: number;
  name: string;
  redlineId: (optional) string;
  createdAt: (optional) string;
  userId: (optional) string;
}

RedlineAction

{
  "redline_id": string;
  "state": 'accepted' | 'rejected' | 'resolved';
  "resolved_at": string;
  "resolved_by": string;
  "resolution_procedure_rev_num": (optional) number;
  "release_procedure_rev_num": (optional) number;
}

DraftSection

{
  "id": string;
  "name": string;
  "headers": (optional) Array<DraftHeader>;
  "steps": Array<DraftStep | DraftAddedStep>;
  "snippet_id": (optional) string;
  "snippet_name": (optional) string;
  "snippet_rev": (optional) number;
  "snippet_ids_map": (optional) Object<string, string>;
  "shows_snippet_detached_message": (optional) boolean;
}

DraftStep

{
  "id": string;
  "name": string;
  "type": (optional) string;
  "headers": (optional) Array<DraftHeader>;
  "timing": (optional) string;
  "duration": (optional) string;
  "location": (optional) string;
  "channel": (optional) string;
  "content": Array<DraftStepBlock>;
  "signoffs": Array<Signoff>;
  "dependencies": (optional) Array<StepDependency>;
  "conditionals": (optional) Array<Conditional>;
  "actions": (optional) Array<StepAction>;
  "step_field_redlines": (optional) {
    [field: string]: Array<DraftFieldRedline>;
  };
  "shows_snippet_detached_message": (optional) boolean;
  "snippet_id": (optional) string;
  "snippet_name": (optional) string;
  "snippet_rev": (optional) number;
  "snippet_ids_map": (optional) Object<string, string>;
  "redline_id": (optional) string;
  "precedingStepId": (optional) string;
  "requires_previous": (optional) boolean;
  "created_during_run": true;
  "created_at": string;
  "created_by": string;
}

StepDependency

{
  "id": string;
  "dependent_ids": Array<string>;
}

Conditional

{
  "id": string;
  "source_type": 'step' | 'content';
  "state": 'completed' | 'failed';
  "content_id": null;
  "source_id": string;
  "target_id": string;
  "target_type": 'step';
}

StepAction

{
  "type": 'signoff';
  "user_id": string;
  "timestamp": string;
  "conditional_value": (optional) string;
  "signoff_id": string;
  "operator": string;
}

ReleaseNote

{
  "user_id": string;
  "timestamp": string;
  "text": string;
}

ReviewComment

{
  "id": string;
  "reference_id": string;
  "redline_id": (optional) string;
  "text": string;
  "user_id": string;
  "created_at": string;
  "type": (optional) 'redline_comment';
  "source_run_id": (optional) string;
  "resolved": (optional) boolean;
  "resolved_by": (optional) string;
  "resolved_at": (optional) string;
  "resolution_procedure_rev_num": (optional) number;
}

Approval

{
  "user_id": string;
  "approved_at": string;
}

Settings

{
  "print_settings": (options) {
      "header": (options) PrintContent;
      "footer": (options) PrintContent;
    };
}

PrintContent

{
  "text": (optional) string;
  "variable_id": (optional) string;
}

Runs API

Epsilon3’s Runs API supports creating and managing runs and associated data.

Start a running procedure

This endpoint creates new procedure runs.

Sample Request

import requests
import os

requests.post(
    url='https://api.epsilon3.io/v1/runs',
    auth=(os.environ.get('EPSILON3_API_KEY'), ''),
    json={
          "procedure_id": "up9goX1AgzCuffxUXbpI1K",
          "procedure_variables": {
            "manufacturer": "tesla",
            "VIN": 12345,
            "four-wheel drive?": false,
          }
        }
    )
curl -X POST \
  https://api.epsilon3.io/v1/runs \
  -H 'Content-Type: application/json' \
  -u "$EPSILON3_API_KEY": \
  -d '{
       "procedure_id": "up9goX1AgzCuffxUXbpI1K",
       "procedure_variables": {
         "manufacturer": "tesla",
         "VIN": 12345,
         "four-wheel drive?": false,
       }
      }'
$apiUrl = "https://api.epsilon3.io/v1/runs"
$apiKey = $env:EPSILON3_API_KEY
$authHeader = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes("$apiKey:"))
$headers = @{
    "Content-Type" = "application/json"
    "Authorization" = "Basic $authHeader"
}
$body = @{
       "procedure_id": "up9goX1AgzCuffxUXbpI1K",
       "procedure_variables": {
         "manufacturer": "tesla",
         "VIN": 12345,
         "four-wheel drive?": false,
       }
      } | ConvertTo-Json

Invoke-RestMethod -Uri $apiUrl -Method Post -Headers $headers -Body $body

Request Body

{
  "procedure_id": string,
  "procedure_variables": {
    "variable name": string | number | boolean
  }
}

POST https://api.epsilon3.io/v1/runs

Example Response Body

{
  "run_id": "GMFvqA1qLgrw0xIEc95M2o",
  "run_number": 42
}

The request body must contain the id of the procedure to start, and can optionally be used to pre-populate procedure variables.

Request value types correspond to the type of the procedure variable:

Procedure Variable Type Request Value Type
Text string
Number number; or, a string parsable to a number
Checkbox boolean
List & Custom List string
Multiple Choice string
Timestamp string, timestamp in ISO-8601 format*

*For time-only timestamp variables (with no date component required), the format may be HH:mm or HH:mm:ss. The date portion will default to the start of the epoch - January 1, 1970 UTC

Unsupported variable types: Attachment, Sketch, External Data, External Search

The run can be viewed at https://app.epsilon3.io/runs/<run_id>.

Pause or resume a running procedure

This endpoint allows you to pause or resume a procedure with an optional comment.

Sample Request

import requests
import os

requests.post(
    url='https://api.epsilon3.io/v1/runs/up9goX1AgzCuffxUXbpI1K/pause',
    auth=(os.environ.get('EPSILON3_API_KEY'), ''),
    json={ "comment": "Safety check pause" }
    )
curl -X POST \
  https://api.epsilon3.io/v1/runs/up9goX1AgzCuffxUXbpI1K/pause \
  -H 'Content-Type: application/json' \
  -u "$EPSILON3_API_KEY": \
  -d '{ "comment": "Safety check pause" }'
$apiUrl = "https://api.epsilon3.io/v1/runs/up9goX1AgzCuffxUXbpI1K/pause"
$apiKey = $env:EPSILON3_API_KEY
$authHeader = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes("$apiKey:"))
$headers = @{
    "Content-Type" = "application/json"
    "Authorization" = "Basic $authHeader"
}
$body = @{ "comment": "Safety check pause" } | ConvertTo-Json

Invoke-RestMethod -Uri $apiUrl -Method Post -Headers $headers -Body $body

Request Body

{ "comment": string (optional) }

POST https://api.epsilon3.io/v1/runs/:runId/pause OR POST https://api.epsilon3.io/v1/runs/:runId/resume

The runId parameter in the URL must contain the id of the running procedure to pause/resume.

Retrieve list of running procedure summaries

This endpoint allows you to retrieve a list of summarized running procedures with an optional filter for run state.

Sample Request

import requests
import os

requests.get(
    url='https://api.epsilon3.io/v1/runs/summary',
    auth=(os.environ.get('EPSILON3_API_KEY'), ''),
    params={
      "run-state": ["paused", "completed"],
    }
)
curl -X GET \
  "https://api.epsilon3.io/v1/runs/summary?run-state=paused&run-state=completed" \
  -u "$EPSILON3_API_KEY":
$apiUrl = "https://api.epsilon3.io/v1/runs/summary?run-state=paused&run-state=completed"
$apiKey = $env:EPSILON3_API_KEY
$authHeader = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes("$apiKey:"))
$headers = @{
    "Authorization" = "Basic $authHeader"
}

Invoke-RestMethod -Uri $apiUrl -Method Get -Headers $headers

GET https://api.epsilon3.io/v1/runs/summary

Query parameter Value
run-state Array - running | paused | completed
operation-keys Array - string
project-ids Array - string
tag-ids Array - string
procedure-ids Array - string
start-time-before String - ISO8601 datetime
start-time-after String - ISO8601 datetime
end-time-before String - ISO8601 datetime
end-time-after String - ISO8601 datetime

Query parameter example usage GET https://api.epsilon3.io/v1/runs/summary?run-state[]=paused&run-state[]=completed&project-ids[]=abc&start-time-before=2024-09-18T01:01:01.000Z

Example Response Body

{
  "_id": string,
  "code": string,
  "completedAt": string, timestamp in ISO-8601 format,
  "name": string,
  "operation": string,
  "project_id": string,
  "run_tags": [
    {key: string, name: string},
    ...
  ],
  "run_section": (optional) string,
  "source_run": (optional) string,
  "starttime": string, timestamp in ISO-8601 format,
  "state": "running" | "completed" | "paused",
  "status": "success" | "failure" | "abort",
  "skipped_steps": integer,
  "completed_steps": integer,
  "failed_steps": integer,
  "total_steps": integer,
  "not_required_steps": integer,
  "participant_user_ids": array(string),
}

End a running procedure

This endpoint allows you to end a procedure with an optional comment or status. When a running procedure is ended via this endpoint, any telemetry data that has not been recorded will be stored.

Sample Request

import requests
import os

requests.post(
    url='https://api.epsilon3.io/v1/runs/up9goX1AgzCuffxUXbpI1K/end',
    auth=(os.environ.get('EPSILON3_API_KEY'), ''),
    json={
          "comment": "Everything looks OK.",
          "status": "success"
        }
    )
curl -X POST \
  https://api.epsilon3.io/v1/runs/up9goX1AgzCuffxUXbpI1K/end \
  -H 'Content-Type: application/json' \
  -u "$EPSILON3_API_KEY": \
  -d '{
       "comment": "Everything looks OK.",
       "status": "success"
     }'
$apiUrl = "https://api.epsilon3.io/v1/runs/up9goX1AgzCuffxUXbpI1K/end"
$apiKey = $env:EPSILON3_API_KEY
$authHeader = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes("$apiKey:"))
$headers = @{
    "Content-Type" = "application/json"
    "Authorization" = "Basic $authHeader"
}
$body = @{
            "comment": "Everything looks OK.",
            "status": "success"
          } | ConvertTo-Json

Invoke-RestMethod -Uri $apiUrl -Method Post -Headers $headers -Body $body

Request Body

{
  "comment": string (optional),
  "status": string (optional)
}

Allowed status values are: - success - failure - abort

POST https://api.epsilon3.io/v1/runs/:runId/end

The runId parameter in the URL must contain the id of the running procedure to end.

Retrieve available run tags

This endpoint allows you to retrieve all run tags available to be assigned to a run.

Sample Request

import requests
import os

requests.get(
    url='https://api.epsilon3.io/v1/runs/tags',
    auth=(os.environ.get('EPSILON3_API_KEY'), ''),
)
curl -X GET \
  "https://api.epsilon3.io/v1/runs/tags" \
  -u "$EPSILON3_API_KEY":
$apiUrl = "https://api.epsilon3.io/v1/runs/tags"
$apiKey = $env:EPSILON3_API_KEY
$authHeader = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes("$apiKey:"))
$headers = @{
    "Authorization" = "Basic $authHeader"
}

Invoke-RestMethod -Uri $apiUrl -Method Get -Headers $headers

GET https://api.epsilon3.io/v1/runs/tags

Example Response Body

{
  "tags": [
    {
      "key": "qji7zlB0WV",
      "name": "Sample Tag"
    }
  ],
}

Create run tags

This endpoint allows you to create tags that you can then assign to runs.

Sample Request

import requests
import os

requests.post(
    url='https://api.epsilon3.io/v1/runs/tags',
    auth=(os.environ.get('EPSILON3_API_KEY'), ''),
    json={ "tag_names": ["Sample Tag 1", "Sample Tag 2"] }
    )
curl -X POST \
  https://api.epsilon3.io/v1/runs/tags \
  -H 'Content-Type: application/json' \
  -u "$EPSILON3_API_KEY": \
  -d '{ "tag_names": ["Sample Tag 1", "Sample Tag 2"] }'
$apiUrl = "https://api.epsilon3.io/v1/runs/tags"
$apiKey = $env:EPSILON3_API_KEY
$authHeader = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes("$apiKey:"))
$headers = @{
    "Content-Type" = "application/json"
    "Authorization" = "Basic $authHeader"
}
$body = @{ "tag_names": ["Sample Tag 1", "Sample Tag 2"] } | ConvertTo-Json

Invoke-RestMethod -Uri $apiUrl -Method Post -Headers $headers -Body $body

Request Body

{ "tag_names": ["Sample Tag 1", "Sample Tag 2"] }

POST https://api.epsilon3.io/v1/runs/tags

Retrieve run metadata

This endpoint allows you to retrieve the metadata of a run.

Sample Request

import requests
import os

requests.get(
    url='https://api.epsilon3.io/v1/runs/up9goX1AgzCuffxUXbpI1K/metadata',
    auth=(os.environ.get('EPSILON3_API_KEY'), ''),
)
curl -X GET \
  "https://api.epsilon3.io/v1/runs/up9goX1AgzCuffxUXbpI1K/metadata" \
  -u "$EPSILON3_API_KEY":
$apiUrl = "https://api.epsilon3.io/v1/runs/up9goX1AgzCuffxUXbpI1K/metadata"
$apiKey = $env:EPSILON3_API_KEY
$authHeader = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes("$apiKey:"))
$headers = @{
    "Authorization" = "Basic $authHeader"
}

Invoke-RestMethod -Uri $apiUrl -Method Get -Headers $headers

GET https://api.epsilon3.io/v1/runs/:runId/metadata

The runId parameter in the URL must contain the id of the running procedure to update.

Example Response Body

{
  "state": "running",
  "tags": [
    {
      "id": "qji7zlB0WV",
      "name": "Sample Tag"
    }
  ],
  project: {
    code: "P1",
    id: "OFJsa3MWU7",
    name: "ProjectOne",
  },
  "operation": {
    "name": "Sample Operation",
    "id": "sample operation"
  },
  participants: ["test1@epsilon3.io", "test2@epsilon3.io"],
}

Set run metadata

This endpoint allows you to set metadata about the run. Currently only run tags supported.

Sample Request

import requests
import os

requests.patch(
    url='https://api.epsilon3.io/v1/runs/up9goX1AgzCuffxUXbpI1K/metadata',
    auth=(os.environ.get('EPSILON3_API_KEY'), ''),
    json={ "run_tag_ids": ["qji7zlB0WV"] }
    )
curl -X PATCH \
  https://api.epsilon3.io/v1/runs/up9goX1AgzCuffxUXbpI1K/metadata \
  -H 'Content-Type: application/json' \
  -u "$EPSILON3_API_KEY": \
  -d '{ "run_tag_ids": ["qji7zlB0WV"] }'
$apiUrl = "https://api.epsilon3.io/v1/runs/up9goX1AgzCuffxUXbpI1K/metadata"
$apiKey = $env:EPSILON3_API_KEY
$authHeader = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes("$apiKey:"))
$headers = @{
    "Content-Type" = "application/json"
    "Authorization" = "Basic $authHeader"
}
$body = @{ "run_tag_ids": ["qji7zlB0WV"] } | ConvertTo-Json

Invoke-RestMethod -Uri $apiUrl -Method Patch -Headers $headers -Body $body

Request Body

{ "run_tag_ids": ["qji7zlB0WV"] }

PATCH https://api.epsilon3.io/v1/runs/:runId/metadata

The runId parameter in the URL must contain the id of the running procedure to update.

Swimlanes API

Swimlanes are used in schedules to group events in the Gantt chart. Epsilon3's swimlanes API currently supports the following capabilities.

Get Swimlanes

Sample Request

import requests
import os

requests.get(
    url='https://api.epsilon3.io/v1/swimlanes',
    auth=(os.environ.get('EPSILON3_API_KEY'), '')
)
curl -X GET \
  https://api.epsilon3.io/v1/swimlanes \
  -u "$EPSILON3_API_KEY":
$apiUrl = "https://api.epsilon3.io/v1/swimlanes"
$apiKey = $env:EPSILON3_API_KEY
$authHeader = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes("$apiKey:"))
$headers = @{
    "Authorization" = "Basic $authHeader"
}

Invoke-RestMethod -Uri $apiUrl -Method Get -Headers $headers

GET /api/v1/swimlanes

Retrieves all swimlane

Response Body

{
  "swimlanes": [
    {
      "id": "DpSTO81RP9fZSUd8d8ffY4",
      "name": "Swimlane Exo"
    },
    {
      "id": "9ozH0ZOXLLBRZg4K0v1CXf",
      "name": "New"
    },
    {
      "id": "A2T07M4MkQeiJQqW7xOH6w",
      "name": "API Swimlane"
    },
    {
      "id": "F1HKrIQ8gY6UIHRj1qhclC",
      "name": "Launch"
    },
    {
      "id": "zAt5hyS3FEmvy4THcTIIVh",
      "name": "QA Check"
    }
  ]
}

Update Swimlane

PATCH /api/v1/swimlanes/:swimlane_id

Updates a specific swimlane.

Request URL

PATCH /api/v1/swimlane/test_swimlane_id

Example Request Body

{
  "name": "Patched Swimlane"
}

Parameters

Request Body

The request body should be a JSON object that contains the details of the swimlane to be updated. The following fields are supported:

Response The response status code will be 204 for a succcessful message

Create Swimlane

POST /api/v1/swimlanes

Request URL

POST /api/v1/swimlanes

Example Request Body

{
  "name": "New Swimlane"
}

Creates a new swimlane.

Parameters

No path parameters are required for this endpoint.

Request Body

The request body should be a JSON object that contains the details of the swimlane to be created. The following fields are supported:

Response

The response status code will be 201 and return a JSON object containing the ID of the newly created swimlane.

Delete Swimlane

DELETE /api/v1/swimlanes/:swimlane_id

Request URL

DELETE /api/v1/swimlanes/test_swimlane_id

Deletes an swimlane.

Parameters

Response

The response status code will be 204 for a successful response.

Telemetry API

Epsilon3’s telemetry API supports creating, updating, retrieving, or deleting telemetry parameters. Uploading telemetry parameters to the API allows the user to do the following in Epsilon3:

Create or update a telemetry parameter

Sample Request

import requests
import os

requests.post(
    url='https://api.epsilon3.io/v1/telemetry/parameters',
    auth=(os.environ.get('EPSILON3_API_KEY'), ''),
    json={
          "name": "test.simulation.error",
          "type": "enum",
          "dictionary_id": 1,
          "description": "Payload error flag",
          "refresh_rate_ms": 10000,
          "values": { "0": "FAIL", "1": "SUCCESS" }
        }
    )
curl -X POST \
  https://api.epsilon3.io/v1/telemetry/parameters \
  -H 'Content-Type: application/json' \
  -u "$EPSILON3_API_KEY": \
  -d '{
      "name": "test.simulation.error",
      "type": "enum",
      "dictionary_id": 1,
      "description": "Payload error flag",
      "refresh_rate_ms": 10000,
      "values": { "0": "FAIL", "1": "SUCCESS" }
    }'
$apiUrl = "https://api.epsilon3.io/v1/telemetry/parameters"
$apiKey = $env:EPSILON3_API_KEY
$authHeader = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes("$apiKey:"))
$headers = @{
    "Content-Type" = "application/json"
    "Authorization" = "Basic $authHeader"
}
$body = @{
      "name": "test.simulation.error",
      "type": "enum",
      "dictionary_id": 1,
      "description": "Payload error flag",
      "refresh_rate_ms": 10000,
      "values": { "0": "FAIL", "1": "SUCCESS" }
    } | ConvertTo-Json

Invoke-RestMethod -Uri $apiUrl -Method Post -Headers $headers -Body $body

Request Body (Parameter Object)

{
  "name": string,
  "type": string,
  "dictionary_id": integer (optional),
  "description": string (optional),
  "units": string (optional),
  "refresh_rate_ms": integer (optional),
  "values": object (optional - required for enum and aggregate types)
}

POST https://api.epsilon3.io/v1/telemetry/parameters

The request body should contain a Parameter object. The fields name and type are required. The name field should be unique per dictionary. The optional dictionary_id field allows the parameter to be related to a dictionary. If no dictionary_id is provided, the parameter will be related to the default dictionary. The parameter refresh_rate_ms is a positive integer denoting the number of milliseconds the UI will wait before refreshing the value, defaults to 1000 (1 second) if not provided. The values parameter is required for enum and aggregate type parameters. For enum types, values represents a mapping of integer keys to string labels - each integer key corresponds to a unique string label. For aggregate types, values represents an array of parameter objects - each object has a required name and type field (a values field is required if type is enum)

Response Body

{
  "id": string,
  "name": string,
  "type": string,
  "dictionary_id": integer,
  "created_at": string, timestamp in ISO-8601 format
}

Example Enum Request

{
  "name": "test.simulation.enum",
  "type": "enum",
  "dictionary_id": 5,
  "description": "Enum representing state of simulation",
  "refresh_rate_ms": 1000,
  "values": { "0": "FAIL", "1": "SUCCESS" }
}

Example Aggregate Request

{
  "name": "test.simulation.aggregate",
  "type": "aggregate",
  "dictionary_id": 5,
  "description": "Aggregate type representing state of simulation",
  "refresh_rate_ms": 1000,
  "values": [{"name": "test_val", "type": "float"}, {"name": "test_enum", "type": "enum", "values":{ "0": "FAIL", "1": "SUCCESS" }}]
}

Supported types:

List all available telemetry parameters

Sample Request

import requests
import os

requests.get(
    url='https://api.epsilon3.io/v1/telemetry/parameters',
    auth=(os.environ.get('EPSILON3_API_KEY'), '')
)
curl -X GET \
  https://api.epsilon3.io/v1/telemetry/parameters \
  -u "$EPSILON3_API_KEY":
$apiUrl = "https://api.epsilon3.io/v1/telemetry/parameters"
$apiKey = $env:EPSILON3_API_KEY
$authHeader = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes("$apiKey:"))
$headers = @{
    "Authorization" = "Basic $authHeader"
}

Invoke-RestMethod -Uri $apiUrl -Method Get -Headers $headers

GET https://api.epsilon3.io/v1/telemetry/parameters

Response Body (List of Parameter Objects)

[{
  "id": string,
  "name": string,
  "type": string,
  "dictionary_id": integer,
  "created_at": string, timestamp in ISO-8601 format,
  "refresh_rate_ms": number,
  "values": object (Represents a mapping of integer keys to string labels)
}]

Retrieve a telemetry parameter by name

Sample Request

import requests
import os

requests.get(
    url='https://api.epsilon3.io/v1/telemetry/parameters',
    auth=(os.environ.get('EPSILON3_API_KEY'), ''),
    params={
      "name": "test.simulation.error",
      "dictionary_id": 1
    }
)
curl -X GET \
  "https://api.epsilon3.io/v1/telemetry/parameters/query?name=test.simulation.error&dictionary_id=1" \
  -u "$EPSILON3_API_KEY":
$apiUrl = "https://api.epsilon3.io/v1/telemetry/parameters/query?name=test.simulation.error&dictionary_id=1"
$apiKey = $env:EPSILON3_API_KEY
$authHeader = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes("$apiKey:"))
$headers = @{
    "Authorization" = "Basic $authHeader"
}

Invoke-RestMethod -Uri $apiUrl -Method Get -Headers $headers

GET https://api.epsilon3.io/v1/telemetry/parameters/query?name={name}&dictionary_id={dictionary_id}

The URL parameter name is required and must be URL encoded. An optional dictionary_id may be provided to choose a specific dictionary. If dictionary_id is not included, the default dictionary will be used.

Delete parameters

DELETE https://api.epsilon3.io/v1/telemetry/parameters

Request Body

{
  "ids": array (integer),
}

Example Request Body

{
  "ids": [123, 456]
}

Test Management API

Conditions

List Conditions

Sample Request

import requests
import os

requests.get(
    url='https://api.epsilon3.io/v1/testing/conditions',
    auth=(os.environ.get('EPSILON3_API_KEY'), '')
)
curl -X GET \
  https://api.epsilon3.io/v1/testing/conditions \
  -u "$EPSILON3_API_KEY":
$apiUrl = "https://api.epsilon3.io/v1/testing/conditions"
$apiKey = $env:EPSILON3_API_KEY
$authHeader = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes("$apiKey:"))
$headers = @{
    "Authorization" = "Basic $authHeader"
}

Invoke-RestMethod -Uri $apiUrl -Method Get -Headers $headers

GET https://api.epsilon3.io/v1/testing/conditions

Retrieve all conditions defined in your workspace.

Example Response Body

{
  "data": [
    {
      "id": "089dab71-f13a-43b1-a350-481c873129f1",
      "name": "Speed",
      "units": [
          "MPH",
          "KPH"
      ]
    },
    ...
  ]
}

Get Condition

GET https://api.epsilon3.io/v1/testing/conditions/:id

Retrieve a single condtion using its ID.

Parameters

Example Request URL

GET https://api.epsilon3.io/v1/testing/conditions/089dab71-f13a-43b1-a350-481c873129f1

Example Response Body

{
    "id": "089dab71-f13a-43b1-a350-481c873129f1",
    "name": "Speed",
    "units": [
        "MPH",
        "KPH"
    ]
}

Hazards

List Hazards

Sample Request

import requests
import os

requests.get(
    url='https://api.epsilon3.io/v1/testing/risks',
    auth=(os.environ.get('EPSILON3_API_KEY'), '')
)
curl -X GET \
  https://api.epsilon3.io/v1/testing/risks \
  -u "$EPSILON3_API_KEY":
$apiUrl = "https://api.epsilon3.io/v1/testing/risks"
$apiKey = $env:EPSILON3_API_KEY
$authHeader = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes("$apiKey:"))
$headers = @{
    "Authorization" = "Basic $authHeader"
}

Invoke-RestMethod -Uri $apiUrl -Method Get -Headers $headers

GET https://api.epsilon3.io/v1/testing/risks

Retrieve all hazards defined in your workspace.

Example Response Body

{
  "data": [
    {
      "id": "f2161547-615e-4959-a989-91f3627d20d1",
      "name": "Altitude Loss",
      "cause": "Stall",
      "notes": "Work in progress",
      "effect": "Inadequate altitude for recovery",
      "category": "Mechanical",
      "severity": 0,
      "probability": 1,
      "mitigation": "Experienced Test Pilot: Ensure a highly skilled test pilot with experience in stall recovery is at the controls. Safety Equipment: Ensure the aircraft is equipped with safety features, such as a stall warning system, to aid in stall recovery.",
      "updated_at": "2024-01-24T21:00:39.421Z",
    },
    ...
  ]
}

Get Hazard

GET https://api.epsilon3.io/v1/testing/risks/:id

Retrieve a single hazard using its ID.

Parameters

Example Request URL

GET https://api.epsilon3.io/v1/testing/risks/f2161547-615e-4959-a989-91f3627d20d1

Example Response Body

{
  "id": "f2161547-615e-4959-a989-91f3627d20d1",
  "name": "Altitude Loss",
  "cause": "Stall",
  "notes": "Work in progress",
  "effect": "Inadequate altitude for recovery",
  "category": "Mechanical",
  "severity": 0,
  "probability": 1,
  "mitigation": "Experienced Test Pilot: Ensure a highly skilled test pilot with experience in stall recovery is at the controls. Safety Equipment: Ensure the aircraft is equipped with safety features, such as a stall warning system, to aid in stall recovery.",
  "updated_at": "2024-01-24T21:00:39.421Z",
}

List Hazard Versions

GET https://api.epsilon3.io/v1/testing/risks/:id/versions

Retrieve all the versions for a hazard.

Parameters

Example Request URL

GET https://api.epsilon3.io/v1/testing/risks/f2161547-615e-4959-a989-91f3627d20d1/versions

Example Response Body

{
  "data": [
    {
      "id": 123,
      "timestamp": "2024-01-24T21:00:39.421Z",
      "record":
        {
          "id": "f2161547-615e-4959-a989-91f3627d20d1",
          "name": "Altitude Loss",
          "cause": "Stall",
          "notes": "Work in progress",
          "effect": "Inadequate altitude for recovery",
          "category": "Mechanical",
          "severity": 0,
          "probability": 1,
          "mitigation": "Experienced Test Pilot: Ensure a highly skilled test pilot with experience in stall recovery is at the controls. Safety Equipment: Ensure the aircraft is equipped with safety features, such as a stall warning system, to aid in stall recovery.",
          "updated_at": "2024-01-24T21:00:39.421Z",
        }
    },
    ...
  ]
}

Get Hazard Version

GET https://api.epsilon3.io/v1/testing/risks/:id/versions/:versionId

Retrieve a single version for a hazard.

Parameters

Example Request URL

GET https://api.epsilon3.io/v1/testing/risks/f2161547-615e-4959-a989-91f3627d20d1/versions/123

Example Response Body

{
  "id": 123,
  "timestamp": "2024-01-24T21:00:39.421Z",
  "record":
    {
      "id": "f2161547-615e-4959-a989-91f3627d20d1",
      "name": "Altitude Loss",
      "cause": "Stall",
      "notes": "Work in progress",
      "effect": "Inadequate altitude for recovery",
      "category": "Mechanical",
      "severity": 0,
      "probability": 1,
      "mitigation": "Experienced Test Pilot: Ensure a highly skilled test pilot with experience in stall recovery is at the controls. Safety Equipment: Ensure the aircraft is equipped with safety features, such as a stall warning system, to aid in stall recovery.",
      "updated_at": "2024-01-24T21:00:39.421Z",
    }
}

Test Points

List Test Points

Sample Request

import requests
import os

requests.get(
    url='https://api.epsilon3.io/v1/testing/cases',
    auth=(os.environ.get('EPSILON3_API_KEY'), '')
)
curl -X GET \
  https://api.epsilon3.io/v1/testing/cases \
  -u "$EPSILON3_API_KEY":
$apiUrl = "https://api.epsilon3.io/v1/testing/cases"
$apiKey = $env:EPSILON3_API_KEY
$authHeader = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes("$apiKey:"))
$headers = @{
    "Authorization" = "Basic $authHeader"
}

Invoke-RestMethod -Uri $apiUrl -Method Get -Headers $headers

GET https://api.epsilon3.io/v1/testing/cases

Retrieve all test points defined in your workspace.

Example Response Body

{
  "data": [
    {
      "id": "f2161547-615e-4959-a989-91f3627d20d1",
      "name": "Cruise",
      "test_case_conditions": [
          {
              "name": "Speed",
              "units": "MPH",
              "value": "22",
              "condition_id": "089dab71-f13a-43b1-a350-481c873129f1"
          }
      ],
    },
    ...
  ]
}

Get Test Point

GET https://api.epsilon3.io/v1/testing/cases/:id

Retrieve a single test point using its ID.

Parameters

Example Request URL

GET https://api.epsilon3.io/v1/testing/cases/f2161547-615e-4959-a989-91f3627d20d1

Example Response Body

{
  "id": "f2161547-615e-4959-a989-91f3627d20d1",
  "name": "Cruise",
  "test_case_conditions": [
      {
          "name": "Speed",
          "units": "MPH",
          "value": "22",
          "condition_id": "089dab71-f13a-43b1-a350-481c873129f1"
      }
  ],
  "risks": [], // list of associated hazards
  "requirements": [], // list of associated requirements
  "runs": [], // list of associated runs
}

List Test Point Versions

GET https://api.epsilon3.io/v1/testing/cases/:id/versions

Retrieve all the versions for a test point.

Parameters

Example Request URL

GET https://api.epsilon3.io/v1/testing/cases/f2161547-615e-4959-a989-91f3627d20d1/versions

Example Response Body

{
  "data": [
    {
      "id": 123,
      "timestamp": "2024-01-24T21:00:39.421Z",
      "record":
        {
          "id": "f2161547-615e-4959-a989-91f3627d20d1",
          "name": "Cruise",
          "test_case_conditions": [
            {
              "name": "Speed",
              "units": "MPH",
              "value": "22",
              "condition_id": "089dab71-f13a-43b1-a350-481c873129f1"
            }
          ],
        }
    },
    ...
  ]
}

Get Test Point Version

GET https://api.epsilon3.io/v1/testing/cases/:id/versions/:versionId

Retrieve a single version for a test point.

Parameters

Example Request URL

GET https://api.epsilon3.io/v1/testing/cases/f2161547-615e-4959-a989-91f3627d20d1/versions/123

Example Response Body

{
  "id": 123,
  "timestamp": "2024-01-24T21:00:39.421Z",
  "record":
    {
      "id": "f2161547-615e-4959-a989-91f3627d20d1",
      "name": "Cruise",
      "test_case_conditions": [
        {
          "name": "Speed",
          "units": "MPH",
          "value": "22",
          "condition_id": "089dab71-f13a-43b1-a350-481c873129f1"
        }
      ],
    }
}

Requirements

List Requirements

Sample Request

import requests
import os

requests.get(
    url='https://api.epsilon3.io/v1/testing/requirements',
    auth=(os.environ.get('EPSILON3_API_KEY'), '')
)
curl -X GET \
  https://api.epsilon3.io/v1/testing/requirements \
  -u "$EPSILON3_API_KEY":
$apiUrl = "https://api.epsilon3.io/v1/testing/requirements"
$apiKey = $env:EPSILON3_API_KEY
$authHeader = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes("$apiKey:"))
$headers = @{
    "Authorization" = "Basic $authHeader"
}

Invoke-RestMethod -Uri $apiUrl -Method Get -Headers $headers

GET https://api.epsilon3.io/v1/testing/requirements

Retrieve all requirements defined in your workspace.

Example Response Body

{
  "data": [
    {
        "id": "6be45049-ed63-4d53-b839-a0a719f94be9",
        "custom_id": "A-100",
        "position": 1,
        "text": "The aircraft should be a commercial passenger airplane designed for carrying passengers and cargo.",
        "priority": {
            "id": 1,
            "name": "High",
            "color": "red-200"
        },
        "type": "secondary",
        "notes": "This is not a military aircraft."
    },
    ...
  ]
}

Get Requirement

GET https://api.epsilon3.io/v1/testing/requirements/:id

Retrieve a single requirement using its ID.

Parameters

Example Request URL

GET https://api.epsilon3.io/v1/testing/requirements/6be45049-ed63-4d53-b839-a0a719f94be9

Example Response Body

{
  "id": "6be45049-ed63-4d53-b839-a0a719f94be9",
  "custom_id": "A-100",
  "position": 1,
  "text": "The aircraft should be a commercial passenger airplane designed for carrying passengers and cargo.",
  "priority": {
      "id": 1,
      "name": "High",
      "color": "red-200"
  },
  "type": "secondary",
  "notes": "This is not a military aircraft.",
  "cases": [], // list of associated test points
  "source_links": [], // list of associated requirements this requirement is a source of
  "target_links": [], // list of associated requirements that target this requirement
  "attachments": [], // list of attachment metadata
}

List Requirement Versions

GET https://api.epsilon3.io/v1/testing/requirements/:id/versions

Retrieve all the versions for a requirement.

Parameters

Example Request URL

GET https://api.epsilon3.io/v1/testing/requirements/6be45049-ed63-4d53-b839-a0a719f94be9/versions

Example Response Body

{
  "data": [
    {
      "id": 123,
      "timestamp": "2024-01-24T21:00:39.421Z",
      "record":
        {
          "id": "6be45049-ed63-4d53-b839-a0a719f94be9",
          "custom_id": "A-100",
          "position": 1,
          "text": "The aircraft should be a commercial passenger airplane designed for carrying passengers and cargo.",
          "priority": {
              "id": 1,
              "name": "High",
              "color": "red-200"
          },
          "type": "secondary",
          "notes": "This is not a military aircraft."
        }
    },
    ...
  ]
}

Get Requirement Version

GET https://api.epsilon3.io/v1/testing/requirements/:id/versions/:versionId

Retrieve a single version for a requirement.

Parameters

Example Request URL

GET https://api.epsilon3.io/v1/testing/requirements/6be45049-ed63-4d53-b839-a0a719f94be9/versions/123

Example Response Body

{
  "id": 123,
  "timestamp": "2024-01-24T21:00:39.421Z",
  "record":
    {
      "id": "6be45049-ed63-4d53-b839-a0a719f94be9",
      "custom_id": "A-100",
      "position": 1,
      "text": "The aircraft should be a commercial passenger airplane designed for carrying passengers and cargo.",
      "priority": {
          "id": 1,
          "name": "High",
          "color": "red-200"
      },
      "type": "secondary",
      "notes": "This is not a military aircraft."
    }
}

Realtime Introduction

Epsilon3, facilitates seamless real-time data exchange to integrate with any third party software platform through the use of the socketIO and webhook communication protocols.

The following modules are currently supported

Epsilon3 provides sample python clients that contain all the core logic needed to connect to Epsilon3 system so that only custom integration logic needs to be added.

Getting Started

Download Sample Client

Set Environment Variables

Add your API key as an environment variable

export EPSILON3_API_KEY=your_api_key
export EPSILON3_API_KEY=your_api_key

(Optional) If you are in the United Kingdom instance you will also need to set the correct URL

export EPSILON3_API_URL='https://api.uk.epsilon3.io'
export EPSILON3_API_URL='https://api.uk.epsilon3.io'

(Optional) If using the Webhook version you will also need to add your webhook key as an environment variable

export EPSILON3_WEBHOOK_KEY=your_webhook_key
export EPSILON3_WEBHOOK_KEY=your_webhook_key

Note: Webhook key registration necessary, contact Epsilon3 support for assistance.

Webhook signature verification

Epsilon3 provides a python module called webhook_auth for verifying that requests sent to your webhooks come from Epsilon3 and not a third party.

Perform signature verification by passing your webhook secret key, the request payload, and the Epsilon3-Signature header to the provided function verify_webhook_signature. This function will return True if the signature can be verified, and False otherwise.

For additional information regarding webhook signature verification or if you’d like to verify webhook signatures manually, please contact Epsilon3 for support.

Run the Application

In a terminal window navigate to the directory where the Realtime Client was downloaded, unzip it and then navigate into it. e.g.

cd client-python-socketio
cd client-python-socketio

Install project dependencies

pipenv install
pipenv install

Activate the project's python environment

pipenv shell
pipenv shell

Run the application

SocketIO version

python app.py
python app.py

Webhook version

flask aiorun
flask aiorun

Commanding

For information on creating commands to use within a procedure please see the Commanding API Section

Listen for a command in real-time

The SocketIO/Webhook clients provide different namespaces to use websockets more efficiently and provide separate communication channels. For real-time commanding, clients can listen for:

Namespace /v1/commands/realtime

Event name send_command

Once a SocketIO or Webhook client is running, they will receive real-time requests to execute commands triggered from running procedures.

Example Request

{
  "name": "test.pressure.level",
  "dictionary_id": 2,
  "arguments":
  {
    "psi": 7.8,
  },
  "operation": "To infinity and beyond!",
  "variables":
  {
    "test.variable1":
    {
      "name": "test.variable1",
      "input_type": "text",
      "value": "hello world",
    },
    "test.variable2":
    {
      "name": "test.variable2",
      "input_type": "number",
    },
  },
  "metadata":
  {
    "user": "test@epsilon3.io",
    "run_id": "QoxCWp4C6kSY5xWUmKj0ye",
    "run_starttime": "2022-12-25T22:34:53.623Z",
    "procedure_code": "Launch123",
    "procedure_name": "alpha",
    "procedure_version": "1.3a",
  }
}

Client Request

The request payload contains the following:

Example Response

{
  "name": "test.pressure.level",
  "success": true,
  "received_at": "2022-12-25T22:34:53.623Z", (ISO-8601 format)
  "message": "Pressure level tested" (optional)
}

Client Response

The optional message field can be used to return a string with additional information that will be shown on the UI.

External Data

For information on creating external data items to use within a procedure please see the External Data API Section

Listen for real-time requests for external data

The sample clients provide different namespaces to use websockets more efficiently and provide separate communication channels. For real-time external data, clients can listen for:

Namespace /v1/external-data/items

Event names search and item

Once a SocketIO or Webhook client is running, they will receive real-time requests triggered from procedures to retrieve external data.

Client Request

Example Request

{
  "type": "work_order",      // External Data Item type to query
  "term": "1234",             // Query search string
  "dictionary_id": 1,
  "metadata":
  {
    "user": "test@epsilon3.io",
    "run_id": "QoxCWp4C6kSY5xWUmKj0ye",
    "run_starttime": "2022-12-25T22:34:53.623Z",
    "procedure_code": "Launch123",
    "procedure_name": "alpha",
    "procedure_version": "1.3a",
  }
}

The request argument is an object containing the external data item type to query, the dictionaryId and a query search string.

Client Response

Example Response

"type": "places",
"success": true,
"message": "Items located.",
"items": [
  {
    "id": "unique id",
    "name": "Locations",
    "label": "Fun places",
    "url": "https://www.epsilon3.io",
    "valid": true,
    "details":[
      {
        "name": "City",
        "value": "Milwaukee"
      },
      {
        "name": "State",
        "value": "Wisconsin"
      },
    ]
  }
]

The client should return an object which contains

Notifications

The sample clients provide different namespaces to use websockets more efficiently and provide separate communication channels. For real-time notifications, clients can listen for:

Namespace /v1/notifications/realtime

Event name notification

Event subtypes

Once a socketIO or Webhook client is running, they will receive real-time requests triggered from procedures to send notifications.

Sending notifications

Notifications can be manually triggered in any running Epsilon3 procedure by clicking the notification button to the left of a step’s signoff buttons.

The returned object is a response object containing a single received property to indicate whether the notification was successfully processed by the client. A {'received': True} response is reflected in Epsilon3 by a success indicator. A {'received': False} response or a lack of response from any client is reflected in Epsilon3 by a failure indicator.

Success Indicator

Failure Indicator

Notification Objects

Notification event objects are received by a listener when a notification is emitted by the connected Epsilon3 workspace.

Notification Object

{
  "id": string,
  "type": string,
  "subtype": string,
  "timestamp": string, timestamp in ISO-8601 format,
  "api_version": float,
  "data": {
    "message": string,
    "run_url": string,
    "section_name": string,
    "step_name": string,
    "users_to_notify": array,
    "remaining_operator_roles": array,
    "notification_source": string
}

Example Notification Event Object

{
  "id": "event_URyUS086KeBSJQcCgA9ENNihHzvKMvWu",
  "type": "notification",
  "subtype": "remaining_step_operators",
  "timestamp": "2022-08-18T19:48:57.608Z",
  "api_version": 1,
  "data": {
    "message": "A step is waiting for your signoff.",
    "run_url": "https://app.epsilon3.io/runs/XmWQs0J3TfPDwQVJCAfJby",
    "section_name": "A",
    "step_name": "A1",
    "users_to_notify": [
      "user1@epsilon3.io",
      "user2@epsilon3.io"
    ],
    "remaining_operator_roles": ["OP1"],
    "notification_source": "user3@epsilon3.io"
  }
}

Telemetry

For information on creating telemetry parameters to use within a procedure please see the Telemetry API Section

Listen for real-time sample requests

The sample clients provide different namespaces to use websockets more efficiently and provide separate communication channels. For real-time telemetry, clients can listen for:

Namespace /v1/telemetry/realtime

Event name get_sample

Once a SocketIO or Webhook client is running, they will receive real-time requests triggered from procedures to retrieve telemetry parameters.

Send telemetry values to Epsilon3

Send telemetry values to Epsilon3 for use within procedures. As new requests are received, Epsilon3 will update any running procedures with the latest values in real time. Sending telemetry values to Epsilon3 will provide users these capabilities:

The Epsilon3 API uses Socket.IO to support real-time and bi-directional telemetry integrations with websockets. When applications connect to this API with a Socket.IO compatible client, they’ll receive real-time requests for telemetry samples. This allows for efficient polling of telemetry data as the API will only request samples for active running procedures. See Appendix 1 for a quick start guide that covers creating a Socket.IO client and connecting to the API using python-socketio.

Example Request

{
  "name": "test.simulation.error",
  "dictionary_id": 2,
  "operation": "To infinity and beyond!",
  "variables":
  {
    "test.variable1":
    {
      "name": "test.variable1",
      "input_type": "text",
      "value": "hello world"
    },
    "test.variable2":
    {
      "name": "test.variable2",
      "input_type": "number"
    }
  },
  "metadata":
  [
    {
      "user": "test@epsilon3.io",
      "run_id": "QoxCWp4C6kSY5xWUmKj0ye",
      "run_starttime": "2022-12-25T22:34:53.623Z",
      "procedure_code": "Launch123",
      "procedure_name": "alpha",
      "procedure_version": "1.3a"
    },
    {
      "user": "test2@epsilon3.io",
      "run_id": "w5ssf4QGzfYK7znXO6P4gZ",
      "run_starttime": "2022-12-25T23:12:4.123Z",
      "procedure_code": "Launch456",
      "procedure_name": "beta",
      "procedure_version": "1.0"
    }
  ]
}

Socket.IO provides different namespaces to use websockets more efficiently and provide separate communication channels. For real-time telemetry data, clients can listen for the event get_sample within the namespace /v1/telemetry/realtime. The request payload contains the following:

The returned object is a Sample object matching the indicated parameter. The recorded_at field is the time the telemetry value was recorded in ISO-8601 format. The value field should be a string representing the current telemetry value.