---
title: "Export mentions as JSON"
method: GET
path: "/v1/mentions/export.json"
tags: ["Mentions"]
---

# Export mentions as JSON

`GET /v1/mentions/export.json`

## Request

- Base URL: `https://api.mentio.dev`
- URL: `https://api.mentio.dev/v1/mentions/export.json`
- Auth: HTTP bearer

The same mentions GET /v1/mentions would list for these filters, in one response, newest matched first (the order they entered your feed): every row is the full Mention object the list returns, text included. Capped at 10,000 mentions; `truncated` (and the X-Mentions-Truncated header) says when the cap cut the list. Shares the CSV export's limit: at most 6 exports per minute per workspace, either format; a 429 carries Retry-After.

## Query parameters

- `keywordId` string: Only matches of this keyword.
- `platform` 'bluesky' | 'hackernews' | 'github' | 'stackoverflow' | 'devto' | 'reddit' | 'x' | 'youtube' | 'news' | 'linkedin' | 'tiktok' | 'instagram' | 'appstore' | 'googleplay' | 'trustpilot' | 'googlemaps' | 'rss': Only posts from this platform.
- `status` 'open' | 'ignored' | 'done': Only mentions in this status. Omit for every status.
- `relevant` boolean: true: only mentions the classifier scored relevant; false: only the rest (unclassified included).
- `sentiment` 'positive' | 'neutral' | 'negative': Only this sentiment.
- `intent` string: Only mentions carrying this intent or topic tag (buy_intent, question, complaint, praise, comparison, churn_intent, bug_report, pricing, hiring, event, promotional, testimonial, industry_insight, launch, feedback).
- `automated` boolean: true: only mentions that read as machine-made (a bot account, a scheduled or templated post, AI-written text); false: only the rest, mentions judged before this existed included. Omitted: everything.
- `organization` boolean: true: only posts by companies, brands and organizations (a LinkedIn company page, a GitHub organization, a business account); false: only posts by people, mentions judged before this existed included. Omitted: everything.
- `personId` string: Only this person (an id from /v1/people), merged accounts included. Implies includeMuted.
- `includeMuted` boolean: true: include mentions by people you muted, hidden by default: muted for the workspace, or for the mention's own keyword group.
- `includeDuplicates` boolean: true: list cross-posts (a mention whose duplicateOf is set) as mentions of their own. By default each is listed only in its original's duplicates.
- `assigneeId` string: Only mentions assigned to this workspace member (user id).
- `snoozed` boolean: true: only mentions currently snoozed. Otherwise snoozed mentions stay out until they wake.
- `excludeAuthors` string[], nullable: Hide these authors: display names, handles or profile URLs. Repeatable, or one comma-separated value.
- `minRelevance` integer, nullable: Only mentions scored at least this; unclassified ones are excluded.
- `minConfidence` number, nullable: Only mentions whose classifier confidence is at least this, 0 to 1. Mentions without a confidence are excluded.
- `minFollowers` integer, nullable: Only authors with at least this many followers. Unknown reach never passes.
- `maxFollowers` integer, nullable: Only authors with at most this many followers. Unknown reach never passes.
- `kind` 'post' | 'comment' | 'repository': Only posts (post), only comments (comment) or only GitHub repository events (repository). Omitted: all.
- `isReply` boolean: true: only replies and comments (posts answering another post); false: only top-level posts. Omitted: both.
- `alertId` string: Apply an alert rule's filter (an id from GET /v1/alerts) on top of the other filters: the same mentions the rule would send, for a feed-shaped export or a preview. Unknown ids are a 404.
- `viewId` string: Apply a saved view's filter (an id from GET /v1/views) on top of the other filters, every condition ANDed: exactly what the view selects. Unknown ids are a 404.
- `keywordKinds` string[]: Only matches of keywords of any of these kinds: brand, competitor, topic. Repeatable, or comma-separated.
- `tags` string[], nullable: Only authors tagged with any of these (exact, case-sensitive), in the workspace's tags or those of the mention's own keyword group. Repeatable, or comma-separated.
- `linkHosts` string[], nullable: Only posts linking to any of these hosts, the host itself or a subdomain of it (octolens.com also matches blog.octolens.com). Repeatable, or comma-separated.
- `platforms` string[]: Only posts from any of these platforms.
- `notPlatforms` string[]: Never posts from these platforms.
- `keywordIds` string[], nullable: Only matches of any of these keywords.
- `groupIds` string[], nullable: Only matches of keywords in any of these groups (grp_...). Repeatable, or comma-separated.
- `notGroupIds` string[], nullable: Never matches of keywords in these groups.
- `notKeywordIds` string[], nullable: Never matches of these keywords.
- `sentiments` string[]: Only these sentiments.
- `notSentiments` string[]: Never these sentiments. A mention the classifier has not scored yet still passes.
- `intents` string[], nullable: Only mentions carrying any of these intent or topic tags.
- `notIntents` string[], nullable: Never mentions carrying these intent or topic tags.
- `notLinkHosts` string[], nullable: Never posts linking to these hosts, the host itself or a subdomain of it.
- `subreddits` string[], nullable: Only Reddit posts from any of these subreddits: subreddits=SaaS,startups (names without the r/, any case). Every other post fails it. Repeatable, or comma-separated.
- `notSubreddits` string[], nullable: Never Reddit posts from these subreddits; posts from other platforms still pass.
- `notTags` string[], nullable: Never authors tagged with any of these, in the workspace's tags or those of the mention's own keyword group.
- `languages` string[]: Only posts in any of these languages (ISO 639-1: en, es, de). A post whose language is unknown never passes.
- `notLanguages` string[]: Never posts in these languages. A post whose language is unknown still passes.
- `countries` string[]: Only posts whose author is in any of these countries (ISO 3166-1 alpha-2: us, in, de), as the classifier read the author's profile and the post. A post whose country is unknown never passes.
- `notCountries` string[]: Never posts whose author is in these countries: notCountries=in. A post whose country is unknown still passes.
- `ratings` integer[]: Only app store reviews with any of these star ratings (1 to 5): ratings=1,2 is the unhappy ones. Every other post fails it.
- `notRatings` integer[]: Never reviews with these star ratings (1 to 5): notRatings=5 hides the five star reviews. Posts that are not reviews still pass.
- `minLikes` integer, nullable: Only posts with at least this many likes (upvotes, reactions), as the platform reported them when the post was found. A post without that count never passes.
- `minReposts` integer, nullable: Only posts with at least this many reposts (shares, retweets), as the platform reported them when the post was found. A post without that count never passes.
- `minReplies` integer, nullable: Only posts with at least this many replies (comments), as the platform reported them when the post was found. A post without that count never passes.
- `minQuotes` integer, nullable: Only posts with at least this many quotes, as the platform reported them when the post was found. A post without that count never passes.
- `minViews` integer, nullable: Only posts with at least this many views (plays), as the platform reported them when the post was found. A post without that count never passes.
- `minBookmarks` integer, nullable: Only posts with at least this many bookmarks (saves), as the platform reported them when the post was found. A post without that count never passes.
- `anyOf` string: OR across groups of conditions, as URL-encoded JSON: [{"platforms":["reddit"],"sentiments":["negative"]},{"intents":["buy_intent"]}] is "negative on Reddit, or buying intent anywhere". Each group holds the conditions of a view filter (lists any-of, not lists none-of, all ANDed); a mention passes when at least one group holds, and every other filter here still applies. 1 to 10 groups, none empty, no nesting.
- `q` string: Substring search in the post text or the author's name.
- `since` string, date-time: Only posts published at or after this instant (ISO 8601, or epoch ms).
- `until` string, date-time: Only posts published at or before this instant (ISO 8601, or epoch ms).

## Response `200`

Every matching mention, up to the cap

- object
  - `data` Mention[], required: At most 10,000 mentions, newest matched first.
    - `id` string, required: Mention id (mm_...): one post matched to one of your keywords. A post matching two keywords has two ids.
    - `status` 'open' | 'ignored' | 'done', required: open: nobody handled it yet. ignored: hidden from the feed and channels by you. done: handled.
    - `relevant` boolean, required: The classifier scored it at or above the delivery threshold (40).
    - `delivered` boolean, required: Reached at least one of your channels.
    - `priority` number, required: Attention score, one decimal, computed at read time: relevance halved, author reach on a follower ladder (unknown reach counts 8), the strongest intent (buy intent 20 down to praise 5), minus 2 per day of age floored at 20.
    - `keyword` object, required: The keyword this post matched, the group it is in, and how it matched.
      - `id` string, required: Keyword id (kw_...).
      - `term` string, required: The tracked term.
      - `group` GroupRef, required: The group the keyword belongs to.
        - `id` string, required: Group id (grp_...).
        - `name` string, required: The group's name.
        - `externalId` string, nullable, required: Your own id for the group, or null.
        - `isDefault` boolean, required: The workspace's default group, where a keyword lands when no group is named.
      - `matchedAs` 'phrase' | 'close_words', required: phrase: the post holds the term as written. close_words: it holds the term's words close together, in another order or form (kept and billed only because the classifier scored it relevant).
      - `matchedIn` 'text' | 'speech', required: text: the term is in the post itself (its text, caption, hashtags or review). speech: it is only in what is said in the video (TikTok), whose transcript follows the 🎙 mark in post.text.
    - `post` object, required
      - `platform` 'bluesky' | 'hackernews' | 'github' | 'stackoverflow' | 'devto' | 'reddit' | 'x' | 'youtube' | 'news' | 'linkedin' | 'tiktok' | 'instagram' | 'appstore' | 'googleplay' | 'trustpilot' | 'googlemaps' | 'rss', required: Platform: bluesky, hackernews, github, stackoverflow, devto, reddit, x, youtube, news, linkedin, tiktok, instagram, appstore (App Store reviews), googleplay (Google Play reviews), trustpilot (Trustpilot reviews), googlemaps (Google reviews of a place), rss (RSS and Atom feeds a keyword reads).
      - `kind` 'post' | 'comment' | 'repository', required: post: a top-level post. comment: an item that answers a post or another comment (a Reddit or Hacker News comment, an X or Bluesky reply, a Stack Overflow answer, a YouTube comment). repository: an event about a GitHub repository naming the keyword (see post.repository).
      - `url` string, required: Permalink of the post.
      - `text` string, required: Title and body, truncated to 8 KB at ingest.
      - `title` string, nullable, required: The post's own title where the platform has one: a Hacker News story, a Reddit thread, a GitHub issue or pull request, a Stack Overflow question, a DEV article, a YouTube video, a news article, a titled review. Null for platforms without titles (X, Bluesky, LinkedIn) and for posts ingested before October 2026.
      - `imageUrl` string, nullable, required: A preview image of the post, when the platform sent one with it: a YouTube thumbnail, a DEV cover, a news article's sharing image, a Bluesky link card or image. Null otherwise.
      - `subreddit` string, nullable, required: The subreddit a Reddit post was written in, without the r/ (SaaS). Null on every other platform.
      - `flair` string, nullable, required: A Reddit post's flair, when its subreddit uses them (Question, Show and Tell). Null otherwise.
      - `repository` object, nullable, required: A GitHub repository event's facts, on a mention whose kind is repository; null on every other mention. The sentence is post.title.
        - `name` string, required: The repository, owner/name.
        - `event` 'new' | 'traction' | 'stars' | 'growth' | 'top', required: What happened. new: it was created. traction: under 30 days old, it reached 10 stars. stars: it passed a star milestone. growth: it gained stars fast in a week. top: one of the most starred repositories naming the keyword, brought by a new keyword's look-back.
        - `stars` integer, required: Its stars when the event was found.
        - `weeklyStars` integer, nullable, required: Stars gained in the 7 days before the event; null when that week is not known yet.
      - `links` string[], required: Links the post carries, in the order written, at most 20. Empty for a post with none, and for posts ingested before September 2026.
      - `publishedAt` string, required: When the post was published.
      - `engagement` object, nullable, required: Engagement counts as the platform reported them when the post was ingested, usually minutes after it was written; a count the platform does not have is null. Null as a whole for platforms that report none and for posts ingested before September 2026. X carries all six.
        - `likes` integer, nullable, required
        - `reposts` integer, nullable, required
        - `replies` integer, nullable, required
        - `quotes` integer, nullable, required
        - `views` integer, nullable, required
        - `bookmarks` integer, nullable, required
      - `replyTo` object, nullable, required: The post or comment this one answers; null for top-level posts.
        - `author` string, nullable, required: Parent post author as the platform names them.
        - `url` string, nullable, required: Parent post URL.
        - `text` string, nullable, required: Parent post text, when the platform gave it.
    - `parentMentionId` string, nullable, required: For a comment whose parent post or comment is itself one of your mentions: that mention's id (mm_...). Null otherwise.
    - `author` object, nullable, required: Who posted it; null when the platform gave no author at all.
      - `id` string, nullable, required: Person id (aut_...) for GET /v1/people/{id}; null when the account is not in the audience yet.
      - `name` string, nullable, required: Display name as the platform reports it.
      - `handle` string, nullable, required: Platform handle derived from the profile URL, formatted as the platform shows it (@name, u/name); null where the platform has none.
      - `url` string, nullable, required: Profile URL.
      - `avatarUrl` string, nullable, required: Profile picture; null where the platform has none.
      - `followers` integer, nullable, required: Follower count as of their newest post; null where the platform has none.
      - `tags` string[], required: Your tags on this person: the workspace's, then those the mention's own keyword group gave them (set with groupId on /v1/people), each once.
    - `review` object, nullable, required: An app store review's facts; null for every other post. Its sentiment comes from the stars (4 and 5 positive, 3 neutral, 1 and 2 negative) and it always counts as relevant, since you chose the app.
      - `rating` integer, required: Stars the reviewer gave.
      - `ratingMax` integer, required: The top of the scale: 5 on both stores.
      - `title` string, nullable, required: The review's headline; null where the store has none (Google Play).
      - `version` string, nullable, required: The app version the reviewer ran, when the store says.
      - `country` string, nullable, required: The storefront it was read in (App Store, Google Play) or the reviewer's country (Trustpilot), a lowercase two-letter code; null where the platform gives none.
      - `verified` boolean, nullable, required: The platform marks the review as verified (Trustpilot); null where the platform has no such mark.
      - `response` string, nullable, required: The developer's reply as it stood when the review was collected; null for none.
      - `responseAt` string, nullable, required: When the developer replied.
      - `app` object, required: The app reviewed.
        - `platform` 'appstore' | 'googleplay' | 'trustpilot' | 'googlemaps', required: appstore (Apple App Store), googleplay (Google Play), trustpilot (a company's Trustpilot page) or googlemaps (a place's Google reviews).
        - `id` string, required: The store's app id.
        - `url` string, required: The app's store listing.
    - `classification` object, nullable, required: The classifier verdict, as corrected by your feedback; null while the post is still queued for classification.
      - `relevance` integer, nullable, required: 0 to 100; null only when classification failed.
      - `sentiment` 'positive' | 'neutral' | 'negative', nullable, required: Classifier sentiment.
      - `intents` string[], required: Intent and topic tags: buy_intent, question, complaint, praise, comparison, churn_intent (leaving or replacing the keyword), bug_report, pricing, hiring, event, promotional, testimonial (a customer vouching for it from their own use), industry_insight (analysis or data about the field), launch (a product or feature launch announcement), feedback (a suggestion or request about it).
      - `automated` boolean, required: The post reads as machine-made: a bot or app account, a scheduled or templated post, an obvious AI-written summary. A label only: automated mentions stay in the feed, are delivered as usual and are billed like any other match. false while unjudged.
      - `language` string, nullable, required: The language the post is written in, as an ISO 639-1 code (en, es, de); null when unknown or classified before languages were recorded.
      - `country` string, nullable, required: Where the author is, as a lowercase ISO 3166-1 alpha-2 code (us, in, de): the classifier's reading of the author's profile location and the post. A best guess, not a fact the platform gave; null when nothing tells, or classified before countries were recorded.
      - `organization` boolean, required: The author is a company, brand or organization account rather than a person: a LinkedIn company page, a GitHub organization, an account that speaks for a business. A label only, like automated. false while unjudged.
      - `confidence` number, nullable, required: How sure the classifier is of its relevance verdict, 0 to 1. null when the verdict came without one: the fallback model judged, or the row was scored before confidence was recorded.
      - `uncertain` boolean, required: The verdict deserves a human look: confidence under 0.4, or the model that wrote the note disagreed with the verdict. A flag for reviewers; it never hides a mention.
      - `note` string, nullable, required: One sentence from the classifier explaining the score.
      - `failed` boolean, required: true when the model could not score this post; it stays in the feed and is not billed.
      - `feedback` object, nullable, required: A person's correction of the verdict, or null. A relevance verdict sets `relevance` to 100 or 0 and `relevant` with it; a corrected sentiment replaces `sentiment`. Every list, filter, digest and report reads the corrected values.
        - `relevant` boolean, nullable, required: Your verdict on relevance, or null when you only corrected the sentiment.
        - `sentiment` 'positive' | 'neutral' | 'negative', nullable, required: Your corrected sentiment, or null when you only judged relevance.
        - `at` string, required: When the last verdict was given.
        - `original` object, required: The classifier values your feedback replaced.
          - `relevance` integer, nullable, required: What the classifier scored before your verdict; null if it had not scored it.
          - `sentiment` 'positive' | 'neutral' | 'negative', nullable, required: The sentiment the classifier gave before your correction.
    - `triage` object, required
      - `assignee` object, nullable, required: Workspace member this mention is assigned to; null when unassigned.
        - `id` string, required
        - `name` string, nullable, required
        - `email` string, nullable, required
      - `snoozedUntil` string, nullable, required: Until when the mention stays out of the feed; null when not snoozed.
      - `note` string, nullable, required: Internal note; null when none.
    - `duplicateOf` string, nullable, required: Set on a cross-post: the id of the mention this one copies (the same author posting the same text again for the same keyword within three days, like one announcement pasted into five subreddits). A copy is billed like any mention but is listed only under its original and never alerted on its own. null for an original.
    - `duplicates` object[], required: The cross-posts filed under this mention, oldest first: where else its author posted it. Empty when there are none, and on a copy.
      - `id` string, required: The copy's mention id (mm_...).
      - `platform` 'bluesky' | 'hackernews' | 'github' | 'stackoverflow' | 'devto' | 'reddit' | 'x' | 'youtube' | 'news' | 'linkedin' | 'tiktok' | 'instagram' | 'appstore' | 'googleplay' | 'trustpilot' | 'googlemaps' | 'rss', required: Platform: bluesky, hackernews, github, stackoverflow, devto, reddit, x, youtube, news, linkedin, tiktok, instagram, appstore (App Store reviews), googleplay (Google Play reviews), trustpilot (Trustpilot reviews), googlemaps (Google reviews of a place), rss (RSS and Atom feeds a keyword reads).
      - `url` string, required: Link to the copy.
      - `publishedAt` string, required: When the copy was published.
    - `stats` object, required: Computed counts.
      - `comments` integer, required: Comments of this post delivered to you (GET /v1/mentions/{id}/comments); 0 until its thread is read, and for keywords without comments.
    - `createdAt` string, required: When the match was recorded; the default feed order.
  - `truncated` boolean, required: true when more mentions matched than the cap returns: narrow the filters (since, until) and export again.

## Other responses

- `400`: Invalid query, or filter_too_complex: the filters together name more values than one query can carry
- `401`: Missing or invalid API key
- `429`: More than 6 exports this minute; retry after the Retry-After seconds

---

[API](https://skmtc.dev/mentio/apis/mentio-api.md) · [All operations](https://skmtc.dev/mentio/apis/mentio-api/llms.txt) · [OpenAPI document](https://skmtc.dev/mentio/apis/mentio-api/revisions/b16a21d0ed02?raw)
