> ## Documentation Index
> Fetch the complete documentation index at: https://docs.sigmic.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Send Follow-up

> Send a follow-up message to an existing task

# Send Follow-up Message

Send a follow-up message to an existing task's session. This maintains conversation context, allowing you to continue the dialogue without creating a new task. The endpoint returns immediately and execution runs in the background.

If the task's session has expired, it is **automatically restored** - no need to create a new task.

## Request

### JSON Request (without files)

```bash theme={null}
POST /api/v1/tasks/{id}/messages
Authorization: Bearer {api_key}
Content-Type: application/json
```

```json theme={null}
{
  "message": "Can you explain that in more detail?"
}
```

### Multipart Request (with files)

```bash theme={null}
POST /api/v1/tasks/{id}/messages
Authorization: Bearer {api_key}
Content-Type: multipart/form-data
```

| Field     | Type    | Required | Description                                                              |
| --------- | ------- | -------- | ------------------------------------------------------------------------ |
| `message` | string  | Yes      | The follow-up message to send                                            |
| `files`   | file(s) | No       | Files to upload (max 20 files, 50MB each). ZIP files are auto-extracted. |

### Path Parameters

| Parameter | Type   | Description                |
| --------- | ------ | -------------------------- |
| `id`      | string | The unique task identifier |

### File Upload Behavior

When files are uploaded:

1. Files are saved to the task's workspace under `uploads/`
2. ZIP files are automatically extracted, preserving directory structure
3. A file list is prepended to your message so the AI knows the files are available
4. The AI can then read and process these files using workspace tools

## Response

Returns JSON immediately. Execution runs in the background.

```json theme={null}
{
  "success": true,
  "data": {
    "status": "running"
  }
}
```

After sending the follow-up, connect to `GET /api/v1/tasks/:id/stream` to receive the response. The stream will replay all conversation history (including your follow-up) then deliver live events.

## Session Auto-Restore

If the task's session has expired (e.g., due to inactivity timeout), the follow-up endpoint automatically:

1. Creates a new session
2. Loads the conversation history into agent memory
3. Copies preserved workspace files
4. Continues execution with your new message

The stream will emit a `status` event with "Restoring session..." during this process. No special handling is needed on your end.

## Examples

### Simple Follow-up (JSON)

<CodeGroup>
  ```bash cURL theme={null}
  # 1. Send the follow-up
  curl -s -X POST https://api.sigmic.ai/api/v1/tasks/YOUR_TASK_ID/messages \
    -H "Authorization: Bearer sigmic_your_key_here" \
    -H "Content-Type: application/json" \
    -d '{"message": "Now multiply that by 3"}'

  # 2. Stream the response
  curl -N https://api.sigmic.ai/api/v1/tasks/YOUR_TASK_ID/stream \
    -H "Authorization: Bearer sigmic_your_key_here"
  ```

  ```javascript JavaScript theme={null}
  const taskId = 'c37c1d78-4d23-4e53-949a-ddd775f25e01';

  // 1. Send the follow-up
  await fetch(
    `https://api.sigmic.ai/api/v1/tasks/${taskId}/messages`,
    {
      method: 'POST',
      headers: {
        'Authorization': 'Bearer sigmic_your_key_here',
        'Content-Type': 'application/json'
      },
      body: JSON.stringify({ message: 'Now multiply that by 3' })
    }
  );

  // 2. Stream the response (includes full history + new response)
  const streamResponse = await fetch(
    `https://api.sigmic.ai/api/v1/tasks/${taskId}/stream`,
    { headers: { 'Authorization': 'Bearer sigmic_your_key_here' } }
  );

  const reader = streamResponse.body.getReader();
  const decoder = new TextDecoder();

  while (true) {
    const { done, value } = await reader.read();
    if (done) break;
    console.log(decoder.decode(value));
  }
  ```

  ```python Python theme={null}
  import requests
  import json

  task_id = 'c37c1d78-4d23-4e53-949a-ddd775f25e01'

  # 1. Send the follow-up
  requests.post(
      f'https://api.sigmic.ai/api/v1/tasks/{task_id}/messages',
      headers={
          'Authorization': 'Bearer sigmic_your_key_here',
          'Content-Type': 'application/json'
      },
      json={'message': 'Now multiply that by 3'}
  )

  # 2. Stream the response
  stream = requests.get(
      f'https://api.sigmic.ai/api/v1/tasks/{task_id}/stream',
      headers={'Authorization': 'Bearer sigmic_your_key_here'},
      stream=True
  )

  for line in stream.iter_lines():
      if line:
          print(line.decode('utf-8'))
  ```
</CodeGroup>

### Follow-up with File Upload

<CodeGroup>
  ```bash cURL theme={null}
  curl -s -X POST https://api.sigmic.ai/api/v1/tasks/YOUR_TASK_ID/messages \
    -H "Authorization: Bearer sigmic_your_key_here" \
    -F "message=Analyze this additional data file" \
    -F "files=@data.csv" \
    -F "files=@config.json"
  ```

  ```javascript JavaScript theme={null}
  const taskId = 'c37c1d78-4d23-4e53-949a-ddd775f25e01';

  const formData = new FormData();
  formData.append('message', 'Analyze this additional data file');
  formData.append('files', dataFile);
  formData.append('files', configFile);

  await fetch(
    `https://api.sigmic.ai/api/v1/tasks/${taskId}/messages`,
    {
      method: 'POST',
      headers: { 'Authorization': 'Bearer sigmic_your_key_here' },
      body: formData
    }
  );

  // Connect to stream for the response...
  ```

  ```python Python theme={null}
  import requests

  task_id = 'c37c1d78-4d23-4e53-949a-ddd775f25e01'

  with open('data.csv', 'rb') as f1, open('config.json', 'rb') as f2:
      requests.post(
          f'https://api.sigmic.ai/api/v1/tasks/{task_id}/messages',
          headers={'Authorization': 'Bearer sigmic_your_key_here'},
          data={'message': 'Analyze this additional data file'},
          files=[
              ('files', ('data.csv', f1, 'text/csv')),
              ('files', ('config.json', f2, 'application/json'))
          ]
      )

  # Connect to stream for the response...
  ```
</CodeGroup>

### Upload ZIP Archive

ZIP files are automatically extracted. Use this to upload entire project directories:

```bash theme={null}
# Create a ZIP of your project
zip -r project.zip src/ tests/ package.json

# Upload and ask for analysis
curl -s -X POST https://api.sigmic.ai/api/v1/tasks/{task_id}/messages \
  -H "Authorization: Bearer sigmic_your_key_here" \
  -F "message=Review this project for security issues" \
  -F "files=@project.zip"
```

The AI will see:

```
[Files uploaded to workspace]
- uploads/src/index.js
- uploads/src/utils.js
- uploads/tests/test.js
- uploads/package.json

Review this project for security issues
```

## Important Notes

<Note>
  Follow-up messages use the same conversation context as the original task, so the agent has full memory of the previous conversation. If the session expired, it is automatically restored.
</Note>

<Tip>
  After sending a follow-up, connect to `GET /tasks/:id/stream` to receive the response. The stream replays the full conversation history followed by live events, so you always get the complete picture.
</Tip>

## Errors

| Code               | Description                              |
| ------------------ | ---------------------------------------- |
| `AUTH_REQUIRED`    | No authentication provided               |
| `INVALID_API_KEY`  | Invalid or expired API key               |
| `NOT_FOUND`        | Task with the specified ID was not found |
| `VALIDATION_ERROR` | Missing `message` in request body        |
