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
partId
(path parameter): ID of the part being retrieved.revisionId
(query parameter): optional ID used to retrieve a specific part revision
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
part_number
: (required) Part Number or Identifier, unique across all parts in the workspace. Must be a string of up to 64 characters.revision
: (required) Revision Identifier. Must be a string of up to 64 characters.name
: (required) Part Name. Must be a string of up to 128 characters.tracking
: (required) Tracking type used for part. Must be one ofserial
,lot
, ornone
.description
: (optional) Part description. Must be a string of up to 512 characters.assembly
: (optional) Mark part as assembly. Must be a boolean value.components
: (optional) Part components. Must be an array of objects with the following format:part_number
: (required) Part Number of the component partrevision
: (required) Revision identifier of the component partquantity
: (required) Number of component parts. Must be a positive integer
details
: (optional) Custom part detail fields to set on the part. Must be an array of objects with the following format:id
: (required) ID of the part detail being setvalue
: (required) Value to set for the part detail
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:
revision
: (optional) Revision Identifier. Must be a string of up to 64 characters.- Updating the value of this field creates a new revision for the part.
name
: (optional) Part Name. Must be a string of up to 128 characters.tracking
: (optional) Tracking type used for part. Must be one ofserial
,lot
, ornone
.description
: (optional) Part description. Must be a string of up to 512 characters.assembly
: (optional) Mark part as assembly. Must be a boolean value.components
: (optional) Part components.- Must be an array of objects with the following fields:
part_number
: (required) Part Number of the component partrevision
: (required) Revision identifier of the component partquantity
: (required) Number of component parts. Must be a positive integer- The array provided in this request will replace the existing array of components. Specify an empty array to remove all components from a part.
- Component parts must already exist.
details
: (optional) Custom part detail fields to set or unset on the part.- Must be an array of objects with the following format:
id
: (required) ID of the part detail being setvalue
: (required) Value to set for the part detail. Set to a blank string to unset- Details already set on the part, but not provided in this array, will not be affected
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
partId
(query parameter): optional ID used to retrieve items only for a specific part. Specify the parameter multiple times, once for each specific part ID, to retrieve items for multiple specific parts.includeConsumed
(query parameter): optional parameter that can be set to indicate whether to include items with quantity value of 0. Must be eithertrue
orfalse
. Defaults totrue
.
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
items
: (required) An array of objects with the following fieldspart_id
: (required) System generated ID of the part of which this item is an instance. Must be a string.part_revision_id
: (optional) System generated ID for a specific revision of the part. If not specified, the latest part revision is used to create the item. Must be a string.tracking_id
: (required) Serial or Lot # of the item if it is a tracked item. Blank string if it is an untracked item. Must be a string of up to 64 characters.quantity
: (required) Item count. Must be a non negative integer. Count can only be either0
or1
for serial tracked items.location_id
: (optional) System generated ID of the specific location where this item should be located.unit_cost_cents
: (optional) Unit cost of item in US cents. Must be a non negative integer.notes
: (optional) Any notes to attach to the item. Notes are displayed in the Epsilon3 Builds UI with support for Markdown. Must be a string of up to 4096 characters.
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:
quantity
: (optional) Must be a non-negative integer. For serial tracked items, must be either0
or1
.location_id
: (optional) Location ID mapped to the location. Set tonull
to remove.unit_cost_cents
: (optional) Unit Cost of item in U.S. cents. Set tonull
to remove.notes
: (optional) Free text notes to attach to item. Must be a string of up to 4096 characters.
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
itemId
(path parameter): ID of the item for which to list activitystartBeforeId
(query parameter): optional integer that can be used to list older activity. When this is set, up to twenty five most recent actions that are older than the activity mapped to this ID are listed.
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:
- Search for and insert commands when creating a procedure
- Send commands to external systems with optional arguments in a running procedure
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:
float
int
string
enum
file
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:
- Limit telemetry, commanding, and external data fields to specific dictionaries during procedure edit
- Switch dictionaries in procedures and retain commands that have the same name
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
- start (required unless exclude_recurrences or eventType is 'unscheduled'): The start of the time range to fetch events from. Should be in ISO string format.
- end (required unless exclude_recurrences or eventType is 'unscheduled'): The end of the time range to fetch events from. Should be in ISO string format.
- eventType (optional): To get 'unscheduled' events, pass this as a query parameter. If provided with 'unscheduled', start and end parameters become optional.
- exclude_recurrences (optional): To get only non-recurring events, pass this as a query parameter with value true. If provided, start and end parameters become optional.
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
eventId
(path parameter): Id of the event.
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
eventId
(path parameter): Id of the event.
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:
name
: (required) Event name, must be a string.start
: (optional) Start time of the event, must be an ISO datetime string.duration
: (optional) Duration of event, must be in ISO 8601 duration string. This is used to calculate event's end date.procedure_id
: (optional) Procedure id.procedure_section_id
: (optional) Procedure section id.run_id
: (optional) Run id.swimlane_id
: (optional) Swimlane id.dependencies
: (optional) Dependencies of the event, must be an object.dependencies.in
: (optional) Incoming dependencies, must be an array.dependencies.out
: (optional) Outgoing dependencies, must be an array.
rrule
: (optional) Recurrence rule.recurrence_id
: (optional) Recurrence id.description
: (optional) Event description.notes
: (optional) Event notes.status
: (optional) Event status can be one of these following values: 'completed' | 'running' | 'paused' | 'success' | 'abort' | 'failure' | 'planning' | 'ended';milestone
: (optional)
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:
name
: (required) Event name, must be a string.start
: (optional) Start time of the event, must be an ISO datetime string.duration
: (optional) Duration of event, must be in ISO 8601 duration string. This is used to calculate event's end date.procedure_id
: (optional) Procedure id.procedure_section_id
: (optional) Procedure section id.swimlane_id
: (optional) Swimlane id.dependencies
: (optional) Dependencies of the event, must be an object.dependencies.in
: (optional) Incoming dependencies, must be an array.dependencies.out
: (optional) Outgoing dependencies, must be an array.
rrule
: (optional) Recurrence rule.description
: (optional) Event description.notes
: (optional) Event notes.status
: (optional) Event status can be one of these following values: 'completed' | 'running' | 'paused' | 'success' | 'abort' | 'failure' | 'planning' | 'ended';milestone
: (optional)
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
eventId
(path parameter): Id of the event.
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 an external data type that can be selected from a dropdown in procedures
- Connect an external data service that can be queried in procedures
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
swimlane_id
(path parameter): Id of the swimlane.
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:
name
: (required) Swimlane name, must be a string.
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:
name
: (required) Swimlane name, must be a string.
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
swimlane_id
(path parameter): Id of the swimlane.
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:
- Search by parameter name for manual input of telemetry values in procedures
- Display parameter description and automatically populate units
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:
float
int
string
bool
enum
aggregate
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
id
(path parameter): ID of the condtion being retrieved.
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
id
(path parameter): ID of the hazard being retrieved.
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
id
(path parameter): ID of the hazard being retrieved.
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
id
(path parameter): ID of the hazard being retrieved.versionId
(path parameter): ID of the version being retrieved.
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
id
(path parameter): ID of the test point being retrieved.
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
id
(path parameter): ID of the test point being retrieved.
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
id
(path parameter): ID of the test point being retrieved.versionId
(path parameter): ID of the version being retrieved.
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
id
(path parameter): ID of the requirement being retrieved.
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
id
(path parameter): ID of the requirement being retrieved.
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
id
(path parameter): ID of the requirement being retrieved.versionId
(path parameter): ID of the version being retrieved.
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."
}
}