Nextract

API Reference

OpenAPI-style reference for authentication, environments, inbound integrations, file uploads, and webhooks.

Introduction

Public HTTP API for inbound integrations — environment-scoped catalog discovery, authenticated file uploads, and webhook payloads.

Base URL

All paths below are relative to https://nextract.littleharborlabs.com. Replace {orgSlug} with your organization slug (visible in the studio URL and integration settings).

REST catalog

/api/v1/orgs/{orgSlug}/integrations

Discover published inbound integrations and upload files to authenticated API ingest endpoints.

Webhooks

/api/hooks/{orgSlug}/{pathSegment}

POST raw JSON or CSV bodies. The pipeline runs synchronously and returns a run id.

MCP agents

AI coding-agent tools (Cursor, Claude, and others) live on MCP Reference · Public MCP docs. They authenticate with an OAuth access_token minted from the Client ID and Client secret — not this partner Bearer key. See Access token.

Create API keys in Settings → API Access. Pin a key to an environment so partners only see that stage (Development, QA, Staging, or Production). Assign authorized clients per integration in the studio when configuring inbound sources. Configuration changes are made in the studio; these endpoints are for runtime traffic only. Queue sources such as Amazon SQS are configured in the studio (Source → Amazon SQS) and polled by the worker — they are not exposed as public HTTP ingest endpoints.

Authentication

Every public API request must include a valid organization API key.

Request headers

Authorization: Bearer nex_wh_…
# or
X-API-Key: nex_wh_…

Create a client in Settings → API Access. Copy the Client secret (prefixed nex_wh_, hashed at rest) and send it as the Bearer token on every /api/v1 request.

  • Catalog endpoints — any enabled organization API key.
  • Upload & webhook endpoints — the key must also be authorized on that specific integration in the studio.
  • Disabled keys and keys removed from an integration's allow list receive 401.
  • Environment pin — optional on each client. When set, catalog, lifecycle, ingest, and run status are limited to that stage. Hitting another environment returns 403. Unpinned keys see every environment (legacy). MCP still requires a pin.
  • MCP — copy both Client ID and Client secret, exchange them at POST /api/oauth/token (grant_type=client_credentials), then send the returned access_token to POST /api/mcp. Walkthrough: MCP Reference → Access token.

Environments

Integrations, files, and API keys belong to a stage: Development, QA, Staging, or Production. Promote copies in the studio; the public API stays scoped to the key’s pin.

How scoping works

Pin the client in Settings → API Access. Unpinned keys may pass ?environment={slug} on list endpoints. Watch-folder paths include the environment slug (./organization/acme-inc/development/inbound/…). Manage stages in Environments.

GEThttps://nextract.littleharborlabs.com/api/v1/orgs/{orgSlug}/environments

List environments

Returns the organization’s stages. A pinned API key only sees its pin.

Security

ApiKeyAuth (organization)

Parameters

NameInTypeRequiredDescription
orgSlugpathstringYesOrganization slug (e.g. acme-inc).

Responses

200

Environment catalog.

401

Missing or invalid API key.

404

Organization not found.

429

Rate limit exceeded.

cURL

curl -s \
  -H "Authorization: Bearer $NEXTRACT_API_KEY" \
  "https://nextract.littleharborlabs.com/api/v1/orgs/acme-inc/environments"

200 — Environment catalog.

{
  "ok": true,
  "organization": { "slug": "acme-inc" },
  "environments": [
    { "slug": "development", "name": "Development", "kind": "DEV" },
    { "slug": "qa", "name": "Quality Assurance", "kind": "QA" },
    { "slug": "staging", "name": "Staging", "kind": "STAGING" },
    { "slug": "prod", "name": "Production", "kind": "PROD" }
  ]
}

401 — Missing or invalid API key.

{
  "ok": false,
  "error": "Invalid or unauthorized API key"
}

404 — Organization not found.

{
  "ok": false,
  "error": "Invalid or unauthorized API key"
}

Rate limiting

Requests are throttled per organization and API key.

The default limit is 60 requests per minute per API key (or client IP when unauthenticated). Individual API clients may have a lower custom quota configured per API client via the optional rateLimitPerMinute field (when unset, the global default applies). Override the global default with NEXTRACT_PUBLIC_API_RATE_LIMIT_PER_MINUTE on the server.

Successful responses include rate limit headers: X-RateLimit-Limit, X-RateLimit-Remaining, and X-RateLimit-Reset (Unix timestamp).

429 Too Many Requests

HTTP/1.1 429 Too Many Requests
Retry-After: 42
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 1751836842

{
  "ok": false,
  "error": "Rate limit exceeded"
}

Errors

Error responses use a consistent JSON envelope.

Error body

{
  "ok": false,
  "error": "Invalid or unauthorized API key"
}
400

Invalid body, empty file, or a payload the integration cannot parse.

401

Missing, disabled, or unauthorized API key.

403

API client is pinned to a different environment, or the key lacks the required scope.

404

Organization, environment, integration, webhook, or run was not found.

409

Lifecycle conflict — for example pausing an integration that is not published.

413

Webhook body larger than 2 MB.

429

Rate limit exceeded. Wait for Retry-After, then send the request again.

500

The pipeline failed while processing a synchronous request.

Upload and webhook integrations can override the default status for auth, validation, not-found, and processing errors. The defaults are 401, 400, 404, and 500.

Integrations API

Read-only catalog of published integrations that accept external traffic. Scoped to the API key’s environment pin, or to ?environment= when the key is unpinned.

GEThttps://nextract.littleharborlabs.com/api/v1/orgs/{orgSlug}/integrations

List inbound integrations

Returns published integrations with an inbound file API or webhook source, including each row’s environment. Use this to discover path segments and endpoint URLs for integrators.

Security

ApiKeyAuth (organization)

Parameters

NameInTypeRequiredDescription
orgSlugpathstringYesOrganization slug (e.g. acme-inc).
environmentquerystringNoOptional environment slug (development, qa, staging, prod). Pinned keys are always limited to their pin; a mismatch returns 403.

Responses

200

Catalog of inbound integrations.

401

Missing or invalid API key.

403

Pinned key queried a different environment.

404

Organization or environment not found.

429

Rate limit exceeded.

500

Unexpected server error.

cURL

curl -s \
  -H "Authorization: Bearer $NEXTRACT_API_KEY" \
  "https://nextract.littleharborlabs.com/api/v1/orgs/acme-inc/integrations?environment=development"

200 — Catalog of inbound integrations.

{
  "ok": true,
  "organization": { "slug": "acme-inc" },
  "integrations": [
    {
      "id": "wf_abc123",
      "name": "Orders inbound",
      "description": "Daily order file intake",
      "pathSegment": "orders-in",
      "sourceType": "api_file_ingest",
      "endpointUrl": "https://nextract.littleharborlabs.com/api/v1/orgs/acme-inc/integrations/orders-in/files",
      "watchPath": "./organization/acme-inc/development/inbound/orders-in",
      "glob": "**/*",
      "allowedClientCount": 2,
      "environment": { "slug": "development", "name": "Development", "kind": "DEV" }
    },
    {
      "id": "wf_def456",
      "name": "Partner webhook",
      "pathSegment": "partner-events",
      "sourceType": "webhook",
      "endpointUrl": "https://nextract.littleharborlabs.com/api/hooks/acme-inc/partner-events",
      "responseFormat": "json",
      "allowedClientCount": 1,
      "environment": { "slug": "development", "name": "Development", "kind": "DEV" }
    }
  ]
}

401 — Missing or invalid API key.

{
  "ok": false,
  "error": "Invalid or unauthorized API key"
}

403 — Pinned key queried a different environment.

{
  "ok": false,
  "error": "Invalid or unauthorized API key"
}

404 — Organization or environment not found.

{
  "ok": false,
  "error": "Invalid or unauthorized API key"
}

500 — Unexpected server error.

{
  "ok": false,
  "error": "Invalid or unauthorized API key"
}
GEThttps://nextract.littleharborlabs.com/api/v1/orgs/{orgSlug}/integrations/{pathSegment}

Get integration

Metadata for a single published integration. File-ingest integrations include an upload contract describing required form fields and query parameters. Path segments are unique per environment, not across the organization — pass ?environment= (or pin the key) when the same segment exists in more than one stage.

Security

ApiKeyAuth (organization)

Parameters

NameInTypeRequiredDescription
orgSlugpathstringYesOrganization slug (e.g. acme-inc).
pathSegmentpathstringYesPublic path segment configured on the integration.
environmentquerystringNoOptional environment slug. Pinned keys stay on their pin; a mismatch returns 403.

Responses

200

Integration metadata (with upload contract when applicable).

401

Missing or invalid API key.

403

API client is pinned to a different environment.

404

Organization, environment, or integration not found.

429

Rate limit exceeded.

500

Unexpected server error.

cURL

curl -s \
  -H "Authorization: Bearer $NEXTRACT_API_KEY" \
  "https://nextract.littleharborlabs.com/api/v1/orgs/acme-inc/integrations/orders-in?environment=development"

200 — Integration metadata (with upload contract when applicable).

{
  "ok": true,
  "integration": {
    "id": "wf_abc123",
    "name": "Orders inbound",
    "pathSegment": "orders-in",
    "sourceType": "api_file_ingest",
    "endpointUrl": "https://nextract.littleharborlabs.com/api/v1/orgs/acme-inc/integrations/orders-in/files",
    "environment": { "slug": "development", "name": "Development", "kind": "DEV" },
    "upload": {
      "method": "POST",
      "contentType": "multipart/form-data",
      "fields": {
        "file": "required — binary file body",
        "fileName": "optional — overrides multipart filename"
      },
      "query": {
        "sync": "optional — true to run the pipeline immediately after upload"
      }
    }
  }
}

401 — Missing or invalid API key.

{
  "ok": false,
  "error": "Invalid or unauthorized API key"
}

403 — API client is pinned to a different environment.

{
  "ok": false,
  "error": "Invalid or unauthorized API key"
}

404 — Organization, environment, or integration not found.

{
  "ok": false,
  "error": "Invalid or unauthorized API key"
}

500 — Unexpected server error.

{
  "ok": false,
  "error": "Invalid or unauthorized API key"
}

Lifecycle API

List, resume, and pause integrations across draft / published / paused / disabled states. Scoped like the catalog (pin or ?environment=). Initial draft publish and dual-control approvals remain Studio-only.

GEThttps://nextract.littleharborlabs.com/api/v1/orgs/{orgSlug}/workflows

List workflows

Returns non-deleted integrations with status, revision, schedule metadata, and environment.

Security

ApiKeyAuth (organization)

Parameters

NameInTypeRequiredDescription
orgSlugpathstringYesOrganization slug (e.g. acme-inc).
environmentquerystringNoOptional environment slug. Pinned keys stay on their pin; a mismatch returns 403.

Responses

200

Lifecycle summaries.

401

Missing or invalid API key.

403

Pinned key queried a different environment.

404

Organization or environment not found.

429

Rate limit exceeded.

cURL

curl -s \
  -H "Authorization: Bearer $NEXTRACT_API_KEY" \
  "https://nextract.littleharborlabs.com/api/v1/orgs/acme-inc/workflows?environment=development"

200 — Lifecycle summaries.

{
  "ok": true,
  "organization": { "slug": "acme-inc" },
  "workflows": [
    {
      "id": "wf_abc123",
      "name": "Orders inbound",
      "slug": "orders-inbound",
      "status": "PUBLISHED",
      "revision": 3,
      "nextRunAt": null,
      "updatedAt": "2026-08-01T12:00:00.000Z",
      "webhookPathSegment": null,
      "inboundApiPathSegment": "orders-in",
      "environment": { "slug": "development", "name": "Development", "kind": "DEV" }
    }
  ]
}

401 — Missing or invalid API key.

{
  "ok": false,
  "error": "Invalid or unauthorized API key"
}

403 — Pinned key queried a different environment.

{
  "ok": false,
  "error": "Invalid or unauthorized API key"
}

404 — Organization or environment not found.

{
  "ok": false,
  "error": "Invalid or unauthorized API key"
}
POSThttps://nextract.littleharborlabs.com/api/v1/orgs/{orgSlug}/workflows/{workflowId}/publish

Publish / resume

Resumes a paused integration to PUBLISHED. Drafts that have never been published, disabled integrations, and pending dual-control approvals must be handled in Studio.

Security

ApiKeyAuth (organization)

Parameters

NameInTypeRequiredDescription
orgSlugpathstringYesOrganization slug (e.g. acme-inc).
workflowIdpathstringYesIntegration id.

Responses

200

Integration is published.

401

Missing or invalid API key.

404

Integration not found.

409

Draft never published, disabled, or awaiting Studio approval.

429

Rate limit exceeded.

cURL

curl -s -X POST \
  -H "Authorization: Bearer $NEXTRACT_API_KEY" \
  "https://nextract.littleharborlabs.com/api/v1/orgs/acme-inc/workflows/wf_abc123/publish"

200 — Integration is published.

{
  "ok": true,
  "organization": { "slug": "acme-inc" },
  "workflowId": "wf_abc123",
  "status": "PUBLISHED",
  "revision": 3
}

401 — Missing or invalid API key.

{
  "ok": false,
  "error": "Invalid or unauthorized API key"
}

404 — Integration not found.

{
  "ok": false,
  "error": "Invalid or unauthorized API key"
}

409 — Draft never published, disabled, or awaiting Studio approval.

{
  "ok": false,
  "error": "Invalid or unauthorized API key"
}
POSThttps://nextract.littleharborlabs.com/api/v1/orgs/{orgSlug}/workflows/{workflowId}/pause

Pause

Pauses a published integration so the worker stops picking up new work.

Security

ApiKeyAuth (organization)

Parameters

NameInTypeRequiredDescription
orgSlugpathstringYesOrganization slug (e.g. acme-inc).
workflowIdpathstringYesIntegration id.

Responses

200

Integration is paused.

401

Missing or invalid API key.

404

Integration not found.

409

Only published integrations can be paused.

429

Rate limit exceeded.

cURL

curl -s -X POST \
  -H "Authorization: Bearer $NEXTRACT_API_KEY" \
  "https://nextract.littleharborlabs.com/api/v1/orgs/acme-inc/workflows/wf_abc123/pause"

200 — Integration is paused.

{
  "ok": true,
  "organization": { "slug": "acme-inc" },
  "workflowId": "wf_abc123",
  "status": "PAUSED"
}

401 — Missing or invalid API key.

{
  "ok": false,
  "error": "Invalid or unauthorized API key"
}

404 — Integration not found.

{
  "ok": false,
  "error": "Invalid or unauthorized API key"
}

409 — Only published integrations can be paused.

{
  "ok": false,
  "error": "Invalid or unauthorized API key"
}

File upload

Multipart upload for integrations using the Authenticated API upload source.

POSThttps://nextract.littleharborlabs.com/api/v1/orgs/{orgSlug}/integrations/{pathSegment}/files

Upload file

Accepts a single file up to 50 MB. The file is stored in the integration inbound using the submitted filename (basename only). By default the worker processes the file asynchronously (HTTP 202). Add ?sync=true to run the pipeline immediately and receive a run id.

Security

ApiKeyAuth (integration allow list)

Parameters

NameInTypeRequiredDescription
orgSlugpathstringYesOrganization slug (e.g. acme-inc).
pathSegmentpathstringYesPublic path segment for the file-ingest integration.
syncquerybooleanNoWhen true, process the file synchronously and return run results (HTTP 200).
Idempotency-KeyheaderstringNoReplay the same response for duplicate uploads within 24 hours (per API client and integration).

Request body

Content-Type: multipart/form-data — Single file upload.

Form fields

NameInTypeRequiredDescription
fileformbinaryYesFile contents. Required.
fileNameformstringNoOverrides the filename from the multipart part.

Responses

202

Accepted — file queued for asynchronous processing (default).

200

Processed synchronously when ?sync=true.

200

Skipped duplicate or idempotent re-delivery (integration-dependent).

400

Invalid multipart body, empty file, or oversize payload.

401

Missing, invalid, or unauthorized API key.

404

Integration not found or not published.

429

Rate limit exceeded.

500

Pipeline processing failed (sync mode).

Asynchronous upload (default)

curl -X POST \
  -H "Authorization: Bearer $NEXTRACT_API_KEY" \
  -F "[email protected];filename=invoice.csv" \
  "https://nextract.littleharborlabs.com/api/v1/orgs/acme-inc/integrations/orders-in/files"

Synchronous processing

curl -X POST \
  -H "Authorization: Bearer $NEXTRACT_API_KEY" \
  -F "[email protected]" \
  "https://nextract.littleharborlabs.com/api/v1/orgs/acme-inc/integrations/orders-in/files?sync=true"

Idempotent upload

curl -X POST \
  -H "Authorization: Bearer $NEXTRACT_API_KEY" \
  -H "Idempotency-Key: invoice-2026-07-06-001" \
  -F "[email protected]" \
  "https://nextract.littleharborlabs.com/api/v1/orgs/acme-inc/integrations/orders-in/files"

202 — Accepted — file queued for asynchronous processing (default).

{
  "ok": true,
  "accepted": true,
  "fileName": "invoice.csv"
}

200 — Processed synchronously when ?sync=true.

{
  "ok": true,
  "runId": "run_xyz",
  "rowCount": 128,
  "fileName": "invoice.csv"
}

200 — Skipped duplicate or idempotent re-delivery (integration-dependent).

{
  "ok": true,
  "skipped": true,
  "reason": "duplicate",
  "fileName": "invoice.csv"
}

400 — Invalid multipart body, empty file, or oversize payload.

{
  "ok": false,
  "error": "Invalid or unauthorized API key"
}

401 — Missing, invalid, or unauthorized API key.

{
  "ok": false,
  "error": "Invalid or unauthorized API key"
}

404 — Integration not found or not published.

{
  "ok": false,
  "error": "Invalid or unauthorized API key"
}

500 — Pipeline processing failed (sync mode).

{
  "ok": false,
  "error": "Invalid or unauthorized API key"
}

Run status

Poll pipeline runs returned from synchronous uploads and webhooks. status is PENDING, RUNNING, SUCCESS, FAILED, or SKIPPED. The response includes outbound delivery status and does not include file paths on disk.

GEThttps://nextract.littleharborlabs.com/api/v1/runs/{runId}

Get run status

Returns run lifecycle fields, per-step summaries, and outbound delivery metadata (API, connector, storage, database, or external file transfer destinations). File paths on disk are not exposed — only the inbound file name.

Security

ApiKeyAuth (organization)

Parameters

NameInTypeRequiredDescription
runIdpathstringYesRun id from a synchronous upload or webhook response.

Responses

200

Run status with delivery summary.

401

Missing or invalid API key.

404

Run not found.

429

Rate limit exceeded.

cURL

curl -s \
  -H "Authorization: Bearer $NEXTRACT_API_KEY" \
  "https://nextract.littleharborlabs.com/api/v1/runs/run_xyz"

200 — Run status with delivery summary.

{
  "ok": true,
  "run": {
    "id": "run_xyz",
    "status": "SUCCESS",
    "workflowId": "wf_abc123",
    "workflowName": "Orders inbound",
    "environment": { "slug": "development", "name": "Development", "kind": "DEV" },
    "triggeredBy": "api_file_ingest",
    "fileName": "invoice.csv",
    "rowCount": 128,
    "startedAt": "2026-07-06T18:00:00.000Z",
    "finishedAt": "2026-07-06T18:00:04.000Z",
    "durationMs": 4000,
    "error": null,
    "delivery": {
      "kind": "api",
      "status": "success",
      "destination": "https://api.example.com/orders",
      "httpStatus": 201,
      "format": "json"
    },
    "steps": [
      { "stepId": "parse-1", "stepType": "parse", "status": "SUCCESS", "error": null, "delivery": null },
      {
        "stepId": "load-1",
        "stepType": "load_api_endpoint",
        "status": "SUCCESS",
        "error": null,
        "delivery": {
          "kind": "api",
          "status": "success",
          "destination": "https://api.example.com/orders",
          "httpStatus": 201,
          "format": "json"
        }
      }
    ]
  }
}

401 — Missing or invalid API key.

{
  "ok": false,
  "error": "Invalid or unauthorized API key"
}

404 — Run not found.

{
  "ok": false,
  "error": "Invalid or unauthorized API key"
}

Webhooks

POST raw JSON or CSV payloads. Bodies larger than 2 MB are rejected. The pipeline runs synchronously and returns a run id.

POSThttps://nextract.littleharborlabs.com/api/hooks/{orgSlug}/{pathSegment}

Ingest webhook payload

Raw request body (not multipart). The payload is staged to CSV and the pipeline runs synchronously. Configure path segment, body format, authorized clients, and optional custom HTTP status codes on a webhook source integration in the studio.

Security

ApiKeyAuth (integration allow list)

Parameters

NameInTypeRequiredDescription
orgSlugpathstringYesOrganization slug (e.g. acme-inc).
pathSegmentpathstringYesWebhook path segment configured on the integration.

Request body

Content-Type: application/json | text/csv — Raw body matching the integration's configured response format.

Responses

200

Processed successfully.

200

Skipped (e.g. duplicate detection).

400

Empty body or invalid payload.

413

Body larger than 2 MB.

401

Missing, invalid, or unauthorized API key.

404

Webhook endpoint not found.

429

Rate limit exceeded.

500

Pipeline processing failed.

JSON webhook

curl -X POST \
  -H "Authorization: Bearer $NEXTRACT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"orders":[{"id":"A1","total":42}]}' \
  "https://nextract.littleharborlabs.com/api/hooks/acme-inc/partner-events"

CSV webhook

curl -X POST \
  -H "Authorization: Bearer $NEXTRACT_API_KEY" \
  -H "Content-Type: text/csv" \
  --data-binary @orders.csv \
  "https://nextract.littleharborlabs.com/api/hooks/acme-inc/partner-events"

200 — Processed successfully.

{
  "ok": true,
  "runId": "run_xyz",
  "rowCount": 4
}

200 — Skipped (e.g. duplicate detection).

{
  "ok": true,
  "skipped": true,
  "reason": "duplicate"
}

400 — Empty body or invalid payload.

{
  "ok": false,
  "error": "Invalid or unauthorized API key"
}

413 — Body larger than 2 MB.

{
  "ok": false,
  "error": "Webhook body too large"
}

401 — Missing, invalid, or unauthorized API key.

{
  "ok": false,
  "error": "Invalid or unauthorized API key"
}

404 — Webhook endpoint not found.

{
  "ok": false,
  "error": "Invalid or unauthorized API key"
}

500 — Pipeline processing failed.

{
  "ok": false,
  "error": "Invalid or unauthorized API key"
}

Alert webhooks (outbound)

Nextract can POST event notifications to URLs you configure under Settings → Alerts.

These are outbound callbacks from Nextract to your systems — not inbound integration endpoints. Payloads are JSON with an event field and organization context.

Event payloads

// run.failed
{
  "event": "run.failed",
  "organizationId": "…",
  "workflowId": "…",
  "runId": "…",
  "error": "…"
}

// run.succeeded
{
  "event": "run.succeeded",
  "organizationId": "…",
  "workflowId": "…",
  "runId": "…",
  "rowCount": 12,
  "workflowName": "…"
}

// quarantine.file
{
  "event": "quarantine.file",
  "organizationId": "…",
  "workflowId": "…",
  "fileName": "…",
  "reasonCode": "MALWARE_DETECTED",
  "quarantinePath": "…"
}

// connector.auth_failed
{
  "event": "connector.auth_failed",
  "organizationId": "…",
  "workflowId": "…",
  "connectorId": "stripe",
  "error": "…"
}

// worker.offline
{
  "event": "worker.offline",
  "organizationId": "…",
  "lastSeen": "2026-10-08T22:00:00.000Z",
  "message": "Background worker heartbeat is stale"
}

OpenAPI

Machine-readable API description for codegen and API gateways.

OpenAPI 3.0 document

Download the spec at https://nextract.littleharborlabs.com/api/v1/openapi.json. The document lists all public paths, security schemes, and response schemas including PublicEnvironment, PublicRunStatus, PublicDeliveryStatus, and lifecycle schemas (WorkflowLifecycleSummary).

TypeScript SDK

Generated client for the public API, including lifecycle helpers.

@nextract/sdk

The monorepo package @nextract/sdk wraps OpenAPI paths with openapi-fetch. Refresh types after API changes with npm run sdk:generate.

Lifecycle helpers

import { createNextractClient } from "@nextract/sdk";

const api = createNextractClient({
  baseUrl: "https://nextract.littleharborlabs.com",
  apiKey: process.env.NEXTRACT_API_KEY!,
});

const { data: stages } = await api.listEnvironments("acme-inc");
const { data } = await api.listWorkflows("acme-inc", { environment: "development" });
await api.pauseWorkflow("acme-inc", "wf_abc123");
await api.publishWorkflow("acme-inc", "wf_abc123");

Studio setup

How to expose an integration on the public API.

  1. Create an integration in the target environment and choose Incoming files → Authenticated API upload or a Webhook source.
  2. Set the public path segment and assign one or more API clients from API Access. Pin each partner key to that environment so they cannot reach other stages.
  3. Publish the integration — only published workflows appear in the catalog.
  4. Share the endpoint URL from the integration editor or discover it via GET /integrations.
Environments

DEV / QA / STAGING / PROD stages

Connectors

OAuth and API-key connections

Quarantine

Review isolated inbound files

Alerts

Failure and quarantine notifications