Converly Sites API

The Sites API from Converly — 5 operation(s) for sites.

GitHub OpenAPI

Operations 8

POST /sites/{id}/value-sources Create sites by id value sources #
GET /sites Get sites #
POST /sites Create sites #
GET /sites/{id} Get sites by id #
PATCH /sites/{id} Update sites by id #
DELETE /sites/{id} Delete sites by id #
GET /sites/{id}/install-snippet Get sites by id install snippet #
GET /sites/{id}/install-status Get sites by id install status #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • 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.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/converly-io:converly-io-sites-api"
All apis
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.

Get an API 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 Specification

converly-io-sites-api-openapi.yml Raw ↑
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