# Revoke one polling subscription

`DELETE /api/v1/data/subscriptions/{subscriptionId}` - [human page](https://aicdapi.com/api-reference#revokeFeedSubscription)

**Release status.** Limited availability

Limited, machine-only release. Revokes one feed. The account must hold a current frozen paid Pro or Ultra period, exactly as creation and polling do. The feed must belong to the authenticated customer and to the exact API key making the request; an unknown id, another account's id, and another key's id are all not found, so the endpoint is not an existence oracle across accounts or credentials. Revoking a feed revokes only that feed: the shared API key, the account's other feeds, and other keys of the account are untouched. The account cap slot is released immediately, and the feed disappears from the live listing. Revocation is idempotent: repeating it succeeds and returns the original revocation time.

**Authentication.** Customer API key: `Authorization: Bearer aicd_...`. A browser session does not authenticate this endpoint. Required scope: `civic:read`.

### Parameters

| Field | Type | Required | Bounds | Description |
| --- | --- | --- | --- | --- |
| `path subscriptionId` | string (uuid) | yes | pattern ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}\|00000000-0000-0000-0000-000000000000\|ffffffff-ffff-ffff-ffff-ffffffffffff)$ | The subscription's id, as returned by the create or list operation. |

### Example request

```bash
curl -X DELETE 'https://aicdapi.com/api/v1/data/subscriptions/3f2504e0-4f89-41d3-9a0c-0305e82c3301' \
  -H "Authorization: Bearer $AICD_API_KEY"
```

### Response 200

The feed is revoked. Repeating the call returns the original revocation time.

| Field | Type | Required | Bounds | Description |
| --- | --- | --- | --- | --- |
| `data` | object | yes |  |  |
| `data.id` | string (uuid) | yes | pattern ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}\|00000000-0000-0000-0000-000000000000\|ffffffff-ffff-ffff-ffff-ffffffffffff)$ | The revoked subscription's id. |
| `data.revokedAt` | string (date-time) | yes | pattern ^(?:(?:\\d\\d[2468][048]\|\\d\\d[13579][26]\|\\d\\d0[48]\|[02468][048]00\|[13579][26]00)-02-29\|\\d{4}-(?:(?:0[13578]\|1[02])-(?:0[1-9]\|[12]\\d\|3[01])\|(?:0[469]\|11)-(?:0[1-9]\|[12]\\d\|30)\|(?:02)-(?:0[1-9]\|1\\d\|2[0-8])))T(?:(?:[01]\\d\|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z\|([+-](?:[01]\\d\|2[0-3]):[0-5]\\d)))$ | When the feed was revoked, which is the original time when this call repeats a revocation. |

Example response:

```json
{
  "data": {
    "id": "3f2504e0-4f89-41d3-9a0c-0305e82c3301",
    "revokedAt": "2026-09-28T13:30:00Z"
  }
}
```

### Errors

| Status | `error.code` | Description |
| --- | --- | --- |
| **401** | `unauthorized` | The API key is missing, malformed, unknown, revoked, expired, or belongs to a customer that is not active. |
| **403** | `billing_channel_unset`, `billing_entitlement_required`, `feed_subscription_plan_required`, `forbidden` | The key lacks the required grant, the account has no billing channel while billing enforcement is on, is not paid through, or is not on a current Pro or Ultra paid tier. |
| **404** | `not_found` | No feed with that id belongs to this account and key, including when the id is not a UUID at all. |
| **413** | `response_too_large` | The serialized response exceeds the response size allowance on your account. |
| **429** | `rate_limited` | Either a per-account allowance was exhausted or the account-wide abuse ceiling was reached. The abuse ceiling is account-wide, is not charged against the paid quota, and is charged after the identity lookup and before a revoked, expired, unpaid, or scope-denied rejection is decided. |
| **500** | `internal_error` | Unexpected failure. No private database detail is returned. |
| **503** | `authentication_unavailable` | The identity lookup, a limit or abuse-ceiling store, or an audit write failed. The request is refused rather than allowed through. |

### Behaviour

- **Limits.** Counted against the per-account minute, burst, and response-byte allowances shared by every key of the account. A subscription carries no budget of its own: subscribing does not add, reserve, or partition paid usage, and the account's admitted-request and byte allowances are what a poll consumes. The account-wide abuse ceiling applies here as it does to the rest of the machine API: it is account-wide, is not charged against the paid quota, and is charged before a revoked, expired, unpaid, or scope-denied rejection is decided.
- **Retry-After.** Sent on 429 only, as whole seconds.
- **Caching.** Customer feed responses must not be cached.
