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"
  }
}

Was this page helpful?