Version

Connectors API

A Subscriby project runs on connectors: the platforms it gates access on, sends messages through and takes payments from.

A Subscriby project runs on connectors: the platforms it gates access on, sends messages through and takes payments from. The directory these endpoints serve is the same one the dashboard and the marketing site render, so a client reads one document and knows which connectors exist, which a creator may install today, what each can do, and exactly which fields connecting one asks for. The manifest is served whole because the creator apps render the connect form from it: no client has to know what a "bot token" is before the connector says so.

The catalogue is the same for every creator and never carries a credential. A project's installations are what the Connectors tab lists: every connector set up on the project, live and standby, with its state and health.

Endpoints

GET

Every connector Subscriby knows, lane by lane, installable connectors first, each with its badges and, for a registered one, its whole manifest and the connect form. ?status= narrows to one lane.

curl https://api.subscriby.net/v1/connectors \  -H "Authorization: Bearer $SUBSCRIBY_TOKEN"

Cards come lane by lane, installable connectors first; within a lane the most installed connector comes first (installations, the number of projects running it today, uninstalled rows excluded) and the name breaks ties. The public and in-app directories offer the same order plus Newest (added_at) and Name, and filter on official, installable and category; a client sorts and filters on the same fields.

Lanes and badges

statusstatus_labelMeaning
availableAvailable NowA package is present and configuration offers it; installable is true.
betaExperimentalAvailable, and flagged so; a badge on the card, never a gate. installable is true.
pausedPausedSwitched off during an incident. Nothing new is installed and sends queue until it is back.
in_developmentUnder DevelopmentA package exists but configuration does not offer it yet (built, on staging, dark).
coming_soonComing SoonA roadmap entry with no package behind it: the card, the category and an eta sentence only.

badges are facts the platform stamps, never a package's own claim: official or community (who publishes it), new while the listing was added within the last sixty days, trending for the connector(s) creators installed most in the last thirty days. A coming_soon card carries none.

GET
/v1/connectors

The token must hold this ability, or the call is refused with 403.

Runs the same action from an agent, behind the same ability.

Authorization

bearerToken
AuthorizationBearer <token>

A personal access token minted on the dashboard under Settings, then Tokens, sent as Authorization: Bearer sbt_live_…. The token carries the abilities each endpoint lists under Requires ability and is frozen to one team.

In: header

Query Parameters

status?string

Narrow the directory to one lane: available, beta, paused, in_development or coming_soon. Omit for every lane. An unknown lane is 422 VALIDATION_FAILED naming the accepted values.

Responses

200OK

Array of ConnectorListingResource

401Unauthorized

The request carries no bearer token, or one that is revoked, malformed, or minted for another environment (an sbt_test_ token on production).

403Forbidden

The token is valid but does not carry the ability this endpoint requires; error.context.required_ability names the one to grant. An endpoint that also checks who owns a row or which tier the account is on answers FORBIDDEN, TEAM_TIER_REQUIRED or CONNECTOR_TIER_REQUIRED with the same status, and says so in its own description.

422Validation failed

When status names no lane; error.context.accepted lists the lanes.

429Too many requests

The token has spent its 300 requests a minute or 10,000 an hour; Retry-After says when the next one is accepted.

Get one connector

GET

One card by key, registered or on the roadmap, in the shape the directory lists.

curl https://api.subscriby.net/v1/connectors/example \  -H "Authorization: Bearer $SUBSCRIBY_TOKEN"

The manifest

Every key from install_mode onward describes what a registered connector can do; a roadmap card has them null or empty.

  • install_mode: paste_credential (the creator pastes a token the platform issued), oauth (the creator authorises an app), shared_platform (Subscriby runs one shared presence; nothing to connect).
  • scopes: project for an installation a creator sets up on a project; platform for a presence Subscriby itself runs on the connector.
  • resource_kinds: the kinds of place the connector gates, with the creator-facing label, the portal_label members see, an icon slug, the grant_mode (bearer_link: a single-use link; membership: the connector admits the member itself; role: a role is granted; creator_task: the creator hands access over by hand), whether a grant can be held ahead of a pass window (supports_early_admission_hold), the kind of the same connector a place of this kind can be an in-place upgrade of (upgrades_from, or null), and the shapes of plan a place of the kind can be sold under (plan_kinds: one_time, recurring, pass, pass_series, in that order). A resource's kind on the Resources endpoints is <key>:<kind>, and the same spelling is what a link request takes. Labels are translated into the token holder's language.
  • capabilities: the port families the connector implements: messaging, broadcasts, access_control, early_admission_hold, support_relay, native_payments, portal_login, creator_registration, management_surface, recovery_probes, recovery_standby_installations, recovery_resource_standby, recovery_mirror, recovery_identity_relink.
  • messaging and pacing: the limits every message and every bulk send is checked against.
  • management_commands and missing_commands: which core commands the connector's in-chat surface renders and which it does not; the docs' capability matrix and the Connectors tab show the gaps from these.
  • recovery: which Disaster Recovery facets the connector implements.
  • portal_cta: the button the member portal shows to open the connector (label, translated, and icon), or null when the connector has nowhere to open; the portal addresses it through the installation's start link.
  • install_fields and settings_fields: the declarative forms. Each field carries type (text, secret, select, toggle, instructions, link), a translated label and help, required, the validation rules, options for a select, a default value, the numbered walkthrough steps (with :app and :button placeholders for the app's name and the submit button's label) and links naming the text a renderer turns into a link. Render them in order and you have the connect form the dashboard shows.
GET
/v1/connectors/{key}

The token must hold this ability, or the call is refused with 403.

Runs the same action from an agent, behind the same ability.

Authorization

bearerToken
AuthorizationBearer <token>

A personal access token minted on the dashboard under Settings, then Tokens, sent as Authorization: Bearer sbt_live_…. The token carries the abilities each endpoint lists under Requires ability and is frozen to one team.

In: header

Path Parameters

key*string

The connector key from the route.

Responses

200OK

200 with the card.

401Unauthorized

The request carries no bearer token, or one that is revoked, malformed, or minted for another environment (an sbt_test_ token on production).

403Forbidden

The token is valid but does not carry the ability this endpoint requires; error.context.required_ability names the one to grant. An endpoint that also checks who owns a row or which tier the account is on answers FORBIDDEN, TEAM_TIER_REQUIRED or CONNECTOR_TIER_REQUIRED with the same status, and says so in its own description.

404Not found

An id in the path names nothing the token can see. TENANT_MISMATCH: the project sits outside the token's scope:project: allow-list, or the token carries no team scope. Both answer 404 rather than 403 so that existence outside the token's scope cannot be inferred. On this endpoint: RESOURCE_NOT_FOUND: when nothing is known by that key; error.context.connector echoes it.

429Too many requests

The token has spent its 300 requests a minute or 10,000 an hour; Retry-After says when the next one is accepted.

Every installation the project holds, live and standby, oldest first.

curl https://api.subscriby.net/v1/projects/7f3d1c92-8b45-4e6a-9d21-5c8e0a4b6f13/connectors \  -H "Authorization: Bearer $SUBSCRIBY_TOKEN"

role is live for the one that acts and standby for the spare the Disaster Recovery Program keeps; state is pending, connected, degraded (the health probe found something wrong, state_reason and state_detail say what, creator_actionable whether the creator can fix it), revoked (the platform withdrew it) or disconnected (the creator did); operational is the one-word answer to "can it act right now?". external_id, display_name, handle and avatar_url are the platform's own account for the installation. Credentials and settings are never serialised.

sales_paused and outage describe a connector outage: the platform refused this live installation outright (token revoked or regenerated, bot deleted). While sales_paused is true, outage carries the outage's id, the connector's reason code and started_at, and every plan that unlocks a place on this connector is refused at checkout with 422 VALIDATION_FAILED; both go back to false and null when the installation answers again, is replaced or is uninstalled. Connector outages describes what members see and how they are compensated; connector.outage_opened and connector.outage_closed announce both ends.

GET
/v1/projects/{project}/connectors

The token must hold this ability, or the call is refused with 403.

Runs the same action from an agent, behind the same ability.

Authorization

bearerToken
AuthorizationBearer <token>

A personal access token minted on the dashboard under Settings, then Tokens, sent as Authorization: Bearer sbt_live_…. The token carries the abilities each endpoint lists under Requires ability and is frozen to one team.

In: header

Path Parameters

project*string

The project, resolved by the route binder.

Formatuuid

Responses

200OK

Array of ConnectorInstallationResource

401Unauthorized

The request carries no bearer token, or one that is revoked, malformed, or minted for another environment (an sbt_test_ token on production).

403Forbidden

The token is valid but does not carry the ability this endpoint requires; error.context.required_ability names the one to grant. An endpoint that also checks who owns a row or which tier the account is on answers FORBIDDEN, TEAM_TIER_REQUIRED or CONNECTOR_TIER_REQUIRED with the same status, and says so in its own description.

404Not found

An id in the path names nothing the token can see. TENANT_MISMATCH: the project sits outside the token's scope:project: allow-list, or the token carries no team scope. Both answer 404 rather than 403 so that existence outside the token's scope cannot be inferred.

429Too many requests

The token has spent its 300 requests a minute or 10,000 an hour; Retry-After says when the next one is accepted.

The project's installation of that connector in the live role, in whatever state, in the shape the installations list describes.

curl https://api.subscriby.net/v1/projects/7f3d1c92-8b45-4e6a-9d21-5c8e0a4b6f13/connectors/example/installation \  -H "Authorization: Bearer $SUBSCRIBY_TOKEN"
GET
/v1/projects/{project}/connectors/{key}/installation

Requires ability

The token must hold this ability, or the call is refused with 403.

Runs the same action from an agent, behind the same ability.

Authorization

bearerToken
AuthorizationBearer <token>

A personal access token minted on the dashboard under Settings, then Tokens, sent as Authorization: Bearer sbt_live_…. The token carries the abilities each endpoint lists under Requires ability and is frozen to one team.

In: header

Path Parameters

project*string

The project, resolved by the route binder.

Formatuuid
key*string

The connector key from the route.

Responses

200OK

200 with the installation.

401Unauthorized

The request carries no bearer token, or one that is revoked, malformed, or minted for another environment (an sbt_test_ token on production).

403Forbidden

The token is valid but does not carry the ability this endpoint requires; error.context.required_ability names the one to grant. An endpoint that also checks who owns a row or which tier the account is on answers FORBIDDEN, TEAM_TIER_REQUIRED or CONNECTOR_TIER_REQUIRED with the same status, and says so in its own description.

404Not found

An id in the path names nothing the token can see. TENANT_MISMATCH: the project sits outside the token's scope:project: allow-list, or the token carries no team scope. Both answer 404 rather than 403 so that existence outside the token's scope cannot be inferred. On this endpoint: RESOURCE_NOT_FOUND: with reason: unknown_connector when the key names no connector at all, so a client can tell a typo from a connector that is not set up here. CONNECTOR_NOT_INSTALLED: when the connector exists but the project does not run it.

429Too many requests

The token has spent its 300 requests a minute or 10,000 an hour; Retry-After says when the next one is accepted.

DELETE
curl -X DELETE https://api.subscriby.net/v1/projects/7f3d1c92-8b45-4e6a-9d21-5c8e0a4b6f13/connectors/example/installation \  -H "Authorization: Bearer $SUBSCRIBY_TOKEN" \  -H "Idempotency-Key: $(uuidgen)"

The connector withdraws the installation on its platform, the credentials are wiped and the installation turns disconnected; the row stays and can be connected again from the dashboard. Grants, resources, plans and identities are untouched, and members keep the access they hold. Answers 204; an installation already disconnected is left alone. Disconnecting is not uninstalling: uninstalling, with its impact preview over the plans it would empty, is the separate act below.

DELETE
/v1/projects/{project}/connectors/{key}/installation

Requires ability

The token must hold this ability, or the call is refused with 403.

Fires one event

Delivered to every endpoint subscribed to it once the change is made.

Runs the same action from an agent, behind the same ability.

Idempotent

Send the header on every call; the same key replays the original response for 24 hours.

Authorization

bearerToken
AuthorizationBearer <token>

A personal access token minted on the dashboard under Settings, then Tokens, sent as Authorization: Bearer sbt_live_…. The token carries the abilities each endpoint lists under Requires ability and is frozen to one team.

In: header

Path Parameters

project*string

The project, resolved by the route binder.

Formatuuid
key*string

The connector key from the route.

Header Parameters

Idempotency-Key*string

A key unique to this operation, such as a fresh UUID. The same key replays the original 2xx response for 24 hours (with Idempotent-Replay: true), so a retry after a timeout never repeats the write; the same key with a different body is refused with 409.

Formatuuid

Responses

204No content

No content

400Bad request

Every write needs an Idempotency-Key header. Send a fresh UUID per distinct operation.

401Unauthorized

The request carries no bearer token, or one that is revoked, malformed, or minted for another environment (an sbt_test_ token on production).

403Forbidden

The token is valid but does not carry the ability this endpoint requires; error.context.required_ability names the one to grant. An endpoint that also checks who owns a row or which tier the account is on answers FORBIDDEN, TEAM_TIER_REQUIRED or CONNECTOR_TIER_REQUIRED with the same status, and says so in its own description.

404Not found

An id in the path names nothing the token can see. TENANT_MISMATCH: the project sits outside the token's scope:project: allow-list, or the token carries no team scope. Both answer 404 rather than 403 so that existence outside the token's scope cannot be inferred. On this endpoint: RESOURCE_NOT_FOUND: with reason: unknown_connector, or 404 CONNECTOR_NOT_INSTALLED when the project does not run the connector.

409Conflict

The key was already used in the last 24 hours with a different request body.

425Too early

The first request with this key is still running; retry in a few seconds and the original response is replayed.

429Too many requests

The token has spent its 300 requests a minute or 10,000 an hour; Retry-After says when the next one is accepted.

Preview an uninstall

GET

Uninstall deletes nothing and touches no money by itself, and it is always previewed first:

curl https://api.subscriby.net/v1/projects/7f3d1c92-8b45-4e6a-9d21-5c8e0a4b6f13/connectors/example/uninstall-preview \  -H "Authorization: Bearer $SUBSCRIBY_TOKEN"
  • resources are the connector's on the project (manual perks are never among them); they will be deactivated and marked detached, their external ids kept.
  • live_grants are the pending, held and granted grants on those resources; each is revoked with reason connector_uninstalled and fires member.resource_removed.
  • emptied_plans are the plans that would keep no active grantable resource; recurring_subscriptions and one_time_subscriptions are the live purchases on them, affected_subscription_ids names them.
  • upcoming_windows, open_support_threads and member_identities are informational: pass windows are never cancelled for you (cancel them from the pass window endpoints, which handle refunds), support threads lose their reach, and member accounts are never removed.
  • options are the two opt-ins with their defaults, exactly the names the DELETE takes.
GET
/v1/projects/{project}/connectors/{key}/uninstall-preview

Requires ability

The token must hold this ability, or the call is refused with 403.

Runs the same action from an agent, behind the same ability.

Authorization

bearerToken
AuthorizationBearer <token>

A personal access token minted on the dashboard under Settings, then Tokens, sent as Authorization: Bearer sbt_live_…. The token carries the abilities each endpoint lists under Requires ability and is frozen to one team.

In: header

Path Parameters

project*string

The project, resolved by the route binder.

Formatuuid
key*string

The connector key from the route.

Responses

200OK

200 with the preview.

401Unauthorized

The request carries no bearer token, or one that is revoked, malformed, or minted for another environment (an sbt_test_ token on production).

403Forbidden

The token is valid but does not carry the ability this endpoint requires; error.context.required_ability names the one to grant. An endpoint that also checks who owns a row or which tier the account is on answers FORBIDDEN, TEAM_TIER_REQUIRED or CONNECTOR_TIER_REQUIRED with the same status, and says so in its own description.

404Not found

An id in the path names nothing the token can see. TENANT_MISMATCH: the project sits outside the token's scope:project: allow-list, or the token carries no team scope. Both answer 404 rather than 403 so that existence outside the token's scope cannot be inferred. On this endpoint: RESOURCE_NOT_FOUND: with reason: unknown_connector, or 404 CONNECTOR_NOT_INSTALLED when the project does not run the connector.

429Too many requests

The token has spent its 300 requests a minute or 10,000 an hour; Retry-After says when the next one is accepted.

Install a connector

POST
curl -X POST https://api.subscriby.net/v1/projects/7f3d1c92-8b45-4e6a-9d21-5c8e0a4b6f13/connectors/example \  -H "Authorization: Bearer $SUBSCRIBY_TOKEN" \  -H "Idempotency-Key: $(uuidgen)"

Installing and connecting are two acts. Installing says "this project runs this connector" and opens a pending installation with no credentials (201 with the installation; 200 with the existing one when it was already installed, nothing changed). Connecting, which hands the connector the creator's credentials, stays on the dashboard, where the connector's declared install_fields are rendered and the platform is asked to describe the installation before anything is bound; a REST client cannot prove a credential is its own to bind. An uninstalled connector installed again comes back as pending with its settings kept.

POST
/v1/projects/{project}/connectors/{key}

Requires ability

The token must hold this ability, or the call is refused with 403.

Fires one event

Delivered to every endpoint subscribed to it once the change is made.

Runs the same action from an agent, behind the same ability.

Idempotent

Send the header on every call; the same key replays the original response for 24 hours.

Authorization

bearerToken
AuthorizationBearer <token>

A personal access token minted on the dashboard under Settings, then Tokens, sent as Authorization: Bearer sbt_live_…. The token carries the abilities each endpoint lists under Requires ability and is frozen to one team.

In: header

Path Parameters

project*string

The project, resolved by the route binder.

Formatuuid
key*string

The connector key from the route.

Header Parameters

Idempotency-Key*string

A key unique to this operation, such as a fresh UUID. The same key replays the original 2xx response for 24 hours (with Idempotent-Replay: true), so a retry after a timeout never repeats the write; the same key with a different body is refused with 409.

Formatuuid

Responses

200OK

201 with the installation; 200 when it was already installed.

response-200?string
400Bad request

Every write needs an Idempotency-Key header. Send a fresh UUID per distinct operation.

401Unauthorized

The request carries no bearer token, or one that is revoked, malformed, or minted for another environment (an sbt_test_ token on production).

403Forbidden

The token is valid but does not carry the ability this endpoint requires; error.context.required_ability names the one to grant. An endpoint that also checks who owns a row or which tier the account is on answers FORBIDDEN, TEAM_TIER_REQUIRED or CONNECTOR_TIER_REQUIRED with the same status, and says so in its own description. On this endpoint: CONNECTOR_TIER_REQUIRED: for a second distinct connector on the project when the **project owner's** plan lacks the multi_connector capability (Growth). The owner's plan is read, never the token holder's, because Teams lets a member run someone else's project.

404Not found

An id in the path names nothing the token can see. TENANT_MISMATCH: the project sits outside the token's scope:project: allow-list, or the token carries no team scope. Both answer 404 rather than 403 so that existence outside the token's scope cannot be inferred. On this endpoint: RESOURCE_NOT_FOUND: with reason: unknown_connector when the key names no connector.

409Conflict

The key was already used in the last 24 hours with a different request body.

422Validation failed

When the key names no connector creators may install today: only a card whose installable is true qualifies; error.context.connector echoes the key.

425Too early

The first request with this key is still running; retry in a few seconds and the original response is replayed.

429Too many requests

The token has spent its 300 requests a minute or 10,000 an hour; Retry-After says when the next one is accepted.

Uninstall a connector

DELETE
curl -X DELETE https://api.subscriby.net/v1/projects/7f3d1c92-8b45-4e6a-9d21-5c8e0a4b6f13/connectors/example \  -H "Authorization: Bearer $SUBSCRIBY_TOKEN" \  -H "Idempotency-Key: $(uuidgen)" \  -H "Content-Type: application/json" \  -d '{"unpublish_emptied_plans": true, "cancel_recurring_subscriptions": false}'

In order: the connector puts every member outside while its credentials still work, the rows are retired in one transaction (grants revoked, resources detached, the installation kept with uninstalled_at), the connector withdraws the installation, and the two opt-ins run. unpublish_emptied_plans (default true) takes the emptied plans off sale, firing plan.deactivated per plan; cancel_recurring_subscriptions (default true) cancels their live recurring subscriptions at the end of the paid period, firing subscription.cancelled per subscription and emailing each member that their subscription will not renew. One-time and lifetime purchases are never cancelled; a refund stays the creator's call. Identities are never removed. connector.uninstalled fires with the counts. Installing the connector again brings the same installation back as pending with its settings kept.

The two opt-ins travel in the JSON body or as query parameters; on by default, they only need sending to switch one off.

DELETE
/v1/projects/{project}/connectors/{key}

Requires ability

The token must hold this ability, or the call is refused with 403.

Delivered to every endpoint subscribed to them once the change is made.

Runs the same action from an agent, behind the same ability.

Idempotent

Send the header on every call; the same key replays the original response for 24 hours.

Authorization

bearerToken
AuthorizationBearer <token>

A personal access token minted on the dashboard under Settings, then Tokens, sent as Authorization: Bearer sbt_live_…. The token carries the abilities each endpoint lists under Requires ability and is frozen to one team.

In: header

Path Parameters

project*string

The project, resolved by the route binder.

Formatuuid
key*string

The connector key from the route.

Query Parameters

unpublish_emptied_plans?boolean

Take the plans the uninstall leaves with nothing to grant off sale, firing plan.deactivated per plan. Defaults to true; send false to leave them on sale.

cancel_recurring_subscriptions?boolean

Cancel the live recurring subscriptions on those plans at the end of their paid period, firing subscription.cancelled per subscription and emailing each member. Defaults to true; one-time and lifetime purchases are never cancelled.

Header Parameters

Idempotency-Key*string

A key unique to this operation, such as a fresh UUID. The same key replays the original 2xx response for 24 hours (with Idempotent-Replay: true), so a retry after a timeout never repeats the write; the same key with a different body is refused with 409.

Formatuuid

Responses

200OK

200 with the report.

400Bad request

Every write needs an Idempotency-Key header. Send a fresh UUID per distinct operation.

401Unauthorized

The request carries no bearer token, or one that is revoked, malformed, or minted for another environment (an sbt_test_ token on production).

403Forbidden

The token is valid but does not carry the ability this endpoint requires; error.context.required_ability names the one to grant. An endpoint that also checks who owns a row or which tier the account is on answers FORBIDDEN, TEAM_TIER_REQUIRED or CONNECTOR_TIER_REQUIRED with the same status, and says so in its own description.

404Not found

An id in the path names nothing the token can see. TENANT_MISMATCH: the project sits outside the token's scope:project: allow-list, or the token carries no team scope. Both answer 404 rather than 403 so that existence outside the token's scope cannot be inferred. On this endpoint: RESOURCE_NOT_FOUND: with reason: unknown_connector, or 404 CONNECTOR_NOT_INSTALLED when the project does not run the connector.

409Conflict

The key was already used in the last 24 hours with a different request body.

422Validation failed

The payload broke a rule, and error.fields maps each offending key to its messages. A refusal from the domain, such as a plan that cannot go on sale or a member who cannot be removed, uses the same code with error.message saying why and no fields.

425Too early

The first request with this key is still running; retry in a few seconds and the original response is replayed.

429Too many requests

The token has spent its 300 requests a minute or 10,000 an hour; Retry-After says when the next one is accepted.

Verify an installation

POST
curl -X POST https://api.subscriby.net/v1/projects/7f3d1c92-8b45-4e6a-9d21-5c8e0a4b6f13/connectors/example/installation/verify \  -H "Authorization: Bearer $SUBSCRIBY_TOKEN" \  -H "Idempotency-Key: $(uuidgen)"

A fresh probe rather than the hourly one: the connector is asked whether the installation still answers and the verdict is recorded, so state becomes connected, degraded (with state_reason, state_detail and creator_actionable) or revoked, and health_checked_at is stamped. Answers 200 with the installation. A pending installation has nothing to verify and is returned as it is. connector.status_changed fires only when the state moved.

POST
/v1/projects/{project}/connectors/{key}/installation/verify

Requires ability

The token must hold this ability, or the call is refused with 403.

Delivered to every endpoint subscribed to it once the change is made.

Runs the same action from an agent, behind the same ability.

Idempotent

Send the header on every call; the same key replays the original response for 24 hours.

Authorization

bearerToken
AuthorizationBearer <token>

A personal access token minted on the dashboard under Settings, then Tokens, sent as Authorization: Bearer sbt_live_…. The token carries the abilities each endpoint lists under Requires ability and is frozen to one team.

In: header

Path Parameters

project*string

The project, resolved by the route binder.

Formatuuid
key*string

The connector key from the route.

Header Parameters

Idempotency-Key*string

A key unique to this operation, such as a fresh UUID. The same key replays the original 2xx response for 24 hours (with Idempotent-Replay: true), so a retry after a timeout never repeats the write; the same key with a different body is refused with 409.

Formatuuid

Responses

200OK

200 with the installation as recorded.

400Bad request

Every write needs an Idempotency-Key header. Send a fresh UUID per distinct operation.

401Unauthorized

The request carries no bearer token, or one that is revoked, malformed, or minted for another environment (an sbt_test_ token on production).

403Forbidden

The token is valid but does not carry the ability this endpoint requires; error.context.required_ability names the one to grant. An endpoint that also checks who owns a row or which tier the account is on answers FORBIDDEN, TEAM_TIER_REQUIRED or CONNECTOR_TIER_REQUIRED with the same status, and says so in its own description.

404Not found

An id in the path names nothing the token can see. TENANT_MISMATCH: the project sits outside the token's scope:project: allow-list, or the token carries no team scope. Both answer 404 rather than 403 so that existence outside the token's scope cannot be inferred. On this endpoint: RESOURCE_NOT_FOUND: with reason: unknown_connector, or 404 CONNECTOR_NOT_INSTALLED when the project does not run the connector.

409Conflict

The key was already used in the last 24 hours with a different request body.

425Too early

The first request with this key is still running; retry in a few seconds and the original response is replayed.

429Too many requests

The token has spent its 300 requests a minute or 10,000 an hour; Retry-After says when the next one is accepted.

Run the connector doctor

POST
curl -X POST https://api.subscriby.net/v1/projects/7f3d1c92-8b45-4e6a-9d21-5c8e0a4b6f13/connectors/example/installation/doctor \  -H "Authorization: Bearer $SUBSCRIBY_TOKEN" \  -H "Idempotency-Key: $(uuidgen)"

The Run Doctor button of the dashboard. The installation is verified exactly as the verify endpoint does it, then the connector is asked about every resource the installation gates, and the answer is one report: a finding for the installation, then one per resource, each with a severity (ok, warning, critical), the connector's own state word, a sentence in the creator's language, whether the creator can fix it (creator_actionable) and where (fix_url). A resource the connector has no place for is a warning, never silence. healthy is true when every finding is ok.

The report is kept on the installation (doctor_ran_at and doctor_healthy on the installation object) and connector.doctor_completed fires only when the findings differ from the previous run's.

POST
/v1/projects/{project}/connectors/{key}/installation/doctor

Requires ability

The token must hold this ability, or the call is refused with 403.

Delivered to every endpoint subscribed to it once the change is made.

Runs the same action from an agent, behind the same ability.

Idempotent

Send the header on every call; the same key replays the original response for 24 hours.

Authorization

bearerToken
AuthorizationBearer <token>

A personal access token minted on the dashboard under Settings, then Tokens, sent as Authorization: Bearer sbt_live_…. The token carries the abilities each endpoint lists under Requires ability and is frozen to one team.

In: header

Path Parameters

project*string

The project, resolved by the route binder.

Formatuuid
key*string

The connector key.

Header Parameters

Idempotency-Key*string

A key unique to this operation, such as a fresh UUID. The same key replays the original 2xx response for 24 hours (with Idempotent-Replay: true), so a retry after a timeout never repeats the write; the same key with a different body is refused with 409.

Formatuuid

Responses

200OK

200 with the report.

400Bad request

Every write needs an Idempotency-Key header. Send a fresh UUID per distinct operation.

401Unauthorized

The request carries no bearer token, or one that is revoked, malformed, or minted for another environment (an sbt_test_ token on production).

403Forbidden

The token is valid but does not carry the ability this endpoint requires; error.context.required_ability names the one to grant. An endpoint that also checks who owns a row or which tier the account is on answers FORBIDDEN, TEAM_TIER_REQUIRED or CONNECTOR_TIER_REQUIRED with the same status, and says so in its own description.

404Not found

An id in the path names nothing the token can see. TENANT_MISMATCH: the project sits outside the token's scope:project: allow-list, or the token carries no team scope. Both answer 404 rather than 403 so that existence outside the token's scope cannot be inferred. On this endpoint: RESOURCE_NOT_FOUND: with reason: unknown_connector, or 404 CONNECTOR_NOT_INSTALLED when the project does not run the connector.

409Conflict

The key was already used in the last 24 hours with a different request body.

425Too early

The first request with this key is still running; retry in a few seconds and the original response is replayed.

429Too many requests

The token has spent its 300 requests a minute or 10,000 an hour; Retry-After says when the next one is accepted.

curl -X POST https://api.subscriby.net/v1/projects/7f3d1c92-8b45-4e6a-9d21-5c8e0a4b6f13/connectors/example/installation/restore-access \  -H "Authorization: Bearer $SUBSCRIBY_TOKEN" \  -H "Idempotency-Key: $(uuidgen)"

The Restore Access item of the dashboard's Connectors tab, offered while an uninstall has left the project detached places on the connector. Once the connector is installed and connected again, every detached place is asked about through the connector; the ones it still controls are made active and healthy again, and every live purchase of a plan that grants them is handed fresh access: only the grants the purchase lacks are issued, which are exactly the ones the uninstall took away, and member.resource_added fires per grant. A place the connector no longer controls stays detached for the doctor to explain. Plans the uninstall took off sale stay off sale until you publish them again.

POST
/v1/projects/{project}/connectors/{key}/installation/restore-access

Requires ability

The token must hold this ability, or the call is refused with 403.

Fires one event

Delivered to every endpoint subscribed to it once the change is made.

Runs the same action from an agent, behind the same ability.

Idempotent

Send the header on every call; the same key replays the original response for 24 hours.

Authorization

bearerToken
AuthorizationBearer <token>

A personal access token minted on the dashboard under Settings, then Tokens, sent as Authorization: Bearer sbt_live_…. The token carries the abilities each endpoint lists under Requires ability and is frozen to one team.

In: header

Path Parameters

project*string

The project, resolved by the route binder.

Formatuuid
key*string

The connector key.

Header Parameters

Idempotency-Key*string

A key unique to this operation, such as a fresh UUID. The same key replays the original 2xx response for 24 hours (with Idempotent-Replay: true), so a retry after a timeout never repeats the write; the same key with a different body is refused with 409.

Formatuuid

Responses

200OK

200 with the report.

400Bad request

Every write needs an Idempotency-Key header. Send a fresh UUID per distinct operation.

401Unauthorized

The request carries no bearer token, or one that is revoked, malformed, or minted for another environment (an sbt_test_ token on production).

403Forbidden

The token is valid but does not carry the ability this endpoint requires; error.context.required_ability names the one to grant. An endpoint that also checks who owns a row or which tier the account is on answers FORBIDDEN, TEAM_TIER_REQUIRED or CONNECTOR_TIER_REQUIRED with the same status, and says so in its own description.

404Not found

An id in the path names nothing the token can see. TENANT_MISMATCH: the project sits outside the token's scope:project: allow-list, or the token carries no team scope. Both answer 404 rather than 403 so that existence outside the token's scope cannot be inferred. On this endpoint: RESOURCE_NOT_FOUND: with reason: unknown_connector, or 404 CONNECTOR_NOT_INSTALLED when the project has no installation of the connector.

409Conflict

The key was already used in the last 24 hours with a different request body.

422Validation failed

While the installation is pending or disconnected.

425Too early

The first request with this key is still running; retry in a few seconds and the original response is replayed.

429Too many requests

The token has spent its 300 requests a minute or 10,000 an hour; Retry-After says when the next one is accepted.

curl -X PATCH https://api.subscriby.net/v1/projects/7f3d1c92-8b45-4e6a-9d21-5c8e0a4b6f13/connectors/example/installation/settings \  -H "Authorization: Bearer $SUBSCRIBY_TOKEN" \  -H "Idempotency-Key: $(uuidgen)" \  -H "Content-Type: application/json" \  -d '{"settings": {"greeting": "Welcome aboard"}, "capabilities": {"broadcasts": false}}'

settings is an object keyed by the field names the connector declares in its settings_fields (read them from the card). Every declared rule runs; a key the connector never declared is 422 VALIDATION_FAILED naming it; fields left out keep their value.

capabilities is an object keyed by capability to true or false: the project's switches for what the connector may do on this installation. A project keeps a connector for access alone by switching off messaging, broadcasts, support_relay, native_payments or any recovery_* facet; every core surface asks the switch before it invokes the connector, so a switched-off broadcast is refused before it is queued and a switched-off health check is skipped. A capability the connector does not declare, or one that cannot be switched off (access_control, early_admission_hold, management_surface, portal_login, creator_registration), is 422 VALIDATION_FAILED naming it; switches left out keep their value. At least one of settings and capabilities is required.

Answers 200 with the installation, which never carries the settings themselves because a settings field may be a secret, but does carry capabilities: every capability the connector declares, each with enabled and toggleable. connector.settings_updated fires naming the fields and the switches (capabilities.<key>) that changed, only when something did.

PATCH
/v1/projects/{project}/connectors/{key}/installation/settings

Requires ability

The token must hold this ability, or the call is refused with 403.

Delivered to every endpoint subscribed to it once the change is made.

Runs the same action from an agent, behind the same ability.

Idempotent

Send the header on every call; the same key replays the original response for 24 hours.

Authorization

bearerToken
AuthorizationBearer <token>

A personal access token minted on the dashboard under Settings, then Tokens, sent as Authorization: Bearer sbt_live_…. The token carries the abilities each endpoint lists under Requires ability and is frozen to one team.

In: header

Path Parameters

project*string

The project, resolved by the route binder.

Formatuuid
key*string

The connector key from the route.

Header Parameters

Idempotency-Key*string

A key unique to this operation, such as a fresh UUID. The same key replays the original 2xx response for 24 hours (with Idempotent-Replay: true), so a retry after a timeout never repeats the write; the same key with a different body is refused with 409.

Formatuuid

Request body

JSONWhat the request carries

The settings and capability switches to change on an installation. At least one of the two is required; keys left out keep their value.

Responses

200OK

200 with the installation.

400Bad request

Every write needs an Idempotency-Key header. Send a fresh UUID per distinct operation.

401Unauthorized

The request carries no bearer token, or one that is revoked, malformed, or minted for another environment (an sbt_test_ token on production).

403Forbidden

The token is valid but does not carry the ability this endpoint requires; error.context.required_ability names the one to grant. An endpoint that also checks who owns a row or which tier the account is on answers FORBIDDEN, TEAM_TIER_REQUIRED or CONNECTOR_TIER_REQUIRED with the same status, and says so in its own description.

404Not found

An id in the path names nothing the token can see. TENANT_MISMATCH: the project sits outside the token's scope:project: allow-list, or the token carries no team scope. Both answer 404 rather than 403 so that existence outside the token's scope cannot be inferred. On this endpoint: RESOURCE_NOT_FOUND: with reason: unknown_connector, or 404 CONNECTOR_NOT_INSTALLED when the project does not run the connector.

409Conflict

The key was already used in the last 24 hours with a different request body.

422Validation failed

The payload broke a rule, and error.fields maps each offending key to its messages. A refusal from the domain, such as a plan that cannot go on sale or a member who cannot be removed, uses the same code with error.message saying why and no fields. On this endpoint: VALIDATION_FAILED: when both settings and capabilities are missing, a settings key the connector never declared is sent, a declared rule fails, or a capability is undeclared or cannot be switched off; error.fields names the key.

425Too early

The first request with this key is still running; retry in a few seconds and the original response is replayed.

429Too many requests

The token has spent its 300 requests a minute or 10,000 an hour; Retry-After says when the next one is accepted.

How is this guide?

Version

On this page

Subscriby is a product
designed by you — for you.
No boardroom full of executives deciding what we ships next. Our roadmap always shaped by you with your feedback.

Share feedback or a request