Skip to content

Create a work item attachment upload ​

POST/api/v2/workspaces/{slug}/projects/{project_id}/work-items/{work_item_id}/attachments/

Start an upload. This is the first of three steps. Send the file's metadata, not the file. The API creates the attachment with is_uploaded: false and returns a signed storage credential in upload_data. You then upload the file straight to storage and confirm the upload.

A successful call returns 200, not 201, and the body is an envelope rather than the bare attachment:

  • upload_data holds the storage url and the form fields to send with the file.
  • asset_id is the new attachment's id. Use it as {pk} when you confirm, read, or delete.
  • asset_url is the attachment's relative path.
  • attachment is the attachment object.

Path Parameters ​

slug:requiredstring

The workspace slug. It appears in your Plane URLs. In https://app.plane.so/my-team/projects/, the slug is my-team.

project_id:requiredstring

The project the resource belongs to. Accepts the project UUID or its bare identifier, for example ENG.

work_item_id:requiredstring

The work item the resource hangs off. Accepts the work item UUID or its PROJ-123 identifier.

Body Parameters ​

name:requiredstring

The file name.

size:requiredinteger

The file size in bytes. Must be at least 1.

external_id:optionalstring

Your system's identifier for this record, for sync and import correlation.

Nullable.

external_source:optionalstring

The system external_id came from, for example github or jira.

Nullable.

type:optionalstring

The file's MIME type, for example application/pdf. Defaults to application/octet-stream. A type the endpoint doesn't accept is a 400.

Response shaping ​

fields:optionalstring

Comma-separated list of fields to return. Unrequested keys are omitted, not returned as null. id always comes back. Pass all for every requestable field. An unknown name is a 400. See Sparse fields.

Requestable here: asset_url, attributes, content_type, created_at, created_by_id, external_id, external_source, id, is_uploaded, name, size, updated_at, updated_by_id, work_item_id.

Scopes ​

projects.work_items.attachments:write

Errors ​

StatusCodeCause
400invalid_requestThe request body or a query parameter failed validation.
401unauthorizedMissing or invalid credentials.
402payment_requiredThe feature this endpoint belongs to isn't enabled on your plan or is switched off.
403forbiddenYour role or token scope doesn't allow this.
404not_foundNo such resource, or it's outside your tenant.
406not_acceptableThe Accept header asks for a representation the API can't produce.
409conflictA business rule blocks the write — see the notes above.
413payload_too_largeThe request body is over the size limit.
415unsupported_media_typeThe Content-Type isn't one this endpoint accepts.
429rate_limitedThrottled. Honor the Retry-After header before retrying.
Create a work item attachment upload
bash
curl -X POST \
  "https://api.plane.so/api/v2/workspaces/my-team/projects/4af68566-94a4-4eb3-94aa-50dc9427067b/work-items/9c1f0b3d-6d2e-4c9a-8b41-2f7e5a0d6c88/attachments/" \
  -H "X-Api-Key: $PLANE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "name": "design-review.pdf",
  "size": 482133,
  "external_id": null,
  "external_source": null,
  "type": "application/pdf"
}'
Response200
json
{
  "upload_data": {
    "url": "https://plane-uploads.s3.amazonaws.com/",
    "fields": {
      "Content-Type": "application/pdf",
      "key": "a3d1c5e7-2b4f-4a69-8c0d-7e5f1b3a9d24/5e8b1f0c9d2a4b7e8f3c6a1d0b9e2f47-design-review.pdf",
      "x-amz-algorithm": "AWS4-HMAC-SHA256",
      "x-amz-credential": "AKIAIOSFODNN7EXAMPLE/20260114/us-east-1/s3/aws4_request",
      "x-amz-date": "20260114T092241Z",
      "policy": "eyJleHBpcmF0aW9uIjoiMjAyNi0wMS0xNFQxMDoyMjo0MVoifQ==",
      "x-amz-signature": "6f1a9c2e4b7d0835a1e9f2c6b4d8a0e3f5c7b9d1a2e4f6081c3b5d7e9f0a2c4b"
    }
  },
  "asset_id": "8f4c2b1e-0d3a-4f7b-9c21-6e5a8b7d4f13",
  "asset_url": "/api/assets/v2/workspaces/my-team/projects/4af68566-94a4-4eb3-94aa-50dc9427067b/issues/9c1f0b3d-6d2e-4c9a-8b41-2f7e5a0d6c88/attachments/8f4c2b1e-0d3a-4f7b-9c21-6e5a8b7d4f13/",
  "attachment": {
    "id": "8f4c2b1e-0d3a-4f7b-9c21-6e5a8b7d4f13",
    "work_item_id": "9c1f0b3d-6d2e-4c9a-8b41-2f7e5a0d6c88",
    "name": "design-review.pdf",
    "content_type": "application/pdf",
    "size": 482133.0,
    "attributes": {
      "name": "design-review.pdf",
      "type": "application/pdf",
      "size": 482133
    },
    "asset_url": "/api/assets/v2/workspaces/my-team/projects/4af68566-94a4-4eb3-94aa-50dc9427067b/issues/9c1f0b3d-6d2e-4c9a-8b41-2f7e5a0d6c88/attachments/8f4c2b1e-0d3a-4f7b-9c21-6e5a8b7d4f13/",
    "is_uploaded": false,
    "external_id": null,
    "external_source": null,
    "created_at": "2026-01-14T09:22:41.478363Z",
    "updated_at": "2026-01-14T09:22:41.478363Z",
    "created_by_id": "16c61a3a-512a-48ac-b0be-b6b46fe6f430",
    "updated_by_id": null
  }
}