@lap v0.3
# Machine-readable API spec. Each @endpoint block is one API call.
@api Asana
@base https://app.asana.com/api/1.0
@version 1.0
@auth Bearer bearer | OAuth2
@endpoints 240
@hint download_for_search
@toc access_requests(4), allocations(5), attachments(4), workspaces(21), batch(1), budgets(5), projects(24), portfolios(16), goals(17), teams(11), custom_fields(6), enum_options(1), custom_types(2), events(1), exports(2), goal_relationships(3), jobs(1), memberships(5), organization_exports(2), portfolio_memberships(2), project_briefs(3), project_memberships(1), project_portfolio_settings(2), project_statuses(2), project_templates(4), tasks(27), rates(5), reactions(1), roles(5), rule_triggers(1), sections(5), status_updates(4), stories(3), tags(6), task_templates(4), user_task_lists(2), team_memberships(2), users(8), time_periods(2), time_tracking_categories(6), time_tracking_entries(4), timesheet_approval_statuses(4), webhooks(5), workspace_memberships(1)

@group access_requests
@endpoint GET /access_requests
@required {target: str}
@optional {user: str, opt_pretty: bool, opt_fields: [str]}
@returns(200) {data: [map]}
@errors {400, 401, 402, 403, 404, 500}

@endpoint POST /access_requests
@optional {data: map{target!: str, message: str}}
@returns(201) {data: map{gid: str, resource_type: str, message: str, approval_status: str, requester: map{gid: str, resource_type: str, name: str}, target: map{gid: str, resource_type: str}}}
@errors {400, 401, 402, 403, 404, 500}

@endpoint POST /access_requests/{access_request_gid}/approve
@required {access_request_gid: str}
@returns(200) {data: map}
@errors {400, 401, 403, 404, 500}

@endpoint POST /access_requests/{access_request_gid}/reject
@required {access_request_gid: str}
@returns(200) {data: map}
@errors {400, 401, 403, 404, 500}

@endgroup

@group allocations
@endpoint GET /allocations/{allocation_gid}
@optional {opt_fields: [str]}
@returns(200) {data: any}
@errors {400, 401, 402, 403, 404, 500}

@endpoint PUT /allocations/{allocation_gid}
@optional {opt_fields: [str], data: any}
@returns(200) {data: any}
@errors {400, 401, 403, 404, 500}

@endpoint DELETE /allocations/{allocation_gid}
@returns(200) {data: map}
@errors {400, 401, 402, 403, 404, 500}

@endpoint GET /allocations
@optional {parent: str, assignee: str, workspace: str, limit: int, offset: str, opt_fields: [str]}
@returns(200) {data: [any], next_page: map?{offset: str, path: str, uri: str(uri)}}
@errors {400, 401, 402, 403, 404, 500}

@endpoint POST /allocations
@optional {opt_fields: [str], data: any}
@returns(201) {data: any}
@errors {400, 401, 402, 403, 404, 500}

@endgroup

@group attachments
@endpoint GET /attachments/{attachment_gid}
@optional {opt_fields: [str]}
@returns(200) {data: any}
@errors {400, 401, 402, 403, 404, 424, 500, 501, 503, 504}

@endpoint DELETE /attachments/{attachment_gid}
@returns(200) {data: map}
@errors {400, 401, 403, 404, 500}

@endpoint GET /attachments
@required {parent: str}
@optional {limit: int, offset: str, opt_fields: [str]}
@returns(200) {data: [map], next_page: map?{offset: str, path: str, uri: str(uri)}}
@errors {400, 401, 403, 404, 500}

@endpoint POST /attachments
@optional {opt_fields: [str]}
@returns(200) {data: any}
@errors {400, 401, 403, 404, 500}

@endgroup

@group workspaces
@endpoint GET /workspaces/{workspace_gid}/audit_log_events
@returns(200) {data: [map], next_page: map?{offset: str, path: str, uri: str(uri)}}
@errors {400, 401, 403, 404, 500}

@endgroup

@group batch
@endpoint POST /batch
@optional {opt_fields: [str], data: map{actions: [map]}}
@returns(200) {data: [map]}
@errors {400, 401, 403, 404, 500}

@endgroup

@group budgets
@endpoint GET /budgets
@required {parent: str}
@returns(200) {data: [any]}
@errors {400, 401, 402, 403, 404, 500}

@endpoint POST /budgets
@optional {data: any}
@returns(201) {data: any}
@errors {400, 401, 402, 403, 404, 500}

@endpoint GET /budgets/{budget_gid}
@optional {opt_fields: [str]}
@returns(200) {data: any}
@errors {400, 401, 402, 403, 404, 500}

@endpoint PUT /budgets/{budget_gid}
@optional {opt_fields: [str], data: any}
@returns(200) {data: any}
@errors {400, 401, 402, 403, 404, 500}

@endpoint DELETE /budgets/{budget_gid}
@returns(200) {data: map}
@errors {400, 401, 402, 403, 404, 500}

@endgroup

@group projects
@endpoint GET /projects/{project_gid}/custom_field_settings
@optional {opt_fields: [str]}
@returns(200) {data: [any], next_page: map?{offset: str, path: str, uri: str(uri)}}
@errors {400, 401, 403, 404, 500}

@endgroup

@group portfolios
@endpoint GET /portfolios/{portfolio_gid}/custom_field_settings
@optional {opt_fields: [str]}
@returns(200) {data: [any], next_page: map?{offset: str, path: str, uri: str(uri)}}
@errors {400, 401, 403, 404, 500}

@endgroup

@group goals
@endpoint GET /goals/{goal_gid}/custom_field_settings
@optional {opt_fields: [str]}
@returns(200) {data: [any], next_page: map?{offset: str, path: str, uri: str(uri)}}
@errors {400, 401, 403, 404, 500}

@endgroup

@group teams
@endpoint GET /teams/{team_gid}/custom_field_settings
@optional {opt_fields: [str]}
@returns(200) {data: [any]}
@errors {400, 401, 403, 404, 500}

@endgroup

@group custom_fields
@endpoint POST /custom_fields
@optional {opt_fields: [str], data: any}
@returns(201) {data: any}
@errors {400, 401, 403, 404, 500}

@endpoint GET /custom_fields/{custom_field_gid}
@optional {opt_fields: [str]}
@returns(200) {data: any}
@errors {400, 401, 403, 404, 500}

@endpoint PUT /custom_fields/{custom_field_gid}
@optional {opt_fields: [str], data: any}
@returns(200) {data: any}
@errors {400, 401, 403, 404, 500}

@endpoint DELETE /custom_fields/{custom_field_gid}
@returns(200) {data: map}
@errors {400, 401, 403, 404, 500}

@endgroup

@group workspaces
@endpoint GET /workspaces/{workspace_gid}/custom_fields
@optional {opt_fields: [str]}
@returns(200) {data: [any], next_page: map?{offset: str, path: str, uri: str(uri)}}
@errors {400, 401, 403, 404, 500}

@endgroup

@group custom_fields
@endpoint POST /custom_fields/{custom_field_gid}/enum_options
@optional {opt_fields: [str], data: any}
@returns(201) {data: map{gid: str, resource_type: str, name: str, enabled: bool, color: str}}
@errors {400, 401, 403, 404, 500}

@endpoint POST /custom_fields/{custom_field_gid}/enum_options/insert
@optional {opt_fields: [str], data: map{enum_option!: str, before_enum_option: str, after_enum_option: str}}
@returns(200) {data: map{gid: str, resource_type: str, name: str, enabled: bool, color: str}}
@errors {400, 401, 403, 404, 500}

@endgroup

@group enum_options
@endpoint PUT /enum_options/{enum_option_gid}
@optional {opt_fields: [str], data: map{gid: str, resource_type: str, name: str, enabled: bool, color: str}}
@returns(200) {data: map{gid: str, resource_type: str, name: str, enabled: bool, color: str}}
@errors {400, 401, 403, 404, 500}

@endgroup

@group custom_types
@endpoint GET /custom_types
@optional {opt_fields: [str]}
@returns(200) {data: [any], next_page: map?{offset: str, path: str, uri: str(uri)}}
@errors {400, 401, 403, 404, 500}

@endpoint GET /custom_types/{custom_type_gid}
@optional {opt_fields: [str]}
@returns(200) {data: any}
@errors {400, 401, 403, 404, 500}

@endgroup

@group events
@endpoint GET /events
@optional {opt_fields: [str]}
@returns(200) {data: [map], sync: str, has_more: bool}
@errors {400, 401, 403, 404, 412, 500}

@endgroup

@group exports
@endpoint POST /exports/graph
@optional {data: map{parent: str}}
@returns(201) {data: map{gid: str, resource_type: str, resource_subtype: str, status: str, new_graph_export: map{gid: str, resource_type: str, created_at: str(date-time), download_url: str(uri)?, completed_at: str(date-time)}}}
@errors {400, 401, 403, 404, 500}

@endpoint POST /exports/resource
@optional {data: map{workspace: str, export_request_parameters: [map]}}
@returns(201) {data: map{gid: str, resource_type: str, resource_subtype: str, status: str, new_resource_export: map{gid: str, resource_type: str, created_at: str(date-time), download_url: str(uri)?, completed_at: str(date-time)}}}
@errors {400, 401, 403, 404, 500}

@endgroup

@group goal_relationships
@endpoint GET /goal_relationships/{goal_relationship_gid}
@optional {opt_fields: [str]}
@returns(200) {data: any}
@errors {400, 401, 403, 404, 500}

@endpoint PUT /goal_relationships/{goal_relationship_gid}
@optional {opt_fields: [str], data: any}
@returns(200) {data: any}
@errors {400, 401, 403, 404, 500}

@endpoint GET /goal_relationships
@required {supported_goal: str}
@optional {opt_pretty: bool, limit: int, offset: str, resource_subtype: str, opt_fields: [str]}
@returns(200) {data: [map], next_page: map?{offset: str, path: str, uri: str(uri)}}
@errors {400, 401, 403, 404, 500}

@endgroup

@group goals
@endpoint POST /goals/{goal_gid}/addSupportingRelationship
@optional {opt_fields: [str], data: map{supporting_resource!: str, insert_before: str, insert_after: str, contribution_weight: num}}
@returns(200) {data: any}
@errors {400, 401, 403, 404, 500}

@endpoint POST /goals/{goal_gid}/removeSupportingRelationship
@optional {data: map{supporting_resource!: str}}
@returns(200) {data: map}
@errors {400, 401, 403, 404, 500}

@endpoint GET /goals/{goal_gid}
@optional {opt_fields: [str]}
@returns(200) {data: any}
@errors {400, 401, 402, 403, 404, 500}

@endpoint PUT /goals/{goal_gid}
@optional {opt_fields: [str], data: any}
@returns(200) {data: any}
@errors {400, 401, 403, 404, 500}

@endpoint DELETE /goals/{goal_gid}
@returns(200) {data: map}
@errors {400, 401, 402, 403, 404, 500}

@endpoint GET /goals
@optional {portfolio: str, project: str, task: str, is_workspace_level: bool, team: str, workspace: str, time_periods: [str], limit: int, offset: str, opt_fields: [str]}
@returns(200) {data: [map], next_page: map?{offset: str, path: str, uri: str(uri)}}
@errors {400, 401, 402, 403, 404, 500}

@endpoint POST /goals
@optional {opt_fields: [str], data: any}
@returns(201) {data: any}
@errors {400, 401, 402, 403, 404, 500}

@endpoint POST /goals/{goal_gid}/setMetric
@optional {opt_fields: [str], data: map{gid: str, resource_type: str, resource_subtype: str, precision: int, unit: str, currency_code: str, initial_number_value: num, target_number_value: num, current_number_value: num, current_display_value: str, progress_source: str, is_custom_weight: bool}}
@returns(200) {data: any}
@errors {400, 401, 402, 403, 404, 500}

@endpoint POST /goals/{goal_gid}/setMetricCurrentValue
@optional {opt_fields: [str], data: map{gid: str, resource_type: str, current_number_value: num}}
@returns(200) {data: any}
@errors {400, 401, 402, 403, 404, 500}

@endpoint POST /goals/{goal_gid}/addFollowers
@optional {opt_fields: [str], data: map{followers!: [str]}}
@returns(200) {data: any}
@errors {400, 401, 402, 403, 404, 500}

@endpoint POST /goals/{goal_gid}/removeFollowers
@optional {opt_fields: [str], data: map{followers!: [str]}}
@returns(200) {data: any}
@errors {400, 401, 402, 403, 404, 500}

@endpoint GET /goals/{goal_gid}/parentGoals
@optional {opt_fields: [str]}
@returns(200) {data: [map]}
@errors {400, 401, 402, 403, 404, 500}

@endpoint POST /goals/{goal_gid}/addCustomFieldSetting
@optional {data: map{custom_field!: any, is_important: bool, insert_before: str, insert_after: str}}
@returns(200) {data: any}
@errors {400, 401, 403, 404, 500}

@endpoint POST /goals/{goal_gid}/removeCustomFieldSetting
@optional {data: map{custom_field!: str}}
@returns(200) {data: map}
@errors {400, 401, 403, 404, 500}

@endgroup

@group jobs
@endpoint GET /jobs/{job_gid}
@optional {opt_fields: [str]}
@returns(200) {data: map{gid: str, resource_type: str, resource_subtype: str, status: str, new_portfolio: map{gid: str, resource_type: str, name: str}, new_project: map{gid: str, resource_type: str, name: str}, new_task: any, new_project_template: map{gid: str, resource_type: str, name: str}, new_graph_export: map{gid: str, resource_type: str, created_at: str(date-time), download_url: str(uri)?, completed_at: str(date-time)}, new_resource_export: map{gid: str, resource_type: str, created_at: str(date-time), download_url: str(uri)?, completed_at: str(date-time)}}}
@errors {400, 401, 403, 404, 500}

@endgroup

@group memberships
@endpoint GET /memberships
@optional {parent: str, member: str, resource_subtype: str, limit: int, offset: str, opt_fields: [str]}
@returns(200) {data: [any], next_page: map?{offset: str, path: str, uri: str(uri)}}
@errors {400, 401, 403, 404, 500}

@endpoint POST /memberships
@optional {data: any}
@returns(201) {data: any}
@errors {400, 401, 403, 404, 500}

@endpoint GET /memberships/{membership_gid}
@returns(200) {data: any}
@errors {400, 401, 403, 404, 500}

@endpoint PUT /memberships/{membership_gid}
@optional {data: map{access_level: str}}
@returns(200) {data: any}
@errors {400, 401, 403, 404, 500}

@endpoint DELETE /memberships/{membership_gid}
@returns(200) {data: map}
@errors {400, 401, 403, 404, 500}

@endgroup

@group organization_exports
@endpoint POST /organization_exports
@optional {opt_fields: [str], data: map{organization: str}}
@returns(201) {data: map{gid: str, resource_type: str, created_at: str(date-time), download_url: str(uri)?, state: str, organization: map{gid: str, resource_type: str, name: str}}}
@errors {400, 401, 403, 404, 500}

@endpoint GET /organization_exports/{organization_export_gid}
@optional {opt_fields: [str]}
@returns(200) {data: map{gid: str, resource_type: str, created_at: str(date-time), download_url: str(uri)?, state: str, organization: map{gid: str, resource_type: str, name: str}}}
@errors {400, 401, 403, 404, 500}

@endgroup

@group portfolio_memberships
@endpoint GET /portfolio_memberships
@optional {opt_fields: [str]}
@returns(200) {data: [map], next_page: map?{offset: str, path: str, uri: str(uri)}}
@errors {400, 401, 403, 404, 500}

@endpoint GET /portfolio_memberships/{portfolio_membership_gid}
@optional {opt_fields: [str]}
@returns(200) {data: map{gid: str, resource_type: str, portfolio: map{gid: str, resource_type: str, name: str}, user: map{gid: str, resource_type: str, name: str}, access_level: str}}
@errors {400, 401, 403, 404, 500}

@endgroup

@group portfolios
@endpoint GET /portfolios/{portfolio_gid}/portfolio_memberships
@optional {opt_fields: [str]}
@returns(200) {data: [map], next_page: map?{offset: str, path: str, uri: str(uri)}}
@errors {400, 401, 403, 404, 500}

@endpoint GET /portfolios
@required {workspace: str}
@optional {limit: int, offset: str, owner: str, opt_fields: [str]}
@returns(200) {data: [map], next_page: map?{offset: str, path: str, uri: str(uri)}}
@errors {400, 401, 403, 404, 500}

@endpoint POST /portfolios
@optional {opt_fields: [str], data: any}
@returns(201) {data: any}
@errors {400, 401, 403, 404, 500}

@endpoint GET /portfolios/{portfolio_gid}
@optional {opt_fields: [str]}
@returns(200) {data: any}
@errors {400, 401, 403, 404, 500}

@endpoint PUT /portfolios/{portfolio_gid}
@optional {opt_fields: [str], data: any}
@returns(200) {data: any}
@errors {400, 401, 403, 404, 500}

@endpoint DELETE /portfolios/{portfolio_gid}
@returns(200) {data: map}
@errors {400, 401, 403, 404, 500}

@endpoint GET /portfolios/{portfolio_gid}/items
@optional {opt_fields: [str]}
@returns(200) {data: [map], next_page: map?{offset: str, path: str, uri: str(uri)}}
@errors {400, 401, 403, 404, 500}

@endpoint POST /portfolios/{portfolio_gid}/addItem
@optional {data: map{item!: str, insert_before: str, insert_after: str}}
@returns(200) {data: map}
@errors {400, 401, 403, 404, 500}

@endpoint POST /portfolios/{portfolio_gid}/removeItem
@optional {data: map{item!: str}}
@returns(200) {data: map}
@errors {400, 401, 403, 404, 500}

@endpoint POST /portfolios/{portfolio_gid}/addCustomFieldSetting
@optional {data: map{custom_field!: any, is_important: bool, insert_before: str, insert_after: str}}
@returns(200) {data: any}
@errors {400, 401, 403, 404, 500}

@endpoint POST /portfolios/{portfolio_gid}/removeCustomFieldSetting
@optional {data: map{custom_field!: str}}
@returns(200) {data: map}
@errors {400, 401, 403, 404, 500}

@endpoint POST /portfolios/{portfolio_gid}/addMembers
@optional {opt_fields: [str], data: map{members!: str}}
@returns(200) {data: any}
@errors {400, 401, 403, 404, 500}

@endpoint POST /portfolios/{portfolio_gid}/removeMembers
@optional {opt_fields: [str], data: map{members!: str}}
@returns(200) {data: any}
@errors {400, 401, 403, 404, 500}

@endpoint POST /portfolios/{portfolio_gid}/duplicate
@optional {opt_fields: [str], data: map{name!: str, include: str}}
@returns(201) {data: map{gid: str, resource_type: str, resource_subtype: str, status: str, new_portfolio: map{gid: str, resource_type: str, name: str}, new_project: map{gid: str, resource_type: str, name: str}, new_task: any, new_project_template: map{gid: str, resource_type: str, name: str}, new_graph_export: map{gid: str, resource_type: str, created_at: str(date-time), download_url: str(uri)?, completed_at: str(date-time)}, new_resource_export: map{gid: str, resource_type: str, created_at: str(date-time), download_url: str(uri)?, completed_at: str(date-time)}}}
@errors {400, 401, 403, 404, 500}

@endgroup

@group project_briefs
@endpoint GET /project_briefs/{project_brief_gid}
@optional {opt_fields: [str]}
@returns(200) {data: any}
@errors {400, 401, 402, 403, 404, 424, 500, 501, 503, 504}

@endpoint PUT /project_briefs/{project_brief_gid}
@optional {opt_fields: [str], data: any}
@returns(200) {data: any}
@errors {400, 401, 403, 404, 500}

@endpoint DELETE /project_briefs/{project_brief_gid}
@returns(200) {data: map}
@errors {400, 401, 403, 404, 500}

@endgroup

@group projects
@endpoint POST /projects/{project_gid}/project_briefs
@optional {opt_fields: [str], data: any}
@returns(201) {data: any}
@errors {400, 401, 402, 403, 404, 500}

@endgroup

@group project_memberships
@endpoint GET /project_memberships/{project_membership_gid}
@optional {opt_fields: [str]}
@returns(200) {data: any}
@errors {400, 401, 403, 404, 500}

@endgroup

@group projects
@endpoint GET /projects/{project_gid}/project_memberships
@optional {opt_fields: [str]}
@returns(200) {data: [map], next_page: map?{offset: str, path: str, uri: str(uri)}}
@errors {400, 401, 403, 404, 500}

@endgroup

@group project_portfolio_settings
@endpoint GET /project_portfolio_settings/{project_portfolio_setting_gid}
@optional {opt_fields: [str]}
@returns(200) {data: any}
@errors {400, 401, 403, 404, 500}

@endpoint PUT /project_portfolio_settings/{project_portfolio_setting_gid}
@optional {opt_fields: [str], data: map{is_access_control_inherited: bool}}
@returns(200) {data: any}
@errors {400, 401, 403, 404, 500}

@endgroup

@group projects
@endpoint GET /projects/{project_gid}/project_portfolio_settings
@optional {opt_fields: [str]}
@returns(200) {data: [map], next_page: map?{offset: str, path: str, uri: str(uri)}}
@errors {400, 401, 403, 404, 500}

@endgroup

@group portfolios
@endpoint GET /portfolios/{portfolio_gid}/project_portfolio_settings
@optional {opt_fields: [str]}
@returns(200) {data: [map], next_page: map?{offset: str, path: str, uri: str(uri)}}
@errors {400, 401, 403, 404, 500}

@endgroup

@group project_statuses
@endpoint GET /project_statuses/{project_status_gid}
@optional {opt_fields: [str]}
@returns(200) {data: any}
@errors {400, 401, 403, 404, 500}

@endpoint DELETE /project_statuses/{project_status_gid}
@returns(200) {data: map}
@errors {400, 401, 403, 404, 500}

@endgroup

@group projects
@endpoint GET /projects/{project_gid}/project_statuses
@required {project_gid: str}
@optional {opt_pretty: bool, limit: int, offset: str, opt_fields: [str]}
@returns(200) {data: [map], next_page: map?{offset: str, path: str, uri: str(uri)}}
@errors {400, 401, 403, 404, 500}

@endpoint POST /projects/{project_gid}/project_statuses
@optional {opt_fields: [str], data: any}
@returns(201) {data: any}
@errors {400, 401, 403, 404, 500}

@endgroup

@group project_templates
@endpoint GET /project_templates/{project_template_gid}
@optional {opt_fields: [str]}
@returns(200) {data: any}
@errors {400, 401, 403, 404, 500}

@endpoint DELETE /project_templates/{project_template_gid}
@returns(200) {data: map}
@errors {400, 401, 402, 403, 404, 500}

@endpoint GET /project_templates
@optional {workspace: str, team: str, limit: int, offset: str, opt_fields: [str]}
@returns(200) {data: [map], next_page: map?{offset: str, path: str, uri: str(uri)}}
@errors {400, 401, 403, 404, 500}

@endgroup

@group teams
@endpoint GET /teams/{team_gid}/project_templates
@optional {limit: int, offset: str, opt_fields: [str]}
@returns(200) {data: [map], next_page: map?{offset: str, path: str, uri: str(uri)}}
@errors {400, 401, 403, 404, 500}

@endgroup

@group project_templates
@endpoint POST /project_templates/{project_template_gid}/instantiateProject
@optional {opt_fields: [str], data: map{name!: str, team: str, public: bool, privacy_setting: str, is_strict: bool, requested_dates: [map], requested_roles: [map]}}
@returns(201) {data: map{gid: str, resource_type: str, resource_subtype: str, status: str, new_portfolio: map{gid: str, resource_type: str, name: str}, new_project: map{gid: str, resource_type: str, name: str}, new_task: any, new_project_template: map{gid: str, resource_type: str, name: str}, new_graph_export: map{gid: str, resource_type: str, created_at: str(date-time), download_url: str(uri)?, completed_at: str(date-time)}, new_resource_export: map{gid: str, resource_type: str, created_at: str(date-time), download_url: str(uri)?, completed_at: str(date-time)}}}
@errors {400, 401, 403, 404, 500}

@endgroup

@group projects
@endpoint GET /projects
@optional {limit: int, offset: str, workspace: str, team: str, archived: bool, opt_fields: [str]}
@returns(200) {data: [map], next_page: map?{offset: str, path: str, uri: str(uri)}}
@errors {400, 401, 403, 404, 500}

@endpoint POST /projects
@optional {opt_fields: [str], data: any}
@returns(201) {data: any}
@errors {400, 401, 403, 404, 500}

@endpoint GET /projects/{project_gid}
@optional {opt_fields: [str]}
@returns(200) {data: any}
@errors {400, 401, 403, 404, 500}

@endpoint PUT /projects/{project_gid}
@optional {opt_fields: [str], data: any}
@returns(200) {data: any}
@errors {400, 401, 403, 404, 500}

@endpoint DELETE /projects/{project_gid}
@returns(200) {data: map}
@errors {400, 401, 403, 404, 500}

@endpoint POST /projects/{project_gid}/duplicate
@optional {opt_fields: [str], data: map{name!: str, team: str, include: str, schedule_dates: map}}
@returns(201) {data: map{gid: str, resource_type: str, resource_subtype: str, status: str, new_portfolio: map{gid: str, resource_type: str, name: str}, new_project: map{gid: str, resource_type: str, name: str}, new_task: any, new_project_template: map{gid: str, resource_type: str, name: str}, new_graph_export: map{gid: str, resource_type: str, created_at: str(date-time), download_url: str(uri)?, completed_at: str(date-time)}, new_resource_export: map{gid: str, resource_type: str, created_at: str(date-time), download_url: str(uri)?, completed_at: str(date-time)}}}
@errors {400, 401, 403, 404, 500}

@endgroup

@group tasks
@endpoint GET /tasks/{task_gid}/projects
@optional {opt_fields: [str]}
@returns(200) {data: [map], next_page: map?{offset: str, path: str, uri: str(uri)}}
@errors {400, 401, 403, 404, 500}

@endgroup

@group teams
@endpoint GET /teams/{team_gid}/projects
@optional {limit: int, offset: str, archived: bool, opt_fields: [str]}
@returns(200) {data: [map], next_page: map?{offset: str, path: str, uri: str(uri)}}
@errors {400, 401, 403, 404, 500}

@endpoint POST /teams/{team_gid}/projects
@optional {opt_fields: [str], data: any}
@returns(201) {data: any}
@errors {400, 401, 403, 404, 500}

@endgroup

@group workspaces
@endpoint GET /workspaces/{workspace_gid}/projects
@optional {limit: int, offset: str, archived: bool, opt_fields: [str]}
@returns(200) {data: [map], next_page: map?{offset: str, path: str, uri: str(uri)}}
@errors {400, 401, 403, 404, 500}

@endpoint POST /workspaces/{workspace_gid}/projects
@optional {opt_fields: [str], data: any}
@returns(201) {data: any}
@errors {400, 401, 403, 404, 500}

@endpoint GET /workspaces/{workspace_gid}/projects/search
@optional {opt_fields: [str]}
@returns(200) {data: [map]}
@errors {400, 401, 402, 403, 404, 500}

@endgroup

@group projects
@endpoint POST /projects/{project_gid}/addCustomFieldSetting
@optional {opt_fields: [str], data: map{custom_field!: any, is_important: bool, insert_before: str, insert_after: str}}
@returns(200) {data: any}
@errors {400, 401, 403, 404, 500}

@endpoint POST /projects/{project_gid}/removeCustomFieldSetting
@optional {data: map{custom_field!: str}}
@returns(200) {data: map}
@errors {400, 401, 403, 404, 500}

@endpoint GET /projects/{project_gid}/task_counts
@optional {opt_fields: [str]}
@returns(200) {data: map{num_tasks: int, num_incomplete_tasks: int, num_completed_tasks: int, num_milestones: int, num_incomplete_milestones: int, num_completed_milestones: int}}
@errors {400, 401, 403, 404, 500}

@endpoint POST /projects/{project_gid}/addMembers
@optional {opt_fields: [str], data: map{members!: str}}
@returns(200) {data: any}
@errors {400, 401, 403, 404, 500}

@endpoint POST /projects/{project_gid}/removeMembers
@optional {opt_fields: [str], data: map{members!: str}}
@returns(200) {data: any}
@errors {400, 401, 403, 404, 500}

@endpoint POST /projects/{project_gid}/addFollowers
@optional {opt_fields: [str], data: map{followers!: str}}
@returns(200) {data: any}
@errors {400, 401, 403, 404, 500}

@endpoint POST /projects/{project_gid}/removeFollowers
@optional {opt_fields: [str], data: map{followers!: str}}
@returns(200) {data: any}
@errors {400, 401, 403, 404, 500}

@endpoint POST /projects/{project_gid}/saveAsTemplate
@optional {opt_fields: [str], data: map{name!: str, team: str, workspace: str, public!: bool}}
@returns(201) {data: map{gid: str, resource_type: str, resource_subtype: str, status: str, new_portfolio: map{gid: str, resource_type: str, name: str}, new_project: map{gid: str, resource_type: str, name: str}, new_task: any, new_project_template: map{gid: str, resource_type: str, name: str}, new_graph_export: map{gid: str, resource_type: str, created_at: str(date-time), download_url: str(uri)?, completed_at: str(date-time)}, new_resource_export: map{gid: str, resource_type: str, created_at: str(date-time), download_url: str(uri)?, completed_at: str(date-time)}}}
@errors {400, 401, 403, 404, 500}

@endgroup

@group rates
@endpoint GET /rates
@optional {parent: str, resource: str, limit: int, offset: str, opt_fields: [str]}
@returns(200) {data: [any], next_page: map?{offset: str, path: str, uri: str(uri)}}
@errors {400, 401, 402, 403, 404, 500}

@endpoint POST /rates
@optional {opt_fields: [str], data: map{gid: str, resource_type: str, parent!: str, resource!: str, rate!: num}}
@returns(201) {data: any}
@errors {400, 401, 402, 403, 404, 500}

@endpoint GET /rates/{rate_gid}
@optional {opt_fields: [str]}
@returns(200) {data: any}
@errors {400, 401, 402, 403, 404, 500}

@endpoint PUT /rates/{rate_gid}
@optional {opt_fields: [str], data: map{gid: str, resource_type: str, rate: num}}
@returns(200) {data: any}
@errors {400, 401, 402, 403, 404, 500}

@endpoint DELETE /rates/{rate_gid}
@returns(200) {data: map}
@errors {400, 401, 402, 403, 404, 500}

@endgroup

@group reactions
@endpoint GET /reactions
@required {target: str, emoji_base: str}
@returns(200) {data: [map], next_page: map?{offset: str, path: str, uri: str(uri)}}
@errors {400, 401, 403, 404, 500}

@endgroup

@group roles
@endpoint GET /roles
@optional {limit: int, offset: str, workspace: str, archived: bool, opt_fields: [str]}
@returns(200) {data: [map], next_page: map?{offset: str, path: str, uri: str(uri)}}
@errors {400, 401, 403, 404, 500}

@endpoint POST /roles
@optional {opt_fields: [str], data: any}
@returns(201) {data: any}
@errors {400, 401, 403, 404, 500}

@endpoint GET /roles/{role_gid}
@optional {opt_fields: [str]}
@returns(200) {data: any}
@errors {400, 401, 403, 404, 500}

@endpoint PUT /roles/{role_gid}
@optional {opt_fields: [str], data: any}
@returns(200) {data: any}
@errors {400, 401, 403, 404, 500}

@endpoint DELETE /roles/{role_gid}
@returns(200) {data: map}
@errors {400, 401, 403, 404, 500}

@endgroup

@group rule_triggers
@endpoint POST /rule_triggers/{rule_trigger_gid}/run
@optional {data: map{resource!: str, action_data!: map}}
@returns(200) {data: map{message: str}}
@errors {400, 401, 402, 403, 404, 500}

@endgroup

@group sections
@endpoint GET /sections/{section_gid}
@optional {opt_fields: [str]}
@returns(200) {data: any}
@errors {400, 401, 403, 404, 500}

@endpoint PUT /sections/{section_gid}
@optional {opt_fields: [str], data: map{name!: str, insert_before: str, insert_after: str}}
@returns(200) {data: any}
@errors {400, 401, 403, 404, 500}

@endpoint DELETE /sections/{section_gid}
@returns(200) {data: map}
@errors {400, 401, 403, 404, 500}

@endgroup

@group projects
@endpoint GET /projects/{project_gid}/sections
@optional {limit: int, offset: str, opt_fields: [str]}
@returns(200) {data: [map], next_page: map?{offset: str, path: str, uri: str(uri)}}
@errors {400, 401, 403, 404, 500}

@endpoint POST /projects/{project_gid}/sections
@optional {opt_fields: [str], data: map{name!: str, insert_before: str, insert_after: str}}
@returns(201) {data: any}
@errors {400, 401, 403, 404, 500}

@endgroup

@group sections
@endpoint POST /sections/{section_gid}/addTask
@optional {data: map{task!: str, insert_before: str, insert_after: str}}
@returns(200) {data: map}
@errors {400, 401, 403, 404, 500}

@endgroup

@group projects
@endpoint POST /projects/{project_gid}/sections/insert
@optional {data: map{section!: str, before_section: str, after_section: str}}
@returns(200) {data: map}
@errors {400, 401, 403, 404, 500}

@endgroup

@group status_updates
@endpoint GET /status_updates/{status_update_gid}
@optional {opt_fields: [str]}
@returns(200) {data: any}
@errors {400, 401, 403, 404, 500}

@endpoint DELETE /status_updates/{status_update_gid}
@returns(200) {data: map}
@errors {400, 401, 403, 404, 500}

@endpoint GET /status_updates
@required {parent: str}
@optional {created_since: str(date-time), opt_fields: [str]}
@returns(200) {data: [map], next_page: map?{offset: str, path: str, uri: str(uri)}}
@errors {400, 401, 403, 404, 500}

@endpoint POST /status_updates
@optional {opt_fields: [str], data: any}
@returns(201) {data: any}
@errors {400, 401, 403, 404, 500}

@endgroup

@group stories
@endpoint GET /stories/{story_gid}
@optional {opt_fields: [str]}
@returns(200) {data: any}
@errors {400, 401, 403, 404, 500}

@endpoint PUT /stories/{story_gid}
@optional {opt_fields: [str], data: map{gid: str, resource_type: str, created_at: str(date-time), resource_subtype: str, text: str, html_text: str, is_pinned: bool, sticker_name: str}}
@returns(200) {data: any}
@errors {400, 401, 403, 404, 500}

@endpoint DELETE /stories/{story_gid}
@returns(200) {data: map}
@errors {400, 401, 403, 404, 500}

@endgroup

@group tasks
@endpoint GET /tasks/{task_gid}/stories
@optional {limit: int, offset: str, opt_fields: [str]}
@returns(200) {data: [map], next_page: map?{offset: str, path: str, uri: str(uri)}}
@errors {400, 401, 403, 404, 500}

@endpoint POST /tasks/{task_gid}/stories
@optional {opt_fields: [str], data: map{gid: str, resource_type: str, created_at: str(date-time), resource_subtype: str, text: str, html_text: str, is_pinned: bool, sticker_name: str}}
@returns(201) {data: any}
@errors {400, 401, 403, 404, 500}

@endgroup

@group goals
@endpoint GET /goals/{goal_gid}/stories
@optional {limit: int, offset: str, opt_fields: [str]}
@returns(200) {data: [map], next_page: map?{offset: str, path: str, uri: str(uri)}}
@errors {400, 401, 403, 404, 500}

@endpoint POST /goals/{goal_gid}/stories
@optional {opt_fields: [str], data: map{gid: str, resource_type: str, created_at: str(date-time), resource_subtype: str, text: str, html_text: str, is_pinned: bool, sticker_name: str}}
@returns(201) {data: any}
@errors {400, 401, 403, 404, 500}

@endgroup

@group tags
@endpoint GET /tags
@optional {limit: int, offset: str, workspace: str, opt_fields: [str]}
@returns(200) {data: [map], next_page: map?{offset: str, path: str, uri: str(uri)}}
@errors {400, 401, 403, 404, 500}

@endpoint POST /tags
@optional {opt_fields: [str], data: any}
@returns(201) {data: any}
@errors {400, 401, 403, 404, 500}

@endpoint GET /tags/{tag_gid}
@optional {opt_fields: [str]}
@returns(200) {data: any}
@errors {400, 401, 403, 404, 500}

@endpoint PUT /tags/{tag_gid}
@optional {opt_fields: [str], data: any}
@returns(200) {data: any}
@errors {400, 401, 403, 404, 500}

@endpoint DELETE /tags/{tag_gid}
@returns(200) {data: map}
@errors {400, 401, 403, 404, 500}

@endgroup

@group tasks
@endpoint GET /tasks/{task_gid}/tags
@optional {opt_fields: [str]}
@returns(200) {data: [map], next_page: map?{offset: str, path: str, uri: str(uri)}}
@errors {400, 401, 403, 404, 500}

@endgroup

@group workspaces
@endpoint GET /workspaces/{workspace_gid}/tags
@optional {limit: int, offset: str, opt_fields: [str]}
@returns(200) {data: [map], next_page: map?{offset: str, path: str, uri: str(uri)}}
@errors {400, 401, 403, 404, 500}

@endpoint POST /workspaces/{workspace_gid}/tags
@optional {opt_fields: [str], data: any}
@returns(201) {data: any}
@errors {400, 401, 403, 404, 500}

@endgroup

@group task_templates
@endpoint GET /task_templates
@optional {limit: int, offset: str, project: str, opt_fields: [str]}
@returns(200) {data: [map]}
@errors {400, 401, 403, 404, 500}

@endpoint GET /task_templates/{task_template_gid}
@optional {opt_fields: [str]}
@returns(200) {data: any}
@errors {400, 401, 403, 404, 500}

@endpoint DELETE /task_templates/{task_template_gid}
@returns(200) {data: map}
@errors {400, 401, 402, 403, 404, 500}

@endpoint POST /task_templates/{task_template_gid}/instantiateTask
@optional {opt_fields: [str], data: map{name: str}}
@returns(201) {data: map{gid: str, resource_type: str, resource_subtype: str, status: str, new_portfolio: map{gid: str, resource_type: str, name: str}, new_project: map{gid: str, resource_type: str, name: str}, new_task: any, new_project_template: map{gid: str, resource_type: str, name: str}, new_graph_export: map{gid: str, resource_type: str, created_at: str(date-time), download_url: str(uri)?, completed_at: str(date-time)}, new_resource_export: map{gid: str, resource_type: str, created_at: str(date-time), download_url: str(uri)?, completed_at: str(date-time)}}}
@errors {400, 401, 403, 404, 500}

@endgroup

@group tasks
@endpoint GET /tasks
@optional {limit: int, offset: str, assignee: str, project: str, section: str, workspace: str, completed_since: str(date-time), modified_since: str(date-time), opt_fields: [str]}
@returns(200) {data: [map], next_page: map?{offset: str, path: str, uri: str(uri)}}
@errors {400, 401, 403, 404, 500}

@endpoint POST /tasks
@optional {opt_fields: [str], data: any}
@returns(201) {data: any}
@errors {400, 401, 403, 404, 500}

@endpoint GET /tasks/{task_gid}
@optional {opt_fields: [str]}
@returns(200) {data: any}
@errors {400, 401, 403, 404, 500}

@endpoint PUT /tasks/{task_gid}
@optional {opt_fields: [str], data: any}
@returns(200) {data: any}
@errors {400, 401, 403, 404, 500}

@endpoint DELETE /tasks/{task_gid}
@returns(200) {data: map}
@errors {400, 401, 403, 404, 500}

@endpoint POST /tasks/{task_gid}/duplicate
@optional {opt_fields: [str], data: map{name: str, include: str}}
@returns(201) {data: map{gid: str, resource_type: str, resource_subtype: str, status: str, new_portfolio: map{gid: str, resource_type: str, name: str}, new_project: map{gid: str, resource_type: str, name: str}, new_task: any, new_project_template: map{gid: str, resource_type: str, name: str}, new_graph_export: map{gid: str, resource_type: str, created_at: str(date-time), download_url: str(uri)?, completed_at: str(date-time)}, new_resource_export: map{gid: str, resource_type: str, created_at: str(date-time), download_url: str(uri)?, completed_at: str(date-time)}}}
@errors {400, 401, 403, 404, 500}

@endgroup

@group projects
@endpoint GET /projects/{project_gid}/tasks
@optional {opt_fields: [str]}
@returns(200) {data: [map], next_page: map?{offset: str, path: str, uri: str(uri)}}
@errors {400, 401, 403, 404, 500}

@endgroup

@group sections
@endpoint GET /sections/{section_gid}/tasks
@optional {opt_fields: [str]}
@returns(200) {data: [map], next_page: map?{offset: str, path: str, uri: str(uri)}}
@errors {400, 401, 403, 404, 500}

@endgroup

@group tags
@endpoint GET /tags/{tag_gid}/tasks
@optional {opt_fields: [str]}
@returns(200) {data: [map], next_page: map?{offset: str, path: str, uri: str(uri)}}
@errors {400, 401, 403, 404, 500}

@endgroup

@group user_task_lists
@endpoint GET /user_task_lists/{user_task_list_gid}/tasks
@optional {opt_fields: [str]}
@returns(200) {data: [map], next_page: map?{offset: str, path: str, uri: str(uri)}}
@errors {400, 401, 403, 404, 500}

@endgroup

@group tasks
@endpoint GET /tasks/{task_gid}/subtasks
@optional {limit: int, offset: str, opt_fields: [str]}
@returns(200) {data: [map], next_page: map?{offset: str, path: str, uri: str(uri)}}
@errors {400, 401, 403, 404, 500}

@endpoint POST /tasks/{task_gid}/subtasks
@optional {opt_fields: [str], data: any}
@returns(201) {data: any}
@errors {400, 401, 403, 404, 500}

@endpoint POST /tasks/{task_gid}/setParent
@optional {opt_fields: [str], data: map{parent!: str, insert_after: str, insert_before: str}}
@returns(200) {data: any}
@errors {400, 401, 403, 404, 500}

@endpoint GET /tasks/{task_gid}/dependencies
@optional {opt_fields: [str]}
@returns(200) {data: [map], next_page: map?{offset: str, path: str, uri: str(uri)}}
@errors {400, 401, 402, 403, 404, 500}

@endpoint POST /tasks/{task_gid}/addDependencies
@optional {data: map{dependencies: [str]}}
@returns(200) {data: map}
@errors {400, 401, 402, 403, 404, 500}

@endpoint POST /tasks/{task_gid}/removeDependencies
@optional {data: map{dependencies: [str]}}
@returns(200) {data: map}
@errors {400, 401, 402, 403, 404, 500}

@endpoint GET /tasks/{task_gid}/dependents
@optional {opt_fields: [str]}
@returns(200) {data: [map], next_page: map?{offset: str, path: str, uri: str(uri)}}
@errors {400, 401, 402, 403, 404, 500}

@endpoint POST /tasks/{task_gid}/addDependents
@optional {data: map{dependents: [str]}}
@returns(200) {data: map}
@errors {400, 401, 402, 403, 404, 500}

@endpoint POST /tasks/{task_gid}/removeDependents
@optional {data: map{dependents: [str]}}
@returns(200) {data: map}
@errors {400, 401, 402, 403, 404, 500}

@endpoint POST /tasks/{task_gid}/addProject
@optional {data: map{project!: str, insert_after: str, insert_before: str, section: str}}
@returns(200) {data: map}
@errors {400, 401, 403, 404, 500}

@endpoint POST /tasks/{task_gid}/removeProject
@optional {data: map{project!: str}}
@returns(200) {data: map}
@errors {400, 401, 403, 404, 500}

@endpoint POST /tasks/{task_gid}/addTag
@optional {data: map{tag!: str}}
@returns(200) {data: map}
@errors {400, 401, 403, 404, 500}

@endpoint POST /tasks/{task_gid}/removeTag
@optional {data: map{tag!: str}}
@returns(200) {data: map}
@errors {400, 401, 403, 404, 500}

@endpoint POST /tasks/{task_gid}/addFollowers
@optional {opt_fields: [str], data: map{followers!: [str]}}
@returns(200) {data: any}
@errors {400, 401, 403, 404, 500}

@endpoint POST /tasks/{task_gid}/removeFollowers
@optional {opt_fields: [str], data: map{followers!: [str]}}
@returns(200) {data: any}
@errors {400, 401, 403, 404, 500}

@endgroup

@group workspaces
@endpoint GET /workspaces/{workspace_gid}/tasks/custom_id/{custom_id}
@returns(200) {data: any}
@errors {400, 401, 403, 404, 500}

@endpoint GET /workspaces/{workspace_gid}/tasks/search
@optional {opt_fields: [str]}
@returns(200) {data: [map]}
@errors {400, 401, 403, 404, 500}

@endgroup

@group team_memberships
@endpoint GET /team_memberships/{team_membership_gid}
@optional {opt_fields: [str]}
@returns(200) {data: map{gid: str, resource_type: str, user: map{gid: str, resource_type: str, name: str}, team: map{gid: str, resource_type: str, name: str}, is_guest: bool, is_limited_access: bool, is_admin: bool}}
@errors {400, 401, 403, 404, 500}

@endpoint GET /team_memberships
@optional {team: str, user: str, workspace: str, opt_fields: [str]}
@returns(200) {data: [map], next_page: map?{offset: str, path: str, uri: str(uri)}}
@errors {400, 401, 403, 404, 500}

@endgroup

@group teams
@endpoint GET /teams/{team_gid}/team_memberships
@optional {opt_fields: [str]}
@returns(200) {data: [map], next_page: map?{offset: str, path: str, uri: str(uri)}}
@errors {400, 401, 403, 404, 500}

@endgroup

@group users
@endpoint GET /users/{user_gid}/team_memberships
@required {workspace: str}
@optional {opt_fields: [str]}
@returns(200) {data: [map], next_page: map?{offset: str, path: str, uri: str(uri)}}
@errors {400, 401, 403, 404, 500}

@endgroup

@group teams
@endpoint POST /teams
@optional {opt_fields: [str], data: any}
@returns(201) {data: any}
@errors {400, 401, 403, 404, 500}

@endpoint GET /teams/{team_gid}
@optional {opt_fields: [str]}
@returns(200) {data: any}
@errors {400, 401, 403, 404, 500}

@endpoint PUT /teams/{team_gid}
@optional {opt_fields: [str], data: any}
@returns(200) {data: any}
@errors {400, 401, 403, 404, 500}

@endgroup

@group workspaces
@endpoint GET /workspaces/{workspace_gid}/teams
@optional {opt_fields: [str]}
@returns(200) {data: [map], next_page: map?{offset: str, path: str, uri: str(uri)}}
@errors {400, 401, 403, 404, 500}

@endgroup

@group users
@endpoint GET /users/{user_gid}/teams
@optional {opt_fields: [str]}
@returns(200) {data: [map], next_page: map?{offset: str, path: str, uri: str(uri)}}
@errors {400, 401, 403, 404, 500}

@endgroup

@group teams
@endpoint POST /teams/{team_gid}/addUser
@optional {opt_fields: [str], data: map{user: str}}
@returns(200) {data: map{gid: str, resource_type: str, user: map{gid: str, resource_type: str, name: str}, team: map{gid: str, resource_type: str, name: str}, is_guest: bool, is_limited_access: bool, is_admin: bool}}
@errors {400, 401, 403, 404, 500}

@endpoint POST /teams/{team_gid}/removeUser
@optional {data: map{user: str}}
@returns(200) {data: map}
@errors {400, 401, 403, 404, 500}

@endgroup

@group time_periods
@endpoint GET /time_periods/{time_period_gid}
@optional {opt_fields: [str]}
@returns(200) {data: any}
@errors {400, 401, 403, 404, 500}

@endpoint GET /time_periods
@required {workspace: str}
@optional {start_on: str(date), end_on: str(date), opt_fields: [str]}
@returns(200) {data: [map], next_page: map?{offset: str, path: str, uri: str(uri)}}
@errors {400, 401, 403, 404, 500}

@endgroup

@group time_tracking_categories
@endpoint GET /time_tracking_categories/{time_tracking_category_gid}
@optional {opt_fields: [str]}
@returns(200) {data: any}
@errors {400, 401, 403, 404, 500}

@endpoint PUT /time_tracking_categories/{time_tracking_category_gid}
@optional {opt_fields: [str], data: any}
@returns(200) {data: any}
@errors {400, 401, 403, 404, 500}

@endpoint DELETE /time_tracking_categories/{time_tracking_category_gid}
@returns(200) {data: map}
@errors {400, 401, 403, 404, 500}

@endpoint GET /time_tracking_categories/{time_tracking_category_gid}/time_tracking_entries
@optional {start_date: str(date), end_date: str(date), limit: int, offset: str, opt_fields: [str]}
@returns(200) {data: [map], next_page: map?{offset: str, path: str, uri: str(uri)}}
@errors {400, 401, 403, 404, 500}

@endpoint GET /time_tracking_categories
@required {workspace: str}
@optional {is_archived: bool, limit: int, offset: str, opt_fields: [str]}
@returns(200) {data: [map], next_page: map?{offset: str, path: str, uri: str(uri)}}
@errors {400, 401, 403, 404, 500}

@endpoint POST /time_tracking_categories
@optional {opt_fields: [str], data: any}
@returns(201) {data: any}
@errors {400, 401, 403, 404, 500}

@endgroup

@group tasks
@endpoint GET /tasks/{task_gid}/time_tracking_entries
@optional {limit: int, offset: str, opt_fields: [str]}
@returns(200) {data: [map], next_page: map?{offset: str, path: str, uri: str(uri)}}
@errors {400, 401, 403, 404, 500}

@endpoint POST /tasks/{task_gid}/time_tracking_entries
@optional {opt_fields: [str], data: map{duration_minutes: int, entered_on: str(date), attributable_to: str, billable_status: str, description: str, categories: [str]}}
@returns(201) {data: any}
@errors {400, 401, 403, 404, 500}

@endgroup

@group time_tracking_entries
@endpoint GET /time_tracking_entries/{time_tracking_entry_gid}
@optional {opt_fields: [str]}
@returns(200) {data: any}
@errors {400, 401, 403, 404, 500}

@endpoint PUT /time_tracking_entries/{time_tracking_entry_gid}
@optional {opt_fields: [str], data: map{duration_minutes: int, entered_on: str(date), attributable_to: str, billable_status: str, description: str, categories: [str]}}
@returns(200) {data: any}
@errors {400, 401, 403, 404, 500}

@endpoint DELETE /time_tracking_entries/{time_tracking_entry_gid}
@returns(200) {data: map}
@errors {400, 401, 403, 404, 500}

@endpoint GET /time_tracking_entries
@optional {task: str, attributable_to: str, portfolio: str, user: str, workspace: str, entered_on_start_date: str(date), entered_on_end_date: str(date), timesheet_approval_status: str, limit: int, offset: str, opt_fields: [str]}
@returns(200) {data: [map], next_page: map?{offset: str, path: str, uri: str(uri)}}
@errors {400, 401, 402, 403, 404, 500}

@endgroup

@group timesheet_approval_statuses
@endpoint GET /timesheet_approval_statuses/{timesheet_approval_status_gid}
@optional {opt_fields: [str]}
@returns(200) {data: any}
@errors {400, 401, 403, 404, 500}

@endpoint PUT /timesheet_approval_statuses/{timesheet_approval_status_gid}
@optional {opt_fields: [str], data: map{approval_status!: str, message: str}}
@returns(200) {data: any}
@errors {400, 401, 402, 403, 404, 500}

@endpoint GET /timesheet_approval_statuses
@required {workspace: str}
@optional {user: str, from_date: str(date), to_date: str(date), approval_statuses: str, limit: int, offset: str, opt_fields: [str]}
@returns(200) {data: [map], next_page: map?{offset: str, path: str, uri: str(uri)}}
@errors {400, 401, 403, 404, 500}

@endpoint POST /timesheet_approval_statuses
@optional {opt_fields: [str], data: map{user!: str, workspace!: str, start_date!: str(date), end_date!: str(date)}}
@returns(201) {data: any}
@errors {400, 401, 402, 403, 404, 500}

@endgroup

@group workspaces
@endpoint GET /workspaces/{workspace_gid}/typeahead
@optional {opt_fields: [str]}
@returns(200) {data: [map]}
@errors {400, 401, 403, 404, 500}

@endgroup

@group user_task_lists
@endpoint GET /user_task_lists/{user_task_list_gid}
@optional {opt_fields: [str]}
@returns(200) {data: map{gid: str, resource_type: str, name: str, owner: any, workspace: any}}
@errors {400, 401, 403, 404, 500}

@endgroup

@group users
@endpoint GET /users/{user_gid}/user_task_list
@optional {opt_fields: [str]}
@returns(200) {data: map{gid: str, resource_type: str, name: str, owner: any, workspace: any}}
@errors {400, 401, 403, 404, 500}

@endpoint GET /users
@optional {opt_fields: [str]}
@returns(200) {data: [map], next_page: map?{offset: str, path: str, uri: str(uri)}}
@errors {400, 401, 403, 404, 500}

@endpoint GET /users/{user_gid}
@optional {opt_fields: [str]}
@returns(200) {data: any}
@errors {400, 401, 403, 404, 500}

@endpoint PUT /users/{user_gid}
@optional {opt_fields: [str], data: any}
@returns(200) {data: any}
@errors {400, 401, 403, 404, 500}

@endpoint GET /users/{user_gid}/favorites
@optional {opt_fields: [str]}
@returns(200) {data: [map], next_page: map?{offset: str, path: str, uri: str(uri)}}
@errors {400, 401, 403, 404, 500}

@endgroup

@group teams
@endpoint GET /teams/{team_gid}/users
@optional {opt_fields: [str]}
@returns(200) {data: [map]}
@errors {400, 401, 403, 404, 500}

@endgroup

@group workspaces
@endpoint GET /workspaces/{workspace_gid}/users
@optional {opt_fields: [str]}
@returns(200) {data: [map]}
@errors {400, 401, 403, 404, 500}

@endpoint GET /workspaces/{workspace_gid}/users/{user_gid}
@optional {opt_fields: [str]}
@returns(200) {data: any}
@errors {400, 401, 403, 404, 500}

@endpoint PUT /workspaces/{workspace_gid}/users/{user_gid}
@optional {opt_fields: [str], data: any}
@returns(200) {data: any}
@errors {400, 401, 403, 404, 500}

@endgroup

@group webhooks
@endpoint GET /webhooks
@required {workspace: str}
@optional {limit: int, offset: str, resource: str, opt_fields: [str]}
@returns(200) {data: [any], next_page: map?{offset: str, path: str, uri: str(uri)}}
@errors {400, 401, 403, 404, 500}

@endpoint POST /webhooks
@optional {opt_fields: [str], data: map{resource!: str, target!: str(uri), filters: [any]}}
@returns(201) {data: any, X-Hook-Secret: str}
@errors {400, 401, 403, 404, 500}

@endpoint GET /webhooks/{webhook_gid}
@optional {opt_fields: [str]}
@returns(200) {data: any}
@errors {400, 401, 403, 404, 500}

@endpoint PUT /webhooks/{webhook_gid}
@optional {opt_fields: [str], data: map{filters: [any]}}
@returns(200) {data: any}
@errors {400, 401, 403, 404, 500}

@endpoint DELETE /webhooks/{webhook_gid}
@returns(200) {data: map}
@errors {400, 401, 403, 404, 500}

@endgroup

@group workspace_memberships
@endpoint GET /workspace_memberships/{workspace_membership_gid}
@optional {opt_fields: [str]}
@returns(200) {data: any}
@errors {400, 401, 403, 404, 500}

@endgroup

@group users
@endpoint GET /users/{user_gid}/workspace_memberships
@optional {opt_fields: [str]}
@returns(200) {data: [map], next_page: map?{offset: str, path: str, uri: str(uri)}}
@errors {400, 401, 403, 404, 500}

@endgroup

@group workspaces
@endpoint GET /workspaces/{workspace_gid}/workspace_memberships
@optional {opt_fields: [str]}
@returns(200) {data: [map], next_page: map?{offset: str, path: str, uri: str(uri)}}

@endpoint GET /workspaces
@optional {opt_fields: [str]}
@returns(200) {data: [map], next_page: map?{offset: str, path: str, uri: str(uri)}}
@errors {400, 401, 403, 404, 500}

@endpoint GET /workspaces/{workspace_gid}
@optional {opt_fields: [str]}
@returns(200) {data: any}
@errors {400, 401, 403, 404, 500}

@endpoint PUT /workspaces/{workspace_gid}
@optional {opt_fields: [str], data: map{gid: str, resource_type: str, name: str}}
@returns(200) {data: any}
@errors {400, 401, 403, 404, 500}

@endpoint POST /workspaces/{workspace_gid}/addUser
@optional {opt_fields: [str], data: map{user: str}}
@returns(200) {data: any}
@errors {400, 401, 403, 404, 500}

@endpoint POST /workspaces/{workspace_gid}/removeUser
@optional {data: map{user: str}}
@returns(200) {data: map}
@errors {400, 401, 403, 404, 500}

@endpoint GET /workspaces/{workspace_gid}/events
@returns(200) {data: [map], sync: str, has_more: bool}
@errors {400, 401, 403, 404, 500}

@endgroup

@end
