Scope requirements
Scope requirements
This API requires one of the following scopes:
crm.objects.goals.readcrm.objects.goals.writeUnderstanding Goal Architecture
Unlike standard objects (like Deals or Contacts) which exist as single rows, a “Goal” in HubSpot is a container for multiple time-bound objects. To successfully create or manage goals, you must understand the hierarchy of the three key components: Goal Family, Goal Target Group, and Goal Target.The Goal Hierarchy
The API defines a goal using a nesting structure linked by specific IDs.Goal Family (The “Goal”)
This is what a user perceives as “One Goal” (e.g., “2025 Revenue Quota”). It is identified by thehs_group_correlation_uuid. This ID links every time-slice together into one cohesive unit.

hs_group_correlation_uuid. If this ID differs across targets, they will appear as separate goals.
Goal Target Group (The Schedule)
This represents the schedule or assignment constraints (e.g., “Monthly targets for User A”). It is identified by thehs_goal_target_group_id. All time periods for that specific user’s schedule share this ID.

hubspot_owner_id property determines who sees this goal in their dashboard. For team goals, the hs_assignee_team_id (or hubspot_team_id) property is used instead to assign the goal to the entire team.
Goal Target (The Time Slice)
These are the individual objects holding the data. For a monthly goal, there are 12 separategoal_target objects (Jan, Feb, Mar…). Each has its own hs_start_datetime and hs_target_amount.

Example: Structure of a Monthly Goal
The JSON below illustrates two separate goal objects: one for January and one for February. While the target data (dates and amounts) changes for each month, they belong to the same Goal Family and Goal Target Group. As shown in the highlighted lines, thehs_goal_name, hs_group_correlation_uuid, and hs_goal_target_group_id remain constant to link these objects into a single cohesive goal schedule.
Retrieve goals
To retrieve goals, make a request in one of the following ways:- Retrieve a single target:
GET /crm/v3/objects/goal_targets/{goalTargetId}/ - Retrieve all targets:
GET /crm/v3/objects/goal_targets - Search for targets:
POST /crm/v3/objects/goal_targets/search
POST request to the search endpoint and include filters in the request body. Learn more about searching the CRM.
For example, to retrieve a goal with an ID of 44027423340, the request URL would be the following:
https://api.hubapi.com/crm/v3/objects/goal_targets/44027423340/
The response will include a few default properties, including the create date, last modified date.
properties query parameter in the request URL along with comma-separated property names. Learn more about goal properties below.
For example, making a GET request to the following URL would result in the response below:
crm/v3/objects/goal_targets/{goalTargetId}?properties=hs_goal_name,hs_target_amount
Create goals
To create goals, make aPOST request to /crm/v3/objects/goal_targets/batch/create.
To ensure these objects appear as a single goal in the UI, your batch request must adhere to specific architectural constraints:
- Shared Identifiers: Every target object in the batch must share the same
hs_group_correlation_uuidandhs_goal_target_group_id. This links them into a “Goal Family”. - Sequential Dates: You must increment the
hs_start_datetimeandhs_end_datetimefor each object. For monthly goals, start dates must be the first millisecond of the month, and end dates must be the last millisecond of the month. - Milestone Accuracy: The number of objects must match the
hs_milestonefrequency (e.g., creating 12 objects for a “monthly” milestone).
/crm/v3/objects/goal_targets/batch/create
Update Goals
To update goals, make a request in one of the following ways:- Update a single target:
PATCH /crm/v3/objects/goal_targets/{goalTargetId} - Batch update multiple targets:
POST /crm/v3/objects/goal_targets/batch/update
- When to use Single Update (
PATCH): Use this when changing data specific to one time slice.- Example: Changing the
hs_target_amountfor just the month of October. - Example: Manually overriding the
hs_kpi_valuefor a specific month.
- Example: Changing the
- When to use Batch Update (
POST): Use this when changing properties that define the Goal Family. If you change these on one object but not the others, the goal may disappear from the UI or appear as duplicates.- Example: Renaming the goal (
hs_goal_name). You must update all 12 targets. - Example: Changing the pipeline (
hs_pipeline_ids). You must update all 12 targets.
- Example: Renaming the goal (
PATCH /crm/v3/objects/goal_targets/{goalTargetId}
Delete Goals
To delete goals, make a request in one of the following ways:- Delete a single target:
DELETE /crm/v3/objects/goal_targets/{goalTargetId} - Batch delete multiple targets:
POST /crm/v3/objects/goal_targets/batch/archive
- Deleting a Single Target (
DELETE): If you use theDELETEendpoint on a single ID, you are removing only that specific slice of time.- Example: If you delete the target for “January,” the goal will still exist in the UI for February through December. The goal family remains active, but the start date or total target amount may calculate incorrectly in reports.
- Deleting a Goal Family (
POST): To completely remove a goal (e.g., “2025 Revenue Quota”) from the system, you must delete every target object associated with that goal’shs_group_correlation_uuid.- Example: You must first query the goal targets to retrieve all IDs associated with the Goal Family, and then use the batch archive endpoint to delete them all simultaneously.
POST /crm/v3/objects/goal_targets/batch/archive
Goals properties
When making aGET request to the Goals API, you can also request specific goal properties.
For example, if you wanted to include properties such as hs_goal_name, hs_target_amount, hs_start_datetime, hs_end_datetime, and hs_created_by_user_id, the request URL may resemble the following:
https://api.hubapi.com/crm/v3/objects/goal_targets/44027423340?properties=hs_goal_name,hs_target_amount,hs_start_datetime,hs_end_datetime,hs_created_by_user_id
The response may look similar to the JSON excerpt below: