> ## 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: c7c09774-5f04-44c9-8734-8ff52e50d60b
---

# Notetaker conversations recap API

> Programmatically read AI-generated summaries and action items from calls and meeting events recorded by HubSpot's AI Notetaker.

export const SupportedProducts = ({marketing, sales, service, cms, data, commerce, crm, marketingLevel, salesLevel, serviceLevel, cmsLevel, dataLevel, commerceLevel, crmLevel}) => {
  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",
      crm: "Smart CRM"
    },
    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"
  }, {
    name: crm ? translations.productNames.crm : '',
    level: translateTier(crmLevel),
    icon: "https://developer.hubspot.com/hubfs/Knowledge_Base_2023-24-25/developer/icons/SmartCRM.svg",
    alt: "Smart CRM"
  }].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 BetaDisclaimerBanner = () => <Warning>
        This functionality is currently in beta. By participating in this beta, you agree to HubSpot's <a href="https://legal.hubspot.com/developer-terms">Developer Terms</a> and <a href="https://legal.hubspot.com/developerbetaterms">Developer Beta Terms</a>. Note that the functionality is still under active development and is subject to change based on testing and feedback.
    </Warning>;

export const RequiredIndicator = () => {
  return <span className="required-indicator">
      required
    </span>;
};

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

<AccordionGroup>
  <Accordion title="Supported products" defaultOpen="true" icon="cubes">
    <SupportedProducts sales={true} service={true} salesLevel="PROFESSIONAL" serviceLevel="PROFESSIONAL" />
  </Accordion>

  <Accordion title="Scope requirements">
    <ScopesList
      scopes={[
    'crm.objects.contacts.read'
  ]}
    />
  </Accordion>
</AccordionGroup>

<BetaDisclaimerBanner />

Use the Notetaker conversation recap API to retrieve notes produced by [Notetaker](https://knowledge.hubspot.com/meetings-tool/record-and-take-notes-in-meetings-with-meeting-notetaker) after a call or meeting. Recap notes include:

* **Conversation summary**: the AI-generated summary stored in the `hs_call_summary` CRM property.
* **Action items**: structured next steps extracted from the conversation transcript.

## Retrieve conversation recaps

To return the AI-generated conversation summary and list of action items for a specific call or meeting activity, make a `GET` request to `/notetaker/2026-09-beta/conversation/recap/{objectTypeId}/{objectId}`.

| Parameter      | Type   | Description                                                                    |
| -------------- | ------ | ------------------------------------------------------------------------------ |
| `objectTypeId` | Number | ID of the CRM object type.  Use `0-48` for calls or `0-47` for meeting events. |
| `objectId`     | Number | ID of the activity.                                                            |

The response below is an example of when the summary and action items have been generated successfully.

```json theme={null}
{
  "summary": {
    "value": "The call covered Q3 pipeline review...",
    "status": "SUCCEEDED",
    "errorMessage": null
  },
  "actionItems": {
    "items": [
      {
        "title": "Schedule follow-up demo",
        "assignee": "Jane Smith"
      }
    ],
    "status": "SUCCEEDED",
    "errorMessage": null
  }
}
```

The response always returns a top-level object containing a `summary` field and an `actionItems` field. Each field includes a `status` indicating whether data is available. Review the status before reading the value.

The response below is an example of when the activity has been recorded but Notetaker has not yet finished generating all recap data.

```json theme={null}
{
  "summary": {
    "value": null,
    "status": "NOT_FOUND",
    "errorMessage": null
  },
  "actionItems": {
    "items": [],
    "status": "IN_PROGRESS",
    "errorMessage": null
  }
}
```

The response below is an example of when generation failed for the `summary`, `actionItems`, or both. Check `errorMessage` for detail.

```json theme={null}
{
  "summary": {
    "value": null,
    "status": "FAILED",
    "errorMessage": "Failed to fetch summary"
  },
  "actionItems": {
    "items": [],
    "status": "FAILED",
    "errorMessage": "Generation failed due to no transcript data"
  }
}
```

<Note>
  * The activity must be processed by Notetaker before recap data is available. Requests made before processing completes return a `NOT_FOUND` or `IN_PROGRESS` status, not an error.
  * If an account doesn't have the notetaker feature, the response returns an empty summary and an empty action item list rather than an error.
</Note>

## Response fields

The response object contains two fields: `summary` and `actionItems`. Each has a `status` that indicates whether data is available.

### summary fields

| Field          | Type           | Description                                                         |
| -------------- | -------------- | ------------------------------------------------------------------- |
| `value`        | String \| null | The AI-generated summary text. null when status is not `SUCCEEDED`. |
| `status`       | String         | Generation status. See [status values](#status-values) below.       |
| `errorMessage` | String \| null | Error detail when status is `FAILED`. null otherwise.               |

### actionItems fields

| Field            | Type           | Description                                                                        |
| ---------------- | -------------- | ---------------------------------------------------------------------------------- |
| `items`          | Array          | List of action item objects. Empty when status is not `SUCCEEDED`.                 |
| `items.title`    | String         | Description of the action item extracted from the conversation.                    |
| `items.assignee` | String         | Name of the person assigned to the action item, as identified in the conversation. |
| `status`         | String         | Generation status. See [status values](#status-values) below.                      |
| `errorMessage`   | String \| null | Error detail when status is `FAILED`. null otherwise.                              |

### Status values

| Status        | Description                                                                                        |
| ------------- | -------------------------------------------------------------------------------------------------- |
| `SUCCEEDED`   | Data was generated successfully. `value` / `items` will be populated.                              |
| `NOT_FOUND`   | No data was found. The portal may not have AI Notetaker, or the engagement wasn't processed.       |
| `IN_PROGRESS` | Generation is still running. Retry after a short delay.<br /><br /> Applies to `actionItems` only. |
| `FAILED`      | Generation failed. Check `errorMessage` for detail.                                                |
