# Asana Integration via LowCodeAPI

**Last Updated**: February 11, 2026

## Overview

Asana is a powerful work management platform that helps teams organize, track, and manage their work. This skill covers core functionality including tasks, projects, teams, users, and attachments, enabling you to build comprehensive workflow automation.

## Base Endpoint

https://api.lowcodeapi.com/asana

**Important**: Always include the provider name `asana` in the URL path after `api.lowcodeapi.com/`

## Authentication

Asana uses Personal Access Token (PAT) authentication.

### Setup Instructions

1. Go to [Asana Developer Apps](https://app.asana.com/0/my-apps)
2. Click "Create New Token"
3. Give your token a name
4. Copy the generated token

### Authentication Details

- **Type**: Personal Access Token (PAT)
- **Header**: `Authorization: Bearer {accessToken}`
- **How to get credentials**: [Asana My Apps](https://app.asana.com/0/my-apps)

When using LowCodeAPI, you only need to provide your access token. The system handles authentication automatically.

## URL Format

LowCodeAPI supports two URL formats for endpoints with path parameters. Always try the **New Format** first, fall back to **Old Format** if needed.

### New Format (Priority)

Path parameters stay in the URL path.

**Pattern**:
```
https://api.lowcodeapi.com/asana/tasks/{task_gid}?api_token=YOUR_API_TOKEN
```

### Old Format (Fallback)

Path parameters become query parameters.

**Pattern**:
```
https://api.lowcodeapi.com/asana/tasks/task_gid?task_gid={task_gid}&api_token=YOUR_API_TOKEN
```

### Decision Flow for AI Agents

1. **Always use New Format first** - Keep path parameters in the URL path
2. If you receive a 404 or error, try **Old Format** with sanitized path
3. Log which format worked for future requests to this provider

## API Categories

- **Tasks** - Create, read, update, and delete tasks
- **Projects** - Manage projects and project membership
- **Teams** - Access team information
- **Users** - Get user and workspace details
- **Attachments** - Upload and manage file attachments
- **Custom Fields** - Manage custom field definitions
- **Events** - Real-time event streaming
- **Batch** - Execute multiple requests in parallel

## Common Endpoints

### Get Attachment

Retrieve a single attachment by ID.

**Method**: GET | **LowCodeAPI Path**: `/attachments/{attachment_gid}`

**New Format URL**:
```
https://api.lowcodeapi.com/asana/attachments/{ATTACHMENT_GID}?api_token=YOUR_API_TOKEN
```

**Old Format URL**:
```
https://api.lowcodeapi.com/asana/attachments/attachment_gid?attachment_gid={ATTACHMENT_GID}&api_token=YOUR_API_TOKEN
```

**Path Parameters**:
| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| attachment_gid | string | Yes | Globally unique identifier for the attachment |

**Query Parameters**:
| Parameter | Type | Description |
|-----------|------|-------------|
| opt_fields | string | Comma-separated list of fields to return |
| opt_pretty | boolean | Provides "pretty" JSON output for debugging |

**Response**:
```json
{
  "data": {
    "data": {
      "gid": "ATTACHMENT_GID",
      "name": "document.pdf",
      "download_url": "https://...",
      "parent": {"gid": "TASK_GID"}
    }
  }
}
```

**Official Documentation**: [Get Attachment](https://developers.asana.com/reference/getattachment)

---

### Delete Attachment

Delete a specific attachment.

**Method**: DELETE | **LowCodeAPI Path**: `/attachments/{attachment_gid}`

**New Format URL**:
```
https://api.lowcodeapi.com/asana/attachments/{ATTACHMENT_GID}?api_token=YOUR_API_TOKEN
```

**Old Format URL**:
```
https://api.lowcodeapi.com/asana/attachments/attachment_gid?attachment_gid={ATTACHMENT_GID}&api_token=YOUR_API_TOKEN
```

**Official Documentation**: [Delete Attachment](https://developers.asana.com/reference/deleteattachment)

---

### Get Attachments for Object

Retrieve all attachments for a parent object (task, project, etc.).

**Method**: GET | **LowCodeAPI Path**: `/attachments`

**New Format URL**:
```
https://api.lowcodeapi.com/asana/attachments?parent={PARENT_GID}&api_token=YOUR_API_TOKEN
```

**Old Format URL**:
```
https://api.lowcodeapi.com/asana/attachments?parent={PARENT_GID}&api_token=YOUR_API_TOKEN
```

**Query Parameters**:
| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| parent | string | Yes | GID of the parent object (task, project, etc.) |
| limit | number | Number of results per page (1-100) |
| offset | string | Pagination offset token |
| opt_fields | string | Fields to return |
| opt_pretty | boolean | Pretty print for debugging |

**Official Documentation**: [Get Attachments](https://developers.asana.com/reference/getattachmentsforobject)

---

### Upload Attachment

Upload an attachment to a parent object.

**Method**: POST | **LowCodeAPI Path**: `/attachments`

**New Format URL**:
```
https://api.lowcodeapi.com/asana/attachments?api_token=YOUR_API_TOKEN
```

**Old Format URL**:
```
https://api.lowcodeapi.com/asana/attachments?api_token=YOUR_API_TOKEN
```

**Request Body (multipart/form-data)**:
| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| file | file | Yes | The file to upload |
| parent | string | Yes | GID of the parent object to attach to |
| name | string | No | Name of the file |
| connect_to_app | boolean | No | Whether to connect to an app |

**Example**:
```bash
curl -X POST "https://api.lowcodeapi.com/asana/attachments?api_token=YOUR_API_TOKEN" \
  -F "[email protected]" \
  -F "parent=TASK_GID" \
  -F "name=Meeting Notes"
```

**Official Documentation**: [Upload Attachment](https://developers.asana.com/reference/createattachmentforobject)

---

### Batch Request

Execute multiple requests in parallel.

**Method**: POST | **LowCodeAPI Path**: `/batch`

**New Format URL**:
```
https://api.lowcodeapi.com/asana/batch?api_token=YOUR_API_TOKEN
```

**Old Format URL**:
```
https://api.lowcodeapi.com/asana/batch?api_token=YOUR_API_TOKEN
```

**Request Body**:
```json
{
  "data": {
    "actions": [
      {
        "method": "GET",
        "relative_path": "/tasks/TASK_GID",
        "data": {}
      },
      {
        "method": "PUT",
        "relative_path": "/tasks/TASK_GID",
        "data": {
          "name": "Updated task name"
        }
      }
    ]
  }
}
```

**Official Documentation**: [Batch Request](https://developers.asana.com/reference/createbatchrequest)

---

### Create Custom Field

Create a new custom field in a workspace.

**Method**: POST | **LowCodeAPI Path**: `/custom_fields`

**New Format URL**:
```
https://api.lowcodeapi.com/asana/custom_fields?api_token=YOUR_API_TOKEN
```

**Old Format URL**:
```
https://api.lowcodeapi.com/asana/custom_fields?api_token=YOUR_API_TOKEN
```

**Request Body**:
```json
{
  "data": {
    "name": "Priority",
    "resource_subtype": "enum",
    "workspace": "WORKSPACE_GID",
    "options": [
      {"name": "High", "color": "red"},
      {"name": "Medium", "color": "yellow"},
      {"name": "Low", "color": "green"}
    ]
  }
}
```

**Official Documentation**: [Create Custom Field](https://developers.asana.com/reference/createcustomfield)

---

### Get Custom Field

Get complete definition of a custom field.

**Method**: GET | **LowCodeAPI Path**: `/custom_fields/{custom_field_gid}`

**New Format URL**:
```
https://api.lowcodeapi.com/asana/custom_fields/{CUSTOM_FIELD_GID}?api_token=YOUR_API_TOKEN
```

**Old Format URL**:
```
https://api.lowcodeapi.com/asana/custom_fields/custom_field_gid?custom_field_gid={CUSTOM_FIELD_GID}&api_token=YOUR_API_TOKEN
```

**Path Parameters**:
| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| custom_field_gid | string | Yes | GID of the custom field |

**Official Documentation**: [Get Custom Field](https://developers.asana.com/reference/getcustomfield)

---

### Update Custom Field

Update an existing custom field.

**Method**: PUT | **LowCodeAPI Path**: `/custom_fields/{custom_field_gid}`

**New Format URL**:
```
https://api.lowcodeapi.com/asana/custom_fields/{CUSTOM_FIELD_GID}?api_token=YOUR_API_TOKEN
```

**Old Format URL**:
```
https://api.lowcodeapi.com/asana/custom_fields/custom_field_gid?custom_field_gid={CUSTOM_FIELD_GID}&api_token=YOUR_API_TOKEN
```

**Request Body**:
```json
{
  "data": {
    "name": "New Name",
    "description": "Updated description",
    "enabled": true
  }
}
```

**Official Documentation**: [Update Custom Field](https://developers.asana.com/reference/updatecustomfield)

---

### Delete Custom Field

Delete a custom field.

**Method**: DELETE | **LowCodeAPI Path**: `/custom_fields/{custom_field_gid}`

**New Format URL**:
```
https://api.lowcodeapi.com/asana/custom_fields/{CUSTOM_FIELD_GID}?api_token=YOUR_API_TOKEN
```

**Old Format URL**:
```
https://api.lowcodeapi.com/asana/custom_fields/custom_field_gid?custom_field_gid={CUSTOM_FIELD_GID}&api_token=YOUR_API_TOKEN
```

**Official Documentation**: [Delete Custom Field](https://developers.asana.com/reference/deletecustomfield)

---

### Create Enum Option

Add an enum option to a custom field.

**Method**: POST | **LowCodeAPI Path**: `/custom_fields/{custom_field_gid}/enum_options`

**New Format URL**:
```
https://api.lowcodeapi.com/asana/custom_fields/{CUSTOM_FIELD_GID}/enum_options?api_token=YOUR_API_TOKEN
```

**Old Format URL**:
```
https://api.lowcodeapi.com/asana/custom_fields/custom_field_gid/enum_options?custom_field_gid={CUSTOM_FIELD_GID}&api_token=YOUR_API_TOKEN
```

**Request Body**:
```json
{
  "data": {
    "name": "Urgent",
    "color": "red",
    "enabled": true
  }
}
```

**Official Documentation**: [Create Enum Option](https://developers.asana.com/reference/createenumoptionforcustomfield)

---

### Insert Enum Option

Move an enum option in the field's list.

**Method**: POST | **LowCodeAPI Path**: `/custom_fields/{custom_field_gid}/enum_options/insert`

**New Format URL**:
```
https://api.lowcodeapi.com/asana/custom_fields/{CUSTOM_FIELD_GID}/enum_options/insert?api_token=YOUR_API_TOKEN
```

**Old Format URL**:
```
https://api.lowcodeapi.com/asana/custom_fields/custom_field_gid/enum_options/insert?custom_field_gid={CUSTOM_FIELD_GID}&api_token=YOUR_API_TOKEN
```

**Request Body**:
```json
{
  "data": {
    "enum_option": "OPTION_GID",
    "before_enum_option": "TARGET_OPTION_GID"
  }
}
```

**Official Documentation**: [Insert Enum Option](https://developers.asana.com/reference/insertenumoptionforcustomfield)

---

### Update Enum Option

Update an existing enum option.

**Method**: PUT | **LowCodeAPI Path**: `/enum_options/{enum_option_gid}`

**New Format URL**:
```
https://api.lowcodeapi.com/asana/enum_options/{ENUM_OPTION_GID}?api_token=YOUR_API_TOKEN
```

**Old Format URL**:
```
https://api.lowcodeapi.com/asana/enum_options/enum_option_gid?enum_option_gid={ENUM_OPTION_GID}&api_token=YOUR_API_TOKEN
```

**Official Documentation**: [Update Enum Option](https://developers.asana.com/reference/updateEnumoption)

---

### Get Events

Get events that have occurred since a sync token.

**Method**: GET | **LowCodeAPI Path**: `/events`

**New Format URL**:
```
https://api.lowcodeapi.com/asana/events?sync={SYNC_TOKEN}&api_token=YOUR_API_TOKEN
```

**Old Format URL**:
```
https://api.lowcodeapi.com/asana/events?sync={SYNC_TOKEN}&api_token=YOUR_API_TOKEN
```

**Query Parameters**:
| Parameter | Type | Description |
|-----------|------|-------------|
| sync | string | Token from previous response or initial sync |
| resource | string | Filter events for a specific resource GID |
| opt_fields | string | Fields to return |
| opt_pretty | boolean | Pretty print for debugging |

**Response**:
```json
{
  "data": {
    "data": [
      {
        "gid": "EVENT_GID",
        "type": "task",
        "action": "changed",
        "resource": {"gid": "TASK_GID", "name": "Task Name"}
      }
    ],
    "sync": "NEXT_SYNC_TOKEN"
  }
}
```

**Official Documentation**: [Get Events](https://developers.asana.com/reference/getevents)

---

### Get Goal

Retrieve a single goal.

**Method**: GET | **LowCodeAPI Path**: `/goals/{goal_gid}`

**New Format URL**:
```
https://api.lowcodeapi.com/asana/goals/{GOAL_GID}?api_token=YOUR_API_TOKEN
```

**Old Format URL**:
```
https://api.lowcodeapi.com/asana/goals/goal_gid?goal_gid={GOAL_GID}&api_token=YOUR_API_TOKEN
```

**Path Parameters**:
| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| goal_gid | string | Yes | GID of the goal |

**Official Documentation**: [Get Goal](https://developers.asana.com/reference/getgoal)

---

### Update Goal

Update an existing goal.

**Method**: PUT | **LowCodeAPI Path**: `/goals/{goal_gid}`

**New Format URL**:
```
https://api.lowcodeapi.com/asana/goals/{GOAL_GID}?api_token=YOUR_API_TOKEN
```

**Old Format URL**:
```
https://api.lowcodeapi.com/asana/goals/goal_gid?goal_gid={GOAL_GID}&api_token=YOUR_API_TOKEN
```

**Request Body**:
```json
{
  "data": {
    "name": "Updated Goal Name",
    "notes": "Updated description",
    "due_on": "2026-12-31",
    "start_on": "2026-01-01"
  }
}
```

**Official Documentation**: [Update Goal](https://developers.asana.com/reference/updategoal)

---

### Delete Goal

Delete a goal.

**Method**: DELETE | **LowCodeAPI Path**: `/goals/{goal_gid}`

**New Format URL**:
```
https://api.lowcodeapi.com/asana/goals/{GOAL_GID}?api_token=YOUR_API_TOKEN
```

**Old Format URL**:
```
https://api.lowcodeapi.com/asana/goals/goal_gid?goal_gid={GOAL_GID}&api_token=YOUR_API_TOKEN
```

**Official Documentation**: [Delete Goal](https://developers.asana.com/reference/deletegoal)

---

### Add Supporting Relationship

Add a supporting goal relationship.

**Method**: POST | **LowCodeAPI Path**: `/goals/{goal_gid}/addSupportingRelationship`

**New Format URL**:
```
https://api.lowcodeapi.com/asana/goals/{GOAL_GID}/addSupportingRelationship?api_token=YOUR_API_TOKEN
```

**Old Format URL**:
```
https://api.lowcodeapi.com/asana/goals/goal_gid/addsupportingrelationship?goal_gid={GOAL_GID}&api_token=YOUR_API_TOKEN
```

**Official Documentation**: [Add Supporting Relationship](https://developers.asana.com/reference/createAddsupportingrelationship)

---

### Remove Supporting Relationship

Remove a supporting goal relationship.

**Method**: POST | **LowCodeAPI Path**: `/goals/{goal_gid}/removeSupportingRelationship`

**New Format URL**:
```
https://api.lowcodeapi.com/asana/goals/{GOAL_GID}/removeSupportingRelationship?api_token=YOUR_API_TOKEN
```

**Old Format URL**:
```
https://api.lowcodeapi.com/asana/goals/goal_gid/removesupportingrelationship?goal_gid={GOAL_GID}&api_token=YOUR_API_TOKEN
```

**Official Documentation**: [Remove Supporting Relationship](https://developers.asana.com/reference/createRemovesupportingrelationship)

---

### Get Goal Relationships

Get compact goal relationship records.

**Method**: GET | **LowCodeAPI Path**: `/goal_relationships`

**New Format URL**:
```
https://api.lowcodeapi.com/asana/goal_relationships?supported_goal={GOAL_GID}&api_token=YOUR_API_TOKEN
```

**Old Format URL**:
```
https://api.lowcodeapi.com/asana/goal_relationships?supported_goal={GOAL_GID}&api_token=YOUR_API_TOKEN
```

**Query Parameters**:
| Parameter | Type | Description |
|-----------|------|-------------|
| supported_goal | string | Filter by supported goal GID |
| resource_subtype | string | Filter by resource subtype |
| opt_fields | string | Fields to return |
| opt_pretty | boolean | Pretty print for debugging |

**Official Documentation**: [Get Goal Relationships](https://developers.asana.com/reference/getGoalrelationships)

---

### Get Goal Relationship

Get a single goal relationship.

**Method**: GET | **LowCodeAPI Path**: `/goal_relationships/{goal_relationship_gid}`

**New Format URL**:
```
https://api.lowcodeapi.com/asana/goal_relationships/{RELATIONSHIP_GID}?api_token=YOUR_API_TOKEN
```

**Old Format URL**:
```
https://api.lowcodeapi.com/asana/goal_relationships/goal_relationship_gid?goal_relationship_gid={RELATIONSHIP_GID}&api_token=YOUR_API_TOKEN
```

**Official Documentation**: [Get Goal Relationship](https://developers.asana.com/reference/getGoalrelationship)

---

### Update Goal Relationship

Update a goal relationship.

**Method**: PUT | **LowCodeAPI Path**: `/goal_relationships/{goal_relationship_gid}`

**New Format URL**:
```
https://api.lowcodeapi.com/asana/goal_relationships/{RELATIONSHIP_GID}?api_token=YOUR_API_TOKEN
```

**Old Format URL**:
```
https://api.lowcodeapi.com/asana/goal_relationships/goal_relationship_gid?goal_relationship_gid={RELATIONSHIP_GID}&api_token=YOUR_API_TOKEN
```

**Official Documentation**: [Update Goal Relationship](https://developers.asana.com/reference/updateGoalrelationship)

## Complete Endpoint Reference

### Attachments

| Method | Endpoint | Description |
|--------|----------|-------------|
| GET | `/attachments/{attachment_gid}` | Get attachment |
| DELETE | `/attachments/{attachment_gid}` | Delete attachment |
| GET | `/attachments` | Get attachments for object |
| POST | `/attachments` | Upload attachment |

### Batch

| Method | Endpoint | Description |
|--------|----------|-------------|
| POST | `/batch` | Execute multiple requests |

### Custom Fields

| Method | Endpoint | Description |
|--------|----------|-------------|
| POST | `/custom_fields` | Create custom field |
| GET | `/custom_fields/{custom_field_gid}` | Get custom field |
| PUT | `/custom_fields/{custom_field_gid}` | Update custom field |
| DELETE | `/custom_fields/{custom_field_gid}` | Delete custom field |
| POST | `/custom_fields/{custom_field_gid}/enum_options` | Create enum option |
| POST | `/custom_fields/{custom_field_gid}/enum_options/insert` | Insert enum option |

### Enum Options

| Method | Endpoint | Description |
|--------|----------|-------------|
| PUT | `/enum_options/{enum_option_gid}` | Update enum option |

### Events

| Method | Endpoint | Description |
|--------|----------|-------------|
| GET | `/events` | Get events |

### Goals

| Method | Endpoint | Description |
|--------|----------|-------------|
| GET | `/goals/{goal_gid}` | Get goal |
| PUT | `/goals/{goal_gid}` | Update goal |
| DELETE | `/goals/{goal_gid}` | Delete goal |
| POST | `/goals/{goal_gid}/addSupportingRelationship` | Add supporting relationship |
| POST | `/goals/{goal_gid}/removeSupportingRelationship` | Remove supporting relationship |

### Goal Relationships

| Method | Endpoint | Description |
|--------|----------|-------------|
| GET | `/goal_relationships` | Get goal relationships |
| GET | `/goal_relationships/{goal_relationship_gid}` | Get goal relationship |
| PUT | `/goal_relationships/{goal_relationship_gid}` | Update goal relationship |

**Note**: Asana has 171 total endpoints. This document covers the most commonly used ones. For a complete list, use the API definition endpoints below.

## API Definition Endpoints

Get the complete API specification for Asana:

- **New Format (OpenAPI)**: `https://backend.lowcodeapi.com/asana/openapi`
- **Old Format (Definition)**: `https://backend.lowcodeapi.com/asana/definition`

## Usage Examples

### Example 1: Upload and Manage Attachments

```bash
# Step 1: Upload attachment to a task (TASK_GID comes from your Asana workspace)
curl -X POST "https://api.lowcodeapi.com/asana/attachments?api_token=YOUR_API_TOKEN" \
  -F "[email protected]" \
  -F "parent=TASK_GID" \
  -F "name=Meeting Notes"

# Response: {"data": {"data": {"gid": "ATTACHMENT_GID", "name": "meeting.pdf"}}}
# Save the attachment GID (ATTACHMENT_GID)

# Step 2: Get attachment details using the GID from Step 1
curl -X GET "https://api.lowcodeapi.com/asana/attachments/ATTACHMENT_GID?api_token=YOUR_API_TOKEN"

# Step 3: Delete the attachment if needed
curl -X DELETE "https://api.lowcodeapi.com/asana/attachments/ATTACHMENT_GID?api_token=YOUR_API_TOKEN"
```

### Example 2: Custom Field Management

```bash
# Step 1: Create a custom field in workspace (WORKSPACE_GID from your workspace)
curl -X POST "https://api.lowcodeapi.com/asana/custom_fields?api_token=YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "data": {
      "name": "Priority",
      "resource_subtype": "enum",
      "workspace": "WORKSPACE_GID"
    }
  }'

# Response: {"data": {"data": {"gid": "CUSTOM_FIELD_GID", "name": "Priority"}}}
# Save the custom field GID (CUSTOM_FIELD_GID)

# Step 2: Add enum options to the field using the GID from Step 1
curl -X POST "https://api.lowcodeapi.com/asana/custom_fields/CUSTOM_FIELD_GID/enum_options?api_token=YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "data": {
      "name": "High",
      "color": "red",
      "enabled": true
    }
  }'

# Step 3: Get the custom field definition using the GID from Step 1
curl -X GET "https://api.lowcodeapi.com/asana/custom_fields/CUSTOM_FIELD_GID?api_token=YOUR_API_TOKEN"
```

### Example 3: Real-time Event Streaming

```bash
# Initial sync - get events from beginning
curl -X GET "https://api.lowcodeapi.com/asana/events?sync=&api_token=YOUR_API_TOKEN"

# Response: {"data": {"data": [...], "sync": "NEXT_SYNC_TOKEN"}}
# Save the sync token (NEXT_SYNC_TOKEN)

# Subsequent syncs - poll for new events using the sync token from previous response
curl -X GET "https://api.lowcodeapi.com/asana/events?sync=NEXT_SYNC_TOKEN&api_token=YOUR_API_TOKEN"

# Keep polling and update the sync token with each response
```

### Example 4: Batch Operations

```bash
# Execute multiple requests in parallel
curl -X POST "https://api.lowcodeapi.com/asana/batch?api_token=YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "data": {
      "actions": [
        {
          "method": "GET",
          "relative_path": "/tasks/TASK_GID_1",
          "data": {}
        },
        {
          "method": "GET",
          "relative_path": "/tasks/TASK_GID_2",
          "data": {}
        }
      ]
    }
  }'
```

### Example 5: Goal Management

```bash
# Step 1: Update a goal (GOAL_GID from your Asana workspace)
curl -X PUT "https://api.lowcodeapi.com/asana/goals/GOAL_GID?api_token=YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "data": {
      "name": "Q1 Revenue Target",
      "due_on": "2026-03-31",
      "notes": "Target: $1M in revenue"
    }
  }'

# Step 2: Get goal relationships
curl -X GET "https://api.lowcodeapi.com/asana/goal_relationships?supported_goal=GOAL_GID&api_token=YOUR_API_TOKEN"

# Step 3: Add a supporting goal relationship
curl -X POST "https://api.lowcodeapi.com/asana/goals/PARENT_GOAL_GID/addSupportingRelationship?api_token=YOUR_API_TOKEN"
```

## Error Handling

| Status Code | Meaning |
|-------------|---------|
| 200 | Success |
| 201 | Created |
| 400 | Bad Request - Invalid parameters |
| 401 | Unauthorized - Invalid token |
| 403 | Forbidden - Insufficient permissions |
| 404 | Not found |
| 429 | Too many requests - Rate limit exceeded |
| 500 | Server error |

## Pagination

Asana uses cursor-based pagination:

- **limit**: Number of results per page (1-100)
- **offset**: Pagination token from previous response
- Keep the offset token and include it in subsequent requests

## Response Format

All responses are wrapped in a `data` key:

```json
{
  "data": {
    // Actual response from Asana API
  }
}
```

## Common Query Parameters

| Parameter | Type | Description |
|-----------|------|-------------|
| opt_fields | string | Comma-separated list of fields to return (e.g., "name,due_on,assignee") |
| opt_pretty | boolean | Pretty print JSON for debugging |
| limit | number | Results per page (1-100) |
| offset | string | Pagination offset token |

## Additional Resources

- **Official Documentation**: [Asana API Reference](https://developers.asana.com/reference)
- **API Keys**: [Asana My Apps](https://app.asana.com/0/my-apps)
- **LowCodeAPI Docs**: https://docs.lowcodeapi.com