# rotateWebhookSigningSecret

Source: /openapi/thomas-federated.openapi.json

## Operation

| Method | URL |
|---|---|
| POST | https://staging-api.thomas.co/v1/webhook-subscriptions/{subscriptionId}/signing-secrets/rotate |

| Field | Value |
|---|---|
| operationId | rotateWebhookSigningSecret |
| method | POST |
| server | https://staging-api.thomas.co/v1 |
| path | /webhook-subscriptions/{subscriptionId}/signing-secrets/rotate |
| tags | `Partner Events & Webhooks` |
| summary | Rotate a webhook signing secret |
| badges | None |

## Request Parameters

| Name | In | Required | Schema | Description |
|---|---|---|---|---|
| subscriptionId | path | true | string |  |
| Idempotency-Key | header | true | string | An opaque client-generated key, 1-255 visible ASCII characters excluding comma. Repeating a request with the same key and the same body returns the ORIGINAL response — including the secret it minted — instead of minting a second one. |

## Request Body

| Content type | Schema refs |
|---|---|
| application/json | #/components/schemas/WebhookSigningSecretRotateRequestDto |

## Responses

| Status | Description | Schema refs |
|---|---|---|
| 201 | The new secret was activated. It is shown here and nowhere else. | #/components/schemas/WebhookSigningSecretRotateResponseDto |
| 400 | The request could not be accepted as sent. | #/components/schemas/ApiErrorResponseDto |
| 401 | Invalid or missing authentication token (AUTH_TOKEN_INVALID) | #/components/schemas/ApiErrorResponseDto |
| 403 | Only a provisioned Partner-owned API client may call this operation | #/components/schemas/ApiErrorResponseDto |
| 404 | No webhook subscription with this id belongs to the calling API client. A subscription owned by a different client is concealed behind this same response. | #/components/schemas/ApiErrorResponseDto |
| 409 | The request conflicts with the current state of this signing-secret lineage. | #/components/schemas/ApiErrorResponseDto |
| 429 | Rate limit exceeded. | #/components/schemas/ApiErrorResponseDto |
| 503 | This deployment has no webhook signing key provisioned | #/components/schemas/ApiErrorResponseDto |

### Response 429 headers

| Name | Description | Schema |
|---|---|---|
| Retry-After | Seconds until the rate-limit block expires before retrying. | {"type":"integer","minimum":0} |
| RateLimit-Limit | Configured request limit for the active rate-limit window. | {"type":"integer"} |
| RateLimit-Remaining | Requests remaining in the active rate-limit window; zero when blocked. | {"type":"integer"} |
| RateLimit-Reset | Seconds until the rate-limit block expires. | {"type":"integer","minimum":0} |

## Artifact Examples

### Response 401 example

```json
{
  "statusCode": 401,
  "message": "Invalid or missing authentication token",
  "error": "AUTH_TOKEN_INVALID"
}
```

### Response 403 example

```json
{
  "statusCode": 403,
  "message": "API client is not permitted to call this operation",
  "error": "PRINCIPAL_TYPE_NOT_ALLOWED"
}
```

### Response 404 example

```json
{
  "statusCode": 404,
  "message": "Webhook subscription was not found",
  "error": "WEBHOOK_SUBSCRIPTION_NOT_FOUND"
}
```

### Response 429 example

```json
{
  "statusCode": 429,
  "message": "ThrottlerException: Too Many Requests",
  "error": "HTTP_TOO_MANY_REQUESTS"
}
```

### Response 503 example

```json
{
  "statusCode": 503,
  "message": "Webhook signing is not configured on this deployment",
  "error": "WEBHOOK_SIGNING_NOT_CONFIGURED"
}
```
