---
updatedAt: 2026-05-28T15:59:25.000Z
agentTools:
  projectIndex: https://developers.qase.io/llms.txt
---

# Upload attachment

This method allows to upload attachment to Qase.
Max upload size:
* Up to 32 Mb per file
* Up to 128 Mb per single request
* Up to 20 files per single request

If there is no free space left in your team account,
you will receive an error with code 507 - Insufficient Storage.


# OpenAPI definition

````json
{
  "openapi": "3.0.0",
  "info": {
    "title": "Qase.io TestOps API v1",
    "description": "Qase TestOps API v1 Specification.\n\n## Rate limiting\n\nRequests are rate limited per workspace (shared across all API tokens of the\nworkspace). The exact limit depends on your subscription plan.\n\nEvery response advertises the current limit state through headers:\n\n- `RateLimit` and `RateLimit-Policy` — IETF rate-limit headers describing the\n  active policies and how much of each one is left.\n- `X-RateLimit-Limit` — maximum number of requests allowed in the window.\n- `X-RateLimit-Remaining` — requests left in the current window.\n- `X-RateLimit-Reset` — Unix timestamp at which the window resets.\n\nTwo policies apply at the same time. `rpm` caps the sustained rate over 60\nseconds. `burst` caps a short spike over 10 seconds. A request is served only\nwhen both policies allow it.\n\nExample headers on a served request, for a plan with a 600 rpm limit:\n\n```\nRateLimit-Policy: \"rpm\";q=600;w=60, \"burst\";q=100;w=10\nRateLimit: \"rpm\";r=412;t=37, \"burst\";r=88;t=2\nX-RateLimit-Limit: 100\nX-RateLimit-Remaining: 88\nX-RateLimit-Reset: 1756742400\n```\n\nIn `RateLimit-Policy`, `q` is the quota and `w` is the window in seconds. In\n`RateLimit`, `r` is the requests left and `t` is the seconds until that policy\nfrees a slot.\n\nThe `X-RateLimit-*` headers are a single-number mirror for older clients. They\nreport whichever of the two policies is closer to its limit, so they can show\nthe burst quota while a spike is in progress, as in the example above.\n\nWhen the limit is exceeded the API responds with `429 Too Many Requests`, a\n`Retry-After` header (seconds to wait before retrying), and the body:\n\n```\nRetry-After: 12\n```\n\n```json\n{\n  \"status\": false,\n  \"errorMessage\": \"API rate limit exceeded.\"\n}\n```\n",
    "termsOfService": "https://qase.io/terms",
    "version": "1.0.0",
    "contact": {
      "name": "Qase.io",
      "url": "https://qase.io",
      "email": "support@qase.io"
    },
    "license": {
      "name": "Apache 2.0",
      "url": "https://github.com/qase-tms/specs/blob/master/LICENSE"
    }
  },
  "tags": [
    {
      "name": "attachments"
    }
  ],
  "servers": [
    {
      "url": "https://api.qase.io/v1",
      "description": "The production API server."
    }
  ],
  "paths": {
    "/attachment/{code}": {
      "post": {
        "operationId": "upload-attachment",
        "tags": [
          "attachments"
        ],
        "summary": "Upload attachment",
        "description": "This method allows to upload attachment to Qase.\nMax upload size:\n* Up to 32 Mb per file\n* Up to 128 Mb per single request\n* Up to 20 files per single request\n\nIf there is no free space left in your team account,\nyou will receive an error with code 507 - Insufficient Storage.\n",
        "parameters": [
          {
            "$ref": "#/components/parameters/Code"
          }
        ],
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "properties": {
                  "file[]": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "An attachments.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AttachmentUploadsResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          },
          "404": {
            "description": "Not Found."
          },
          "413": {
            "description": "Payload Too Large."
          },
          "429": {
            "description": "Too Many Requests."
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "AttachmentUploadsResponse": {
        "allOf": [
          {
            "$ref": "#/components/schemas/Response"
          },
          {
            "type": "object",
            "properties": {
              "result": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "hash": {
                      "type": "string"
                    },
                    "filename": {
                      "type": "string"
                    },
                    "mime": {
                      "type": "string"
                    },
                    "extension": {
                      "type": "string"
                    },
                    "url": {
                      "type": "string"
                    },
                    "team": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        ]
      },
      "Response": {
        "type": "object",
        "properties": {
          "status": {
            "type": "boolean"
          }
        }
      }
    },
    "securitySchemes": {
      "TokenAuth": {
        "type": "apiKey",
        "in": "header",
        "name": "Token"
      }
    },
    "parameters": {
      "Code": {
        "name": "code",
        "in": "path",
        "description": "Code of project, where to search entities.",
        "required": true,
        "schema": {
          "type": "string",
          "minLength": 2,
          "maxLength": 10
        }
      }
    }
  },
  "security": [
    {
      "TokenAuth": []
    }
  ]
}
````