> For the complete documentation index, see [llms.txt](https://developer.celigo.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://developer.celigo.com/api/api-reference/marketplace-and-templates/marketplace.md).

# Marketplace

Browse Celigo marketplace content. The marketplace contains two types of entries:

* **Integration Apps** — licensed, Celigo-built connectors (e.g. Shopify–NetSuite) that install with managed updates.
* **Templates** — reusable blueprints that create a set of resources when installed: an integration with its flows, connections, exports, imports, and scripts (`type: integration`), or an MCP server with its tools (`type: mcpserver`).

You can preview what a template would create before committing to the install.

### Marketplace entry schema

## The MarketplaceEntry object

```json
{"openapi":"3.2.0","info":{"title":"Marketplace","version":"1.0.0"},"components":{"schemas":{"MarketplaceEntry":{"type":"object","required":["_id","name","applications","numInstalls","user","lastModified"],"description":"A single marketplace listing — either an Integration App (`docType: Connector`)\nor a Template (`docType: Template`). `docType` is only present in\n`POST /v1/published/combined` responses; `GET /v1/published` (Connectors\nonly) and `GET /v1/templates/published` (Templates only) omit the field.","properties":{"_id":{"type":"string","format":"objectId","description":"Marketplace entry id. For Templates, use this with `/v1/templates/{_id}/preview`."},"name":{"type":"string","description":"Display name of the marketplace entry."},"description":{"type":"string","description":"Marketing description shown in the marketplace listing. Always set on\nIntegration Apps; a Template publisher can leave it blank, in which\ncase the field is absent."},"type":{"type":"string","enum":["integration","mcpserver"],"description":"Kind of resource a Template installs, which decides the install route.\nPresent on every Template entry (`GET /v1/templates/published` and\n`docType: Template` entries of `POST /v1/published/combined`); absent\non Connector entries, which install through their own route."},"imageURL":{"type":"string","description":"Relative image path (e.g. `/images/company-logos/amazon-netsuite.png`)\nor absolute URL. Not always present on Template entries."},"websiteURL":{"type":"string","format":"uri","description":"External product page URL. Rare on Template entries."},"applications":{"type":"array","description":"Systems this marketplace entry bridges. Values are either\nwell-known application slugs (`netsuite`, `shopify`, `amazonmws`) or\nobject ids referencing an Application definition.","items":{"type":"string"}},"user":{"type":"object","description":"Publisher metadata.","properties":{"name":{"type":"string","description":"Publisher display name."},"company":{"type":"string","description":"Publisher's company. For Celigo-built content this is `\"Celigo\"`."}}},"trialEnabled":{"type":"boolean","description":"Whether this entry offers a trial install. Populated on Integration\nApp entries; rarely set on Templates."},"lastModified":{"type":"string","format":"date-time","description":"When the marketplace entry was last updated."},"numInstalls":{"type":"integer","description":"Live install counter across all Celigo accounts. Used as the\n`sort_by=numInstalls` key."},"docType":{"type":"string","enum":["Connector","Template"],"description":"Discriminator distinguishing Integration Apps from Templates. Only\npopulated in `POST /v1/published/combined` responses. Absent in\n`GET /v1/published` (Connectors only)."},"framework":{"type":"string","enum":["twoDotZero"],"description":"Integration App framework version. Present only on Connector entries\nthat use the 2.0 edition-based architecture. When set, the\n`twoDotZero` object contains edition metadata."},"twoDotZero":{"type":"object","description":"Edition metadata for Integration Apps using the 2.0 framework.\nPresent only when `framework` is `twoDotZero`.","properties":{"_integrationId":{"type":"string","format":"objectId","description":"Integration id that backs this Integration App."},"editions":{"type":"array","description":"Available editions (e.g. Starter, Professional). Empty when no editions are configured.","items":{"type":"object","properties":{"_id":{"type":"string","format":"objectId","description":"System-generated unique identifier for the edition."},"displayName":{"type":"string","description":"Edition label shown to users (e.g. \"Starter Edition\")."},"order":{"type":"integer","description":"Display order among editions."},"resources":{"type":"object","description":"Resource ids included in this edition.","properties":{"_flowIds":{"type":"array","description":"Ids of the flows included in this edition.","items":{"type":"string","format":"objectId"}},"_importIds":{"type":"array","description":"Ids of the imports included in this edition.","items":{"type":"string","format":"objectId"}},"_exportIds":{"type":"array","description":"Ids of the exports included in this edition.","items":{"type":"string","format":"objectId"}},"_connectionIds":{"type":"array","description":"Ids of the connections included in this edition.","items":{"type":"string","format":"objectId"}},"_asyncHelperIds":{"type":"array","description":"Ids of the async helpers included in this edition.","items":{"type":"string","format":"objectId"}},"_fileDefinitionIds":{"type":"array","description":"Ids of the file definitions included in this edition.","items":{"type":"string","format":"objectId"}}}},"childResources":{"type":"object","description":"Child resource ids (for parent-child Integration Apps).","properties":{"_flowIds":{"type":"array","description":"Ids of the flows included in this edition's child integrations.","items":{"type":"string","format":"objectId"}},"_importIds":{"type":"array","description":"Ids of the imports included in this edition's child integrations.","items":{"type":"string","format":"objectId"}},"_exportIds":{"type":"array","description":"Ids of the exports included in this edition's child integrations.","items":{"type":"string","format":"objectId"}},"_connectionIds":{"type":"array","description":"Ids of the connections included in this edition's child integrations.","items":{"type":"string","format":"objectId"}},"_asyncHelperIds":{"type":"array","description":"Ids of the async helpers included in this edition's child integrations.","items":{"type":"string","format":"objectId"}},"_fileDefinitionIds":{"type":"array","description":"Ids of the file definitions included in this edition's child integrations.","items":{"type":"string","format":"objectId"}}}}}}},"isParentChild":{"type":"boolean","description":"When true, this Integration App uses the parent-child model."}}}}}}}}
```

## List published Templates

> Returns the marketplace catalog of published \*\*Templates\*\* — the\
> Template-only counterpart of \`GET /v1/published\` (Integration Apps only).\
> Every entry carries \`type\`, which tells you whether the template installs\
> an integration or an MCP server and therefore which install route to\
> call. Entries have no \`docType\`.\
> \
> Results are sorted by \`name\` unless \`sort\_by\` says otherwise, and the\
> list may be paginated: follow the \`Link\` header's \`rel="next"\` URL until\
> the header is absent. Templates that reference an application no\
> longer available on the platform are left out, so this list can be\
> shorter than the \`docType: Template\` subset of\
> \`POST /v1/published/combined\`.

```json
{"openapi":"3.2.0","info":{"title":"Marketplace","version":"1.0.0"},"tags":[{"name":"Marketplace","description":"Browse Celigo marketplace content. The marketplace contains two types\nof entries:\n\n- **Integration Apps** — licensed, Celigo-built connectors (e.g.\n  Shopify–NetSuite) that install with managed updates.\n- **Templates** — reusable blueprints that create a set of resources\n  when installed: an integration with its flows, connections, exports,\n  imports, and scripts (`type: integration`), or an MCP server with its\n  tools (`type: mcpserver`).\n\nYou can preview what a template would create before committing to the\ninstall.\n\n## Marketplace entry schema\n\n{% openapi-schemas spec=\"marketplace\" schemas=\"MarketplaceEntry\" grouped=\"true\" %}"}],"servers":[{"url":"https://api.integrator.io","description":"Production (US / default region)"},{"url":"https://api.eu.integrator.io","description":"Production (EU region)"},{"url":"https://api.au.integrator.io","description":"Production (AU region)"},{"url":"https://api.ca.integrator.io","description":"Production (CA region)"}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer"}},"parameters":{"After":{"name":"after","in":"query","required":false,"description":"Opaque cursor for forward pagination. Pass the value from the `Link`\nresponse header (`rel=\"next\"`) to fetch the next page.","schema":{"type":"string"}}},"schemas":{"MarketplaceEntry":{"type":"object","required":["_id","name","applications","numInstalls","user","lastModified"],"description":"A single marketplace listing — either an Integration App (`docType: Connector`)\nor a Template (`docType: Template`). `docType` is only present in\n`POST /v1/published/combined` responses; `GET /v1/published` (Connectors\nonly) and `GET /v1/templates/published` (Templates only) omit the field.","properties":{"_id":{"type":"string","format":"objectId","description":"Marketplace entry id. For Templates, use this with `/v1/templates/{_id}/preview`."},"name":{"type":"string","description":"Display name of the marketplace entry."},"description":{"type":"string","description":"Marketing description shown in the marketplace listing. Always set on\nIntegration Apps; a Template publisher can leave it blank, in which\ncase the field is absent."},"type":{"type":"string","enum":["integration","mcpserver"],"description":"Kind of resource a Template installs, which decides the install route.\nPresent on every Template entry (`GET /v1/templates/published` and\n`docType: Template` entries of `POST /v1/published/combined`); absent\non Connector entries, which install through their own route."},"imageURL":{"type":"string","description":"Relative image path (e.g. `/images/company-logos/amazon-netsuite.png`)\nor absolute URL. Not always present on Template entries."},"websiteURL":{"type":"string","format":"uri","description":"External product page URL. Rare on Template entries."},"applications":{"type":"array","description":"Systems this marketplace entry bridges. Values are either\nwell-known application slugs (`netsuite`, `shopify`, `amazonmws`) or\nobject ids referencing an Application definition.","items":{"type":"string"}},"user":{"type":"object","description":"Publisher metadata.","properties":{"name":{"type":"string","description":"Publisher display name."},"company":{"type":"string","description":"Publisher's company. For Celigo-built content this is `\"Celigo\"`."}}},"trialEnabled":{"type":"boolean","description":"Whether this entry offers a trial install. Populated on Integration\nApp entries; rarely set on Templates."},"lastModified":{"type":"string","format":"date-time","description":"When the marketplace entry was last updated."},"numInstalls":{"type":"integer","description":"Live install counter across all Celigo accounts. Used as the\n`sort_by=numInstalls` key."},"docType":{"type":"string","enum":["Connector","Template"],"description":"Discriminator distinguishing Integration Apps from Templates. Only\npopulated in `POST /v1/published/combined` responses. Absent in\n`GET /v1/published` (Connectors only)."},"framework":{"type":"string","enum":["twoDotZero"],"description":"Integration App framework version. Present only on Connector entries\nthat use the 2.0 edition-based architecture. When set, the\n`twoDotZero` object contains edition metadata."},"twoDotZero":{"type":"object","description":"Edition metadata for Integration Apps using the 2.0 framework.\nPresent only when `framework` is `twoDotZero`.","properties":{"_integrationId":{"type":"string","format":"objectId","description":"Integration id that backs this Integration App."},"editions":{"type":"array","description":"Available editions (e.g. Starter, Professional). Empty when no editions are configured.","items":{"type":"object","properties":{"_id":{"type":"string","format":"objectId","description":"System-generated unique identifier for the edition."},"displayName":{"type":"string","description":"Edition label shown to users (e.g. \"Starter Edition\")."},"order":{"type":"integer","description":"Display order among editions."},"resources":{"type":"object","description":"Resource ids included in this edition.","properties":{"_flowIds":{"type":"array","description":"Ids of the flows included in this edition.","items":{"type":"string","format":"objectId"}},"_importIds":{"type":"array","description":"Ids of the imports included in this edition.","items":{"type":"string","format":"objectId"}},"_exportIds":{"type":"array","description":"Ids of the exports included in this edition.","items":{"type":"string","format":"objectId"}},"_connectionIds":{"type":"array","description":"Ids of the connections included in this edition.","items":{"type":"string","format":"objectId"}},"_asyncHelperIds":{"type":"array","description":"Ids of the async helpers included in this edition.","items":{"type":"string","format":"objectId"}},"_fileDefinitionIds":{"type":"array","description":"Ids of the file definitions included in this edition.","items":{"type":"string","format":"objectId"}}}},"childResources":{"type":"object","description":"Child resource ids (for parent-child Integration Apps).","properties":{"_flowIds":{"type":"array","description":"Ids of the flows included in this edition's child integrations.","items":{"type":"string","format":"objectId"}},"_importIds":{"type":"array","description":"Ids of the imports included in this edition's child integrations.","items":{"type":"string","format":"objectId"}},"_exportIds":{"type":"array","description":"Ids of the exports included in this edition's child integrations.","items":{"type":"string","format":"objectId"}},"_connectionIds":{"type":"array","description":"Ids of the connections included in this edition's child integrations.","items":{"type":"string","format":"objectId"}},"_asyncHelperIds":{"type":"array","description":"Ids of the async helpers included in this edition's child integrations.","items":{"type":"string","format":"objectId"}},"_fileDefinitionIds":{"type":"array","description":"Ids of the file definitions included in this edition's child integrations.","items":{"type":"string","format":"objectId"}}}}}}},"isParentChild":{"type":"boolean","description":"When true, this Integration App uses the parent-child model."}}}}},"Error":{"type":"object","description":"Standard error response envelope returned by integrator.io APIs.","properties":{"errors":{"type":"array","description":"List of errors that occurred while processing the request.","items":{"type":"object","properties":{"code":{"oneOf":[{"type":"string"},{"type":"integer"}],"description":"Machine-readable error code. Usually a string like\n`invalid_ref`, `missing_required_field`, or `unauthorized`;\nmay be an **integer** when the error mirrors an upstream HTTP\nstatus (e.g. `500`) — most commonly returned by connection-ping\nand adaptor-proxy responses."},"message":{"type":"string","description":"Human-readable description of the error."},"field":{"type":"string","description":"Optional pointer to the document field that caused the error.\nUsed by structural validation errors (`missing_required_field`,\n`invalid_ref`) to indicate which field is at fault\n(e.g. `_id`, `type`, `http.baseURI`)."},"source":{"type":"string","description":"Optional origin layer for the error — e.g. `application` when\nthe error came from the remote system the adaptor called,\n`connector` when the adaptor itself rejected the request."}},"required":["message"]}}},"required":["errors"]}},"responses":{"401-unauthorized":{"description":"Unauthorized. The request lacks a valid bearer token, or the provided token\nfailed to authenticate.\n\nNote: the 401 response is produced by the auth middleware **before** the\nrequest reaches the endpoint handler, so it does **not** follow the\nstandard `{errors: [...]}` envelope. Instead the body is a bare\n`{message: string}` object with no `code`, no `errors` array. Callers\nhandling 401s should key off the HTTP status and the `message` string,\nnot try to destructure an `errors[]`.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","description":"Human-readable description of the auth failure. Known values:\n- `\"Unauthorized\"` — no `Authorization` header on the request.\n- `\"Bearer Authentication Failed\"` — header present but token\n  is invalid, revoked, or expired."}},"required":["message"]}}}}}},"paths":{"/v1/templates/published":{"get":{"operationId":"listPublishedTemplates","tags":["Marketplace"],"summary":"List published Templates","description":"Returns the marketplace catalog of published **Templates** — the\nTemplate-only counterpart of `GET /v1/published` (Integration Apps only).\nEvery entry carries `type`, which tells you whether the template installs\nan integration or an MCP server and therefore which install route to\ncall. Entries have no `docType`.\n\nResults are sorted by `name` unless `sort_by` says otherwise, and the\nlist may be paginated: follow the `Link` header's `rel=\"next\"` URL until\nthe header is absent. Templates that reference an application no\nlonger available on the platform are left out, so this list can be\nshorter than the `docType: Template` subset of\n`POST /v1/published/combined`.","parameters":[{"$ref":"#/components/parameters/After"},{"name":"sort_by","in":"query","required":false,"schema":{"type":"string","enum":["name","lastModified"],"default":"name"},"description":"Sort key. The direction is fixed per key — ascending for `name`,\ndescending for `lastModified`."}],"responses":{"200":{"description":"Array of Template marketplace entries.","headers":{"Link":{"description":"RFC 5988 pagination links. When more pages remain, includes a\n`<...>; rel=\"next\"` entry with an `after` cursor; absent on the\nfinal page.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MarketplaceEntry"}}}}},"204":{"description":"No published templates are available."},"400":{"description":"`sort_by` is not one of the accepted keys, or `after` is not a valid pagination cursor.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"$ref":"#/components/responses/401-unauthorized"}}}}}}
```

## Preview a template's installed resource docs

> Returns the concrete resource documents a template would create if\
> installed. The response is an envelope \`{type, objects, stackRequired}\`\
> where \`objects\` is an array of \`{model, doc}\` entries — one per resource\
> that the install step would materialize.\
> \
> \`type\` tells you which install route to use afterwards:\
> \`POST /v1/integrations/template/{\_id}\` for \`integration\`,\
> \`POST /v1/mcpservers/template/{\_templateId}\` for \`mcpserver\`.\
> \`stackRequired\` is \`true\` when the template has hooks or wrapper\
> connections that run on a stack: the marketplace installer prompts for\
> one; \`POST /v1/integrations/template/{\_id}\`, for a template it accepts\
> (no \`template\_zip\` install step), needs it as \`\_stackId\`; and an\
> MCP-server template's install adds a stack step to the integration it\
> creates.\
> \
> Previewing an MCP-server template needs the same install permission as\
> installing it (403 for a monitor or integration-level user whose access\
> doesn't allow creating integrations); an integration template's preview\
> needs none.\
> \
> The ID must belong to a Template, not a Connector (Integration App).\
> Connector IDs from \`/v1/published\` return 404 here -- pull template\
> IDs from \`GET /v1/templates/published\` or the \`Template\`-typed entries\
> of \`POST /v1/published/combined\`.

```json
{"openapi":"3.2.0","info":{"title":"Marketplace","version":"1.0.0"},"tags":[{"name":"Marketplace","description":"Browse Celigo marketplace content. The marketplace contains two types\nof entries:\n\n- **Integration Apps** — licensed, Celigo-built connectors (e.g.\n  Shopify–NetSuite) that install with managed updates.\n- **Templates** — reusable blueprints that create a set of resources\n  when installed: an integration with its flows, connections, exports,\n  imports, and scripts (`type: integration`), or an MCP server with its\n  tools (`type: mcpserver`).\n\nYou can preview what a template would create before committing to the\ninstall.\n\n## Marketplace entry schema\n\n{% openapi-schemas spec=\"marketplace\" schemas=\"MarketplaceEntry\" grouped=\"true\" %}"}],"servers":[{"url":"https://api.integrator.io","description":"Production (US / default region)"},{"url":"https://api.eu.integrator.io","description":"Production (EU region)"},{"url":"https://api.au.integrator.io","description":"Production (AU region)"},{"url":"https://api.ca.integrator.io","description":"Production (CA region)"}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer"}},"schemas":{"TemplatePreviewResponse":{"type":"object","description":"Envelope describing what a template's install would produce. `objects[]`\nenumerates each resource doc the installer would create, tagged by\n`model`. The docs are populated with the template's defaults and\nplaceholder ids that the installer rewrites during the real install.","required":["objects","stackRequired","type"],"properties":{"type":{"type":"string","enum":["integration","mcpserver"],"description":"Kind of resource the template installs. Read it before installing —\nthe two kinds use different install routes, and the integration route\nrejects MCP server templates."},"objects":{"type":"array","description":"Resource docs the installer would materialize. For an integration\ntemplate the ordering is `Integration` first (exactly one), then\n`Connection`s, `Flow`s, `Export`s, `Import`s, `Script`s and any\nother supporting resources; for an MCP server template it is the\n`McpServer` doc first, then its `Connection`s, `Export`s, `Import`s,\n`Script`s and `Tool`s, then one `Prompt` entry per inline prompt.","items":{"type":"object","description":"One resource doc tagged with its model type.","properties":{"model":{"type":"string","enum":["Integration","McpServer","Connection","Flow","Export","Import","Script","AsyncHelper","FileDefinition","EDIProfile","LookupCache","Api","Tool","Prompt"],"description":"Resource class this doc describes. Which classes appear depends\non what the template zip contains; `Integration` and `Prompt`\nnever appear together because they belong to different template\nkinds."},"doc":{"type":"object","description":"The concrete resource document. Shape matches the write shape\nof the corresponding resource endpoint (e.g. `POST /v1/flows`,\n`POST /v1/exports`, etc.). Fields are populated with the\ntemplate's defaults; ids are placeholders that the installer\nreplaces during the real install.","additionalProperties":true}}}},"stackRequired":{"type":"boolean","description":"`true` when the template has an export or import hook, or a wrapper\nconnection, that runs on a stack (a function with no script). The\nmarketplace installer asks for the stack. Through the API, an\nintegration template that `POST /v1/integrations/template/{_id}`\naccepts (no `template_zip` install step) needs `_stackId` in the body,\nor the install fails with 400 `stack_not_found`; so does a zip\ninstalled with `POST /v1/integrations/template`. An MCP-server\ntemplate's install takes no body: the integration it creates for a\ntool-bearing template gets a stack install step instead."}}},"Error":{"type":"object","description":"Standard error response envelope returned by integrator.io APIs.","properties":{"errors":{"type":"array","description":"List of errors that occurred while processing the request.","items":{"type":"object","properties":{"code":{"oneOf":[{"type":"string"},{"type":"integer"}],"description":"Machine-readable error code. Usually a string like\n`invalid_ref`, `missing_required_field`, or `unauthorized`;\nmay be an **integer** when the error mirrors an upstream HTTP\nstatus (e.g. `500`) — most commonly returned by connection-ping\nand adaptor-proxy responses."},"message":{"type":"string","description":"Human-readable description of the error."},"field":{"type":"string","description":"Optional pointer to the document field that caused the error.\nUsed by structural validation errors (`missing_required_field`,\n`invalid_ref`) to indicate which field is at fault\n(e.g. `_id`, `type`, `http.baseURI`)."},"source":{"type":"string","description":"Optional origin layer for the error — e.g. `application` when\nthe error came from the remote system the adaptor called,\n`connector` when the adaptor itself rejected the request."}},"required":["message"]}}},"required":["errors"]}},"responses":{"401-unauthorized":{"description":"Unauthorized. The request lacks a valid bearer token, or the provided token\nfailed to authenticate.\n\nNote: the 401 response is produced by the auth middleware **before** the\nrequest reaches the endpoint handler, so it does **not** follow the\nstandard `{errors: [...]}` envelope. Instead the body is a bare\n`{message: string}` object with no `code`, no `errors` array. Callers\nhandling 401s should key off the HTTP status and the `message` string,\nnot try to destructure an `errors[]`.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","description":"Human-readable description of the auth failure. Known values:\n- `\"Unauthorized\"` — no `Authorization` header on the request.\n- `\"Bearer Authentication Failed\"` — header present but token\n  is invalid, revoked, or expired."}},"required":["message"]}}}}}},"paths":{"/v1/templates/{_id}/preview":{"get":{"operationId":"previewTemplate","tags":["Marketplace"],"summary":"Preview a template's installed resource docs","description":"Returns the concrete resource documents a template would create if\ninstalled. The response is an envelope `{type, objects, stackRequired}`\nwhere `objects` is an array of `{model, doc}` entries — one per resource\nthat the install step would materialize.\n\n`type` tells you which install route to use afterwards:\n`POST /v1/integrations/template/{_id}` for `integration`,\n`POST /v1/mcpservers/template/{_templateId}` for `mcpserver`.\n`stackRequired` is `true` when the template has hooks or wrapper\nconnections that run on a stack: the marketplace installer prompts for\none; `POST /v1/integrations/template/{_id}`, for a template it accepts\n(no `template_zip` install step), needs it as `_stackId`; and an\nMCP-server template's install adds a stack step to the integration it\ncreates.\n\nPreviewing an MCP-server template needs the same install permission as\ninstalling it (403 for a monitor or integration-level user whose access\ndoesn't allow creating integrations); an integration template's preview\nneeds none.\n\nThe ID must belong to a Template, not a Connector (Integration App).\nConnector IDs from `/v1/published` return 404 here -- pull template\nIDs from `GET /v1/templates/published` or the `Template`-typed entries\nof `POST /v1/published/combined`.","parameters":[{"name":"_id","in":"path","required":true,"description":"Template id from `POST /v1/published/combined`.","schema":{"type":"string","format":"objectId"}}],"responses":{"200":{"description":"Template preview envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplatePreviewResponse"}}}},"401":{"$ref":"#/components/responses/401-unauthorized"},"403":{"description":"An MCP-server template previewed by a user who may not install templates (a monitor\nor integration-level user whose access doesn't allow creating integrations).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No template matched the id. Most commonly: the id belongs to a\nConnector (Integration App) rather than a Template — Connectors are\ninstalled via `POST /v1/connectors/{_id}/install`, available only to\nCeligo Partners, not through this preview endpoint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```

## List published Integration Apps (Connectors)

> Returns the marketplace catalog of \*\*Integration Apps\*\* — the\
> Celigo-built, fully-managed connectors that install as a single\
> integration. Roughly 30 entries curated by Celigo.\
> \
> Each item is a marketplace listing, not an integration instance —\
> \`\_id\` is the marketplace entry id, the \`applications\` array enumerates\
> the systems the connector bridges, and \`numInstalls\` is the live install\
> counter across all Celigo accounts.\
> \
> For a combined list that also includes user-installable Templates,\
> use \`POST /v1/published/combined\` instead. Entries here have no\
> \`docType\` field -- that discriminator only appears in the combined\
> endpoint's response.\
> \
> The list may be paginated: follow the \`Link\` header's \`rel="next"\` URL\
> until the header is absent.

```json
{"openapi":"3.2.0","info":{"title":"Marketplace","version":"1.0.0"},"tags":[{"name":"Marketplace","description":"Browse Celigo marketplace content. The marketplace contains two types\nof entries:\n\n- **Integration Apps** — licensed, Celigo-built connectors (e.g.\n  Shopify–NetSuite) that install with managed updates.\n- **Templates** — reusable blueprints that create a set of resources\n  when installed: an integration with its flows, connections, exports,\n  imports, and scripts (`type: integration`), or an MCP server with its\n  tools (`type: mcpserver`).\n\nYou can preview what a template would create before committing to the\ninstall.\n\n## Marketplace entry schema\n\n{% openapi-schemas spec=\"marketplace\" schemas=\"MarketplaceEntry\" grouped=\"true\" %}"}],"servers":[{"url":"https://api.integrator.io","description":"Production (US / default region)"},{"url":"https://api.eu.integrator.io","description":"Production (EU region)"},{"url":"https://api.au.integrator.io","description":"Production (AU region)"},{"url":"https://api.ca.integrator.io","description":"Production (CA region)"}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer"}},"parameters":{"After":{"name":"after","in":"query","required":false,"description":"Opaque cursor for forward pagination. Pass the value from the `Link`\nresponse header (`rel=\"next\"`) to fetch the next page.","schema":{"type":"string"}}},"schemas":{"MarketplaceEntry":{"type":"object","required":["_id","name","applications","numInstalls","user","lastModified"],"description":"A single marketplace listing — either an Integration App (`docType: Connector`)\nor a Template (`docType: Template`). `docType` is only present in\n`POST /v1/published/combined` responses; `GET /v1/published` (Connectors\nonly) and `GET /v1/templates/published` (Templates only) omit the field.","properties":{"_id":{"type":"string","format":"objectId","description":"Marketplace entry id. For Templates, use this with `/v1/templates/{_id}/preview`."},"name":{"type":"string","description":"Display name of the marketplace entry."},"description":{"type":"string","description":"Marketing description shown in the marketplace listing. Always set on\nIntegration Apps; a Template publisher can leave it blank, in which\ncase the field is absent."},"type":{"type":"string","enum":["integration","mcpserver"],"description":"Kind of resource a Template installs, which decides the install route.\nPresent on every Template entry (`GET /v1/templates/published` and\n`docType: Template` entries of `POST /v1/published/combined`); absent\non Connector entries, which install through their own route."},"imageURL":{"type":"string","description":"Relative image path (e.g. `/images/company-logos/amazon-netsuite.png`)\nor absolute URL. Not always present on Template entries."},"websiteURL":{"type":"string","format":"uri","description":"External product page URL. Rare on Template entries."},"applications":{"type":"array","description":"Systems this marketplace entry bridges. Values are either\nwell-known application slugs (`netsuite`, `shopify`, `amazonmws`) or\nobject ids referencing an Application definition.","items":{"type":"string"}},"user":{"type":"object","description":"Publisher metadata.","properties":{"name":{"type":"string","description":"Publisher display name."},"company":{"type":"string","description":"Publisher's company. For Celigo-built content this is `\"Celigo\"`."}}},"trialEnabled":{"type":"boolean","description":"Whether this entry offers a trial install. Populated on Integration\nApp entries; rarely set on Templates."},"lastModified":{"type":"string","format":"date-time","description":"When the marketplace entry was last updated."},"numInstalls":{"type":"integer","description":"Live install counter across all Celigo accounts. Used as the\n`sort_by=numInstalls` key."},"docType":{"type":"string","enum":["Connector","Template"],"description":"Discriminator distinguishing Integration Apps from Templates. Only\npopulated in `POST /v1/published/combined` responses. Absent in\n`GET /v1/published` (Connectors only)."},"framework":{"type":"string","enum":["twoDotZero"],"description":"Integration App framework version. Present only on Connector entries\nthat use the 2.0 edition-based architecture. When set, the\n`twoDotZero` object contains edition metadata."},"twoDotZero":{"type":"object","description":"Edition metadata for Integration Apps using the 2.0 framework.\nPresent only when `framework` is `twoDotZero`.","properties":{"_integrationId":{"type":"string","format":"objectId","description":"Integration id that backs this Integration App."},"editions":{"type":"array","description":"Available editions (e.g. Starter, Professional). Empty when no editions are configured.","items":{"type":"object","properties":{"_id":{"type":"string","format":"objectId","description":"System-generated unique identifier for the edition."},"displayName":{"type":"string","description":"Edition label shown to users (e.g. \"Starter Edition\")."},"order":{"type":"integer","description":"Display order among editions."},"resources":{"type":"object","description":"Resource ids included in this edition.","properties":{"_flowIds":{"type":"array","description":"Ids of the flows included in this edition.","items":{"type":"string","format":"objectId"}},"_importIds":{"type":"array","description":"Ids of the imports included in this edition.","items":{"type":"string","format":"objectId"}},"_exportIds":{"type":"array","description":"Ids of the exports included in this edition.","items":{"type":"string","format":"objectId"}},"_connectionIds":{"type":"array","description":"Ids of the connections included in this edition.","items":{"type":"string","format":"objectId"}},"_asyncHelperIds":{"type":"array","description":"Ids of the async helpers included in this edition.","items":{"type":"string","format":"objectId"}},"_fileDefinitionIds":{"type":"array","description":"Ids of the file definitions included in this edition.","items":{"type":"string","format":"objectId"}}}},"childResources":{"type":"object","description":"Child resource ids (for parent-child Integration Apps).","properties":{"_flowIds":{"type":"array","description":"Ids of the flows included in this edition's child integrations.","items":{"type":"string","format":"objectId"}},"_importIds":{"type":"array","description":"Ids of the imports included in this edition's child integrations.","items":{"type":"string","format":"objectId"}},"_exportIds":{"type":"array","description":"Ids of the exports included in this edition's child integrations.","items":{"type":"string","format":"objectId"}},"_connectionIds":{"type":"array","description":"Ids of the connections included in this edition's child integrations.","items":{"type":"string","format":"objectId"}},"_asyncHelperIds":{"type":"array","description":"Ids of the async helpers included in this edition's child integrations.","items":{"type":"string","format":"objectId"}},"_fileDefinitionIds":{"type":"array","description":"Ids of the file definitions included in this edition's child integrations.","items":{"type":"string","format":"objectId"}}}}}}},"isParentChild":{"type":"boolean","description":"When true, this Integration App uses the parent-child model."}}}}},"Error":{"type":"object","description":"Standard error response envelope returned by integrator.io APIs.","properties":{"errors":{"type":"array","description":"List of errors that occurred while processing the request.","items":{"type":"object","properties":{"code":{"oneOf":[{"type":"string"},{"type":"integer"}],"description":"Machine-readable error code. Usually a string like\n`invalid_ref`, `missing_required_field`, or `unauthorized`;\nmay be an **integer** when the error mirrors an upstream HTTP\nstatus (e.g. `500`) — most commonly returned by connection-ping\nand adaptor-proxy responses."},"message":{"type":"string","description":"Human-readable description of the error."},"field":{"type":"string","description":"Optional pointer to the document field that caused the error.\nUsed by structural validation errors (`missing_required_field`,\n`invalid_ref`) to indicate which field is at fault\n(e.g. `_id`, `type`, `http.baseURI`)."},"source":{"type":"string","description":"Optional origin layer for the error — e.g. `application` when\nthe error came from the remote system the adaptor called,\n`connector` when the adaptor itself rejected the request."}},"required":["message"]}}},"required":["errors"]}},"responses":{"401-unauthorized":{"description":"Unauthorized. The request lacks a valid bearer token, or the provided token\nfailed to authenticate.\n\nNote: the 401 response is produced by the auth middleware **before** the\nrequest reaches the endpoint handler, so it does **not** follow the\nstandard `{errors: [...]}` envelope. Instead the body is a bare\n`{message: string}` object with no `code`, no `errors` array. Callers\nhandling 401s should key off the HTTP status and the `message` string,\nnot try to destructure an `errors[]`.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","description":"Human-readable description of the auth failure. Known values:\n- `\"Unauthorized\"` — no `Authorization` header on the request.\n- `\"Bearer Authentication Failed\"` — header present but token\n  is invalid, revoked, or expired."}},"required":["message"]}}}}}},"paths":{"/v1/published":{"get":{"operationId":"listPublishedConnectors","tags":["Marketplace"],"summary":"List published Integration Apps (Connectors)","description":"Returns the marketplace catalog of **Integration Apps** — the\nCeligo-built, fully-managed connectors that install as a single\nintegration. Roughly 30 entries curated by Celigo.\n\nEach item is a marketplace listing, not an integration instance —\n`_id` is the marketplace entry id, the `applications` array enumerates\nthe systems the connector bridges, and `numInstalls` is the live install\ncounter across all Celigo accounts.\n\nFor a combined list that also includes user-installable Templates,\nuse `POST /v1/published/combined` instead. Entries here have no\n`docType` field -- that discriminator only appears in the combined\nendpoint's response.\n\nThe list may be paginated: follow the `Link` header's `rel=\"next\"` URL\nuntil the header is absent.","parameters":[{"$ref":"#/components/parameters/After"}],"responses":{"200":{"description":"Array of Integration App (Connector) marketplace entries.","headers":{"Link":{"description":"RFC 5988 pagination links. When more pages remain, includes a\n`<...>; rel=\"next\"` entry with an `after` cursor; absent on the\nfinal page.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MarketplaceEntry"}}}}},"400":{"description":"`after` is not a valid pagination cursor.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"$ref":"#/components/responses/401-unauthorized"}}}}}}
```

## List Integration Apps and Templates together

> Returns a unified array of marketplace content — both Integration\
> Apps (\`docType: Connector\`) and Templates (\`docType: Template\`). Each\
> entry carries the \`docType\` discriminator so callers can partition, and\
> every Template entry also carries \`type\` (\`integration\` or \`mcpserver\`),\
> which decides its install route. The list may be paginated: follow the\
> \`Link\` header's \`rel="next"\` URL until the header is absent.\
> \
> Despite being a POST, this is a \*\*read-only, safe\*\* endpoint — the body\
> is an empty \`{}\` in the default CLI invocation. POST is used purely to\
> carry sort and filter parameters that don't fit cleanly in a query\
> string. The route is POST-only.\
> \
> Always send \`Content-Type: application/json\` with at least \`{}\` as\
> the body. For Connector-only listings, \`GET /v1/published\` is\
> lighter.

```json
{"openapi":"3.2.0","info":{"title":"Marketplace","version":"1.0.0"},"tags":[{"name":"Marketplace","description":"Browse Celigo marketplace content. The marketplace contains two types\nof entries:\n\n- **Integration Apps** — licensed, Celigo-built connectors (e.g.\n  Shopify–NetSuite) that install with managed updates.\n- **Templates** — reusable blueprints that create a set of resources\n  when installed: an integration with its flows, connections, exports,\n  imports, and scripts (`type: integration`), or an MCP server with its\n  tools (`type: mcpserver`).\n\nYou can preview what a template would create before committing to the\ninstall.\n\n## Marketplace entry schema\n\n{% openapi-schemas spec=\"marketplace\" schemas=\"MarketplaceEntry\" grouped=\"true\" %}"}],"servers":[{"url":"https://api.integrator.io","description":"Production (US / default region)"},{"url":"https://api.eu.integrator.io","description":"Production (EU region)"},{"url":"https://api.au.integrator.io","description":"Production (AU region)"},{"url":"https://api.ca.integrator.io","description":"Production (CA region)"}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer"}},"parameters":{"After":{"name":"after","in":"query","required":false,"description":"Opaque cursor for forward pagination. Pass the value from the `Link`\nresponse header (`rel=\"next\"`) to fetch the next page.","schema":{"type":"string"}}},"schemas":{"MarketplaceEntry":{"type":"object","required":["_id","name","applications","numInstalls","user","lastModified"],"description":"A single marketplace listing — either an Integration App (`docType: Connector`)\nor a Template (`docType: Template`). `docType` is only present in\n`POST /v1/published/combined` responses; `GET /v1/published` (Connectors\nonly) and `GET /v1/templates/published` (Templates only) omit the field.","properties":{"_id":{"type":"string","format":"objectId","description":"Marketplace entry id. For Templates, use this with `/v1/templates/{_id}/preview`."},"name":{"type":"string","description":"Display name of the marketplace entry."},"description":{"type":"string","description":"Marketing description shown in the marketplace listing. Always set on\nIntegration Apps; a Template publisher can leave it blank, in which\ncase the field is absent."},"type":{"type":"string","enum":["integration","mcpserver"],"description":"Kind of resource a Template installs, which decides the install route.\nPresent on every Template entry (`GET /v1/templates/published` and\n`docType: Template` entries of `POST /v1/published/combined`); absent\non Connector entries, which install through their own route."},"imageURL":{"type":"string","description":"Relative image path (e.g. `/images/company-logos/amazon-netsuite.png`)\nor absolute URL. Not always present on Template entries."},"websiteURL":{"type":"string","format":"uri","description":"External product page URL. Rare on Template entries."},"applications":{"type":"array","description":"Systems this marketplace entry bridges. Values are either\nwell-known application slugs (`netsuite`, `shopify`, `amazonmws`) or\nobject ids referencing an Application definition.","items":{"type":"string"}},"user":{"type":"object","description":"Publisher metadata.","properties":{"name":{"type":"string","description":"Publisher display name."},"company":{"type":"string","description":"Publisher's company. For Celigo-built content this is `\"Celigo\"`."}}},"trialEnabled":{"type":"boolean","description":"Whether this entry offers a trial install. Populated on Integration\nApp entries; rarely set on Templates."},"lastModified":{"type":"string","format":"date-time","description":"When the marketplace entry was last updated."},"numInstalls":{"type":"integer","description":"Live install counter across all Celigo accounts. Used as the\n`sort_by=numInstalls` key."},"docType":{"type":"string","enum":["Connector","Template"],"description":"Discriminator distinguishing Integration Apps from Templates. Only\npopulated in `POST /v1/published/combined` responses. Absent in\n`GET /v1/published` (Connectors only)."},"framework":{"type":"string","enum":["twoDotZero"],"description":"Integration App framework version. Present only on Connector entries\nthat use the 2.0 edition-based architecture. When set, the\n`twoDotZero` object contains edition metadata."},"twoDotZero":{"type":"object","description":"Edition metadata for Integration Apps using the 2.0 framework.\nPresent only when `framework` is `twoDotZero`.","properties":{"_integrationId":{"type":"string","format":"objectId","description":"Integration id that backs this Integration App."},"editions":{"type":"array","description":"Available editions (e.g. Starter, Professional). Empty when no editions are configured.","items":{"type":"object","properties":{"_id":{"type":"string","format":"objectId","description":"System-generated unique identifier for the edition."},"displayName":{"type":"string","description":"Edition label shown to users (e.g. \"Starter Edition\")."},"order":{"type":"integer","description":"Display order among editions."},"resources":{"type":"object","description":"Resource ids included in this edition.","properties":{"_flowIds":{"type":"array","description":"Ids of the flows included in this edition.","items":{"type":"string","format":"objectId"}},"_importIds":{"type":"array","description":"Ids of the imports included in this edition.","items":{"type":"string","format":"objectId"}},"_exportIds":{"type":"array","description":"Ids of the exports included in this edition.","items":{"type":"string","format":"objectId"}},"_connectionIds":{"type":"array","description":"Ids of the connections included in this edition.","items":{"type":"string","format":"objectId"}},"_asyncHelperIds":{"type":"array","description":"Ids of the async helpers included in this edition.","items":{"type":"string","format":"objectId"}},"_fileDefinitionIds":{"type":"array","description":"Ids of the file definitions included in this edition.","items":{"type":"string","format":"objectId"}}}},"childResources":{"type":"object","description":"Child resource ids (for parent-child Integration Apps).","properties":{"_flowIds":{"type":"array","description":"Ids of the flows included in this edition's child integrations.","items":{"type":"string","format":"objectId"}},"_importIds":{"type":"array","description":"Ids of the imports included in this edition's child integrations.","items":{"type":"string","format":"objectId"}},"_exportIds":{"type":"array","description":"Ids of the exports included in this edition's child integrations.","items":{"type":"string","format":"objectId"}},"_connectionIds":{"type":"array","description":"Ids of the connections included in this edition's child integrations.","items":{"type":"string","format":"objectId"}},"_asyncHelperIds":{"type":"array","description":"Ids of the async helpers included in this edition's child integrations.","items":{"type":"string","format":"objectId"}},"_fileDefinitionIds":{"type":"array","description":"Ids of the file definitions included in this edition's child integrations.","items":{"type":"string","format":"objectId"}}}}}}},"isParentChild":{"type":"boolean","description":"When true, this Integration App uses the parent-child model."}}}}},"Error":{"type":"object","description":"Standard error response envelope returned by integrator.io APIs.","properties":{"errors":{"type":"array","description":"List of errors that occurred while processing the request.","items":{"type":"object","properties":{"code":{"oneOf":[{"type":"string"},{"type":"integer"}],"description":"Machine-readable error code. Usually a string like\n`invalid_ref`, `missing_required_field`, or `unauthorized`;\nmay be an **integer** when the error mirrors an upstream HTTP\nstatus (e.g. `500`) — most commonly returned by connection-ping\nand adaptor-proxy responses."},"message":{"type":"string","description":"Human-readable description of the error."},"field":{"type":"string","description":"Optional pointer to the document field that caused the error.\nUsed by structural validation errors (`missing_required_field`,\n`invalid_ref`) to indicate which field is at fault\n(e.g. `_id`, `type`, `http.baseURI`)."},"source":{"type":"string","description":"Optional origin layer for the error — e.g. `application` when\nthe error came from the remote system the adaptor called,\n`connector` when the adaptor itself rejected the request."}},"required":["message"]}}},"required":["errors"]}},"responses":{"401-unauthorized":{"description":"Unauthorized. The request lacks a valid bearer token, or the provided token\nfailed to authenticate.\n\nNote: the 401 response is produced by the auth middleware **before** the\nrequest reaches the endpoint handler, so it does **not** follow the\nstandard `{errors: [...]}` envelope. Instead the body is a bare\n`{message: string}` object with no `code`, no `errors` array. Callers\nhandling 401s should key off the HTTP status and the `message` string,\nnot try to destructure an `errors[]`.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","description":"Human-readable description of the auth failure. Known values:\n- `\"Unauthorized\"` — no `Authorization` header on the request.\n- `\"Bearer Authentication Failed\"` — header present but token\n  is invalid, revoked, or expired."}},"required":["message"]}}}}}},"paths":{"/v1/published/combined":{"post":{"operationId":"listPublishedCombined","tags":["Marketplace"],"summary":"List Integration Apps and Templates together","description":"Returns a unified array of marketplace content — both Integration\nApps (`docType: Connector`) and Templates (`docType: Template`). Each\nentry carries the `docType` discriminator so callers can partition, and\nevery Template entry also carries `type` (`integration` or `mcpserver`),\nwhich decides its install route. The list may be paginated: follow the\n`Link` header's `rel=\"next\"` URL until the header is absent.\n\nDespite being a POST, this is a **read-only, safe** endpoint — the body\nis an empty `{}` in the default CLI invocation. POST is used purely to\ncarry sort and filter parameters that don't fit cleanly in a query\nstring. The route is POST-only.\n\nAlways send `Content-Type: application/json` with at least `{}` as\nthe body. For Connector-only listings, `GET /v1/published` is\nlighter.","parameters":[{"$ref":"#/components/parameters/After"},{"name":"sort_by","in":"query","required":false,"schema":{"type":"string","enum":["numInstalls","name","lastModified"]},"description":"Sort key. `numInstalls` (descending) matches the CLI default.\nOmitting `sort_by` returns results in server-default order."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"Body is required (even if empty) because the endpoint is POST\nand the server enforces `Content-Type: application/json` —\notherwise 415. No fields inside the body are currently honored by\nthe server for filtering."}}}},"responses":{"200":{"description":"Array of marketplace entries, both Connectors and Templates.","headers":{"Link":{"description":"RFC 5988 pagination links. When more pages remain, includes a\n`<...>; rel=\"next\"` entry with an `after` cursor; absent on the\nfinal page.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MarketplaceEntry"}}}}},"400":{"description":"Typically `invalid_query_param` when `sort_by` is outside the\naccepted enum or `after` is not a valid pagination cursor.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"$ref":"#/components/responses/401-unauthorized"},"415":{"description":"Request lacked `Content-Type: application/json`. The server refuses\nto accept the body and returns this even when the body is an empty\nstring.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
```
