# solari instagram tag search

> Every post carrying one exact hashtag or @mention.

- **CLI**: `solari instagram tag search`
- **MCP tool**: `solari_instagram_tag_search`
- **Access**: `solari:read` — Works with any signed-in SOLARI account.

Every tracked post carrying one exact tag — '#ootd' for a hashtag, '@handle' for mentions of an account — hydrated into full rows, newest-collected first with cursor pagination. Exact whole-tag matching over the entire tracked history and every region, where solari_instagram_content_search does free-text over four regions and about six months. Works with any signed-in SOLARI account.

**When to use it** — Measuring a campaign hashtag's real reach, or finding every post that mentioned an account. Exact whole-tag matching over the full tracked history — content search is the tool for keywords found anywhere in text, but it only reaches four regions and about six months.

**What comes back** — Hydrated posts carrying the tag, newest collected first, with a cursor for the next page.

## Parameters

- `query` (string, required, ≤ 200 chars) — One exact tag. '#ootd' or 'ootd' searches a hashtag; '@oliveyoung_official' searches mentions of that account. No spaces, no wildcards.
- `limit` (integer, optional, ≥ 1) — Posts per page, default 20. Values above 1000 are clamped to 1000. Larger pages cost no more than smaller ones.
- `cursor` (string, optional) — next_cursor from the previous response. Omit for the first page.

## Response

### `Response`

- `query` (string) — The tag the lookup actually ran on, without its leading # or @.
- `tag_kind` (string) — hashtag or mention — how the query was read.
- `matched_tags` (integer) — How many stored tag spellings the query matched. Above 1 is normal: a mention matches both the handle and the account's numeric id, and a Hangul hashtag matches both of its Unicode spellings. 0 means the tag has never been seen.
- `items` (object[]) — The posts found.
- `found` (integer) — Posts that hydrated. Lower than the page size when a post was deleted after the tag index was last refreshed.
- `next_cursor` (string | null) — Pass back as cursor for the next page. null on the last page.
- `mirror_synced_at` (timestamp | null) — When the tag index was last refreshed (UTC). Posts published after this may not carry their tags yet.

### `items[]`

- `id` (uuid) — Post id.
- `slug` (string) — Instagram shortcode.
- `text` (string) — Caption text.
- `posted_at` (timestamp) — Publication time (UTC).
- `username / user_id / account_id` (string) — Authoring account. account_id is the current name.
- `like_count / comment_count` (integer) — Engagement snapshot.
- `play_count` (integer | null) — Video plays.
- `media_type` (string) — Post format.

## Example

```console
$ solari instagram tag search query=#ootd limit=3
```

_Long strings and repeated array entries are trimmed for readability._

```json
{
  "query": "ootd",
  "tag_kind": "hashtag",
  "matched_tags": 1,
  "items": [
    {
      "id": "01a06a16-781f-7578-822b-1c326e72f28d",
      "slug": "DW1jniHiVSU",
      "text": "御殿場是一個一天逛不完的地方 希望下次有時間可以慢慢逛 —— OOTD —— Pants：LAKOLE / Shirt：HARE #LYNN__OOTD #日常穿搭 #ootd …",
      "posted_at": "2026-04-07T16:16:21Z",
      "virtual_campaign": null,
      "username": "llling_yinnnnn",
      "user_id": "019dbc46-1a67-7ef5-b95a-2fb466790d04",
      "account_id": "019dbc46-1a67-7ef5-b95a-2fb466790d04",
      "profile_picture_url": null,
      "like_count": 3,
      "comment_count": 4,
      "media_type": "post",
      "play_count": null,
      "media": []
    },
    {
      "id": "01a06a16-552d-7099-ae0a-77e6b68de960",
      "slug": "DaS66VzJBPW",
      "text": "SEOUL OOTD — 這次搭配了四種完全不同風格 #ootd #lynn__ootd #穿搭販賣機 #韓國穿搭",
      "posted_at": "2026-07-02T15:33:13Z",
      "virtual_campaign": null,
      "username": "llling_yinnnnn",
      "user_id": "019dbc46-1a67-7ef5-b95a-2fb466790d04",
      "account_id": "019dbc46-1a67-7ef5-b95a-2fb466790d04",
      "profile_picture_url": null,
      "like_count": 32,
      "comment_count": 1,
      "media_type": "reel",
      "play_count": 888,
      "media": []
    },
    "… 1 more"
  ],
  "found": 3,
  "next_cursor": "01a06a16-552d-7099-ae0a-77e6b68de960",
  "mirror_synced_at": "2026-09-03T21:47:19Z"
}
```

## As an MCP call

```json
{
  "name": "solari_instagram_tag_search",
  "arguments": {
    "query": "#ootd",
    "limit": 3
  }
}
```

## Notes

- Order is collection recency, not publication date — a single account's posts are collected in one burst, so consecutive items often share an author and their posted_at values jump around. Sort by posted_at yourself when publication order matters.
- The tag index is rebuilt once a day, so posts from the last several hours may not carry their tags yet. mirror_synced_at gives the exact cutoff. Captions and engagement counts are always live.
- Every page costs the same to compute no matter how large, so ask for one page of 1000 rather than twenty pages of 50.
- Matching is exact and whole-tag. '#ootd' will not match '#ootdkorea', and there are no wildcards.
- Prefix with @ to search mentions of an account: 'query=@oliveyoung_official'.

## Related tools

- [`solari_instagram_content_search`](https://solari.sh/docs/tools/instagram-content-search.md)
- [`solari_instagram_content_aggregate`](https://solari.sh/docs/tools/instagram-content-aggregate.md)
