Converly Sites API
The Sites API from Converly — 5 operation(s) for sites.
The Sites API from Converly — 5 operation(s) for sites.
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
find_apisBrowse and filter every API in the catalog.get_api_artifactsOne API's artifacts, grouped by type.get_openapiThe primary OpenAPI for this API.find_similar_apisAPIs that look like this one.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.curl "https://apis.io/api/v1/apis/converly-io:converly-io-sites-api"
curl "https://apis.io/api/v1/apis?limit=25"
Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
title: Converly Io Sites API
version: 1.0.0
description: 'Operations tagged Sites across 2 of this provider''s published API definitions: converly-io-openapi.json, converly-io-openapi.yml. Each path carries the servers of the definition it was published in.'
servers:
- url: https://app.converly.io/api/v1
tags:
- name: Sites
paths:
/sites/{id}/value-sources:
post:
description: Read which monetary sources this site's trigger can supply to a draft action. Requires flows:read and site ownership (including plugin site scope). No conversion is sent. Choose only a source with structural.eligible, availability.available and publication.allowed all true. Availability is current, not a publication guarantee.
security:
- BearerAuth: []
parameters:
- schema:
$ref: '#/components/schemas/SiteId'
required: true
description: Prefixed site id, e.g. site_xxxxxx
name: id
in: path
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
trigger:
type: object
properties:
integrationId:
type: string
minLength: 1
maxLength: 128
integration:
type: string
minLength: 1
maxLength: 128
triggerId:
type: string
minLength: 1
maxLength: 128
additionalProperties: {}
action:
type: object
properties:
id:
type: string
integrationId:
type: string
minLength: 1
maxLength: 128
config:
type: object
properties: {}
additionalProperties: {}
required:
- integrationId
- config
additionalProperties: {}
required:
- trigger
- action
additionalProperties: false
responses:
'200':
description: Backend-authoritative source options and the selected reference's verdict.
content:
application/json:
schema:
type: object
properties:
version:
type: number
enum:
- 1
sources:
type: array
items:
type: object
properties:
id:
type: string
sourceId:
type: string
triggerId:
type: string
intent:
type: string
label:
type: string
description:
type: string
icon:
type: string
acquisitionStage:
type: string
channels:
type: array
items:
type: string
currencyMode:
type: string
enum:
- declared
- source
- automatic
resolverVersion:
type: number
structural:
type: object
properties:
eligible:
type: boolean
reason:
type:
- string
- 'null'
required:
- eligible
- reason
availability:
type: object
properties:
available:
type: boolean
reason:
type:
- string
- 'null'
required:
- available
- reason
publication:
type: object
properties:
allowed:
type: boolean
reason:
type:
- string
- 'null'
required:
- allowed
- reason
required:
- id
- sourceId
- triggerId
- intent
- label
- description
- icon
- acquisitionStage
- channels
- currencyMode
- resolverVersion
- structural
- availability
- publication
maxItems: 100
selected:
type:
- object
- 'null'
properties:
reference:
type: object
properties:
triggerId:
type: string
sourceId:
type: string
required:
- triggerId
- sourceId
structural:
type: object
properties:
eligible:
type: boolean
reason:
type:
- string
- 'null'
required:
- eligible
- reason
availability:
type: object
properties:
available:
type: boolean
reason:
type:
- string
- 'null'
required:
- available
- reason
publication:
type: object
properties:
allowed:
type: boolean
reason:
type:
- string
- 'null'
required:
- allowed
- reason
required:
- reference
- structural
- availability
- publication
required:
- version
- sources
- selected
'400':
description: Invalid trigger or draft action.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorEnvelope'
'401':
description: Structured error envelope.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorEnvelope'
'403':
description: Structured error envelope.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorEnvelope'
'404':
description: Site not found in this credential's scope.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorEnvelope'
'503':
description: Value discovery unavailable; retain existing selections and retry.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorEnvelope'
tags:
- Sites
summary: Create sites by id value sources
x-summary-source: derived
operationId: postSitesByIdValueSources
x-operation-id-source: derived
servers:
- url: https://app.converly.io/api/v1
/sites:
get:
description: List sites for the authenticated account.
security:
- BearerAuth: []
parameters:
- schema:
type: integer
minimum: 1
maximum: 1000
required: false
name: limit
in: query
- schema:
type: string
required: false
name: starting_after
in: query
- schema:
type: string
required: false
name: ending_before
in: query
responses:
'200':
description: Paginated list of sites.
content:
application/json:
schema:
$ref: '#/components/schemas/PaginatedSites'
'401':
description: Structured error envelope.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorEnvelope'
'403':
description: Structured error envelope.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorEnvelope'
tags:
- Sites
summary: Get sites
x-summary-source: derived
operationId: getSites
x-operation-id-source: derived
post:
description: 'Create a site. All fields optional — defaults: name=''My Website'', domain=null, timezone=''America/New_York''. Supports Idempotency-Key header.'
security:
- BearerAuth: []
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/SiteWriteBody'
responses:
'201':
description: The newly created site.
content:
application/json:
schema:
$ref: '#/components/schemas/Site'
'400':
description: Validation failure (e.g. domain empty string).
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorEnvelope'
'401':
description: Structured error envelope.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorEnvelope'
'403':
description: 'invalid_scope (a site-scoped token cannot create sites), or site_limit_reached: the account''s plan has no free site.'
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorEnvelope'
'409':
description: 'billing_change_in_progress: a change to the account''s plan is in progress. Nothing was created; retry shortly.'
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorEnvelope'
tags:
- Sites
summary: Create sites
x-summary-source: derived
operationId: postSites
x-operation-id-source: derived
servers:
- url: https://app.converly.io/api/v1
/sites/{id}:
get:
description: Get a single site.
security:
- BearerAuth: []
parameters:
- schema:
$ref: '#/components/schemas/SiteId'
required: true
description: Prefixed site id, e.g. site_xxxxxx
name: id
in: path
responses:
'200':
description: The site.
content:
application/json:
schema:
$ref: '#/components/schemas/Site'
'404':
description: Structured error envelope.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorEnvelope'
tags:
- Sites
summary: Get sites by id
x-summary-source: derived
operationId: getSitesById
x-operation-id-source: derived
patch:
description: Partial update. Changing `domain` triggers a cross-service sync to the delivery service's allowed_origins — failure rolls back only the domain field (other changes persist). One domain auto-expands to [domain, www-variant] at the delivery service.
security:
- BearerAuth: []
parameters:
- schema:
$ref: '#/components/schemas/SiteId'
required: true
description: Prefixed site id, e.g. site_xxxxxx
name: id
in: path
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/SiteWriteBody'
responses:
'200':
description: The updated site.
content:
application/json:
schema:
$ref: '#/components/schemas/Site'
'400':
description: Structured error envelope.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorEnvelope'
'404':
description: Structured error envelope.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorEnvelope'
'502':
description: Delivery-service sync failed; domain change rolled back.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorEnvelope'
tags:
- Sites
summary: Update sites by id
x-summary-source: derived
operationId: patchSitesById
x-operation-id-source: derived
delete:
description: Remove a site. No undelete. The removal is reserved first, so the site is hidden from every read and list, its flows can't be published and its pending connect handoffs are cancelled. Converly then tells the delivery service to stop accepting the site's conversions, and only after that is confirmed deletes the site with its flows, publications, plugin integrations and known triggers. An unconfirmed stop answers 502 removal_unconfirmed and is retried automatically until confirmed.
security:
- BearerAuth: []
parameters:
- schema:
$ref: '#/components/schemas/SiteId'
required: true
description: Prefixed site id, e.g. site_xxxxxx
name: id
in: path
responses:
'200':
description: Deleted.
content:
application/json:
schema:
$ref: '#/components/schemas/DeletedResponse'
'404':
description: Structured error envelope.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorEnvelope'
'409':
description: 'last_site: a single-site plan''s only site cannot be removed. Or billing_change_in_progress: a change to the account''s plan is in progress; nothing changed.'
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorEnvelope'
'502':
description: 'removal_unconfirmed: the removal was started but could not be confirmed. Retrying is safe, and Converly also keeps retrying automatically until it is confirmed.'
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorEnvelope'
tags:
- Sites
summary: Delete sites by id
x-summary-source: derived
operationId: deleteSitesById
x-operation-id-source: derived
servers:
- url: https://app.converly.io/api/v1
/sites/{id}/install-snippet:
get:
description: Return the HTML tag to embed on the customer's site.
security:
- BearerAuth: []
parameters:
- schema:
$ref: '#/components/schemas/SiteId'
required: true
description: Prefixed site id, e.g. site_xxxxxx
name: id
in: path
responses:
'200':
description: Snippet + site_key.
content:
application/json:
schema:
$ref: '#/components/schemas/InstallSnippet'
'404':
description: Structured error envelope.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorEnvelope'
tags:
- Sites
summary: Get sites by id install snippet
x-summary-source: derived
operationId: getSitesByIdInstallSnippet
x-operation-id-source: derived
servers:
- url: https://app.converly.io/api/v1
/sites/{id}/install-status:
get:
description: Whether tracking is working on the site, based on captured conversion events ('confirmed' proves the snippet is live; 'never_seen' only means no conversions captured yet). High-volume polling endpoint (audit logging skipped).
security:
- BearerAuth: []
parameters:
- schema:
$ref: '#/components/schemas/SiteId'
required: true
description: Prefixed site id, e.g. site_xxxxxx
name: id
in: path
responses:
'200':
description: Install status.
content:
application/json:
schema:
$ref: '#/components/schemas/InstallStatus'
'404':
description: Structured error envelope.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorEnvelope'
tags:
- Sites
summary: Get sites by id install status
x-summary-source: derived
operationId: getSitesByIdInstallStatus
x-operation-id-source: derived
servers:
- url: https://app.converly.io/api/v1
components:
schemas:
Site:
type: object
properties:
id:
$ref: '#/components/schemas/SiteId'
name:
type: string
domain:
type:
- string
- 'null'
timezone:
type:
- string
- 'null'
site_key:
type: string
created_at:
type: string
format: date-time
updated_at:
type: string
format: date-time
required:
- id
- name
- domain
- timezone
- site_key
- created_at
- updated_at
SiteId:
type: string
pattern: ^site_[0-9A-Za-z]{22}$
description: Prefixed site id, e.g. site_xxxxxx
InstallSnippet:
type: object
properties:
snippet:
type: string
description: HTML `<script>` tag to paste into the site.
site_key:
type: string
description: Short opaque site key (embedded in the snippet's ?key= param).
required:
- snippet
- site_key
DeletedResponse:
type: object
properties:
deleted:
type: boolean
enum:
- true
required:
- deleted
InstallStatus:
type: object
properties:
installed:
type: boolean
last_seen_at:
type:
- string
- 'null'
format: date-time
detection:
type: string
enum:
- pending
- confirmed
- never_seen
source:
type: string
enum:
- heartbeat
description: Present when the detection came from the loader heartbeat (the loader was seen running within 48h). Advisory — treat as 'loader seen recently', not verified installation.
origin_authorized:
type: boolean
description: Heartbeat detections only. false = the loader is running on an origin this site is not authorized for, so conversions are being rejected — fix the site's domain.
last_origin:
type:
- string
- 'null'
description: 'Heartbeat detections only: the origin the loader was last seen on.'
required:
- installed
- last_seen_at
- detection
description: 'Two detection signals, in preference order. Loader heartbeat: ''confirmed'' with source ''heartbeat'' means the loader was seen running within 48h (advisory), with origin_authorized/last_origin alongside. Captured events fallback: ''confirmed'' without a source means at least one conversion event exists. ''never_seen'' = neither signal — NOT proof the snippet is missing. ''pending'' = the lookups failed; try again.'
ErrorEnvelope:
type: object
properties:
error:
type: object
properties:
type:
type: string
enum:
- invalid_request_error
- authentication_error
- permission_error
- not_found_error
- rate_limit_error
- delivery_service_error
- internal_error
- idempotency_error
code:
type: string
message:
type: string
param:
type: string
required:
- type
- code
- message
required:
- error
SiteWriteBody:
type: object
properties:
name:
type: string
minLength: 1
maxLength: 255
domain:
type:
- string
- 'null'
description: Forgiving input — bare host, URL with path, or URL with trailing slash all accepted and normalized to `{scheme}://{host}`. Empty string is rejected. Set to null to clear (denies all origins).
timezone:
type: string
maxLength: 100
description: IANA timezone string. NOT validated beyond length.
PaginatedSites:
type: object
properties:
data:
type: array
items:
$ref: '#/components/schemas/Site'
has_more:
type: boolean
next_cursor:
type:
- string
- 'null'
required:
- data
- has_more
- next_cursor
securitySchemes:
BearerAuth:
type: http
scheme: bearer
bearerFormat: sk_live_...
InternalBearer:
type: http
scheme: bearer
bearerFormat: JOBS_SECRET
description: Shared internal secret. This is NOT an sk_live_* API key. Used by /v1/signup and internal job endpoints.
x-refined-from:
- converly-io-openapi.json
- converly-io-openapi.yml