# Endpoints API

> Read the endpoints ApiTraffic detected in a bucket with their traffic and latency, manage endpoint rules, and triage attention signals.

Source: https://www.apitraffic.io/docs/api-reference/endpoints

ApiTraffic groups requests into endpoints, such as `/v1/orders/{order_id}`, from your framework's routes, your endpoint rules and the paths it sees. These operations list those endpoints with their metrics, manage the [endpoint rules](https://www.apitraffic.io/docs/data/endpoint-rules) that name endpoints your framework does not, and read and triage the attention signals raised about them (error spikes, latency regressions and other things worth a look). See [Endpoint handling](https://www.apitraffic.io/docs/endpoint-handling) for how endpoints are detected.

**Permissions:** any member, or a `user` or `administrator` API token, for every operation on this page.

## List endpoints

`GET https://api.apitraffic.io/v1/accounts/{accountSid}/buckets/{bucketSid}/endpoints`

Returns the endpoints seen in a bucket during a time range, busiest first.

### Path parameters

- **accountSid (path, string, required)**:
  The account identifier.

- **bucketSid (path, string, required)**:
  The bucket identifier.

### Query parameters

- **startTime (query, string, required)**:
  Start of the range (ISO 8601, UTC, ending in `Z`).

- **endTime (query, string, required)**:
  End of the range.

- **environmentSid (query, string)**:
  Only this environment.

- **direction (query, string, default in)**:
  `in` for your API's own endpoints, `out` for the calls it makes, grouped per upstream host.

- **limit (query, integer, default 100)**:
  Endpoints to return, 1 to 1000.

### Response

- **endpoints (object[], required)**:
  One entry per endpoint: `endpoint`, `host` (for outbound endpoints, otherwise `null`), `direction`, `requestCount`, `avgResponseTime` (ms), `errorCount` (status 400 or above), `errorRate` (percent, 0 to 100), `firstSeen` and `lastSeen`.

- **total (number, required)**:
  The number of endpoints returned.

```bash cURL
curl -G https://api.apitraffic.io/v1/accounts/acc_2mXq7RbT4kPz9WvN3cHd8LsYfQa/buckets/k3m9p2x/endpoints \
  -H "Authorization: Bearer $APITRAFFIC_TOKEN" \
  --data-urlencode 'startTime=2026-10-19T00:00:00.000Z' \
  --data-urlencode 'endTime=2026-10-20T00:00:00.000Z' \
  --data-urlencode 'environmentSid=prd7k2'
```

```js Node.js
const accountSid = 'acc_2mXq7RbT4kPz9WvN3cHd8LsYfQa';
const params = new URLSearchParams({
  startTime: '2026-10-19T00:00:00.000Z',
  endTime: '2026-10-20T00:00:00.000Z',
  environmentSid: 'prd7k2',
});
const response = await fetch(
  `https://api.apitraffic.io/v1/accounts/${accountSid}/buckets/k3m9p2x/endpoints?${params}`,
  { headers: { Authorization: `Bearer ${process.env.APITRAFFIC_TOKEN}` } },
);
const { endpoints } = await response.json();
```

```json 200
{
  "endpoints": [
    {
      "endpoint": "/v1/products/{product_id}",
      "host": null,
      "direction": "in",
      "requestCount": 3120,
      "avgResponseTime": 48.2,
      "errorCount": 94,
      "errorRate": 3.01,
      "firstSeen": "2026-10-19T00:00:03.000Z",
      "lastSeen": "2026-10-19T23:59:58.000Z"
    },
    {
      "endpoint": "/v1/payments/{payment_id}/capture",
      "host": null,
      "direction": "in",
      "requestCount": 402,
      "avgResponseTime": 612.4,
      "errorCount": 61,
      "errorRate": 15.17,
      "firstSeen": "2026-10-19T00:04:11.000Z",
      "lastSeen": "2026-10-19T23:57:40.000Z"
    }
  ],
  "total": 2
}
```

## Get endpoint metrics

`GET https://api.apitraffic.io/v1/accounts/{accountSid}/buckets/{bucketSid}/endpoints/{endpoint}`

Returns latency percentiles, error rates, status classes and a time series for one endpoint.

### Path parameters

- **accountSid (path, string, required)**:
  The account identifier.

- **bucketSid (path, string, required)**:
  The bucket identifier.

- **endpoint (path, string, required)**:
  The endpoint pattern exactly as [List endpoints](#list-endpoints) returns it, URL-encoded. For example `/v1/orders/{order_id}` becomes `%2Fv1%2Forders%2F%7Border_id%7D`.

### Query parameters

- **startTime (query, string, required)**:
  Start of the range.

- **endTime (query, string, required)**:
  End of the range.

- **environmentSid (query, string)**:
  Only this environment.

- **direction (query, string, default in)**:
  `in` or `out`.

- **host (query, string)**:
  For an outbound endpoint, the upstream host. Needed to tell apart the same path on two services.

- **resolution (query, string)**:
  Width of each period: `1min`, `10min`, `1hr`, `2hr`, `1d` or `1mo`. Defaults to `1min` for a range of an hour or less, otherwise `10min`.

### Response

- **endpoint (string | null, required)**:
  The endpoint.

- **host (string | null)**:
  The upstream host for an outbound endpoint.

- **direction (string | null)**:
  `in` or `out`.

- **summary (object, required)**:
  The whole range: `requestCount`, `avgResponseTime`, `minResponseTime`, `maxResponseTime`, `p50ResponseTime`, `p95ResponseTime`, `p99ResponseTime` (all ms), `errorCount`, `errorRate` (percent), `throughputRps`, `statusCodes` (`2xx`, `3xx`, `4xx`, `5xx` counts), `firstSeen` and `lastSeen`.

- **timeseries (object[], required)**:
  One entry per period: `timestamp`, `requestCount`, `avgResponseTime`, `p95ResponseTime`, `errorCount`, `errorRate` and `throughputRps`.

```bash cURL
curl -G "https://api.apitraffic.io/v1/accounts/acc_2mXq7RbT4kPz9WvN3cHd8LsYfQa/buckets/k3m9p2x/endpoints/%2Fv1%2Fpayments%2F%7Bpayment_id%7D%2Fcapture" \
  -H "Authorization: Bearer $APITRAFFIC_TOKEN" \
  --data-urlencode 'startTime=2026-10-19T13:00:00.000Z' \
  --data-urlencode 'endTime=2026-10-19T16:00:00.000Z' \
  --data-urlencode 'resolution=10min'
```

```js Node.js
const accountSid = 'acc_2mXq7RbT4kPz9WvN3cHd8LsYfQa';
const endpoint = encodeURIComponent('/v1/payments/{payment_id}/capture');
const params = new URLSearchParams({
  startTime: '2026-10-19T13:00:00.000Z',
  endTime: '2026-10-19T16:00:00.000Z',
  resolution: '10min',
});
const response = await fetch(
  `https://api.apitraffic.io/v1/accounts/${accountSid}/buckets/k3m9p2x/endpoints/${endpoint}?${params}`,
  { headers: { Authorization: `Bearer ${process.env.APITRAFFIC_TOKEN}` } },
);
const { summary, timeseries } = await response.json();
```

```json 200
{
  "endpoint": "/v1/payments/{payment_id}/capture",
  "host": null,
  "direction": "in",
  "summary": {
    "requestCount": 51,
    "avgResponseTime": 2310.5,
    "maxResponseTime": 4120,
    "minResponseTime": 180,
    "p50ResponseTime": 2600,
    "p95ResponseTime": 3980,
    "p99ResponseTime": 4060,
    "errorCount": 22,
    "errorRate": 43.14,
    "throughputRps": 0.005,
    "statusCodes": { "2xx": 29, "3xx": 0, "4xx": 0, "5xx": 22 },
    "firstSeen": "2026-10-19T13:02:10.000Z",
    "lastSeen": "2026-10-19T15:58:31.000Z"
  },
  "timeseries": [
    {
      "timestamp": "2026-10-19T14:00:00.000Z",
      "requestCount": 6,
      "avgResponseTime": 3610.2,
      "p95ResponseTime": 4010,
      "errorCount": 4,
      "errorRate": 66.67,
      "throughputRps": 0.01
    }
  ]
}
```

## The endpoint rule object

An endpoint rule assigns an endpoint pattern to requests whose path matches, for paths your framework cannot name itself.

- **sid (string, required)**:
  The rule's identifier (`epr_` followed by 27 letters and digits).

- **accountSid (string, required)**:
  The account.

- **description (string | null)**:
  A short description.

- **matchPattern (string, required)**:
  The path to match. `{*}` matches one path segment, for example `/v1/orders/{*}/items`.

- **endpointPattern (string, required)**:
  The endpoint to assign, for example `/v1/orders/{orderId}/items`.

- **priority (integer, required)**:
  Lower numbers are checked first. Default `0`.

- **direction (string, required)**:
  `in` (requests your API serves), `out` (calls it makes) or `*` (both). Default `*`.

- **hosts (string[], required)**:
  For outbound traffic, the upstream hosts the rule applies to, or `["*"]`.

- **buckets (string[])**:
  The buckets the rule applies to, or `["*"]`.

- **environments (string[])**:
  The environments the rule applies to, or `["*"]`.

- **enabled (boolean)**:
  Whether the rule is active. Default `true`.

- **stream (boolean)**:
  Whether matching requests are long-lived connections (streams, long polling). They still count as traffic but are left out of response-time metrics. Responses sent as `text/event-stream` are treated this way without a rule. Default `false`.

- **source (string, required)**:
  `manual` (written by someone) or `learned` (proposed from observed traffic).

- **observedValues (string[])**:
  For learned rules, some of the segment values that led to the rule.

- **createdAt (string, required)**:
  When the rule was created (ISO 8601).

## List endpoint rules

`GET https://api.apitraffic.io/v1/accounts/{accountSid}/endpointRules`

Returns every endpoint rule in the account.

### Path parameters

- **accountSid (path, string, required)**:
  The account identifier.

### Response

- **hasMore (boolean, required)**:
  Always `false`.

- **records (object[], required)**:
  The rules, as [endpoint rule objects](#the-endpoint-rule-object).

```bash cURL
curl https://api.apitraffic.io/v1/accounts/acc_2mXq7RbT4kPz9WvN3cHd8LsYfQa/endpointRules \
  -H "Authorization: Bearer $APITRAFFIC_TOKEN"
```

```js Node.js
const accountSid = 'acc_2mXq7RbT4kPz9WvN3cHd8LsYfQa';
const response = await fetch(`https://api.apitraffic.io/v1/accounts/${accountSid}/endpointRules`, {
  headers: { Authorization: `Bearer ${process.env.APITRAFFIC_TOKEN}` },
});
const { records } = await response.json();
```

```json 200
{
  "hasMore": false,
  "records": [
    {
      "sid": "epr_2aB4cD6eF8gH1iJ3kL5mN7oP9qR",
      "accountSid": "acc_2mXq7RbT4kPz9WvN3cHd8LsYfQa",
      "description": "Freight tracking calls",
      "matchPattern": "/v1/shipments/{*}/tracking",
      "endpointPattern": "/v1/shipments/{shipmentId}/tracking",
      "priority": 0,
      "direction": "out",
      "hosts": ["api.acme-freight.example"],
      "buckets": ["*"],
      "environments": ["*"],
      "enabled": true,
      "stream": false,
      "source": "manual",
      "observedValues": [],
      "createdAt": "2026-05-12T08:30:00.000Z"
    }
  ]
}
```

## Get endpoint rule

`GET https://api.apitraffic.io/v1/accounts/{accountSid}/endpointRules/{endpointRuleSid}`

Returns one endpoint rule.

### Path parameters

- **accountSid (path, string, required)**:
  The account identifier.

- **endpointRuleSid (path, string, required)**:
  The rule's identifier (`epr_…`).

### Response

An [endpoint rule object](#the-endpoint-rule-object).

```bash cURL
curl https://api.apitraffic.io/v1/accounts/acc_2mXq7RbT4kPz9WvN3cHd8LsYfQa/endpointRules/epr_2aB4cD6eF8gH1iJ3kL5mN7oP9qR \
  -H "Authorization: Bearer $APITRAFFIC_TOKEN"
```

```js Node.js
const accountSid = 'acc_2mXq7RbT4kPz9WvN3cHd8LsYfQa';
const ruleSid = 'epr_2aB4cD6eF8gH1iJ3kL5mN7oP9qR';
const response = await fetch(`https://api.apitraffic.io/v1/accounts/${accountSid}/endpointRules/${ruleSid}`, {
  headers: { Authorization: `Bearer ${process.env.APITRAFFIC_TOKEN}` },
});
const rule = await response.json();
```

```json 200
{
  "sid": "epr_2aB4cD6eF8gH1iJ3kL5mN7oP9qR",
  "accountSid": "acc_2mXq7RbT4kPz9WvN3cHd8LsYfQa",
  "description": "Freight tracking calls",
  "matchPattern": "/v1/shipments/{*}/tracking",
  "endpointPattern": "/v1/shipments/{shipmentId}/tracking",
  "priority": 0,
  "direction": "out",
  "hosts": ["api.acme-freight.example"],
  "buckets": ["*"],
  "environments": ["*"],
  "enabled": true,
  "stream": false,
  "source": "manual",
  "observedValues": [],
  "createdAt": "2026-05-12T08:30:00.000Z"
}
```

## Create endpoint rule

`POST https://api.apitraffic.io/v1/accounts/{accountSid}/endpointRules`

Creates an endpoint rule. It applies to requests captured from then on.

**Limit:** the number of endpoint rules depends on the plan; past it, the API answers `409` with code `2213`.

### Path parameters

- **accountSid (path, string, required)**:
  The account identifier.

### Body parameters

- **matchPattern (body, string, required)**:
  The path to match, with `{*}` for one segment.

- **endpointPattern (body, string, required)**:
  The endpoint to assign.

- **description (body, string | null)**:
  A short description.

- **priority (body, integer, default 0)**:
  0 or more; lower numbers are checked first.

- **direction (body, string, default *)**:
  `in`, `out` or `*`.

- **hosts (body, string[], default ["*"])**:
  Upstream hosts, for outbound traffic.

- **buckets (body, string[])**:
  Bucket sids, or `["*"]`.

- **environments (body, string[])**:
  Environment sids, or `["*"]`.

- **enabled (body, boolean, default true)**:
  Whether the rule is active.

- **stream (body, boolean, default false)**:
  Treat matching requests as long-lived connections.

### Response

The new [endpoint rule object](#the-endpoint-rule-object).

```bash cURL
curl -X POST https://api.apitraffic.io/v1/accounts/acc_2mXq7RbT4kPz9WvN3cHd8LsYfQa/endpointRules \
  -H "Authorization: Bearer $APITRAFFIC_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "description": "Freight tracking calls",
    "matchPattern": "/v1/shipments/{*}/tracking",
    "endpointPattern": "/v1/shipments/{shipmentId}/tracking",
    "direction": "out",
    "hosts": ["api.acme-freight.example"]
  }'
```

```js Node.js
const accountSid = 'acc_2mXq7RbT4kPz9WvN3cHd8LsYfQa';
const response = await fetch(`https://api.apitraffic.io/v1/accounts/${accountSid}/endpointRules`, {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.APITRAFFIC_TOKEN}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    description: 'Freight tracking calls',
    matchPattern: '/v1/shipments/{*}/tracking',
    endpointPattern: '/v1/shipments/{shipmentId}/tracking',
    direction: 'out',
    hosts: ['api.acme-freight.example'],
  }),
});
const rule = await response.json();
```

```json 200
{
  "sid": "epr_2aB4cD6eF8gH1iJ3kL5mN7oP9qR",
  "accountSid": "acc_2mXq7RbT4kPz9WvN3cHd8LsYfQa",
  "description": "Freight tracking calls",
  "matchPattern": "/v1/shipments/{*}/tracking",
  "endpointPattern": "/v1/shipments/{shipmentId}/tracking",
  "priority": 0,
  "direction": "out",
  "hosts": ["api.acme-freight.example"],
  "buckets": ["*"],
  "environments": ["*"],
  "enabled": true,
  "stream": false,
  "source": "manual",
  "observedValues": [],
  "createdAt": "2026-10-20T11:40:00.000Z"
}
```

## Update endpoint rule

`PUT https://api.apitraffic.io/v1/accounts/{accountSid}/endpointRules/{endpointRuleSid}`

Replaces an endpoint rule. `matchPattern` and `endpointPattern` are required; send the other fields with the values you want, as for [Create endpoint rule](#create-endpoint-rule). `stream` keeps its value when omitted.

### Path parameters

- **accountSid (path, string, required)**:
  The account identifier.

- **endpointRuleSid (path, string, required)**:
  The rule's identifier.

### Body parameters

The same as [Create endpoint rule](#create-endpoint-rule).

### Response

The updated [endpoint rule object](#the-endpoint-rule-object).

```bash cURL
curl -X PUT https://api.apitraffic.io/v1/accounts/acc_2mXq7RbT4kPz9WvN3cHd8LsYfQa/endpointRules/epr_2aB4cD6eF8gH1iJ3kL5mN7oP9qR \
  -H "Authorization: Bearer $APITRAFFIC_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "description": "Freight tracking calls",
    "matchPattern": "/v1/shipments/{*}/tracking",
    "endpointPattern": "/v1/shipments/{shipmentId}/tracking",
    "direction": "out",
    "hosts": ["api.acme-freight.example"],
    "enabled": false
  }'
```

```js Node.js
const accountSid = 'acc_2mXq7RbT4kPz9WvN3cHd8LsYfQa';
const ruleSid = 'epr_2aB4cD6eF8gH1iJ3kL5mN7oP9qR';
const response = await fetch(`https://api.apitraffic.io/v1/accounts/${accountSid}/endpointRules/${ruleSid}`, {
  method: 'PUT',
  headers: {
    Authorization: `Bearer ${process.env.APITRAFFIC_TOKEN}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    description: 'Freight tracking calls',
    matchPattern: '/v1/shipments/{*}/tracking',
    endpointPattern: '/v1/shipments/{shipmentId}/tracking',
    direction: 'out',
    hosts: ['api.acme-freight.example'],
    enabled: false,
  }),
});
const rule = await response.json();
```

```json 200
{
  "sid": "epr_2aB4cD6eF8gH1iJ3kL5mN7oP9qR",
  "accountSid": "acc_2mXq7RbT4kPz9WvN3cHd8LsYfQa",
  "description": "Freight tracking calls",
  "matchPattern": "/v1/shipments/{*}/tracking",
  "endpointPattern": "/v1/shipments/{shipmentId}/tracking",
  "priority": 0,
  "direction": "out",
  "hosts": ["api.acme-freight.example"],
  "buckets": ["*"],
  "environments": ["*"],
  "enabled": false,
  "stream": false,
  "source": "manual",
  "observedValues": [],
  "createdAt": "2026-10-20T11:40:00.000Z"
}
```

## Delete endpoint rule

`DELETE https://api.apitraffic.io/v1/accounts/{accountSid}/endpointRules/{endpointRuleSid}`

Deletes an endpoint rule.

### Path parameters

- **accountSid (path, string, required)**:
  The account identifier.

- **endpointRuleSid (path, string, required)**:
  The rule's identifier.

### Response

- **sid (string, required)**:
  The deleted rule's identifier.

- **deleted (boolean, required)**:
  `true`.

```bash cURL
curl -X DELETE https://api.apitraffic.io/v1/accounts/acc_2mXq7RbT4kPz9WvN3cHd8LsYfQa/endpointRules/epr_2aB4cD6eF8gH1iJ3kL5mN7oP9qR \
  -H "Authorization: Bearer $APITRAFFIC_TOKEN"
```

```js Node.js
const accountSid = 'acc_2mXq7RbT4kPz9WvN3cHd8LsYfQa';
const ruleSid = 'epr_2aB4cD6eF8gH1iJ3kL5mN7oP9qR';
await fetch(`https://api.apitraffic.io/v1/accounts/${accountSid}/endpointRules/${ruleSid}`, {
  method: 'DELETE',
  headers: { Authorization: `Bearer ${process.env.APITRAFFIC_TOKEN}` },
});
```

```json 200
{
  "sid": "epr_2aB4cD6eF8gH1iJ3kL5mN7oP9qR",
  "deleted": true
}
```

## The attention signal object

Attention signals are raised by a background evaluation of each bucket's recent traffic, independent of any time range you pick in the app.

**Plan:** signals are raised for plans that include **Attention signals**. Reading and triaging existing signals keeps working if the plan changes.

- **sid (string, required)**:
  The signal's identifier (`asig_` followed by 27 letters and digits).

- **accountSid (string, required)**:
  The account.

- **bucketSid (string, required)**:
  The bucket.

- **environmentSid (string | null)**:
  The environment.

- **signalType (string, required)**:
  `error_rate`, `error_hotspot`, `latency_regression`, `error_regression`, `slow_endpoint`, `waf_blocked`, `waf_would_block`, `drift_breaking`, `drift_high` or `drift_open`.

- **subjectType (string, required)**:
  `bucket` or `endpoint`.

- **subject (string | null)**:
  The endpoint, for endpoint signals.

- **severity (string, required)**:
  `critical`, `warning` or `info`.

- **status (string, required)**:
  `open`, `acknowledged`, `snoozed`, `dismissed` or `resolved`.

- **title (string | null)**:
  A one-line summary.

- **detail (string | null)**:
  More detail.

- **metricValue (number | null)**:
  The number that raised the signal, in `metricUnit` (`percent`, `ms` or `count`).

- **context (object)**:
  Supporting counts; the shape depends on `signalType`.

- **occurrenceCount (number, required)**:
  How many evaluations have seen the signal firing.

- **firstSeenAt (string | null)**:
  First seen.

- **lastSeenAt (string | null)**:
  Last seen.

- **resolvedAt (string | null)**:
  When the problem stopped.

- **dismissedAt (string | null)**:
  When it was dismissed, and `dismissedByUserSid` by whom.

- **snoozedUntil (string | null)**:
  When a snoozed signal comes back.

- **createdAt (string | null)**:
  When the signal was first raised.

## List attention signals

`GET https://api.apitraffic.io/v1/accounts/{accountSid}/buckets/{bucketSid}/attentionSignals`

Returns a bucket's signals. By default only those someone should see now: firing, and not dismissed or snoozed.

### Path parameters

- **accountSid (path, string, required)**:
  The account identifier.

- **bucketSid (path, string, required)**:
  The bucket identifier.

### Query parameters

- **environmentSid (query, string)**:
  Only this environment.

- **status (query, string)**:
  Only this status: `open`, `acknowledged`, `snoozed`, `dismissed` or `resolved`.

- **signalType (query, string)**:
  Only this type.

- **severity (query, string)**:
  `critical`, `warning` or `info`.

- **visibleOnly (query, boolean, default true)**:
  Pass `false` to include dismissed, snoozed and resolved signals.

- **limit (query, integer, default 250)**:
  Signals to return, 1 to 1000.

### Response

- **hasMore (boolean, required)**:
  Whether more signals match than were returned.

- **records (object[], required)**:
  The signals, as [attention signal objects](#the-attention-signal-object).

```bash cURL
curl -G https://api.apitraffic.io/v1/accounts/acc_2mXq7RbT4kPz9WvN3cHd8LsYfQa/buckets/k3m9p2x/attentionSignals \
  -H "Authorization: Bearer $APITRAFFIC_TOKEN" \
  --data-urlencode 'severity=critical'
```

```js Node.js
const accountSid = 'acc_2mXq7RbT4kPz9WvN3cHd8LsYfQa';
const response = await fetch(
  `https://api.apitraffic.io/v1/accounts/${accountSid}/buckets/k3m9p2x/attentionSignals?severity=critical`,
  { headers: { Authorization: `Bearer ${process.env.APITRAFFIC_TOKEN}` } },
);
const { records } = await response.json();
```

```json 200
{
  "hasMore": false,
  "records": [
    {
      "sid": "asig_2fG4hJ6kL8mN1pQ3rS5tU7vW9xY",
      "accountSid": "acc_2mXq7RbT4kPz9WvN3cHd8LsYfQa",
      "bucketSid": "k3m9p2x",
      "environmentSid": "prd7k2",
      "signalType": "error_hotspot",
      "subjectType": "endpoint",
      "subject": "/v1/payments/{payment_id}/capture",
      "severity": "critical",
      "status": "open",
      "title": "POST /v1/payments/{payment_id}/capture is failing",
      "detail": "43% of requests returned 5xx in the last hour.",
      "metricValue": 43.1,
      "metricUnit": "percent",
      "context": {},
      "occurrenceCount": 4,
      "firstSeenAt": "2026-10-19T14:05:00.000Z",
      "lastSeenAt": "2026-10-19T14:35:00.000Z",
      "resolvedAt": null,
      "dismissedAt": null,
      "dismissedByUserSid": null,
      "snoozedUntil": null,
      "createdAt": "2026-10-19T14:05:00.000Z"
    }
  ]
}
```

## Update attention signal

`PATCH https://api.apitraffic.io/v1/accounts/{accountSid}/buckets/{bucketSid}/attentionSignals/{signalSid}`

Acknowledges, snoozes, dismisses or reopens a signal. A dismissal applies to everyone in the account and records who made it. A dismissed signal comes back on its own if it escalates in severity or its metric gets materially worse. `resolved` cannot be set by hand; it is set when the problem stops.

### Path parameters

- **accountSid (path, string, required)**:
  The account identifier.

- **bucketSid (path, string, required)**:
  The bucket identifier.

- **signalSid (path, string, required)**:
  The signal's identifier (`asig_…`).

### Body parameters

- **status (body, string, required)**:
  `open`, `acknowledged`, `snoozed` or `dismissed`.

- **snoozeMinutes (body, integer)**:
  How long to hide the signal, 1 to 43200 minutes (30 days). Required with `snoozed`.

### Response

The updated [attention signal object](#the-attention-signal-object).

```bash cURL
curl -X PATCH https://api.apitraffic.io/v1/accounts/acc_2mXq7RbT4kPz9WvN3cHd8LsYfQa/buckets/k3m9p2x/attentionSignals/asig_2fG4hJ6kL8mN1pQ3rS5tU7vW9xY \
  -H "Authorization: Bearer $APITRAFFIC_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "status": "snoozed", "snoozeMinutes": 120 }'
```

```js Node.js
const accountSid = 'acc_2mXq7RbT4kPz9WvN3cHd8LsYfQa';
const signalSid = 'asig_2fG4hJ6kL8mN1pQ3rS5tU7vW9xY';
const response = await fetch(
  `https://api.apitraffic.io/v1/accounts/${accountSid}/buckets/k3m9p2x/attentionSignals/${signalSid}`,
  {
    method: 'PATCH',
    headers: {
      Authorization: `Bearer ${process.env.APITRAFFIC_TOKEN}`,
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({ status: 'snoozed', snoozeMinutes: 120 }),
  },
);
const signal = await response.json();
```

```json 200
{
  "sid": "asig_2fG4hJ6kL8mN1pQ3rS5tU7vW9xY",
  "accountSid": "acc_2mXq7RbT4kPz9WvN3cHd8LsYfQa",
  "bucketSid": "k3m9p2x",
  "environmentSid": "prd7k2",
  "signalType": "error_hotspot",
  "subjectType": "endpoint",
  "subject": "/v1/payments/{payment_id}/capture",
  "severity": "critical",
  "status": "snoozed",
  "title": "POST /v1/payments/{payment_id}/capture is failing",
  "detail": "43% of requests returned 5xx in the last hour.",
  "metricValue": 43.1,
  "metricUnit": "percent",
  "context": {},
  "occurrenceCount": 4,
  "firstSeenAt": "2026-10-19T14:05:00.000Z",
  "lastSeenAt": "2026-10-19T14:35:00.000Z",
  "resolvedAt": null,
  "dismissedAt": null,
  "dismissedByUserSid": null,
  "snoozedUntil": "2026-10-19T16:40:00.000Z",
  "createdAt": "2026-10-19T14:05:00.000Z"
}
```

## Errors

| Status | Code | Meaning |
| --- | --- | --- |
| `400` | `1000` | A parameter is missing or invalid, for example `snoozed` without `snoozeMinutes`. |
| `403` | `2509` | Changing a rule or signal for the read-only sample bucket. |
| `404` | `4000` | No rule or signal with that sid. |
| `409` | `2213` | The plan's endpoint rule limit is reached. |
| `503`, `504` | `5101` to `5104` | Endpoint metrics could not be read right now. Retry after `Retry-After` seconds. |

## Related

- [Endpoint rules](https://www.apitraffic.io/docs/data/endpoint-rules):
    When and how to write endpoint rules.

- [Drift API](https://www.apitraffic.io/docs/api-reference/drift):
    Changes in an endpoint's shape over time.
