[New] Goals Now Support Privacy Settings, Default Access Levels, and Stories via API
Summary
Goals now support privacy settings, default access levels, and stories via the Asana API.
You can now:
- Control goal visibility with
privacy_setting - Set a default member access level with
default_access_level - Read and post goal comments programmatically using two new goal stories endpoints
These are additive changes with no breaking impact on existing integrations.
Who is affected
This update is relevant to developers building:
- Goal management and OKR tools that need to reflect or enforce goal visibility configured by workspace admins — for example, restricting sensitive strategic goals to members only while keeping team-level goals visible across the workspace
- Reporting and analytics integrations that surface goal data and need to respect privacy boundaries when displaying goals to different user segments
- Collaboration tools that want to surface goal comments or post programmatic updates into a goal’s activity feed
What’s new
Privacy and access level fields
Two new optional fields are now available on goal create, read, and update endpoints:
| Field | Type | Description |
|---|---|---|
privacy_setting |
string | Controls who can see the goal. Values: public_to_workspace, members_only |
default_access_level |
string | Default access role assigned when a new member joins the goal. Values: admin, editor, commenter, viewer |
Affected endpoints:
GET /goals/{goal_gid}— Returnsprivacy_settinganddefault_access_levelGET /goals— Available viaopt_fieldsPOST /goals— Acceptsprivacy_settinganddefault_access_levelPUT /goals/{goal_gid}— Acceptsprivacy_settinganddefault_access_level
Note:
privacy_settinganddefault_access_levelare opt-in fields and must be explicitly requested using theopt_fieldsparameter. For example:
GET /goals/{goal_gid}?opt_fields=custom_field_settings.custom_field.default_access_level,custom_field_settings.custom_field.privacy_setting
Goal stories endpoints
Two new endpoints let you read and create stories (comments and activity) on goals:
| Endpoint | Description |
|---|---|
GET /goals/{goal_gid}/stories |
Returns all stories for a goal (paginated) |
POST /goals/{goal_gid}/stories |
Creates a comment or sticker story on a goal |
Goal stories follow the same structure as task stories. Comments are authored by the authenticated user and timestamped at the time of the server request.
Required OAuth scope: goals:write
Optional request fields for POST /goals/{goal_gid}/stories:
| Field | Type | Description |
|---|---|---|
text |
string | The text content of the comment |
html_text |
string | HTML formatted text of the comment |
is_pinned |
boolean | Whether the story should be pinned on the goal |
sticker_name |
string enum | The sticker to attach to the story. Values: green_checkmark, people_dancing, dancing_unicorn, heart, party_popper, people_waving_flags, splashing_narwhal, trophy, yeti_riding_unicorn, celebrating_people, determined_climbers, phoenix_spreading_love |
Usage
Creating a goal with privacy settings
// POST /goals
{
"data": {
"name": "Grow web traffic by 30%",
"notes": "Start building brand awareness.",
"due_on": "2019-09-15",
"start_on": "2019-09-14",
"is_workspace_level": true,
"privacy_setting": "public_to_workspace",
"default_access_level": "commenter",
"workspace": "12345678901234",
"time_period": "98765432109876",
"owner": "11223344556677"
}
}
Updating privacy settings on an existing goal
// PUT /goals/{goal_gid}
{
"data": {
"privacy_setting": "members_only",
"default_access_level": "editor"
}
}
Getting stories from a goal
// GET /goals/{goal_gid}/stories
{
"data": [
{
"gid": "12345",
"resource_type": "story",
"type": "comment",
"text": "Updated Q2 target based on revised forecast.",
"created_by": {
"gid": "98765",
"resource_type": "user",
"name": "Greg Sanchez"
},
"created_at": "2024-04-01T10:00:00.000Z"
}
]
}
Creating a comment on a goal
// POST /goals/{goal_gid}/stories
{
"data": {
"text": "Updated Q2 target based on revised forecast."
}
}
Creating a sticker story on a goal
// POST /goals/{goal_gid}/stories
{
"data": {
"sticker_name": "trophy",
"is_pinned": true
}
}
Timeline
These changes are available now.