> ## Documentation Index
> Fetch the complete documentation index at: https://developers.hubspot.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

---
id: fbf221e4-0860-4852-b7b8-f50f9396226c
---

# Site search API

> Use the site search API to search for content across your HubSpot-hosted sites and retrieve indexed data for specific assets.

export const PostmanCard = ({title, collectionId}) => {
  return <div className="card-condensed-cta">
      <Card title={title ? title : "Postman collection"} href={`https://app.getpostman.com/run-collection/${collectionId}`} horizontal={true} cta="Run in Postman" icon={<svg xmlns="http://www.w3.org/2000/svg" width={25} height={25} preserveAspectRatio="xMidYMid" viewBox="0 0 256 256">
              <path fill="#FF6C37" d="M254.953 144.253c8.959-70.131-40.569-134.248-110.572-143.206C74.378-7.912 10.005 41.616 1.047 111.619c-8.959 70.003 40.569 134.248 110.572 143.334 70.131 8.959 134.248-40.569 143.334-110.7Z" />
              <path fill="#FFF" d="m174.2 82.184-54.007 54.007-15.229-15.23c53.11-53.11 58.358-48.503 69.236-38.777Z" />
              <path fill="#FF6C37" d="M120.193 137.47c-.384 0-.64-.128-.895-.384l-15.358-15.229a1.237 1.237 0 0 1 0-1.792c54.007-54.006 59.638-48.887 71.028-38.649.255.256.383.512.383.896s-.128.64-.383.896l-54.007 53.878c-.128.256-.512.384-.768.384Zm-13.437-16.509 13.437 13.438 52.087-52.087c-9.47-8.446-15.87-11.006-65.524 38.65Z" />
              <path fill="#FFF" d="m135.679 151.676-14.718-14.718 54.007-54.006c14.46 14.59-7.167 38.265-39.29 68.724Z" />
              <path fill="#FF6C37" d="M135.679 152.956c-.384 0-.64-.128-.896-.384l-14.718-14.718c-.256-.256-.256-.512-.256-.896s.128-.64.384-.895L174.2 82.056a1.237 1.237 0 0 1 1.791 0 15.58 15.58 0 0 1 4.991 11.902c-.256 14.206-16.38 32.25-44.28 58.614-.383.256-.767.384-1.023.384Zm-12.926-15.998c8.19 8.319 11.646 11.646 12.926 12.926 21.5-20.476 42.36-41.464 42.488-55.926.128-3.327-1.152-6.655-3.327-9.214l-52.087 52.214Z" />
              <path fill="#FFF" d="m105.22 121.345 10.878 10.878c.256.256.256.512 0 .768-.128.128-.128.128-.256.128l-22.524 4.863c-1.152.128-2.175-.64-2.431-1.791-.128-.64.128-1.28.512-1.664l13.053-13.054c.256-.256.64-.384.768-.128Z" />
              <path fill="#FF6C37" d="M92.934 139.262c-1.92 0-3.327-1.536-3.327-3.455 0-.896.384-1.792 1.024-2.432l13.053-13.054c.768-.64 1.792-.64 2.56 0l10.878 10.878c.768.64.768 1.792 0 2.56-.256.256-.512.384-.896.512l-22.524 4.863c-.256 0-.512.128-.768.128Zm11.902-16.51-12.542 12.543c-.256.256-.383.64-.128 1.024.128.383.512.511.896.383l21.116-4.607-9.342-9.342Z" />
              <path fill="#FFF" d="M202.739 52.238c-8.191-7.935-21.373-7.679-29.307.64-7.935 8.318-7.679 21.372.64 29.306A20.678 20.678 0 0 0 199.155 85l-14.59-14.59 18.174-18.172Z" />
              <path fill="#FF6C37" d="M188.405 89.223c-12.158 0-22.012-9.854-22.012-22.012 0-12.158 9.854-22.012 22.012-22.012 5.631 0 11.134 2.176 15.23 6.143.255.256.383.512.383.896s-.128.64-.384.895L186.357 70.41l13.566 13.566c.512.512.512 1.28 0 1.792l-.256.256c-3.327 2.047-7.295 3.199-11.262 3.199Zm0-41.337c-10.75 0-19.452 8.703-19.324 19.453 0 10.75 8.702 19.452 19.452 19.324 2.944 0 5.887-.64 8.575-2.047l-13.438-13.31c-.256-.256-.384-.512-.384-.896s.128-.64.384-.895l17.149-17.15c-3.456-2.943-7.807-4.479-12.414-4.479Z" />
              <path fill="#FFF" d="m203.122 52.622-.255-.256-18.301 18.044 14.461 14.462c1.408-.896 2.816-1.92 3.967-3.072a20.51 20.51 0 0 0 .128-29.178Z" />
              <path fill="#FF6C37" d="M199.155 86.28c-.384 0-.64-.128-.896-.384l-14.589-14.59c-.256-.256-.384-.512-.384-.896s.128-.64.384-.895l18.173-18.173a1.237 1.237 0 0 1 1.791 0l.384.256c8.575 8.574 8.575 22.396.128 31.098-1.28 1.28-2.687 2.432-4.223 3.328-.384.128-.64.256-.768.256Zm-12.798-15.87 12.926 12.926c1.024-.64 2.048-1.536 2.816-2.304 7.294-7.294 7.678-19.196.64-26.875L186.357 70.41Z" />
              <path fill="#FFF" d="M176.375 84.488a7.879 7.879 0 0 0-11.134 0l-48.247 48.247 8.063 8.063 51.062-44.792c3.328-2.816 3.584-7.807.768-11.134-.256-.128-.384-.256-.512-.384Z" />
              <path fill="#FF6C37" d="M124.929 142.077c-.384 0-.64-.128-.896-.383l-8.063-8.063a1.237 1.237 0 0 1 0-1.792l48.247-48.247a9.115 9.115 0 0 1 12.926 0 9.115 9.115 0 0 1 0 12.926l-.384.384-51.063 44.792c-.128.255-.384.383-.767.383Zm-6.143-9.342 6.27 6.271 50.167-44.024c2.816-2.304 3.072-6.527.768-9.342-2.303-2.816-6.526-3.072-9.342-.768-.128.128-.256.256-.512.384l-47.351 47.48Z" />
              <path fill="#FFF" d="M80.009 187.637c-.512.256-.768.768-.64 1.28l2.175 9.214c.512 1.28-.256 2.816-1.663 3.2-1.024.384-2.176 0-2.816-.768l-14.077-13.95 45.943-45.943 15.87.256 10.75 10.75c-2.56 2.175-18.045 17.149-55.542 35.961Z" />
              <path fill="#FF6C37" d="M78.985 202.61c-1.024 0-2.048-.383-2.688-1.151l-13.95-13.95c-.255-.256-.383-.512-.383-.896 0-.383.128-.64.384-.895l45.944-45.944c.256-.256.64-.384.895-.384l15.87.256c.383 0 .64.128.895.384l10.75 10.75c.256.256.384.64.384 1.024s-.128.64-.512.896l-.895.767c-13.566 11.902-31.995 23.804-54.902 35.194l2.175 9.086c.384 1.664-.384 3.456-1.92 4.352-.767.384-1.407.512-2.047.512Zm-14.078-15.997 13.182 13.054c.384.64 1.152.896 1.792.512.64-.384.896-1.152.512-1.792l-2.176-9.214c-.256-1.152.256-2.176 1.28-2.688 22.652-11.39 40.952-23.163 54.39-34.81l-9.47-9.47-14.718-.256-44.792 44.664Z" />
              <path fill="#FFF" d="m52.11 197.62 11.006-11.007 16.38 16.381-26.107-1.791c-1.151-.128-1.92-1.152-1.791-2.304 0-.512.128-1.024.512-1.28Z" />
              <path fill="#FF6C37" d="m79.497 204.146-26.236-1.791c-1.92-.128-3.199-1.792-3.071-3.712.128-.768.384-1.535 1.024-2.047L62.22 185.59a1.237 1.237 0 0 1 1.792 0l16.38 16.38c.385.385.512.897.257 1.408-.256.512-.64.768-1.152.768Zm-16.381-15.74-10.11 10.11c-.384.255-.384.895 0 1.151.127.128.255.256.511.256l22.652 1.536-13.053-13.054ZM104.452 146.557c-.768 0-1.28-.64-1.28-1.28 0-.384.128-.64.384-.896l12.414-12.414a1.237 1.237 0 0 1 1.792 0l8.062 8.063c.384.384.512.768.384 1.28-.128.384-.512.767-1.023.895l-20.477 4.352h-.256Zm12.414-11.902-8.446 8.446 13.821-2.943-5.375-5.503Z" />
              <path fill="#FFF" d="m124.8 140.926-14.077 3.071c-1.024.256-2.048-.384-2.303-1.408-.128-.64 0-1.28.511-1.791l7.807-7.807 8.063 7.935Z" />
              <path fill="#FF6C37" d="M110.467 145.277a3.168 3.168 0 0 1-3.2-3.2c0-.895.385-1.663.897-2.303l7.806-7.807a1.237 1.237 0 0 1 1.792 0l8.062 8.063c.384.384.512.768.384 1.28-.128.384-.512.767-1.023.895l-14.078 3.072h-.64Zm6.399-10.622-6.91 6.91c-.257.257-.257.512-.129.768s.384.384.768.384l11.774-2.56-5.503-5.502ZM203.25 64.907c-.256-.767-1.151-1.151-1.92-.895-.767.255-1.151 1.151-.895 1.92 0 .127.128.255.128.383.768 1.536.512 3.455-.512 4.863-.512.64-.384 1.536.128 2.048.64.512 1.536.384 2.048-.256 1.92-2.432 2.303-5.503 1.023-8.063Z" />
            </svg>} />
    </div>;
};

export const Tag = ({children, type = 'default', className = ''}) => {
  return <span className={`tag tag-${type} ${className}`.trim()}>
      {children}
    </span>;
};

export const SupportedProducts = ({marketing, sales, service, cms, data, commerce, marketingLevel, salesLevel, serviceLevel, cmsLevel, dataLevel, commerceLevel}) => {
  const translations = {
    description: "Requires one of the following products or higher.",
    productNames: {
      marketing: "Marketing Hub",
      sales: "Sales Hub",
      service: "Service Hub",
      cms: "Content Hub",
      data: "Data Hub",
      commerce: "Revenue Hub"
    },
    tiers: {
      free: "Free",
      starter: "Starter",
      professional: "Professional",
      enterprise: "Enterprise"
    }
  };
  const translateTier = tier => {
    if (!tier) return '';
    const lowerTier = tier.toLowerCase();
    return translations.tiers[lowerTier] || tier;
  };
  const products = [{
    name: marketing ? translations.productNames.marketing : '',
    level: translateTier(marketingLevel),
    icon: "https://mintlify-assets.b-cdn.net/Icons/marketing-bolt.svg",
    alt: "Marketing Hub"
  }, {
    name: sales ? translations.productNames.sales : '',
    level: translateTier(salesLevel),
    icon: "https://mintlify-assets.b-cdn.net/Icons/sales-star.svg",
    alt: "Sales Hub"
  }, {
    name: service ? translations.productNames.service : '',
    level: translateTier(serviceLevel),
    icon: "https://mintlify-assets.b-cdn.net/Icons/service-heart.svg",
    alt: "Service Hub"
  }, {
    name: cms ? translations.productNames.cms : '',
    level: translateTier(cmsLevel),
    icon: "https://mintlify-assets.b-cdn.net/Icons/content-play.svg",
    alt: "Content Hub"
  }, {
    name: data ? translations.productNames.data : '',
    level: translateTier(dataLevel),
    icon: "https://developers.hubspot.com/hubfs/Knowledge_Base_2023-24-25/subscription_key_icons/operations_icon.svg",
    alt: "Data Hub"
  }, {
    name: commerce ? translations.productNames.commerce : '',
    level: translateTier(commerceLevel),
    icon: "https://developers.hubspot.com/hubfs/Knowledge_Base/subscription_key_icons/commerce_icon.svg",
    alt: "Revenue Hub"
  }].filter(product => product.name && product.level);
  if (products.length === 0) return null;
  return <div>
      <div className="text-sm mb-2">{translations.description}</div>
      <div className={`grid ${products.length === 1 ? 'grid-cols-1' : 'grid-cols-2'} gap-1.5`}>
        {products.map((product, index) => <div key={index} style={{
    display: 'flex',
    alignItems: 'center'
  }}>
            <img src={product.icon} alt={product.alt} className="w-3.5 h-3.5 mr-1.5 mt-2.5 mb-2.5 flex-shrink-0 align-middle" />
            <span className="font-medium mr-1 text-sm">{product.name} -</span>
            <span className="text-sm">{product.level}</span>
          </div>)}
      </div>
    </div>;
};

export const ScopesList = ({scopes = [], description = "This API requires one of the following scopes:"}) => {
  if (!scopes || scopes.length === 0) {
    return null;
  }
  const sortedScopes = scopes.sort((a, b) => a.localeCompare(b));
  return <div>
      <div className="text-sm mb-2">{description}</div>
      <div>
        {sortedScopes.map((scope, index) => <div key={index}>
            <code>
              <span className="text-xs">{scope}</span>
            </code>
          </div>)}
      </div>
    </div>;
};

<PostmanCard collectionId="26126890-a62920cc-c626-455d-adbb-bb1c8e018bf9" />

<AccordionGroup>
  <Accordion title="Supported products" defaultOpen="true" icon="cubes">
    <SupportedProducts marketing={true} marketingLevel="professional" cms={true} cmsLevel="professional" />
  </Accordion>

  <Accordion title="Required Scopes" icon="key">
    <ScopesList
      scopes={[
  'content'
]}
    />
  </Accordion>
</AccordionGroup>

The site search API allows you to search for content across HubSpot-hosted sites and retrieve indexed data for specific pages. Use this API to build custom search experiences for your website.

## Search your site

To search for content across your HubSpot-hosted sites, make a `GET` request to `/cms/v3/site-search/search`.

For example, the following request searches for blog posts containing "marketing" on the `blog.hubspot.com` domain:

```shell wrap theme={null}
curl 'https://api.hubapi.com/cms/v3/site-search/search?q=marketing&type=BLOG_POST&domain=blog.hubspot.com&limit=10' \
  --request GET \
  --header "Authorization: Bearer YOUR_ACCESS_TOKEN"
```

The following query parameters are available:

| Parameter     | Type    | Description                                                                                                                                                                                                           |
| ------------- | ------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `q`           | String  | The term to search for.                                                                                                                                                                                               |
| `type`        | String  | Specifies the type of content to search. Options include: `SITE_PAGE`, `LANDING_PAGE`, `BLOG_POST`, `LISTING_PAGE`, `KNOWLEDGE_ARTICLE`. Defaults to all content types except `LANDING_PAGE` and `KNOWLEDGE_ARTICLE`. |
| `domain`      | String  | A domain to match search results for. Multiple domains can be provided  using `&` as a separator (e.g., `domain=blog.hubspot.com&domain=marketing.hubspot.com`).                                                      |
| `pathPrefix`  | String  | Specifies a path prefix to filter search results. Only returns results with URL paths that start with the specified value.                                                                                            |
| `matchPrefix` | Boolean | Inverts the behavior of the `pathPrefix` filter when set to `false`. Defaults to `true`.                                                                                                                              |
| `language`    | String  | Specifies the language of content to be searched. Must be a valid [ISO 639-1 language code](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) (e.g., `es` for Spanish).                                          |
| `groupId`     | String  | Specifies which blog(s) to search by blog ID. Can be used multiple times to search more than one blog.                                                                                                                |
| `tableId`     | Integer | Specifies a specific HubDB table to search. Only returns results from the specified table.                                                                                                                            |
| `hubdbQuery`  | String  | Specify a HubDB query to further filter the search results.                                                                                                                                                           |
| `property`    | String  | Specifies which properties to search. Options include `title`, `description`, and `html`. All properties are searched by default.                                                                                     |
| `length`      | String  | Specifies the length of the search results description. `SHORT` returns the first 128 characters of the meta description. `LONG` builds a more detailed snippet based on the page content.                            |
| `limit`       | Integer | The number of results to return per page. Defaults to `10`, maximum is `100`.                                                                                                                                         |
| `offset`      | Integer | Used to page through results. Use the `offset` value from the previous response to get the next set of results.                                                                                                       |

### Boosting parameters

The following parameters control how results are ranked:

| Parameter         | Type    | Description                                                                                                                                                                                                                        |
| ----------------- | ------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `autocomplete`    | Boolean | Specifies whether you are showing autocomplete results. Defaults to `false`.                                                                                                                                                       |
| `boostLimit`      | Number  | The maximum amount a result will be boosted based on its view count. Defaults to `5.0`.                                                                                                                                            |
| `boostRecent`     | String  | A relative time window where scores of content published outside this window decay. Only applies to blog posts. For example, `10d` boosts posts published within the last 10 days. Supported time units: `ms`, `s`, `m`, `h`, `d`. |
| `popularityBoost` | Number  | How strongly a result is boosted based on its view count. Defaults to `1.0`.                                                                                                                                                       |

The response includes a `total` count and an array of search results:

```json theme={null}
{
  "total": 12,
  "offset": 0,
  "limit": 10,
  "results": [
    {
      "id": 24314356,
      "score": 2.536124,
      "type": "BLOG_POST",
      "domain": "blog.hubspot.com",
      "url": "https://blog.hubspot.com/blog/tabid/6307/bid/11692/Inbound-Marketing-Vs-Outbound-Marketing.aspx",
      "featuredImageUrl": "https://cdn2.hubspot.net/hubfs/53/assets/hubspot.com/buzz/HubSpotOpenGraph.png",
      "language": "en-us",
      "title": "Inbound <span class=\"hs-search-highlight hs-highlight-title\">Marketing</span> Vs. Outbound <span class=\"hs-search-highlight hs-highlight-title\">Marketing</span>",
      "description": "This blog post is one of several <span class=\"hs-search-highlight hs-highlight-html\">Marketing</span> Transformation Success Stories...",
      "authorFullName": "Hobbes Baron",
      "tags": ["Inbound Marketing"],
      "publishedDate": 1302130260000
    }
  ],
  "searchTerm": "marketing",
  "page": 0
}
```

| Field              | Type    | Description                                                                                          |
| ------------------ | ------- | ---------------------------------------------------------------------------------------------------- |
| `id`               | Integer | The ID of the content.                                                                               |
| `score`            | Number  | The matching score of the content.                                                                   |
| `type`             | String  | The type of content (`SITE_PAGE`, `LANDING_PAGE`, `BLOG_POST`, `LISTING_PAGE`, `KNOWLEDGE_ARTICLE`). |
| `domain`           | String  | The domain the content is hosted on.                                                                 |
| `url`              | String  | The URL of the content.                                                                              |
| `title`            | String  | The title of the content. Matching terms are wrapped in `<span>` tags for highlighting.              |
| `description`      | String  | The description of the content. Matching terms are wrapped in `<span>` tags for highlighting.        |
| `featuredImageUrl` | String  | The URL of the featured image (if applicable).                                                       |
| `language`         | String  | The content's language.                                                                              |
| `authorFullName`   | String  | The name of the author (for blog posts).                                                             |
| `tags`             | Array   | Tags associated with the content (for blog posts).                                                   |
| `publishedDate`    | Integer | The publish date as a Unix timestamp in milliseconds.                                                |
| `category`         | String  | The category of the article (for knowledge articles).                                                |
| `subcategory`      | String  | The subcategory of the article (for knowledge articles).                                             |
| `tableId`          | Integer | The HubDB table ID (for dynamic pages).                                                              |
| `rowId`            | Integer | The row ID in the HubDB table (for dynamic pages).                                                   |

### Pagination

Results are paginated using offset-based pagination. To retrieve the next page of results, include an `offset` query parameter with the value from the previous response.

For example, if the first request returned `offset: 0` and `limit: 10`, retrieve the next page with `offset=10`:

```shell wrap theme={null}
curl 'https://api.hubapi.com/cms/v3/site-search/search?q=marketing&limit=10&offset=10' \
  --request GET \
  --header "Authorization: Bearer YOUR_ACCESS_TOKEN"
```

## Get indexed data for an asset

To retrieve all indexed data for a specific asset, make a `GET` request to `/cms/v3/site-search/indexed-data/{contentId}`. This is useful for debugging why a particular asset is not appearing in search results.

For example, the following request retrieves indexed data for a blog post with ID `24314356`:

```shell wrap theme={null}
curl 'https://api.hubapi.com/cms/v3/site-search/indexed-data/24314356?type=BLOG_POST' \
  --request GET \
  --header "Authorization: Bearer YOUR_ACCESS_TOKEN"
```

The following parameters are available:

| Parameter                                    | Type    | Description                                                                                                        |
| -------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------------ |
| `contentId` <Tag type="error">Required</Tag> | Integer | The ID of the asset (page ID, blog post ID, HubDB row ID, etc.). Specified in the URL path.                        |
| `type` <Tag type="error">Required</Tag>      | String  | The type of asset. Options include: `SITE_PAGE`, `BLOG_POST`, `KNOWLEDGE_ARTICLE`, `LANDING_PAGE`, `LISTING_PAGE`. |

The response includes all indexed fields for the asset:

```json theme={null}
{
  "id": "24314356",
  "type": "BLOG_POST",
  "fields": {
    "title_nested.en": {
      "name": "title_nested.en",
      "values": ["Inbound Marketing Vs. Outbound Marketing"],
      "value": "Inbound Marketing Vs. Outbound Marketing",
      "metadataField": false
    },
    "domain": {
      "name": "domain",
      "values": ["blog.hubspot.com"],
      "value": "blog.hubspot.com",
      "metadataField": false
    },
    "url": {
      "name": "url",
      "values": ["https://blog.hubspot.com/blog/tabid/6307/bid/11692/Inbound-Marketing-Vs-Outbound-Marketing.aspx"],
      "value": "https://blog.hubspot.com/blog/tabid/6307/bid/11692/Inbound-Marketing-Vs-Outbound-Marketing.aspx",
      "metadataField": false
    },
    "language": {
      "name": "language",
      "values": ["en-us"],
      "value": "en-us",
      "metadataField": false
    },
    "author_full_name": {
      "name": "author_full_name",
      "values": ["Hobbes Baron"],
      "value": "Hobbes Baron",
      "metadataField": false
    },
    "tag": {
      "name": "tag",
      "values": ["Inbound Marketing"],
      "value": "Inbound Marketing",
      "metadataField": false
    },
    "publishedDate": {
      "name": "publishedDate",
      "values": [1302130260000],
      "value": 1302130260000,
      "metadataField": false
    }
  }
}
```

Each field in the `fields` object contains:

| Field           | Type    | Description                                                      |
| --------------- | ------- | ---------------------------------------------------------------- |
| `name`          | String  | The name of the indexed field.                                   |
| `value`         | Any     | The primary value of the field.                                  |
| `values`        | Array   | All values for the field (some fields may have multiple values). |
| `metadataField` | Boolean | Whether the field is a metadata field used for internal routing. |

## Content types

The `type` parameter accepts the following values:

| Type                | Description                              |
| ------------------- | ---------------------------------------- |
| `SITE_PAGE`         | Website pages created in HubSpot.        |
| `LANDING_PAGE`      | Landing pages created in HubSpot.        |
| `BLOG_POST`         | Blog posts associated with your blog(s). |
| `LISTING_PAGE`      | Blog listing pages.                      |
| `KNOWLEDGE_ARTICLE` | Knowledge base articles.                 |
