HeadlessOps
API Reference

Integration Files API

Upload, download, push, and deploy integration files

Integration Files API

Endpoints

GET /api/integrations/:name/files

List integration files.

Auth: API Key | Min Role: VIEWER | MCP: integrations:read

Query parameters:

ParameterDescription
moderead (default) — returns filename, size, and content snippet (~200 chars). download — returns full file content map.
folderPath(download mode only) Absolute local folder path where files will be written by the local proxy.

Read mode response:

{ "files": [{ "filename": "integration.yaml", "sizeBytes": 512, "snippet": "name: my-automation..." }], "totalFiles": 2, "totalSizeBytes": 1024 }

GET /api/integrations/:name/files/:filename

Get the full content of a specific integration file.

Auth: API Key | Min Role: VIEWER


PUT /api/integrations/:name/files/:filename

Create or update a single integration file (upsert).

Auth: API Key | Min Role: DEVELOPER

Body: { "content": "file content here" }


DELETE /api/integrations/:name/files/:filename

Delete an integration file. integration.yaml cannot be deleted.

Auth: API Key | Min Role: DEVELOPER

Response: { "ok": true }


POST /api/integrations/:name/deploy

Snapshot the current files as a versioned deployment.

Auth: API Key | Min Role: DEVELOPER | MCP: integrations:write

Body: { "name": "v1.2", "description": "Optional version label" }

Response: { "ok": true, "lastDeployedAt": "2026-01-15T10:00:00Z" }


POST /api/integrations/:name/push

Upsert files and snapshot a deployment without triggering a run.

Auth: API Key | Min Role: DEVELOPER | MCP: integrations:write

Body:

{
  "files": { "integration.yaml": "...", "step.ts": "..." },
  "description": "Optional version label"
}

Or use folderPath to load all supported files from a server-side directory:

{ "folderPath": "/absolute/path/to/integration/folder" }

Response: 201 { "ok": true, "version": 3, "fileCount": 2, "lastDeployedAt": "..." }


POST /api/integrations/:name/push-run

Atomic push-and-run: upsert files, snapshot a deployment, trigger a run, and return the runId. The integration is created automatically if it does not exist.

Auth: API Key | Min Role: DEVELOPER | MCP: integrations:write

Body:

{
  "files": {
    "integration.yaml": "name: my-automation\ntrigger:\n  type: manual\nsteps:\n  - id: greet\n    name: Greet\n    description: Returns hello\n    file: greet.ts",
    "greet.ts": "export async function run(input: Record<string, any>, ctx: StepContext) {\n    return { message: \"hello\" };\n}"
  },
  "payload": { "key": "value" }
}

Or with folderPath:

{ "folderPath": "/absolute/path/to/folder", "payload": {} }

Response: 201 { "runId": "run_abc123", "status": "RUNNING" }

Supported file extensions: .yaml, .yml, .ts, .json, .md, .txt