GetItDoneGetItDone Docs
API ReferenceAttachments

Start an attachment upload

Phase 1 of the two-phase upload (the SAME presign flow the in-app uploader uses): declares the file and answers a short-lived presigned PUT URL plus the `file_key` to register afterwards. Checked against the plan's file-size and storage allowances. Nothing is attached until phase 2. Supports the optional `Idempotency-Key` header (a replay returns the SAME URL, which may have expired — start a fresh upload instead of replaying old keys).

POST
/v1/tasks/{task_id}/attachments/uploads

Phase 1 of the two-phase upload (the SAME presign flow the in-app uploader uses): declares the file and answers a short-lived presigned PUT URL plus the file_key to register afterwards. Checked against the plan's file-size and storage allowances. Nothing is attached until phase 2. Supports the optional Idempotency-Key header (a replay returns the SAME URL, which may have expired — start a fresh upload instead of replaying old keys).

Authorization

bearerAuth
AuthorizationBearer <token>

A gid_ API key (Settings → API keys) or an OAuth 2.1 access token.

In: header

Path Parameters

task_id*string

Task short id, e.g. T-123 (a bare 123 is also accepted on input).

Match^(?:T-)?[0-9]{1,12}$

Header Parameters

Idempotency-Key?string

Optional client-generated key (1-255 visible ASCII characters; a UUID works) making this POST safely retryable. Retrying with the SAME key and byte-identical body within 24h replays the stored first response (marked Idempotency-Replayed: true, never re-executed, never charged against quota). The same key with a different body answers 422 idempotency_key_reused; a retry racing the first execution answers 409 idempotency_in_progress. Omitting the header executes normally with no idempotency guarantee.

Length1 <= length <= 255

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

What you are about to upload.

Response Body

application/json

application/problem+json

application/problem+json

application/problem+json

application/problem+json

application/problem+json

application/problem+json

application/problem+json

application/problem+json

curl -X POST "https://example.com/v1/tasks/string/attachments/uploads" \  -H "Content-Type: application/json" \  -d '{    "file_name": "string",    "content_type": "string",    "size": 1  }'
{  "upload_url": "string",  "upload_method": "PUT",  "file_key": "string",  "expires_at": "2019-08-24T14:15:22Z"}