--- title: media API methods description: >- Attach media to authored statuses. See Using Mastodon > Posting toots > Attachments for more information about size and format limits. menu: docs: weight: 10 name: media parent: methods-statuses identifier: methods-media aliases: [ "/methods/media", "/api/methods/media", "/methods/statuses/media", ] --- ## Upload media as an attachment (async) {#v2} ```http POST /api/v2/media HTTP/1.1 ``` Creates a media attachment to be used with a new status. The full sized media will be processed asynchronously in the background for large uploads. **Returns:** [MediaAttachment]({{< relref "entities/MediaAttachment" >}}), but without a URL\ **OAuth:** User token + `write:media`\ **Version history:**\ 3.1.3 - added\ 3.2.0 - add `thumbnail` parameter\ 4.0.0 - Smaller media formats (image) will be processed synchronously and return 200 instead of 202. Larger media formats (video, gifv, audio) will continue to be processed asynchronously and return 202. #### Request ##### Headers Authorization : {{}} Provide this header with `Bearer ` to gain authorized access to this API method. ##### Form data parameters file : {{}} Object. The file to be attached, encoded using multipart form data. The file must have a MIME type. thumbnail : Object. The custom thumbnail of the media to be attached, encoded using multipart form data. description : String. A plain-text description of the media, for accessibility purposes. focus : String. Two floating points (x,y), comma-delimited, ranging from -1.0 to 1.0. See [Focal points for cropping media thumbnails]({{< relref "api/guidelines#focal-points" >}}) for more information. #### Response ##### 200: OK MediaAttachment was created successfully, and the full-size file was processed synchronously. ```json { "id": "22348641", "type": "image", "url": "https://files.mastodon.social/media_attachments/files/022/348/641/original/e96382f26c72a29c.jpeg", "preview_url": "https://files.mastodon.social/media_attachments/files/022/348/641/small/e96382f26c72a29c.jpeg", "remote_url": null, "text_url": "https://mastodon.social/media/4Zj6ewxzzzDi0g8JnZQ", "meta": { "focus": { "x": -0.42, "y": 0.69 }, "original": { "width": 640, "height": 480, "size": "640x480", "aspect": 1.3333333333333333 }, "small": { "width": 461, "height": 346, "size": "461x346", "aspect": 1.3323699421965318 } }, "description": "test uploaded via api", "blurhash": "UFBWY:8_0Jxv4mx]t8t64.%M-:IUWGWAt6M}" } ``` ##### 202: Accepted MediaAttachment was created successfully, but the full-size file is still processing. Note that the MediaAttachment's `url` will still be null, as the media is still being processed in the background. However, the `preview_url` should be available. Use [`GET /api/v1/media/:id`](#get) to check the status of the media attachment. ```json { "id": "22348641", "type": "image", "url": null, "preview_url": "https://files.mastodon.social/media_attachments/files/022/348/641/small/cebc6d51be03e509.jpeg", "remote_url": null, "text_url": "https://mastodon.social/media/4Zj6ewxzzzDi0g8JnZQ", "meta": { "focus": { "x": -0.69, "y": 0.42 }, "original": { "width": 640, "height": 480, "size": "640x480", "aspect": 1.3333333333333333 }, "small": { "width": 461, "height": 346, "size": "461x346", "aspect": 1.3323699421965318 } }, "description": "test uploaded via api", "blurhash": "UFBWY:8_0Jxv4mx]t8t64.%M-:IUWGWAt6M}" } ``` ##### 401: Unauthorized Invalid or missing Authorization header. ```json { "error": "The access token is invalid" } ``` ##### 422: Unprocessable entity File or file type is unsupported or invalid ```json { "error": "Validation failed: File content type is invalid, File is invalid" } ``` ##### 500: Server error Could not generate a thumbnail for the attachment ```json { "error": "Error processing thumbnail for uploaded media" } ``` --- ## Get media attachment {#get} ```http GET /api/v1/media/:id HTTP/1.1 ``` Get a media attachment, before it is attached to a status and posted, but after it is accepted for processing. Use this method to check that the full-sized media has finished processing. **Returns:** [MediaAttachment]({{< relref "entities/MediaAttachment" >}})\ **OAuth:** User token + `write:media`\ **Version history:**\ 3.1.3 - added #### Request ##### Path parameters :id : {{}} String. The ID of the MediaAttachment in the database. ##### Headers Authorization : {{}} Provide this header with `Bearer ` to gain authorized access to this API method. #### Response ##### 200: OK The media file was processed, and a `url` to the processed media is available. ```json { "id": "22348641", "type": "image", "url": "https://files.mastodon.social/media_attachments/files/022/348/641/original/e96382f26c72a29c.jpeg", "preview_url": "https://files.mastodon.social/media_attachments/files/022/348/641/small/e96382f26c72a29c.jpeg", "remote_url": null, "text_url": "https://mastodon.social/media/4Zj6ewxzzzDi0g8JnZQ", "meta": { "focus": { "x": -0.42, "y": 0.69 }, "original": { "width": 640, "height": 480, "size": "640x480", "aspect": 1.3333333333333333 }, "small": { "width": 461, "height": 346, "size": "461x346", "aspect": 1.3323699421965318 } }, "description": "test uploaded via api, but updated", "blurhash": "UFBWY:8_0Jxv4mx]t8t64.%M-:IUWGWAt6M}" } ``` ##### 206: Partial content The media attachment is still being processed ```json ``` ##### 401: Unauthorized Invalid or missing Authorization header. ```json { "error": "The access token is invalid" } ``` ##### 404: Not found MediaAttachment is not owned by you or does not exist ```json { "error": "Record not found" } ``` ##### 422: Unprocessable entity There was an error processing the media attachment ```json { "error": "Validation failed: File content type is invalid, File is invalid" } ``` --- ## Update media attachment {#update} ```http PUT /api/v1/media/:id HTTP/1.1 ``` Update a MediaAttachment's parameters, before it is attached to a status and posted. **Returns:** [MediaAttachment]({{< relref "entities/MediaAttachment" >}})\ **OAuth:** User token + `write:media`\ **Version history:**\ 0.0.0 - added\ 2.3.0 - add `focus` parameter\ 3.2.0 - added `thumbnail` #### Request ##### Path parameters :id : {{}} String. The ID of the MediaAttachment in the database. ##### Headers Authorization : {{}} Provide this header with `Bearer ` to gain authorized access to this API method. ##### Form data parameters thumbnail : Object. The custom thumbnail of the media to be attached, encoded using multipart form data. description : String. A plain-text description of the media, for accessibility purposes. focus : String. Two floating points (x,y), comma-delimited, ranging from -1.0 to 1.0. See [Focal points for cropping media thumbnails]({{< relref "api/guidelines#focal-points" >}}) for more information. #### Response ##### 200: OK Attachment with an updated `description` ```json { "id": "22348641", "type": "image", "url": "https://files.mastodon.social/media_attachments/files/022/348/641/original/e96382f26c72a29c.jpeg", "preview_url": "https://files.mastodon.social/media_attachments/files/022/348/641/small/e96382f26c72a29c.jpeg", "remote_url": null, "text_url": "https://mastodon.social/media/4Zj6ewxzzzDi0g8JnZQ", "meta": { "focus": { "x": -0.42, "y": 0.69 }, "original": { "width": 640, "height": 480, "size": "640x480", "aspect": 1.3333333333333333 }, "small": { "width": 461, "height": 346, "size": "461x346", "aspect": 1.3323699421965318 } }, "description": "test uploaded via api, but updated", "blurhash": "UFBWY:8_0Jxv4mx]t8t64.%M-:IUWGWAt6M}" } ``` ##### 401: Unauthorized Invalid or missing Authorization header. ```json { "error": "The access token is invalid" } ``` ##### 404: Not found Attachment is not owned by you or does not exist ```json { "error": "Record not found" } ``` ##### 422: Unprocessable entity ```json { "error": "Validation failed: File content type is invalid, File is invalid" } ``` --- ## (DEPRECATED) Upload media as an attachment {#v1} ```http POST /api/v1/media HTTP/1.1 ``` Creates an attachment to be used with a new status. This method will return after the full sized media is done processing. **Returns:** [MediaAttachment]({{< relref "entities/MediaAttachment" >}})\ **OAuth:** User token + `write:media`\ **Version history:**\ 0.0.0 - added\ 2.3.0 - add `focus` parameter\ 3.1.3 - deprecated in favor of [POST /api/v2/media](#v2), which is equal to v1 in all aspects, except it returns HTTP 202, and the returned JSON object has a url of null. This is because while the thumbnail is prepared synchronously, the full version of the media attachment will be processed in the background.\ 3.2.0 - add `thumbnail` parameter #### Request ##### Headers Authorization : {{}} Provide this header with `Bearer ` to gain authorized access to this API method. ##### Form data parameters file : {{}} Object. The file to be attached, encoded using multipart form data. The file must have a MIME type. thumbnail : Object. The custom thumbnail of the media to be attached, encoded using multipart form data. description : String. A plain-text description of the media, for accessibility purposes. focus : String. Two floating points (x,y), comma-delimited, ranging from -1.0 to 1.0. See [Focal points for cropping media thumbnails]({{< relref "api/guidelines#focal-points" >}}) for more information. #### Response ##### 200: OK Attachment created successfully. Note that the MediaAttachment will be created even if the file is not understood correctly due to failed processing. Sample response for a correct file: ```json { "id": "22348641", "type": "image", "url": "https://files.mastodon.social/media_attachments/files/022/348/641/original/cebc6d51be03e509.jpeg", "preview_url": "https://files.mastodon.social/media_attachments/files/022/348/641/small/cebc6d51be03e509.jpeg", "remote_url": null, "text_url": "https://mastodon.social/media/4Zj6ewxzzzDi0g8JnZQ", "meta": { "focus": { "x": -0.69, "y": 0.42 }, "original": { "width": 640, "height": 480, "size": "640x480", "aspect": 1.3333333333333333 }, "small": { "width": 461, "height": 346, "size": "461x346", "aspect": 1.3323699421965318 } }, "description": "test uploaded via api", "blurhash": "UFBWY:8_0Jxv4mx]t8t64.%M-:IUWGWAt6M}" } ``` Sample response for an incorrect file, which results in a "missing" url: ```json { "id": "22348456", "type": "unknown", "url": "https://mastodon.social/files/original/missing.png", "preview_url": "https://mastodon.social/files/small/missing.png", "remote_url": null, "text_url": "https://mastodon.social/media/Ao2nvQoQNHROpKgEyoA", "meta": { "focus": { "x": -0.69, "y": 0.42 } }, "description": "test uploaded via api", "blurhash": null } ``` ##### 401: Unauthorized Invalid or missing Authorization header. ```json { "error": "The access token is invalid" } ``` ##### 422: Unprocessable entity File or file type is unsupported or invalid ```json { "error": "Validation failed: File content type is invalid, File is invalid" } ``` --- ## See also {{< page-relref ref="methods/instance" caption="GET /api/v2/instance (for obtaining configuration limits)">}} {{< page-relref ref="entities/instance#media_attachments" caption="Instance#configuration[media_attachments]">}} {{< page-relref ref="api/guidelines#focal-points" caption="Focal points for cropping media thumbnails" >}} {{< caption-link url="https://github.com/mastodon/mastodon/blob/main/app/controllers/api/v1/media_controller.rb" caption="app/controllers/api/v1/media_controller.rb" >}} {{< caption-link url="https://github.com/mastodon/mastodon/blob/main/app/controllers/api/v2/media_controller.rb" caption="app/controllers/api/v2/media_controller.rb" >}}