# GET /v1/highlight: Instagram highlight API

One highlight by its id or link: title, cover, the account it belongs to and every story in it.

- Call: `GET https://storiesfly.com/api/v1/highlight`
- Price **1 request**
- Answers up to **15 minutes** old

## Parameters

All parameters go in the query string.

| Name | Type | Sent | Description |
| --- | --- | --- | --- |
| `url` | string | one of | Link to the highlight. Send exactly one of url or id. |
| `id` | string | one of | Numeric id of the highlight. Send exactly one of url or id. |

## Example request

Put your own key in the header.

### cURL

```bash
curl "https://storiesfly.com/api/v1/highlight?id=18103599704256781" \
  -H "X-Api-Key: sf_live_your_key"
```

### JavaScript

```javascript
const res = await fetch(
  "https://storiesfly.com/api/v1/highlight?id=18103599704256781",
  { headers: { "X-Api-Key": process.env.STORIESFLY_KEY } }
);
const data = await res.json();
```

### Python

```python
import os
import requests

r = requests.get(
    "https://storiesfly.com/api/v1/highlight",
    params={"id": "18103599704256781"},
    headers={"X-Api-Key": os.environ["STORIESFLY_KEY"]},
)
data = r.json()
```

## Example response

200 OK · X-Units-Charged: 1

```json
{
  "id": "18103599704256781",
  "title": "｡˚ ♡",
  "cover_url": "https://scontent-iad3-1.cdninstagram.com/v/t51.71878-15/809450273_1103403688775264_8171408473185393758_n.jpg",
  "items_count": 82,
  "created_at": 1789616670,
  "created_at_iso": "2026-09-17T03:44:30.000Z",
  "user": {
    "id": "7719696",
    "username": "arianagrande"
  },
  "stories": [
    {
      "id": "3987461624755717505",
      "url": "https://www.instagram.com/stories/arianagrande/3987461624755717505/",
      "taken_at": 1789562478,
      "taken_at_iso": "2026-09-16T12:41:18.000Z",
      "media_type": "video",
      "media_url": "https://scontent-iad3-2.cdninstagram.com/o1/v/t2/f2/m78/AQOztCQ_1G5kGYFooZsrACEQGloAwaemY1bdccNs7a5dMFT6PV2y3F7utCG2-mrfX_4sPPHdWpDh4XpfWXBCSfuAp_6-JpWK-mIFI9c…",
      "thumbnail_url": "https://scontent-iad3-1.cdninstagram.com/v/t51.71878-15/813715219_1125534599803896_6521198656794297674_n.jpg",
      "video_duration": 28.866
    },
    {
      "id": "3987462196355524663",
      "url": "https://www.instagram.com/stories/arianagrande/3987462196355524663/",
      "taken_at": 1789562555,
      "taken_at_iso": "2026-09-16T12:42:35.000Z",
      "media_type": "video",
      "media_url": "https://scontent-iad3-2.cdninstagram.com/o1/v/t2/f2/m78/AQMZwmKqL-JUTpMdUpJ4F3j35SbK5wlaEBfI1NLMPmimpjB_mAW30HBK86yblEs7iBS62nrYJfJjHNrAGFQjrkcYxTUNHPgUdXsYTcc…",
      "thumbnail_url": "https://scontent-iad6-1.cdninstagram.com/v/t51.71878-15/809767015_4519435528321827_7980976440616415635_n.jpg",
      "video_duration": 13.633
    }
  ]
}
```

A real answer, shortened: lists are cut to two items and long texts to 160 characters.

## Price and freshness

A call takes 1 request. Free requests are spent first, then your balance. The [pricing](https://storiesfly.com/developers/pricing) page has the rates.

Answers are kept for up to 15 minutes. Asking again inside that time returns the same answer and takes 1 request again.

## Errors

A failed call answers with an HTTP status and a body `{error, code}`. These are the codes this endpoint gives. [Errors and what is charged](https://storiesfly.com/developers/docs#errors) covers all of them.

| Status | Code | When |
| --- | --- | --- |
| `400` | `bad_request` | A parameter is missing or wrong, or not exactly one of `url` or `id` was sent. `fields` lists the names. Free. |
| `401` | `unauthorized` | The `X-Api-Key` header is missing or the key is wrong. Free. |
| `402` | `credits_exhausted` | The free requests and the balance are used up. Top up in the [dashboard](https://storiesfly.com/developers/dashboard). Free. |
| `403` | `telegram_required` | The account behind the key is not linked to Telegram. The answer has a `link_url` to do it. Free. |
| `404` | `not_found` | The highlight does not exist. Charged like an answer. |
| `429` | `rate_limited` | More requests in a second than your level allows. Wait for the `Retry-After` header. Free. |
| `500` | `internal_error` | A fault on our side. Retry shortly. Refunded. |
| `503` | `upstream_unavailable` | Our side failed or timed out. Retry shortly. Refunded. |

## Questions about this endpoint

### Where do I get the id of a highlight?

From [user/highlights](https://storiesfly.com/developers/docs/user-highlights), or from the link of the highlight on instagram.com: it is the number at the end of /stories/highlights/.

### Does a big highlight cost more?

No. The whole highlight takes 1 request, however many stories it holds.

### Does a highlight expire?

Not on a timer: it stays until the owner removes it. The media links in the answer still stop working after some time, so save the files you need.

## Related endpoints

- [GET /v1/user/highlights](https://storiesfly.com/developers/docs/user-highlights): Highlight covers and titles
- [GET /v1/story](https://storiesfly.com/developers/docs/story): One story by link or id
- [GET /v1/user/stories](https://storiesfly.com/developers/docs/user-stories): Stories live now, with the length of each video
- [GET /v1/resolve](https://storiesfly.com/developers/docs/resolve): Turn a post, reel or share link into data

## Links

- [This page on the site](https://storiesfly.com/developers/docs/highlight)
- [Instagram data API](https://storiesfly.com/developers): what the API is and what it returns
- [Pricing](https://storiesfly.com/developers/pricing): rates, examples and billing rules
- [Documentation](https://storiesfly.com/developers/docs): quick start, authentication, errors and every endpoint
- [OpenAPI file](https://storiesfly.com/openapi.json): the whole API in one file
- [API dashboard](https://storiesfly.com/developers/dashboard): get a key and top up
- [Changelog](https://storiesfly.com/developers/changelog): what changed and when
