---
title: "Confirm a signing secret rotation"
method: POST
path: "/api/v1/connections/{connection_id}/trigger-ingress/signing-secret/confirm"
tags: ["Triggers"]
---

# Confirm a signing secret rotation

`POST /api/v1/connections/{connection_id}/trigger-ingress/signing-secret/confirm`

## Request

- Base URL: `https://$SCALEKIT_ENVIRONMENT_URL`
- URL: `https://$SCALEKIT_ENVIRONMENT_URL/api/v1/connections/{connection_id}/trigger-ingress/signing-secret/confirm`
- Auth: OAuth 2
  - Client credentials
  - Token URL: `https://$SCALEKIT_ENVIRONMENT_URL/oauth/token`
- TypeScript: <https://skmtc.dev/scalekit/apis/scalekit-api-reference/docs/api/v1/connections/:connection_id/trigger-ingress/signing-secret/confirm/post.ts> (a function with typed inputs; its response is checked against the schema)

Ends a signing-secret rotation by retiring the previous secret, so only the current secret is accepted. Call this endpoint once the provider's app configuration holds the new secret. A rotation is never confirmed automatically: until you call this endpoint, the previous secret stays accepted until its expiry, at most 24 hours after the rotation started. Pass the connection ID in the path, and in the body the signing_secret_rotation_id from the latest SetTriggerSigningSecret or GetTriggerIngressEndpoint response, so that only the rotation you looked at is confirmed. Calling this endpoint when no rotation is in progress succeeds and changes nothing. Returns the endpoint with its masked secret and rotation state.

## Path parameters

- `connection_id` string, required

## Request body

- TriggerServiceConfirmTriggerSigningSecretRotationBody
  - `signing_secret_rotation_id` string, int64: The rotation to confirm: the signing_secret_rotation_id from the latest SetTriggerSigningSecret or GetTriggerIngressEndpoint response. Required while a rotation is in progress; a missing or non-matching value is then refused with 400, rather than confirming a rotation you did not look at. Ignored when no rotation is in progress.

## Response `200`

The previous secret is retired, or no rotation was in progress; the endpoint's current signing-secret state

- TriggersTriggerIngressEndpoint: The webhook URL a provider sends a connection's events to, and the state of the secret those events are signed with. This message never carries the signing secret itself: masked_signing_secret shows at most its last four characters, so you can tell which secret is stored. The only response that returns a secret in plaintext is GenerateTriggerSigningSecret's, once, for a secret Scalekit generates.
  - `connection_id` string: ID of the connection this webhook URL belongs to.
  - `id` string: Unique identifier of the connection's webhook endpoint.
  - `masked_signing_secret` string: The stored secret with all but its last four characters replaced, or every character replaced for a secret of 8 characters or fewer. Present only when one is configured. Enough to compare against the secret the provider's app configuration shows, and never enough to sign with.
  - `previous_signing_secret_expires_at` string, date-time: When the previous secret stops being accepted even if the rotation is never confirmed: 24 hours after the rotation started. Absent when no rotation is in progress.
  - `rotation_in_progress` boolean: Whether the previous signing secret is still accepted alongside the current one. True from the moment a different secret replaces a stored one until the rotation is confirmed, or until previous_signing_secret_expires_at passes.
  - `signing_secret_configured` boolean: Whether a signing secret is stored. While false, every event sent to the URL is answered with 503 so the provider retries it, and the provider's own URL verification fails.
  - `signing_secret_rotation_id` string, int64: Identifies the latest signing-secret rotation; it increases by one each time a rotation starts. Zero when none has ever started. Pass this value to ConfirmTriggerSigningSecretRotation to confirm this specific rotation. A value naming a rotation that a newer one has since replaced is refused rather than confirming the wrong rotation.
  - `url` string: The URL to paste into the provider's app configuration as the event destination. It is built on your environment's domain, using its custom domain when one is set, and ends in a random token unique to this connection, so treat it as confidential. Returned whether or not a signing secret has been set. The URL accepts request bodies up to 1 MB and answers a larger one with 413. Until a signing secret is set it answers events with 503, so the provider retries them; an event that fails signature verification is answered with 400.

## Other responses

- `400`: Invalid request - connection_id is not a valid connection ID, or a rotation is in progress and signing_secret_rotation_id is missing or does not match it, for example because a newer rotation has started. The message names the current rotation ID; read the endpoint again with GetTriggerIngressEndpoint before confirming
- `404`: Not found - no webhook URL has been created for this connection yet (error_code TRIGGER_INGRESS_ENDPOINT_NOT_CREATED; call CreateTriggerIngressEndpoint first), the connection does not exist in this environment (error_code RESOURCE_NOT_FOUND), or Triggers is not enabled for the environment (error_code RESOURCE_NOT_FOUND)
- `500`: Internal error - the rotation could not be confirmed; retry the request

## Changes

- **2026-10-30** `f47f1022d844`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/scalekit/apis/scalekit-api-reference/changes/api/v1/connections/:connection_id/trigger-ingress/signing-secret/confirm/post.md)

---

[API](https://skmtc.dev/scalekit/apis/scalekit-api-reference.md) - [All operations](https://skmtc.dev/scalekit/apis/scalekit-api-reference/llms.txt) - [OpenAPI document](https://skmtc.dev/scalekit/apis/scalekit-api-reference/revisions/f47f1022d844?raw)
