> **Building with AI coding agents?** Install the authstack plugin with one command. This equips your agent with accurate Scalekit implementation patterns.
>
> **Recommended** (the `-y` flags skip prompts, so the command runs without an interactive terminal):
> ```bash
> npx -y @scalekit-inc/cli setup -y
> ```
>
> Global:
> ```bash
> npm install -g @scalekit-inc/cli
> scalekit setup -y
> ```
>
> Supports Claude Code, Cursor, GitHub Copilot, Codex + skills for other Agent Skills-compatible agents in `~/.agents/skills`.
> Skills: integrate-agentkit, implement-saaskit, add-mcp-oauth, implement-sso, implement-scim.
> [Full setup guide](https://docs.scalekit.com/dev-kit/build-with-ai/)

---

# List available triggers (beta)

`GET /api/v1/connections/{connection_id}/triggers`

This endpoint is in beta. Its request and response may change.

Lists every trigger the connection's app offers. A trigger that can't run on this connection is still listed, with `available` set to `false` and a `reason` and `remedy`. Each trigger says whether it's a webhook or polling trigger, which scopes it needs, which filters it takes in `config_fields`, and for a polling trigger its default and minimum interval.

**Path parameters**

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `connection_id` | string | Yes | ID of the connection, in this environment. Up to 64 characters. |

**Response (200)**

| Name | Type | Description |
| --- | --- | --- |
| `connection_uses_shared_app` | boolean | Whether the connection is configured to use Scalekit's shared provider app rather than your own. Read from the connection's saved configuration. When true, any trigger with platform_credentials UNSUPPORTED is unavailable until you add your own provider app to the connection. |
| `triggers` | array of object | Every trigger the connection's provider publishes, including unavailable ones. Check available on each before offering it. |
| `triggers.available` | boolean | Whether this trigger can run on this connection. False does not mean the trigger is unsupported by the provider — it means something about THIS connection prevents it, and reason and remedy say what. |
| `triggers.config_fields` | array of object | Values a subscription can set in its config map to narrow which events it receives. A config key not listed here is refused. |
| `triggers.config_fields.display_name` | string | Human-readable label for the field. |
| `triggers.config_fields.help_text` | string | Guidance on what to enter. Empty when the trigger provides none. |
| `triggers.config_fields.key` | string | The key to send in a subscription's config map. Send it exactly as returned, without changing its case: a key that does not match is refused. |
| `triggers.config_fields.placeholder` | string | Example value to show in an empty input. Empty when the trigger provides none. |
| `triggers.config_fields.required` | boolean | Whether a subscription must set this field to a non-empty value. A subscription request that omits a required field is refused. |
| `triggers.default_interval_seconds` | integer | Polling interval, in seconds, a subscription uses when it does not set interval_seconds. Zero for a webhook trigger. |
| `triggers.delivery_scope` | string (enum) | Whether this trigger delivers one event per connected account or one event for the whole connection, whatever accounts exist on it. Decides how the trigger is subscribed: an account-scoped trigger is subscribed on one connected account, a connection-scoped one on the connection itself, naming no account. One of: `ACCOUNT`, `CONNECTION`. |
| `triggers.description` | string | What event the trigger reports. |
| `triggers.display_name` | string | Human-readable name of the trigger. |
| `triggers.min_interval_seconds` | integer | Shortest polling interval, in seconds, a subscription to this trigger may request. A lower interval_seconds is refused rather than rounded up. Zero for a webhook trigger, which has no interval. |
| `triggers.mode` | string (enum) | How the trigger detects events. WEBHOOK - the provider sends each event to the connection's webhook URL, so the connection needs a webhook URL registered with the provider. POLL - Scalekit checks the provider on an interval, so a subscription can set interval_seconds. One of: `WEBHOOK`, `POLL`. |
| `triggers.name` | string | Unique name of the trigger within its provider. Pass it as trigger_name when listing eligible accounts or creating a subscription. |
| `triggers.platform_credentials` | string (enum) | Whether this trigger works on a connection that uses Scalekit's shared provider app. UNSUPPORTED means the connection needs your own provider app before this trigger can run; combine it with connection_uses_shared_app on the list response to decide whether to ask for one. UNSPECIFIED when the trigger declares a value this server does not recognise. One of: `SUPPORTED`, `UNSUPPORTED`. |
| `triggers.provider` | string | The provider the trigger belongs to, the same as the connection's provider. |
| `triggers.provides_bearer_secret` | boolean | Whether Scalekit generates this trigger's signing secret ([Generate a signing secret](https://docs.scalekit.com/agentkit/reference/triggers/generate-a-signing-secret/)) rather than you copying one from the provider's console. True only for providers that send no signature of their own. Always false for a polled trigger. |
| `triggers.reason` | string | Why the trigger is unavailable on this connection. Populated whenever available is false. |
| `triggers.refusal_code` | string (enum) | The stable code of the connection-level rule that made this trigger unavailable. SHARED_APP — the connection uses Scalekit's shared provider app. POLL_CONNECTION_SCOPE — a polled trigger cannot be connection-scoped. UNSPECIFIED when the trigger is available, or when a rule without a code refused it; reason and remedy are populated either way. One of: `SHARED_APP`, `POLL_CONNECTION_SCOPE`. |
| `triggers.register_hint` | string | Provider-specific guidance on where to register the connection's ingress URL in the provider's console, written by the connector author. At most 500 characters, with no control characters. Empty when the connector provides none, and always empty for a polled trigger. |
| `triggers.remedy` | string | What to do to make the trigger available. Populated whenever available is false. |
| `triggers.required_scopes` | array of object | Permissions a connected account's grant must include to subscribe to this trigger. A subscription for an account whose grant lacks one of them is refused, naming the missing scope. |
| `triggers.required_scopes.grant` | string | Which grant channel must carry the scope. Some providers fan events out differently for a bot install than for a user install, so this is not merely descriptive. |
| `triggers.required_scopes.scope` | string | The provider's own name for the permission, exactly as it appears in their console. |
| `triggers.requires_signing_secret` | boolean | Whether the provider signs this trigger's events with a secret you copy from the provider's console and sets on the connection's ingress endpoint. Always false for a polled trigger, which receives no inbound requests. |
| `triggers.secret_hint` | string | Provider-specific guidance on where the provider shows the signing secret to copy, written by the connector author. At most 500 characters, with no control characters. Empty when the connector provides none, and always empty for a polled trigger. |

**Errors**

- `400`: Invalid request - connection_id is not a valid connection ID
- `404`: Not found - the connection does not exist in this environment, or Triggers isn't turned on for your environment
- `500`: Internal error - the triggers for this connection could not be read; retry the request

**Request**

```bash
curl -sS -X GET \
  "$SCALEKIT_ENVIRONMENT_URL/api/v1/connections/conn_133400101014995480/triggers" \
  -H "Authorization: Bearer $TOKEN"
```

**Response**

```json
{
  "triggers": [
    {
      "name": "salesforce_lead_created",
      "display_name": "Lead created",
      "description": "Fires when a new lead is created in Salesforce. Edits to an existing lead do not fire it.",
      "provider": "salesforce",
      "mode": "POLL",
      "required_scopes": [
        {
          "scope": "api",
          "grant": "default"
        }
      ],
      "min_interval_seconds": 300,
      "default_interval_seconds": 300,
      "config_fields": [
        {
          "key": "lead_source",
          "display_name": "Lead source",
          "help_text": "Only fire for leads from this source, e.g. Web. Leave blank for all leads.",
          "placeholder": "",
          "required": false
        }
      ],
      "available": true,
      "reason": "",
      "remedy": "",
      "delivery_scope": "ACCOUNT",
      "platform_credentials": "UNSUPPORTED",
      "refusal_code": "TRIGGER_REFUSAL_CODE_UNSPECIFIED",
      "requires_signing_secret": false,
      "register_hint": "",
      "secret_hint": "",
      "provides_bearer_secret": false
    }
  ],
  "connection_uses_shared_app": false
}
```

**Python SDK:** `scalekit_client.actions.triggers.list_available`

List every trigger a connection offers and whether each is usable there.

```python
scalekit_client.actions.triggers.list_available(
    connection_id: str,
) -> ListAvailableTriggersResponse
```

Example:

```python
result = scalekit_client.actions.triggers.list_available(
    connection_id="conn_133400101014995480",
)
```

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `connection_id` | `str` | Yes | The connection (`conn_...`). |

Returns `ListAvailableTriggersResponse`: All triggers (not paginated), plus `connection_uses_shared_app`.


Part of [Triggers](https://docs.scalekit.com/agentkit/reference/triggers/) in the [AgentKit API reference](https://docs.scalekit.com/agentkit/reference/). Authentication: https://docs.scalekit.com/agentkit/reference/authentication.md. Errors and rate limits: https://docs.scalekit.com/agentkit/reference/errors.md. Pagination: https://docs.scalekit.com/agentkit/reference/pagination.md


---

## More Scalekit documentation

| Resource | What it contains | When to use it |
|----------|-----------------|----------------|
| [/llms.txt](/llms.txt) | Structured index with routing hints per product area | Start here — find which documentation set covers your topic before loading full content |
| [/llms-full.txt](/llms-full.txt) | Complete documentation for all Scalekit products in one file | Use when you need exhaustive context across multiple products or when the topic spans several areas |
| [sitemap-0.xml](https://docs.scalekit.com/sitemap-0.xml) | Full URL list of every documentation page | Use to discover specific page URLs you can fetch for targeted, page-level answers |
