S
supero.docs
Developers/API Reference/Plugins API

Plugins API

REST API reference for the Plugin Registry — register your own HTTP endpoint as a project-scoped plugin, invoke it through the platform gateway, and monitor its health.

Overview

The Plugin Registry lets a project register an arbitrary external HTTP endpoint and call it through the platform gateway, which adds authentication-header injection, timeouts, retries with backoff, and circuit breaking. It is the path to reach for when you need to wire up a service that is not already in the managed catalog.
For providers Supero already knows how to talk to (payments, email, SMS, and similar), prefer the managed services catalog — GET /api/v1/services/catalog, POST /api/v1/services/import, PUT /api/v1/services/{id}/config, POST /api/v1/services/execute — described on Managed Integrations & Provider Catalog. Reach for the Plugin Registry when you're wiring up your own custom HTTP endpoint that has no catalog entry.

Base URL and authentication

All endpoints below are relative to https://api.supero.dev. Authenticate with a user session token (Authorization: Bearer <jwt>) or a project/domain-scoped API key (X-API-Key: ak_...). Plugins are project-scoped: register and list calls take a project_uuid, and the calling identity must have access to that project.
bash
curl https://api.supero.dev/api/v1/plugins?project_uuid=6f1e2a3b-...-9c0d \
  -H "Authorization: Bearer $ACCESS_TOKEN"
ActionMethod & pathPermission required
Register a pluginPOST /api/v1/plugins/registerplugin:create
List pluginsGET /api/v1/pluginsplugin:list
Get plugin detailsGET /api/v1/plugins/{plugin_uuid}plugin:read
Enable / disable a pluginPUT /api/v1/plugins/{plugin_uuid}/statusplugin:update
Delete a pluginDELETE /api/v1/plugins/{plugin_uuid}plugin:delete
Get plugin healthGET /api/v1/plugins/{plugin_uuid}/healthplugin:read
Invoke a pluginPOST /api/v1/plugins/invoke/{object_type}operational:create

ℹ️ Domain admins

domain_admin (and platform-level roles) are implicitly granted every plugin permission within their own domain. Other roles need the specific plugin:* / operational:create permission granted through your access policy.

Register a Plugin

POST /api/v1/plugins/register

Registers a new external HTTP endpoint under a project. plugin_name only needs to be unique within that project.
json
{
  "project_uuid": "6f1e2a3b-7c4d-4e11-9a2f-3d5b8e9c0d1a",
  "plugin_name": "twilio-sms",
  "endpoint_url": "https://api.twilio.com/2010-04-01/Accounts/AC.../Messages.json",
  "http_method": "POST",
  "auth_type": "header",
  "auth_header_name": "Authorization",
  "auth_header_value": "Basic dGVzdDp0ZXN0",
  "custom_headers": { "X-Source": "supero" },
  "timeout_seconds": 30,
  "max_retries": 3,
  "retry_backoff_seconds": 2,
  "circuit_breaker_threshold": 5,
  "circuit_breaker_timeout_seconds": 60
}
FieldTypeRequiredDefaultNotes
project_uuidstringYes—Parent project the plugin belongs to.
plugin_namestringYes—Unique within the project; used to invoke by name.
endpoint_urlstringYes—Full http:// or https:// URL of your endpoint.
http_methodstringNoPOSTOne of POST, PUT, PATCH — the method used to call endpoint_url.
auth_typestringNononeOne of none, header.
auth_header_namestringNo—Header name to send, e.g. Authorization or X-API-Key.
auth_header_valuestringNo—Header value. Stored securely and redacted in API responses.
custom_headersobjectNo—Additional static headers sent on every invocation.
timeout_secondsintegerNo30Request timeout, up to 300.
max_retriesintegerNo3Retry attempts on failure.
retry_backoff_secondsintegerNo2Initial backoff delay, applied exponentially.
circuit_breaker_thresholdintegerNo5Consecutive failures before the circuit opens.
circuit_breaker_timeout_secondsintegerNo60Time before the circuit tries half-open.

Response — 201 Created

json
{
  "success": true,
  "message": "Plugin registered successfully",
  "plugin": {
    "plugin_uuid": "9b2c1e4a-...-1f2a3b4c",
    "plugin_name": "twilio-sms",
    "endpoint_url": "https://api.twilio.com/2010-04-01/Accounts/AC.../Messages.json",
    "enabled": true,
    "health_status": "healthy"
  }
}

⚠️ Missing fields

project_uuid, plugin_name, and endpoint_url are all required — a request missing any of them returns 400 with a message listing the missing fields.

List and Get Plugins

GET /api/v1/plugins

Lists plugins for a project. project_uuid can be passed as a query parameter or, if omitted, is read from the caller's JWT. Pass enabled_only=true to return only enabled plugins.
bash
curl "https://api.supero.dev/api/v1/plugins?project_uuid=6f1e2a3b-...-9c0d&enabled_only=true" \
  -H "Authorization: Bearer $ACCESS_TOKEN"
json
{
  "project_uuid": "6f1e2a3b-...-9c0d",
  "total": 1,
  "plugins": [
    {
      "plugin_uuid": "9b2c1e4a-...-1f2a3b4c",
      "plugin_name": "twilio-sms",
      "endpoint_url": "https://api.twilio.com/2010-04-01/Accounts/AC.../Messages.json",
      "enabled": true,
      "health_status": "healthy",
      "total_invocations": 42,
      "success_count": 40,
      "failure_count": 2
    }
  ]
}

GET /api/v1/plugins/{plugin_uuid}

Returns the full registry record for a single plugin, keyed by its plugin_uuid. auth_header_value is never returned.
bash
curl https://api.supero.dev/api/v1/plugins/9b2c1e4a-...-1f2a3b4c \
  -H "Authorization: Bearer $ACCESS_TOKEN"

ℹ️ Keyed by UUID, not name

Get, status update, delete, and health all address the plugin by plugin_uuid in the path — not plugin_name. Look the UUID up via the list endpoint if you only know the name.

Enable, Disable, and Delete

PUT /api/v1/plugins/{plugin_uuid}/status

Toggles a plugin on or off without touching its other configuration. A disabled plugin is skipped by invoke calls and returns 503.
json
{
  "enabled": false
}
json
{
  "success": true,
  "message": "Plugin disabled successfully",
  "plugin_uuid": "9b2c1e4a-...-1f2a3b4c",
  "enabled": false
}

DELETE /api/v1/plugins/{plugin_uuid}

Permanently removes the plugin registration. There is no restore.
json
{
  "success": true,
  "message": "Plugin deleted successfully",
  "plugin_uuid": "9b2c1e4a-...-1f2a3b4c"
}
There is no endpoint to replace a plugin's full configuration in one call — to change endpoint_url, auth, retries, or breaker settings, delete the plugin and register it again.

Invoke a Plugin

POST /api/v1/plugins/invoke/{object_type}

Calls your registered endpoint through the gateway, applying the auth header, timeout, retries, and circuit breaker configured at registration. object_type is a label you choose (for example send_sms or send_email) that appears in logs — it does not need to match a schema type.
The request body must include either plugin_name or plugin_uuid to select the plugin; every other field is forwarded to your endpoint as the outbound request payload.
bash
curl -X POST https://api.supero.dev/api/v1/plugins/invoke/send_sms \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "plugin_name": "twilio-sms",
    "to": "+14155551234",
    "body": "Your order has shipped"
  }'
The plugin is resolved within the project carried on the caller's JWT. To target a plugin in a different project you have access to, pass parent_uuid alongside plugin_name/plugin_uuid.

Response

On success, the response is whatever your endpoint returned, passed through by the gateway. Failures are normalized into the platform's standard error shape.
StatusMeaning
400Neither plugin_name nor plugin_uuid was supplied.
404No plugin with that name/UUID exists in the resolved project.
503The plugin is disabled, or its circuit breaker is open (response includes retry_after).
504The call to endpoint_url exceeded the plugin's timeout_seconds.
500Any other failure calling the endpoint, after retries are exhausted.

Plugin Health

GET /api/v1/plugins/{plugin_uuid}/health

Returns current health status plus running invocation statistics and the plugin's circuit breaker configuration.
json
{
  "plugin_uuid": "9b2c1e4a-...-1f2a3b4c",
  "plugin_name": "twilio-sms",
  "health_status": "healthy",
  "enabled": true,
  "statistics": {
    "total_invocations": 142,
    "success_count": 138,
    "failure_count": 4,
    "success_rate_percent": 97.18,
    "average_latency_ms": 212,
    "last_invocation_at": "2026-07-15T09:12:44Z"
  },
  "circuit_breaker": {
    "threshold": 5,
    "timeout_seconds": 60
  }
}
health_statusMeaning
unknownNewly registered — no health check has run yet.
healthyRecent invocations are succeeding.
unhealthyRecent invocations are failing.
circuit_openThe circuit breaker tripped after consecutive failures; invocations will fail fast with 503 until the timeout elapses.

Next steps