> ## 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: 1a371dde-6382-46a4-9fa8-72776197da55
---

# Task series API (BETA)

> Create and manage regularly recurring tasks using the task series API.

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} salesLevel="starter" service={true} serviceLevel="starter" />
  </Accordion>

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

Use the task series API to mark and manage regularly repeated tasks in HubSpot. By setting routine tasks as recurring, your sales reps can avoid setting manual reminders for themselves to stay up-to-date with their prospects and customers.

## Set a task as recurring

To set an existing task as recurring, make a `POST` to `/crm/task-series/2026-09-beta`, and include the following properties in the body of your request:

| Property | Type   | Description                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
| -------- | ------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `taskId` | Number | The ID of an existing task that hasn't yet been set to *Repeating*. You can use the [tasks API](/docs/api-reference/latest/crm/activities/tasks/guide#retrieve-tasks) to retrieve a list of tasks in your account, which you can use to get the ID of a specific task.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
| `series` | Object | An object that specifies the frequency and start time of the task series via the following properties: <ul><li>`repeatInterval`: the recurrence schedule as a standards-compliant RFC-5545 RRULE string. <br /> <br /> This string follows the format of `FREQ={TIME_PERIOD}`, where `TIME_PERIOD` can be `YEARLY`, `MONTHLY`, `WEEKLY`, `DAILY`. <br /> <br /> You can also set the frequency to every weekday using the format `FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR`</li><li>`startsAt`: the date and time when the task series is scheduled to start, in ISO 8601 format.</li><li>`repeatStatus`: a string representing the current status of the task series repetition, which should be set to `REPEATING`. If you stop a recurring task via the [DELETE endpoint below](#stop-a-recurring-task), this field will automatically be updated to `STOPPED_BY_USER`. </li></ul> |

For example, sending the following request body would set a task with an ID of `3774299725` to repeat weekly starting on August 15 2026:

```json theme={null}
{
  "taskId": 3774299725,
  "series": {
    "repeatInterval": "FREQ=WEEKLY",
    "startsAt": "2026-08-15T12:00:00Z",
    "repeatStatus": "REPEATING"
  }
}
```

A successful response will resemble the following:

```json theme={null}
{
  "id": "3774299725",
  "series": {
    "repeatInterval": "FREQ=WEEKLY",
    "startsAt": "2026-08-15T12:00:00Z",
    "repeatStatus": "REPEATING"
  },
  "properties": {
    "hs_task_family": "SALES",
    "hubspot_owner_id": "11045285",
    "hs_task_relative_reminders": "[]",
    "hs_task_type": "TODO",
    "hs_task_subject": "Changes requested",
    "hs_task_body": "Confirm all quote updates with Steve in accounting",
    "hs_task_priority": "NONE",
    "hs_task_template_id": "575837213828"
  },
  "createdAt": "2026-07-31T17:36:38.154Z",
  "updatedAt": "2026-07-31T17:36:38.154Z"
}
```

## Retrieve a recurring task

To retrieve a recurring task by its ID, make a `GET` request to `/crm/task-series/2026-09-beta/{taskId}`. To locate a specific task by its ID, you can use the [tasks API](/docs/api-reference/latest/crm/activities/tasks/guide#retrieve-tasks) to retrieve a full list of existing tasks.

## Update a recurring task

You can update a previously specified task series by making a `PATCH` request to `/crm/task-series/2026-09-beta/{taskId}`, and providing the scheduling changes within the `series` property in the body of your request. The fields of the `series` object are specified in the [table above](#set-a-task-as-recurring).

## Stop a recurring task

To stop a task series from recurring, make a `DELETE` request to `/crm/task-series/2026-09-beta/{taskId}`. A successful request will result in a `204 No Content` response. If you retrieve the task series via the [endpoint above](#retrieve-a-recurring-task), the `repeatStatus` field within the `series` property will be updated to `STOPPED_BY_USER`:

```json highlight={6} theme={null}
{
  "id": "3774299725",
  "series": {
    "repeatInterval": "FREQ=WEEKLY",
    "startsAt": "2026-08-15T12:00:00Z",
    "repeatStatus": "STOPPED_BY_USER"
  },
  "properties": {
    "hs_task_family": "SALES",
    "hubspot_owner_id": "11045285",
    "hs_task_relative_reminders": "[]",
    "hs_task_type": "TODO",
    "hs_task_subject": "Changes requested",
    "hs_task_body": "Confirm all quote updates with Steve in accounting",
    "hs_task_priority": "NONE",
    "hs_task_template_id": "575837213828"
  },
  "createdAt": "2026-07-31T17:36:38.154Z",
  "updatedAt": "2026-07-31T18:11:57.955Z"
}
```
