Glasser

Provided by Ahrefs

Ahrefs Organic Keywords

From $0.055 per callanswers within 75s

The keywords a domain or URL ranks for in organic search on a date from the Ahrefs index: keyword, best position and ranking URL, search volume, traffic, CPC by default. select, where and order_by are passed to Ahrefs as documented (fields used in where or order_by are billed like returned fields). Up to 250 rows per call (limit 1–250, default 25). No offset or pagination. Price is per Ahrefs API unit. An empty report is reported as no result.

How to run it

Step 1Set up

Once: paste this into your agent's chat. The Skill installs the CLI and logs in by itself. For an agent that cannot use a shell, connect it over MCP instead.

Set up
set up https://glasser.ai/SKILL.md

Show me how to use the Ahrefs endpoint /v3/site-explorer/organic-keywords on Glasser.

Step 2Try a specific example task

When you need to decide which pages to optimize first, you might look for keywords ranking just outside the top 10 and compare their search volumes to see which pages are worth updating.

Copy this prompt into your agent to find those keywords and their ranking pages.

Prompt
Use ahrefs:/v3/site-explorer/organic-keywords on Glasser.
For my domain and date, list returned keywords ranking 11–20 by search volume, with their ranking URLs.

Endpoint structure

json
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "target",
    "date"
  ],
  "properties": {
    "date": {
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      "maxLength": 10,
      "minLength": 1
    },
    "mode": {
      "enum": [
        "exact",
        "prefix",
        "domain",
        "subdomains"
      ],
      "type": "string"
    },
    "limit": {
      "type": "integer",
      "maximum": 250,
      "minimum": 1
    },
    "where": {
      "type": "string",
      "minLength": 1
    },
    "select": {
      "type": "string",
      "pattern": "^[a-z_][a-z0-9_.]*(,[a-z_][a-z0-9_.]*)*$",
      "minLength": 1
    },
    "target": {
      "type": "string",
      "maxLength": 500,
      "minLength": 1
    },
    "country": {
      "enum": [
        "ad",
        "ae",
        "af",
        "ag",
        "ai",
        "al",
        "am",
        "ao",
        "ar",
        "as",
        "at",
        "au",
        "aw",
        "az",
        "ba",
        "bb",
        "bd",
        "be",
        "bf",
        "bg",
        "bh",
        "bi",
        "bj",
        "bn",
        "bo",
        "br",
        "bs",
        "bt",
        "bw",
        "by",
        "bz",
        "ca",
        "cd",
        "cf",
        "cg",
        "ch",
        "ci",
        "ck",
        "cl",
        "cm",
        "cn",
        "co",
        "cr",
        "cu",
        "cv",
        "cy",
        "cz",
        "de",
        "dj",
        "dk",
        "dm",
        "do",
        "dz",
        "ec",
        "ee",
        "eg",
        "es",
        "et",
        "fi",
        "fj",
        "fm",
        "fo",
        "fr",
        "ga",
        "gb",
        "gd",
        "ge",
        "gf",
        "gg",
        "gh",
        "gi",
        "gl",
        "gm",
        "gn",
        "gp",
        "gq",
        "gr",
        "gt",
        "gu",
        "gy",
        "hk",
        "hn",
        "hr",
        "ht",
        "hu",
        "id",
        "ie",
        "il",
        "im",
        "in",
        "iq",
        "is",
        "it",
        "je",
        "jm",
        "jo",
        "jp",
        "ke",
        "kg",
        "kh",
        "ki",
        "kn",
        "kr",
        "kw",
        "ky",
        "kz",
        "la",
        "lb",
        "lc",
        "li",
        "lk",
        "ls",
        "lt",
        "lu",
        "lv",
        "ly",
        "ma",
        "mc",
        "md",
        "me",
        "mg",
        "mk",
        "ml",
        "mm",
        "mn",
        "mq",
        "mr",
        "ms",
        "mt",
        "mu",
        "mv",
        "mw",
        "mx",
        "my",
        "mz",
        "na",
        "nc",
        "ne",
        "ng",
        "ni",
        "nl",
        "no",
        "np",
        "nr",
        "nu",
        "nz",
        "om",
        "pa",
        "pe",
        "pf",
        "pg",
        "ph",
        "pk",
        "pl",
        "pn",
        "pr",
        "ps",
        "pt",
        "py",
        "qa",
        "re",
        "ro",
        "rs",
        "ru",
        "rw",
        "sa",
        "sb",
        "sc",
        "se",
        "sg",
        "sh",
        "si",
        "sk",
        "sl",
        "sm",
        "sn",
        "so",
        "sr",
        "st",
        "sv",
        "td",
        "tg",
        "th",
        "tj",
        "tk",
        "tl",
        "tm",
        "tn",
        "to",
        "tr",
        "tt",
        "tw",
        "tz",
        "ua",
        "ug",
        "us",
        "uy",
        "uz",
        "vc",
        "ve",
        "vg",
        "vi",
        "vn",
        "vu",
        "ws",
        "ye",
        "yt",
        "za",
        "zm",
        "zw"
      ],
      "type": "string"
    },
    "order_by": {
      "type": "string",
      "pattern": "^[a-z_][a-z0-9_.]*(:(asc|desc))?(,[a-z_][a-z0-9_.]*(:(asc|desc))?)*$",
      "minLength": 1
    },
    "protocol": {
      "enum": [
        "both",
        "http",
        "https"
      ],
      "type": "string"
    }
  },
  "additionalProperties": false
}

How pricing works

Base feeIncludes up to 50 api units. The same price with or without matching data.$0.055
Per additional api unitFor each api unit after the first 50.$0.0011
Maximum per RunThe total charge will not exceed this amount.$55.00
Provider errorThe Provider failed to answer.$0.00
Timed outThe Run exceeded its time limit.$0.00
Internal failureAn internal error prevented completion.$0.00
Method GETVersion 4Provider documentation ↗