# GET /v1/location/posts: Location posts API

Posts tagged at a place, a page at a time. sort is top (default) or recent. Pass next_cursor back as cursor, with the same sort, for the next page.

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

## Parameters

All parameters go in the query string.

| Name | Type | Sent | Description |
| --- | --- | --- | --- |
| `id` | string | required | Numeric id of the place. |
| `sort` | string | optional | Which posts: top or recent. Top when left out. |
| `cursor` | string | optional | The next_cursor of the page before. Leave it out for the first page. |

## Example request

Put your own key in the header.

### cURL

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

### JavaScript

```javascript
const res = await fetch(
  "https://storiesfly.com/api/v1/location/posts?id=213385402",
  { 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/location/posts",
    params={"id": "213385402"},
    headers={"X-Api-Key": os.environ["STORIESFLY_KEY"]},
)
data = r.json()
```

## Example response

200 OK · X-Units-Charged: 1

```json
{
  "location": {
    "id": "213385402"
  },
  "sort": "top",
  "posts": [
    {
      "id": "3330175410275775172",
      "shortcode": "C43KORBOnLE",
      "url": "https://www.instagram.com/p/C43KORBOnLE/",
      "owner": {
        "id": "59563767229",
        "username": "joinpepperdeals"
      },
      "taken_at": 1711207866,
      "taken_at_iso": "2024-03-23T15:31:06.000Z",
      "caption": "☕️ free coffee anyone? 👉 this weekend, select @dunkin lovers can score free coffee every day until 03/27! check ur accounts now ⤵️\n\n🤝 Follow @yourthrifty.bff…",
      "media_type": "carousel",
      "pinned": false,
      "thumbnail_url": "https://scontent-cdg4-3.cdninstagram.com/v/t39.30808-6/469720588_17924113379991230_4852877156254501958_n.jpg",
      "media": [
        {
          "id": "3330175405284444957",
          "type": "image",
          "image_url": "https://scontent-cdg4-3.cdninstagram.com/v/t39.30808-6/469720588_17924113379991230_4852877156254501958_n.jpg",
          "video_url": null,
          "width": 1440,
          "height": 1800,
          "video_duration": null
        },
        {
          "id": "3330175405267769476",
          "type": "image",
          "image_url": "https://scontent-cdg4-1.cdninstagram.com/v/t39.30808-6/469506975_17924113742991230_9172324255223227006_n.jpg",
          "video_url": null,
          "width": 1440,
          "height": 1800,
          "video_duration": null
        }
      ],
      "likes": 3577,
      "comments": 36,
      "shares": null,
      "reposts": null,
      "views": null,
      "saves": null,
      "video_duration": null,
      "counts_hidden": false
    },
    {
      "id": "3409088133431647374",
      "shortcode": "C9Pg5hhMVyO",
      "url": "https://www.instagram.com/p/C9Pg5hhMVyO/",
      "owner": {
        "id": "31941868",
        "username": "watcha_lim"
      },
      "taken_at": 1720614996,
      "taken_at_iso": "2024-07-10T12:36:36.000Z",
      "caption": "Coffee time",
      "media_type": "carousel",
      "pinned": false,
      "thumbnail_url": "https://scontent-cdg6-1.cdninstagram.com/v/t39.30808-6/508968166_10237527234943342_2001090206700403515_n.jpg",
      "media": [
        {
          "id": "3409088115303905508",
          "type": "image",
          "image_url": "https://scontent-cdg6-1.cdninstagram.com/v/t39.30808-6/508968166_10237527234943342_2001090206700403515_n.jpg",
          "video_url": null,
          "width": 1615,
          "height": 1707,
          "video_duration": null
        },
        {
          "id": "3409088115438059146",
          "type": "image",
          "image_url": "https://scontent-cdg4-2.cdninstagram.com/v/t39.30808-6/508372126_10237527239983468_89387695715837078_n.jpg",
          "video_url": null,
          "width": 1615,
          "height": 1707,
          "video_duration": null
        }
      ],
      "likes": 49,
      "comments": 9,
      "shares": null,
      "reposts": null,
      "views": null,
      "saves": null,
      "video_duration": null,
      "counts_hidden": false
    }
  ],
  "next_cursor": "c1.ryg6VkAgkE2BcPyGM0q6ADwLG1KAGWvXyxXcleap6rtdnm6USXXD4rRRujLUjticHxS2vixe2jbdlG4LggGvIE1ISp6sYLXI6XWcb66UIrM_RMPDKCUhQylnCgNoMsPrfzM",
  "has_more": true
}
```

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.

Page size follows Instagram and varies by endpoint.

## 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. `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 place 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

### What does sort do?

`sort` is `top` (the default) or `recent`.

### How do I get the next page?

Send the `next_cursor` back as `cursor`, with the same `sort`: a cursor of one sort is refused with another. Each page takes 1 request.

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

From [location/search](https://storiesfly.com/developers/docs/location-search) or [search/places](https://storiesfly.com/developers/docs/search-places).

## Related endpoints

- [GET /v1/location](https://storiesfly.com/developers/docs/location): Place name, address, city and coordinates
- [GET /v1/location/search](https://storiesfly.com/developers/docs/location-search): Find places by name or around a point
- [GET /v1/hashtag/posts](https://storiesfly.com/developers/docs/hashtag-posts): Posts under a hashtag: top, recent or reels

## Links

- [This page on the site](https://storiesfly.com/developers/docs/location-posts)
- [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
