Keywords

Track a keyword

Start tracking a word or phrase. Matching, classification and delivery begin on the next poll. A funded workspace tracks up to 500 keywords; each costs $5 per month, deducted daily from the balance. `matching` narrows what the term matches (required and excluded terms, excluded authors, case, subreddits, GitHub repository events) before a mention is stored, so a rejected post is never billed; `context` is a sentence the classifier reads for this keyword only. `cap` puts a monthly ceiling on its matched mentions: at the cap it stops matching until the first of the next month (UTC) or until the cap is raised, while its daily keyword charge continues.

POST
/v1/keywords
AuthorizationBearer <token>

API key minted via POST /v1/api-keys (format mk_live_...)

In: header

termstring

The word or phrase to track, case-insensitive. A multi-word term matches as the phrase or as its words close together (see matching.exactPhrase); wrap it in double quotes for the exact phrase only.

Length2 <= length <= 80
kind?string

brand: your own names. competitor: theirs. topic: the space. Drives share of voice and segments.

Default"brand"
Value in"brand" | "competitor" | "topic"
platforms?|null

Platforms to search the term on; omit or null for every platform. [] searches it nowhere: a keyword that only collects reviews or reads feeds, which then needs reviewSources or feeds.

context?string|null

A sentence the classifier reads for this keyword only, on top of the company profile or the group's own description (at most 300 characters): what the term means here, what to ignore. "Arc is our browser; ignore the geometry word." Null clears it.

Lengthlength <= 300
matching?

Omitted fields are untouched; an empty list clears one.

cap?|null

A mention cap per day, week or month (per, default month); omit or null for none.

comments?

Comments under this keyword's mentions; omitted fields are untouched (on create: off, 20 per post).

display?

Which of this keyword's mentions you see, by language and country; each list is replaced when sent, kept when omitted. Hidden mentions are still billed.

groupId?string

The group to track it in (grp_...); omit for the workspace's default group. A term may be tracked once per group.

Length1 <= length
reviewSources?

Review pages this keyword collects, at most 10: App Store and Google Play apps, Trustpilot pages, Google Maps places. Every new review of one is a mention of the keyword, whatever its text says. Polled once a day (per country on the app stores). A newly connected page brings its last 30 days, the newest 100 reviews (per country), free and never sent as instant alerts; after that each review bills like any mention.

Itemsitems <= 10
feeds?

RSS or Atom feeds this keyword reads, at most 20, each { url }: a feed's URL, or a page's (a forum, a community, a blog), in which case the feed the page advertises is used, else a usual address such as /feed or /rss. A URL with no feed behind it is a 400. Each feed is read every hour; an item is a mention of this keyword when it holds the term (with the keyword's matching rules), and only of keywords that named the feed. A newly connected feed brings its newest 10 items of the last 30 days that hold the term, billed like any mention and never sent as instant alerts.

Itemsitems <= 20
readsWorkspaceFeeds?boolean

Whether the keyword also reads the workspace's feeds (GET /v1/feeds); default true. A new keyword reading them gets the look-back of the 8 most recently connected.

Response Body

application/json

application/json

application/json

application/json

curl -X POST "https://api.mentio.dev/v1/keywords" \  -H "Content-Type: application/json" \  -d '{    "term": "string"  }'
{
  "id": "string",
  "term": "string",
  "kind": "brand",
  "muted": true,
  "pausedForBalance": true,
  "pausedForNoise": true,
  "pausedForCap": true,
  "cap": {
    "mentions": 1,
    "per": "day",
    "used": 0,
    "welcome": true,
    "own": 0,
    "ownPer": "day",
    "resumesAt": "string"
  },
  "comments": {
    "enabled": true,
    "maxPerPost": 1
  },
  "display": {
    "languages": {
      "only": [
        "en"
      ],
      "excluded": [
        "en"
      ]
    },
    "countries": {
      "only": [
        "us"
      ],
      "excluded": [
        "us"
      ]
    }
  },
  "group": {
    "id": "string",
    "name": "string",
    "externalId": "string",
    "isDefault": true
  },
  "platforms": [
    "bluesky"
  ],
  "feeds": [
    {
      "url": "string",
      "title": "string",
      "connectedAt": "string"
    }
  ],
  "readsWorkspaceFeeds": true,
  "reviewSources": [
    {
      "platform": "appstore",
      "id": "string",
      "url": "string",
      "countries": [
        "string"
      ],
      "language": "string",
      "connectedAt": "string"
    }
  ],
  "context": "string",
  "matching": {
    "requiredTerms": [
      "string"
    ],
    "requiredMode": "any",
    "requiredGroups": [
      [
        "string"
      ]
    ],
    "excludedTerms": [
      "string"
    ],
    "excludedAuthors": [
      "string"
    ],
    "caseSensitive": true,
    "exactPhrase": true,
    "subreddits": {
      "only": [
        "string"
      ],
      "excluded": [
        "string"
      ]
    },
    "repositories": {
      "events": [
        "new"
      ],
      "minStars": 1000000,
      "minWeeklyStars": 25
    }
  },
  "stats": {
    "mentions": 0,
    "relevant": 0,
    "last7d": 0,
    "thisMonth": 0,
    "lastMentionAt": "string",
    "feedback": {
      "relevant": 0,
      "notRelevant": 0
    },
    "noise": {
      "scored": 0,
      "relevant": 0,
      "noisy": true
    },
    "health": "healthy",
    "cost": {
      "keywordDays": 0,
      "keywordCents": 0,
      "billableMentions": 0,
      "mentionCents": 0,
      "billableComments": 0,
      "commentCents": 0,
      "totalCents": 0
    }
  },
  "polling": [
    {
      "platform": "bluesky",
      "lastPolledAt": "string",
      "emptyPolls": 0
    }
  ],
  "createdAt": "string"
}
{
  "error": {
    "code": "unauthorized",
    "message": "string",
    "requestId": "string",
    "retryAfterSeconds": 0
  }
}
{
  "error": {
    "code": "unauthorized",
    "message": "string",
    "requestId": "string",
    "retryAfterSeconds": 0
  }
}
{
  "error": {
    "code": "unauthorized",
    "message": "string",
    "requestId": "string",
    "retryAfterSeconds": 0
  }
}