Domains

Four endpoints that together describe a domain's organic footprint: the headline numbers, the keywords behind them, the domains it competes with, and the pages that carry the traffic. Start with the overview and go deeper only where the numbers justify it, because the deeper calls cost more.


POST/v1/domains/overview

Domain overview

Organic visibility totals for a domain in one country: keyword count, top 3 and top 10 positions, estimated monthly organic traffic, what that traffic would cost in paid ads, and month over month movement.

Required attributes

  • Name
    domain
    Type
    string
    Description

    A bare domain such as example.com. Protocol, www. and paths are stripped.

Optional attributes

  • Name
    country
    Type
    string
    Description

    ISO 3166-1 alpha-2 code such as US, ES or MX. Default US. See Countries and languages.

  • Name
    language
    Type
    string
    Description

    ISO 639-1 code such as en or es. Defaults to the main language of the country, so ES means Spanish unless you say otherwise.

Response fields

  • Name
    organic.keywords
    Type
    integer
    Description

    Keywords the domain ranks for in the top 100.

  • Name
    organic.monthly_traffic
    Type
    integer
    Description

    Estimated monthly organic visits, modelled from positions and search volumes.

  • Name
    organic.traffic_value_usd
    Type
    integer
    Description

    What buying that traffic through ads would cost per month.

  • Name
    movement
    Type
    object
    Description

    Keywords that improved, declined, are new or were lost since the previous month.

Returns 404 not_found when the domain has no organic presence in that country. That is often a language mismatch: try the country's main language, which is the default.

Request

POST
/v1/domains/overview
curl -X POST https://suvjexogmfpvxjcktvuk.supabase.co/functions/v1/api/v1/domains/overview \
  -H "Authorization: Bearer $PENGU_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"domain": "hubspot.com", "country": "US"}'

Response

{
  "data": {
    "domain": "hubspot.com",
    "country": "US",
    "checked_at": "2026-09-09T11:47:02.086Z",
    "organic": {
      "keywords": 303827,
      "top_3": 13141,
      "top_10": 48894,
      "positions_11_20": 64193,
      "positions_21_30": 59140,
      "monthly_traffic": 2258695,
      "traffic_value_usd": 44177901
    },
    "movement": {
      "improved": 95727,
      "declined": 78824,
      "new": 116809,
      "lost": 131200
    }
  },
  "meta": {
    "credits_charged": 2,
    "credits_remaining": 483.5,
    "request_id": "b8ebf69f-d9ab-4b8b-9733-d66af4023f3d"
  }
}

POST/v1/domains/keywords

Domain keywords

The keywords a domain actually ranks for, highest estimated traffic first. This is the endpoint to use for "where does their traffic come from".

Required attributes

  • Name
    domain
    Type
    string
    Description

    A bare domain such as example.com. Protocol, www. and paths are stripped.

Optional attributes

  • Name
    country
    Type
    string
    Description

    ISO 3166-1 alpha-2 code such as US, ES or MX. Default US. See Countries and languages.

  • Name
    language
    Type
    string
    Description

    ISO 639-1 code such as en or es. Defaults to the main language of the country, so ES means Spanish unless you say otherwise.

  • Name
    limit
    Type
    integer
    Description

    Keywords to return, 10 to 100. Default 50. Capped by your plan.

Response fields

  • Name
    total_keywords
    Type
    integer
    Description

    How many keywords the domain ranks for in total, beyond the ones returned.

  • Name
    keywords[].traffic
    Type
    integer
    Description

    Estimated monthly visits this keyword sends to the domain.

  • Name
    keywords[].url
    Type
    string
    Description

    The page that ranks.

Request

POST
/v1/domains/keywords
curl -X POST https://suvjexogmfpvxjcktvuk.supabase.co/functions/v1/api/v1/domains/keywords \
  -H "Authorization: Bearer $PENGU_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"domain": "hubspot.com", "country": "US", "limit": 50}'

Response

{
  "data": {
    "domain": "hubspot.com",
    "country": "US",
    "total_keywords": 303854,
    "count": 10,
    "keywords": [
      {
        "keyword": "hubspot",
        "position": 1,
        "volume": 368000,
        "traffic": 111872,
        "cpc": 7.88,
        "difficulty": 57,
        "url": "https://www.hubspot.com/"
      },
      {
        "keyword": "client feedback surveys",
        "position": 3,
        "volume": 135000,
        "traffic": 41040,
        "cpc": 37.46,
        "difficulty": 7,
        "url": "https://knowledge.hubspot.com/customer-feedback/create-and-send-customer-satisfaction-surveys"
      },
      {
        "keyword": "customer feedback survey",
        "position": 2,
        "volume": 135000,
        "traffic": 41040,
        "cpc": 37.46,
        "difficulty": 13,
        "url": "https://knowledge.hubspot.com/customer-feedback/create-and-send-customer-satisfaction-surveys"
      },
      // ...
    ]
  },
  "meta": {
    "credits_charged": 4.5,
    "credits_remaining": 483.5,
    "request_id": "f4d29d84-977a-4866-a7f4-129c36715f00"
  }
}

POST/v1/domains/competitors

Domain competitors

Domains that share organic keywords with the target, ranked by how many they share. Large platforms such as YouTube or Reddit often appear first because they rank for everything; filter them out client side if you want direct competitors only.

Required attributes

  • Name
    domain
    Type
    string
    Description

    A bare domain such as example.com. Protocol, www. and paths are stripped.

Optional attributes

  • Name
    country
    Type
    string
    Description

    ISO 3166-1 alpha-2 code such as US, ES or MX. Default US. See Countries and languages.

  • Name
    language
    Type
    string
    Description

    ISO 639-1 code such as en or es. Defaults to the main language of the country, so ES means Spanish unless you say otherwise.

  • Name
    limit
    Type
    integer
    Description

    Competitors to return, 5 to 50. Default 10.

Response fields

  • Name
    competitors[].shared_keywords
    Type
    integer
    Description

    Keywords both domains rank for.

  • Name
    competitors[].avg_position
    Type
    integer
    Description

    The competitor's average position on the shared keywords.

  • Name
    competitors[].monthly_traffic
    Type
    integer
    Description

    The competitor's total estimated organic traffic.

Request

POST
/v1/domains/competitors
curl -X POST https://suvjexogmfpvxjcktvuk.supabase.co/functions/v1/api/v1/domains/competitors \
  -H "Authorization: Bearer $PENGU_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"domain": "hubspot.com", "country": "US", "limit": 10}'

Response

{
  "data": {
    "domain": "hubspot.com",
    "country": "US",
    "count": 4,
    "competitors": [
      {
        "domain": "youtube.com",
        "shared_keywords": 296384,
        "avg_position": 18,
        "keywords": 150042818,
        "monthly_traffic": 3027344320
      },
      {
        "domain": "reddit.com",
        "shared_keywords": 205819,
        "avg_position": 8,
        "keywords": 94514427,
        "monthly_traffic": 4158425546
      },
      {
        "domain": "quora.com",
        "shared_keywords": 166261,
        "avg_position": 23,
        "keywords": 31933895,
        "monthly_traffic": 368517098
      },
      // ...
    ]
  },
  "meta": {
    "credits_charged": 3.5,
    "credits_remaining": 483.5,
    "request_id": "0ba810b5-0413-4207-8391-067aaa10aca1"
  }
}

POST/v1/domains/pages

Top pages

The pages of a domain that earn the most organic traffic. A site where ten URLs carry most of the traffic is fragile; a flat distribution means depth.

Required attributes

  • Name
    domain
    Type
    string
    Description

    A bare domain such as example.com. Protocol, www. and paths are stripped.

Optional attributes

  • Name
    country
    Type
    string
    Description

    ISO 3166-1 alpha-2 code such as US, ES or MX. Default US. See Countries and languages.

  • Name
    language
    Type
    string
    Description

    ISO 639-1 code such as en or es. Defaults to the main language of the country, so ES means Spanish unless you say otherwise.

  • Name
    limit
    Type
    integer
    Description

    Pages to return, 10 to 100. Default 25.

Response fields

  • Name
    pages[].monthly_traffic
    Type
    integer
    Description

    Estimated monthly organic visits to this URL.

  • Name
    pages[].keywords
    Type
    integer
    Description

    Keywords this URL ranks for.

  • Name
    pages[].top_10
    Type
    integer
    Description

    Of those, how many rank in the top 10.

Request

POST
/v1/domains/pages
curl -X POST https://suvjexogmfpvxjcktvuk.supabase.co/functions/v1/api/v1/domains/pages \
  -H "Authorization: Bearer $PENGU_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"domain": "hubspot.com", "country": "US", "limit": 25}'

Response

{
  "data": {
    "domain": "hubspot.com",
    "country": "US",
    "count": 10,
    "pages": [
      {
        "url": "https://www.hubspot.com/products/crm",
        "monthly_traffic": 329133,
        "keywords": 1001,
        "top_3": 522,
        "top_10": 745,
        "traffic_value_usd": 14445707
      },
      {
        "url": "https://www.hubspot.com/",
        "monthly_traffic": 134601,
        "keywords": 505,
        "top_3": 61,
        "top_10": 67,
        "traffic_value_usd": 1456113
      },
      {
        "url": "https://knowledge.hubspot.com/customer-feedback/create-and-send-customer-satisfaction-surveys",
        "monthly_traffic": 123147,
        "keywords": 22,
        "top_3": 5,
        "top_10": 7,
        "traffic_value_usd": 4612271
      },
      // ...
    ]
  },
  "meta": {
    "credits_charged": 2,
    "credits_remaining": 483.5,
    "request_id": "1433f8d6-c24f-41d4-9e31-50ccaaa7040f"
  }
}

POST/v1/domains/keyword-gap

Keyword gap

Two domains head to head: every keyword both are known for, each one's position, and the traffic value behind it. Knowing a rival exists is cheap; knowing which keywords they beat you on is what you act on.

Required attributes

  • Name
    domain
    Type
    string
    Description

    Your domain, bare: example.com.

  • Name
    competitor
    Type
    string
    Description

    The domain to compare against. Must be different from domain.

Optional attributes

  • Name
    country
    Type
    string
    Description

    ISO 3166-1 alpha-2 country code. Default US.

  • Name
    language
    Type
    string
    Description

    ISO 639-1 language code. Defaults to the language of the country.

  • Name
    limit
    Type
    integer
    Description

    Keywords to compare, 10 to 300. Default 50. Capped by your plan.

Response fields

  • Name
    they_beat_you
    Type
    array
    Description

    Keywords where the competitor outranks you, highest volume first. This is the list to work from.

  • Name
    you_beat_them
    Type
    array
    Description

    Keywords where you outrank them, which is what you defend.

  • Name
    only_they_rank
    Type
    array
    Description

    Keywords they rank for and you do not appear for at all.

  • Name
    they_beat_you[].position_delta
    Type
    integer
    Description

    Your position minus theirs. Positive means they are ahead by that many places.

  • Name
    they_beat_you[].traffic_value
    Type
    integer
    Description

    Estimated monthly traffic value of their position on that keyword.

Request

POST
/v1/domains/keyword-gap
curl -X POST https://suvjexogmfpvxjcktvuk.supabase.co/functions/v1/api/v1/domains/keyword-gap \
  -H "Authorization: Bearer $PENGU_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"domain": "example.com", "competitor": "competitor.com", "country": "US", "limit": 50}'

Response

{
  "data": {
    "domain": "example.com",
    "competitor": "competitor.com",
    "country": "US",
    "language": "en",
    "checked_at": "2026-09-20T09:44:07.318Z",
    "count": 50,
    "they_beat_you": [
      {
        "keyword": "project management for agencies",
        "volume": 2400,
        "cpc": 12.4,
        "your_position": 14,
        "their_position": 3,
        "their_url": "https://competitor.com/agencies",
        "position_delta": 11,
        "traffic_value": 1860
      }
    ],
    "you_beat_them": [],
    "only_they_rank": []
  },
  "meta": {
    "credits_charged": 10,
    "credits_remaining": 2790,
    "request_id": "d9a2c481-3e77-4b02-a6f1-8c5d0e3b1729"
  }
}

Was this page helpful?