> ## Documentation Index
> Fetch the complete documentation index at: https://lava.so/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Epsilon3

> REST API for Epsilon3, an operations platform for building, running, and tracking procedures for complex hardware — spacecraft, satellites, energy, and manufacturing.

REST API for Epsilon3, an operations platform for building, running, and tracking procedures for complex hardware — spacecraft, satellites, energy, and manufacturing. Use when an agent needs to read or manage a team's procedures, live procedure runs, issues, telemetry parameters, build/inventory parts, or procurement records (purchase orders and vendors) inside their Epsilon3 workspace. Unlike generic project or checklist tools, Epsilon3 models step-by-step operational runs with commanding, telemetry, and test management for mission-critical hardware.

23 example endpoints available through Lava's AI Gateway. See the [Epsilon3 API docs](https://docs.epsilon3.io/) for full documentation.

<Warning>This provider requires your own credentials — connect your API key or OAuth account before use.</Warning>

<Info>This is a **catch-all provider** — any valid URL under `https://api.epsilon3.io` is supported. Any Epsilon3 REST endpoint. Construct URL as [https://api.epsilon3.io/v1/\&#123;path\&#125](https://api.epsilon3.io/v1/\&#123;path\&#125); (single-run retrieval is on /v2: GET /v2/runs/\{runId}). Note the shapes: list endpoints are /summary (GET /v1/procedures/summary, GET /v1/runs/summary), run lifecycle uses POST sub-resources (POST /v1/runs to start, then POST /v1/runs/\{runId}/pause, /resume, /end), and search is POST /v1/search with a JSON body. Purchase-order lifecycle: create = POST builds/orders (bulk purchase\_orders\[] envelope, created\_by required, state ignored — always draft), field updates = PATCH builds/orders/\{id} (flat vendor\_id, ship\_to\_name, ship\_to\_address, notes, delivery\_date), state = PUT builds/orders/\{id}/state (\{ order\_state }, the only way to change state), lines = POST builds/orders/\{id}/order-lines, approvals = POST builds/orders/\{id}/approvals. Vendors are list-only (GET builds/vendors; no per-id GET, create, or update documented). Unknown GET paths under api.epsilon3.io return the Epsilon3 web app as an HTML page rather than a JSON 404 — an HTML response means the path is not a real API route. Common roots: procedures/summary, procedures/\{id}, runs, runs/summary, runs/\{id}/(pause|resume|end|metadata|automation/start), search, issues, telemetry/parameters, commands, dictionaries, dictionary-groups, fields, forms, external-data, skills, settings/locations, testing/(conditions|risks|cases|requirements), builds/(parts|part-details|inventory|work-orders|orders|vendors|tools|shipments|customers|purchase-requests). Rate limit: 15,000 requests per 10-minute window per API key (429 on exceed). See [https://docs.epsilon3.io/](https://docs.epsilon3.io/) for the full reference. The endpoints below are curated examples.</Info>

## Endpoints

### List procedure summaries in the workspace

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

<Tabs>
  <Tab title="SDK">
    ```typescript theme={null}
    const data = await lava.gateway('https://api.epsilon3.io/v1/procedures/summary', { method: 'GET' });
    ```
  </Tab>

  <Tab title="cURL">
    ```bash theme={null}
    curl "https://api.lava.so/v1/forward?u=https%3A%2F%2Fapi.epsilon3.io%2Fv1%2Fprocedures%2Fsummary" \
      -H "Authorization: Bearer $LAVA_SECRET_KEY"
    ```
  </Tab>
</Tabs>

### Retrieve a single procedure by id

**GET** `https://api.epsilon3.io/v1/procedures/{procedureId}` — Free

<Tabs>
  <Tab title="SDK">
    ```typescript theme={null}
    const data = await lava.gateway('https://api.epsilon3.io/v1/procedures/{procedureId}', { method: 'GET' });
    ```
  </Tab>

  <Tab title="cURL">
    ```bash theme={null}
    curl "https://api.lava.so/v1/forward?u=https%3A%2F%2Fapi.epsilon3.io%2Fv1%2Fprocedures%2F%7BprocedureId%7D" \
      -H "Authorization: Bearer $LAVA_SECRET_KEY"
    ```
  </Tab>
</Tabs>

### List running procedure summaries. Filter with query params, e.g. ?run-state\[]=paused\&run-state\[]=running

**GET** `https://api.epsilon3.io/v1/runs/summary` — Free

<Tabs>
  <Tab title="SDK">
    ```typescript theme={null}
    const data = await lava.gateway('https://api.epsilon3.io/v1/runs/summary', { method: 'GET' });
    ```
  </Tab>

  <Tab title="cURL">
    ```bash theme={null}
    curl "https://api.lava.so/v1/forward?u=https%3A%2F%2Fapi.epsilon3.io%2Fv1%2Fruns%2Fsummary" \
      -H "Authorization: Bearer $LAVA_SECRET_KEY"
    ```
  </Tab>
</Tabs>

### Retrieve a single run by id (Runs V2 API, /v2 path)

**GET** `https://api.epsilon3.io/v2/runs/{runId}` — Free

<Tabs>
  <Tab title="SDK">
    ```typescript theme={null}
    const data = await lava.gateway('https://api.epsilon3.io/v2/runs/{runId}', { method: 'GET' });
    ```
  </Tab>

  <Tab title="cURL">
    ```bash theme={null}
    curl "https://api.lava.so/v1/forward?u=https%3A%2F%2Fapi.epsilon3.io%2Fv2%2Fruns%2F%7BrunId%7D" \
      -H "Authorization: Bearer $LAVA_SECRET_KEY"
    ```
  </Tab>
</Tabs>

### Start a running procedure. Body requires procedure\_id and can optionally pre-populate procedure\_variables (values typed per the procedure variable: string | number | boolean). Returns \{ run\_id, run\_number }.

**POST** `https://api.epsilon3.io/v1/runs` — Free

<Tabs>
  <Tab title="SDK">
    ```typescript theme={null}
    const data = await lava.gateway('https://api.epsilon3.io/v1/runs', {
      body: {
    "procedure_id": "{procedureId}",
    "procedure_variables": {
      "manufacturer": "tesla",
      "VIN": 12345
    }
    },
    });
    ```
  </Tab>

  <Tab title="cURL">
    ```bash theme={null}
    curl -X POST "https://api.lava.so/v1/forward?u=https%3A%2F%2Fapi.epsilon3.io%2Fv1%2Fruns" \
      -H "Authorization: Bearer $LAVA_SECRET_KEY" \
      -H "Content-Type: application/json" \
      -d '{"procedure_id":"{procedureId}","procedure_variables":{"manufacturer":"tesla","VIN":12345}}'
    ```
  </Tab>
</Tabs>

### Pause a running procedure by run id (resume via /resume)

**POST** `https://api.epsilon3.io/v1/runs/{runId}/pause` — Free

<Tabs>
  <Tab title="SDK">
    ```typescript theme={null}
    const data = await lava.gateway('https://api.epsilon3.io/v1/runs/{runId}/pause', { method: 'POST' });
    ```
  </Tab>

  <Tab title="cURL">
    ```bash theme={null}
    curl -X POST "https://api.lava.so/v1/forward?u=https%3A%2F%2Fapi.epsilon3.io%2Fv1%2Fruns%2F%7BrunId%7D%2Fpause" \
      -H "Authorization: Bearer $LAVA_SECRET_KEY" \
      -H "Content-Type: application/json"
    ```
  </Tab>
</Tabs>

### End a running procedure by run id

**POST** `https://api.epsilon3.io/v1/runs/{runId}/end` — Free

<Tabs>
  <Tab title="SDK">
    ```typescript theme={null}
    const data = await lava.gateway('https://api.epsilon3.io/v1/runs/{runId}/end', { method: 'POST' });
    ```
  </Tab>

  <Tab title="cURL">
    ```bash theme={null}
    curl -X POST "https://api.lava.so/v1/forward?u=https%3A%2F%2Fapi.epsilon3.io%2Fv1%2Fruns%2F%7BrunId%7D%2Fend" \
      -H "Authorization: Bearer $LAVA_SECRET_KEY" \
      -H "Content-Type: application/json"
    ```
  </Tab>
</Tabs>

### Full-text search across workspace resources. Body: \{ query: string, filters?: \{ procedures?: string\[], runs?: string\[] }, include\_archived?: boolean }. Optional query params resource\_type, from\_date, to\_date narrow the scope.

**POST** `https://api.epsilon3.io/v1/search` — Free

<Tabs>
  <Tab title="SDK">
    ```typescript theme={null}
    const data = await lava.gateway('https://api.epsilon3.io/v1/search', {
      body: {
    "query": "valve check",
    "filters": {
      "procedures": [
        "released"
      ],
      "runs": [
        "running",
        "paused"
      ]
    },
    "include_archived": false
    },
    });
    ```
  </Tab>

  <Tab title="cURL">
    ```bash theme={null}
    curl -X POST "https://api.lava.so/v1/forward?u=https%3A%2F%2Fapi.epsilon3.io%2Fv1%2Fsearch" \
      -H "Authorization: Bearer $LAVA_SECRET_KEY" \
      -H "Content-Type: application/json" \
      -d '{"query":"valve check","filters":{"procedures":["released"],"runs":["running","paused"]},"include_archived":false}'
    ```
  </Tab>
</Tabs>

### Retrieve a list of issues. Filter with query params, e.g. ?status\_types\[]=active\&run\_id=\{runId}

**GET** `https://api.epsilon3.io/v1/issues` — Free

<Tabs>
  <Tab title="SDK">
    ```typescript theme={null}
    const data = await lava.gateway('https://api.epsilon3.io/v1/issues', { method: 'GET' });
    ```
  </Tab>

  <Tab title="cURL">
    ```bash theme={null}
    curl "https://api.lava.so/v1/forward?u=https%3A%2F%2Fapi.epsilon3.io%2Fv1%2Fissues" \
      -H "Authorization: Bearer $LAVA_SECRET_KEY"
    ```
  </Tab>
</Tabs>

### Create an issue. Body requires title and project\_id (string | null); optional fields include notes, run\_id, severity\_id, status\_id, assignee, reference\_id, reference\_type, and details. Returns \{ id }.

**POST** `https://api.epsilon3.io/v1/issues` — Free

<Tabs>
  <Tab title="SDK">
    ```typescript theme={null}
    const data = await lava.gateway('https://api.epsilon3.io/v1/issues', {
      body: {
    "title": "Valve leak during pressurization",
    "project_id": "h78svHgfi4",
    "notes": "Observed a slow leak on the main oxidizer valve.",
    "run_id": "{runId}"
    },
    });
    ```
  </Tab>

  <Tab title="cURL">
    ```bash theme={null}
    curl -X POST "https://api.lava.so/v1/forward?u=https%3A%2F%2Fapi.epsilon3.io%2Fv1%2Fissues" \
      -H "Authorization: Bearer $LAVA_SECRET_KEY" \
      -H "Content-Type: application/json" \
      -d '{"title":"Valve leak during pressurization","project_id":"h78svHgfi4","notes":"Observed a slow leak on the main oxidizer valve.","run_id":"{runId}"}'
    ```
  </Tab>
</Tabs>

### Update an existing issue by id

**PATCH** `https://api.epsilon3.io/v1/issues/{issueId}` — Free

<Tabs>
  <Tab title="SDK">
    ```typescript theme={null}
    const data = await lava.gateway('https://api.epsilon3.io/v1/issues/{issueId}', { method: 'PATCH', body: {"status_id":"123"} });
    ```
  </Tab>

  <Tab title="cURL">
    ```bash theme={null}
    curl -X PATCH "https://api.lava.so/v1/forward?u=https%3A%2F%2Fapi.epsilon3.io%2Fv1%2Fissues%2F%7BissueId%7D" \
      -H "Authorization: Bearer $LAVA_SECRET_KEY" \
      -H "Content-Type: application/json" \
      -d '{"status_id":"123"}'
    ```
  </Tab>
</Tabs>

### List all available telemetry parameters

**GET** `https://api.epsilon3.io/v1/telemetry/parameters` — Free

<Tabs>
  <Tab title="SDK">
    ```typescript theme={null}
    const data = await lava.gateway('https://api.epsilon3.io/v1/telemetry/parameters', { method: 'GET' });
    ```
  </Tab>

  <Tab title="cURL">
    ```bash theme={null}
    curl "https://api.lava.so/v1/forward?u=https%3A%2F%2Fapi.epsilon3.io%2Fv1%2Ftelemetry%2Fparameters" \
      -H "Authorization: Bearer $LAVA_SECRET_KEY"
    ```
  </Tab>
</Tabs>

### Bulk create or update telemetry parameters. See the Telemetry API docs for the request body.

**PUT** `https://api.epsilon3.io/v1/telemetry/parameters/bulk` — Free

<Tabs>
  <Tab title="SDK">
    ```typescript theme={null}
    const data = await lava.gateway('https://api.epsilon3.io/v1/telemetry/parameters/bulk', { method: 'PUT' });
    ```
  </Tab>

  <Tab title="cURL">
    ```bash theme={null}
    curl -X PUT "https://api.lava.so/v1/forward?u=https%3A%2F%2Fapi.epsilon3.io%2Fv1%2Ftelemetry%2Fparameters%2Fbulk" \
      -H "Authorization: Bearer $LAVA_SECRET_KEY" \
      -H "Content-Type: application/json"
    ```
  </Tab>
</Tabs>

### List parts from the builds/inventory catalog. Returns \{ parts, pagination: \{ total, next\_page\_token } }. Filter with partNumber (case-insensitive; repeat it to match several: ?partNumber=A\&partNumber=B), or partId, projectId, procurementType, tracking, tag, preferredVendor, assembly. Sort with sort=part\_number|created\_at and order=asc|desc. Page with ?pageToken=\<next\_page\_token>; limit must be 1000 or fewer (a higher value returns 422).

**GET** `https://api.epsilon3.io/v1/builds/parts?partNumber={partNumber}` — Free

<Tabs>
  <Tab title="SDK">
    ```typescript theme={null}
    const data = await lava.gateway('https://api.epsilon3.io/v1/builds/parts?partNumber={partNumber}', { method: 'GET' });
    ```
  </Tab>

  <Tab title="cURL">
    ```bash theme={null}
    curl "https://api.lava.so/v1/forward?u=https%3A%2F%2Fapi.epsilon3.io%2Fv1%2Fbuilds%2Fparts%3FpartNumber%3D%7BpartNumber%7D" \
      -H "Authorization: Bearer $LAVA_SECRET_KEY"
    ```
  </Tab>
</Tabs>

### Update an existing part by id

**PATCH** `https://api.epsilon3.io/v1/builds/parts/{partId}` — Free

<Tabs>
  <Tab title="SDK">
    ```typescript theme={null}
    const data = await lava.gateway('https://api.epsilon3.io/v1/builds/parts/{partId}', { method: 'PATCH' });
    ```
  </Tab>

  <Tab title="cURL">
    ```bash theme={null}
    curl -X PATCH "https://api.lava.so/v1/forward?u=https%3A%2F%2Fapi.epsilon3.io%2Fv1%2Fbuilds%2Fparts%2F%7BpartId%7D" \
      -H "Authorization: Bearer $LAVA_SECRET_KEY" \
      -H "Content-Type: application/json"
    ```
  </Tab>
</Tabs>

### Delete a part. The part identifier is supplied in the request body; see the Builds API docs.

**DELETE** `https://api.epsilon3.io/v1/builds/parts` — Free

<Tabs>
  <Tab title="SDK">
    ```typescript theme={null}
    const data = await lava.gateway('https://api.epsilon3.io/v1/builds/parts', { method: 'DELETE' });
    ```
  </Tab>

  <Tab title="cURL">
    ```bash theme={null}
    curl -X DELETE "https://api.lava.so/v1/forward?u=https%3A%2F%2Fapi.epsilon3.io%2Fv1%2Fbuilds%2Fparts" \
      -H "Authorization: Bearer $LAVA_SECRET_KEY" \
      -H "Content-Type: application/json"
    ```
  </Tab>
</Tabs>

### Retrieve all purchase orders in the workspace. Returns \{ purchase\_orders: \[...] } with id, code (e.g. PO-1), state, vendor, lines, and delivery\_date per order.

**GET** `https://api.epsilon3.io/v1/builds/orders` — Free

<Tabs>
  <Tab title="SDK">
    ```typescript theme={null}
    const data = await lava.gateway('https://api.epsilon3.io/v1/builds/orders', { method: 'GET' });
    ```
  </Tab>

  <Tab title="cURL">
    ```bash theme={null}
    curl "https://api.lava.so/v1/forward?u=https%3A%2F%2Fapi.epsilon3.io%2Fv1%2Fbuilds%2Forders" \
      -H "Authorization: Bearer $LAVA_SECRET_KEY"
    ```
  </Tab>
</Tabs>

### Retrieve a single purchase order by its 22-character id

**GET** `https://api.epsilon3.io/v1/builds/orders/{purchaseOrderId}` — Free

<Tabs>
  <Tab title="SDK">
    ```typescript theme={null}
    const data = await lava.gateway('https://api.epsilon3.io/v1/builds/orders/{purchaseOrderId}', { method: 'GET' });
    ```
  </Tab>

  <Tab title="cURL">
    ```bash theme={null}
    curl "https://api.lava.so/v1/forward?u=https%3A%2F%2Fapi.epsilon3.io%2Fv1%2Fbuilds%2Forders%2F%7BpurchaseOrderId%7D" \
      -H "Authorization: Bearer $LAVA_SECRET_KEY"
    ```
  </Tab>
</Tabs>

### Create one or more purchase orders (bulk envelope). Body: \{ purchase\_orders: \[\{ created\_by (required), vendor\_id (flat id string, NOT a nested vendor object), ship\_to\_name, ship\_to\_address, delivery\_date (MM/DD/YYYY), notes, lines: \[\{ part\_revision\_id, description, unit\_amount, quantity }] }] }. The code (PO-N) and id are system-generated and cannot be supplied. State cannot be set here — new orders are always draft; transition via PUT .../orders/\{id}/state.

**POST** `https://api.epsilon3.io/v1/builds/orders` — Free

<Tabs>
  <Tab title="SDK">
    ```typescript theme={null}
    const data = await lava.gateway('https://api.epsilon3.io/v1/builds/orders', {
      body: {
    "purchase_orders": [
      {
        "created_by": "jane.doe@example.com",
        "vendor_id": "{vendorId}",
        "ship_to_name": "Headquarters",
        "ship_to_address": "123 Alpha Way\nAnytown USA\n10101",
        "delivery_date": "07/01/2026",
        "notes": "Rush order",
        "lines": [
          {
            "part_revision_id": "{partRevisionId}",
            "description": "Rocket Engine",
            "unit_amount": 8000,
            "quantity": 1
          }
        ]
      }
    ]
    },
    });
    ```
  </Tab>

  <Tab title="cURL">
    ```bash theme={null}
    curl -X POST "https://api.lava.so/v1/forward?u=https%3A%2F%2Fapi.epsilon3.io%2Fv1%2Fbuilds%2Forders" \
      -H "Authorization: Bearer $LAVA_SECRET_KEY" \
      -H "Content-Type: application/json" \
      -d '{"purchase_orders":[{"created_by":"jane.doe@example.com","vendor_id":"{vendorId}","ship_to_name":"Headquarters","ship_to_address":"123 Alpha Way\nAnytown USA\n10101","delivery_date":"07/01/2026","notes":"Rush order","lines":[{"part_revision_id":"{partRevisionId}","description":"Rocket Engine","unit_amount":8000,"quantity":1}]}]}'
    ```
  </Tab>
</Tabs>

### Update fields on an existing purchase order: vendor\_id, ship\_to\_name, ship\_to\_address, delivery\_date (MM/DD/YYYY), sales\_tax\_basis\_points, tax\_jurisdiction\_id, discount\_bp, notes, work\_order\_id, details, attachments. Pass null to clear a field. State and line items cannot be changed here — use the dedicated state and order-lines endpoints.

**PATCH** `https://api.epsilon3.io/v1/builds/orders/{purchaseOrderId}` — Free

<Tabs>
  <Tab title="SDK">
    ```typescript theme={null}
    const data = await lava.gateway('https://api.epsilon3.io/v1/builds/orders/{purchaseOrderId}', {
      method: 'PATCH',
      body: {
    "vendor_id": "{vendorId}",
    "ship_to_name": "Headquarters",
    "ship_to_address": "123 Alpha Way\nAnytown USA\n10101",
    "notes": "Updated delivery instructions"
    },
    });
    ```
  </Tab>

  <Tab title="cURL">
    ```bash theme={null}
    curl -X PATCH "https://api.lava.so/v1/forward?u=https%3A%2F%2Fapi.epsilon3.io%2Fv1%2Fbuilds%2Forders%2F%7BpurchaseOrderId%7D" \
      -H "Authorization: Bearer $LAVA_SECRET_KEY" \
      -H "Content-Type: application/json" \
      -d '{"vendor_id":"{vendorId}","ship_to_name":"Headquarters","ship_to_address":"123 Alpha Way\nAnytown USA\n10101","notes":"Updated delivery instructions"}'
    ```
  </Tab>
</Tabs>

### Transition a purchase order to a new state — the only endpoint that can change a purchase order's state. Body: \{ order\_state } with one of draft, submitted, closed, canceled, in\_review, partially\_received, fully\_received.

**PUT** `https://api.epsilon3.io/v1/builds/orders/{purchaseOrderId}/state` — Free

<Tabs>
  <Tab title="SDK">
    ```typescript theme={null}
    const data = await lava.gateway('https://api.epsilon3.io/v1/builds/orders/{purchaseOrderId}/state', { method: 'PUT', body: {"order_state":"submitted"} });
    ```
  </Tab>

  <Tab title="cURL">
    ```bash theme={null}
    curl -X PUT "https://api.lava.so/v1/forward?u=https%3A%2F%2Fapi.epsilon3.io%2Fv1%2Fbuilds%2Forders%2F%7BpurchaseOrderId%7D%2Fstate" \
      -H "Authorization: Bearer $LAVA_SECRET_KEY" \
      -H "Content-Type: application/json" \
      -d '{"order_state":"submitted"}'
    ```
  </Tab>
</Tabs>

### Add, update, or remove line items on an existing purchase order. Body: \{ added: \[\{ part\_revision\_id, description, unit\_amount, quantity }], updated: \[\{ id, ... }], removed: \[\{ id }] }.

**POST** `https://api.epsilon3.io/v1/builds/orders/{purchaseOrderId}/order-lines` — Free

<Tabs>
  <Tab title="SDK">
    ```typescript theme={null}
    const data = await lava.gateway('https://api.epsilon3.io/v1/builds/orders/{purchaseOrderId}/order-lines', {
      body: {
    "added": [
      {
        "part_revision_id": "{partRevisionId}",
        "description": "Rocket Engine",
        "unit_amount": 8000,
        "quantity": 1
      }
    ]
    },
    });
    ```
  </Tab>

  <Tab title="cURL">
    ```bash theme={null}
    curl -X POST "https://api.lava.so/v1/forward?u=https%3A%2F%2Fapi.epsilon3.io%2Fv1%2Fbuilds%2Forders%2F%7BpurchaseOrderId%7D%2Forder-lines" \
      -H "Authorization: Bearer $LAVA_SECRET_KEY" \
      -H "Content-Type: application/json" \
      -d '{"added":[{"part_revision_id":"{partRevisionId}","description":"Rocket Engine","unit_amount":8000,"quantity":1}]}'
    ```
  </Tab>
</Tabs>

### Retrieve all vendors in the workspace. Returns \{ vendors: \[...] } with id, name, address, contact, emails, and team\_id per vendor. This is the only documented vendor read — there is no per-id vendor GET.

**GET** `https://api.epsilon3.io/v1/builds/vendors` — Free

<Tabs>
  <Tab title="SDK">
    ```typescript theme={null}
    const data = await lava.gateway('https://api.epsilon3.io/v1/builds/vendors', { method: 'GET' });
    ```
  </Tab>

  <Tab title="cURL">
    ```bash theme={null}
    curl "https://api.lava.so/v1/forward?u=https%3A%2F%2Fapi.epsilon3.io%2Fv1%2Fbuilds%2Fvendors" \
      -H "Authorization: Bearer $LAVA_SECRET_KEY"
    ```
  </Tab>
</Tabs>

## Next Steps

<CardGroup cols={2}>
  <Card title="All Providers" icon="grid" href="/gateway/supported-providers">
    Browse all supported AI providers
  </Card>

  <Card title="Forward Proxy" icon="route" href="/gateway/forward-proxy">
    Learn how to construct proxy URLs and authenticate requests
  </Card>
</CardGroup>
