---
title: "Changes to Create Media Metadata"
method: POST
path: "/2/media/metadata"
---

# Changes to Create Media Metadata

`POST /2/media/metadata`

> Every recorded change to this operation, newest first.

## Timeline

Changed in 6 of 20 revisions.

- **2026-11-03** `2e1fefa37444`: 2 breaking, 2 info
- **2026-10-26** `23643fd75fe0`: 3 breaking, 2 info
- **2026-08-15** `c74357dfe14e`: 12 breaking, 34 warning, 7 info
- **2025-12-21** `1a92a48036c1`: 17 breaking, 5 warning, 19 info
- **2025-05-16** `141a148b1e41`: 2 info
- **2025-04-29** `18b84dc8a40e`: 1 info

## Changes

- **2026-11-03** `2e1fefa37444`: 2 breaking, 2 info
  - added `#/components/schemas/DmBadAttachmentProblem, #/components/schemas/DmBadCtaProblem, #/components/schemas/DmBadCustomProfileProblem, #/components/schemas/DmBadMediaProblem, #/components/schemas/DmBadQuickReplyProblem, #/components/schemas/DmBadUrlProblem, #/components/schemas/DmConversationNameTooLongProblem, #/components/schemas/DmConversationNotFoundProblem, #/components/schemas/DmDuplicateProblem, #/components/schemas/DmInactiveDeviceProblem, #/components/schemas/DmNotDeliveredProblem, #/components/schemas/DmNotFoundProblem, #/components/schemas/DmNotOwnerProblem, #/components/schemas/DmParticipantNotAddedProblem, #/components/schemas/DmParticipantNotFoundProblem, #/components/schemas/DmParticipantRestrictedProblem, #/components/schemas/DmParticipantUnavailableProblem, #/components/schemas/DmRateLimitedProblem, #/components/schemas/DmRecipientBlocksSenderProblem, #/components/schemas/DmRecipientCannotReceiveProblem, #/components/schemas/DmRecipientEncryptedUnavailableProblem, #/components/schemas/DmRecipientNotAcceptingProblem, #/components/schemas/DmRecipientNotFoundProblem, #/components/schemas/DmRecipientRestrictsGroupsProblem, #/components/schemas/DmRecipientUnavailableProblem, #/components/schemas/DmRequestInProgressProblem, #/components/schemas/DmSafetyLimitedProblem, #/components/schemas/DmSafetyRejectedProblem, #/components/schemas/DmSenderBlocksRecipientProblem, #/components/schemas/DmSenderDeclinedDmsProblem, #/components/schemas/DmSenderDmsClosedProblem, #/components/schemas/DmSenderEncryptedUnavailableProblem, #/components/schemas/DmSenderNotInConversationProblem, #/components/schemas/DmSenderNotPermittedProblem, #/components/schemas/DmSenderNotVerifiedProblem, #/components/schemas/DmSenderPhoneRequiredProblem, #/components/schemas/DmSenderReadOnlyProblem, #/components/schemas/DmSenderUnavailableProblem, #/components/schemas/DmTextEmptyProblem, #/components/schemas/DmTextTooLongProblem, #/components/schemas/DmTooFewParticipantsProblem, #/components/schemas/DmTooManyParticipantsProblem, #/components/schemas/DmUnsupportedMessageProblem` to the response body `oneOf` list for the response status `default`
  - added `#/components/schemas/DmBadAttachmentProblem, #/components/schemas/DmBadCtaProblem, #/components/schemas/DmBadCustomProfileProblem, #/components/schemas/DmBadMediaProblem, #/components/schemas/DmBadQuickReplyProblem, #/components/schemas/DmBadUrlProblem, #/components/schemas/DmConversationNameTooLongProblem, #/components/schemas/DmConversationNotFoundProblem, #/components/schemas/DmDuplicateProblem, #/components/schemas/DmInactiveDeviceProblem, #/components/schemas/DmNotDeliveredProblem, #/components/schemas/DmNotFoundProblem, #/components/schemas/DmNotOwnerProblem, #/components/schemas/DmParticipantNotAddedProblem, #/components/schemas/DmParticipantNotFoundProblem, #/components/schemas/DmParticipantRestrictedProblem, #/components/schemas/DmParticipantUnavailableProblem, #/components/schemas/DmRateLimitedProblem, #/components/schemas/DmRecipientBlocksSenderProblem, #/components/schemas/DmRecipientCannotReceiveProblem, #/components/schemas/DmRecipientEncryptedUnavailableProblem, #/components/schemas/DmRecipientNotAcceptingProblem, #/components/schemas/DmRecipientNotFoundProblem, #/components/schemas/DmRecipientRestrictsGroupsProblem, #/components/schemas/DmRecipientUnavailableProblem, #/components/schemas/DmRequestInProgressProblem, #/components/schemas/DmSafetyLimitedProblem, #/components/schemas/DmSafetyRejectedProblem, #/components/schemas/DmSenderBlocksRecipientProblem, #/components/schemas/DmSenderDeclinedDmsProblem, #/components/schemas/DmSenderDmsClosedProblem, #/components/schemas/DmSenderEncryptedUnavailableProblem, #/components/schemas/DmSenderNotInConversationProblem, #/components/schemas/DmSenderNotPermittedProblem, #/components/schemas/DmSenderNotVerifiedProblem, #/components/schemas/DmSenderPhoneRequiredProblem, #/components/schemas/DmSenderReadOnlyProblem, #/components/schemas/DmSenderUnavailableProblem, #/components/schemas/DmTextEmptyProblem, #/components/schemas/DmTextTooLongProblem, #/components/schemas/DmTooFewParticipantsProblem, #/components/schemas/DmTooManyParticipantsProblem, #/components/schemas/DmUnsupportedMessageProblem` to the `errors/items/` response property `oneOf` list for the response status `200`
  - added `https://api.x.com/2/problems/dm-bad-attachment, https://api.x.com/2/problems/dm-bad-cta, https://api.x.com/2/problems/dm-bad-custom-profile, https://api.x.com/2/problems/dm-bad-media, https://api.x.com/2/problems/dm-bad-quick-reply, https://api.x.com/2/problems/dm-bad-url, https://api.x.com/2/problems/dm-conversation-name-too-long, https://api.x.com/2/problems/dm-conversation-not-found, https://api.x.com/2/problems/dm-duplicate, https://api.x.com/2/problems/dm-inactive-device, https://api.x.com/2/problems/dm-not-delivered, https://api.x.com/2/problems/dm-not-found, https://api.x.com/2/problems/dm-not-owner, https://api.x.com/2/problems/dm-participant-not-added, https://api.x.com/2/problems/dm-participant-not-found, https://api.x.com/2/problems/dm-participant-restricted, https://api.x.com/2/problems/dm-participant-unavailable, https://api.x.com/2/problems/dm-rate-limited, https://api.x.com/2/problems/dm-recipient-blocks-sender, https://api.x.com/2/problems/dm-recipient-cannot-receive, https://api.x.com/2/problems/dm-recipient-encrypted-unavailable, https://api.x.com/2/problems/dm-recipient-not-accepting, https://api.x.com/2/problems/dm-recipient-not-found, https://api.x.com/2/problems/dm-recipient-restricts-groups, https://api.x.com/2/problems/dm-recipient-unavailable, https://api.x.com/2/problems/dm-request-in-progress, https://api.x.com/2/problems/dm-safety-limited, https://api.x.com/2/problems/dm-safety-rejected, https://api.x.com/2/problems/dm-sender-blocks-recipient, https://api.x.com/2/problems/dm-sender-declined-dms, https://api.x.com/2/problems/dm-sender-dms-closed, https://api.x.com/2/problems/dm-sender-encrypted-unavailable, https://api.x.com/2/problems/dm-sender-not-in-conversation, https://api.x.com/2/problems/dm-sender-not-permitted, https://api.x.com/2/problems/dm-sender-not-verified, https://api.x.com/2/problems/dm-sender-phone-required, https://api.x.com/2/problems/dm-sender-read-only, https://api.x.com/2/problems/dm-sender-unavailable, https://api.x.com/2/problems/dm-text-empty, https://api.x.com/2/problems/dm-text-too-long, https://api.x.com/2/problems/dm-too-few-participants, https://api.x.com/2/problems/dm-too-many-participants, https://api.x.com/2/problems/dm-unsupported-message` mapping keys to the response discriminator for the response status `default`
  - added `https://api.x.com/2/problems/dm-bad-attachment, https://api.x.com/2/problems/dm-bad-cta, https://api.x.com/2/problems/dm-bad-custom-profile, https://api.x.com/2/problems/dm-bad-media, https://api.x.com/2/problems/dm-bad-quick-reply, https://api.x.com/2/problems/dm-bad-url, https://api.x.com/2/problems/dm-conversation-name-too-long, https://api.x.com/2/problems/dm-conversation-not-found, https://api.x.com/2/problems/dm-duplicate, https://api.x.com/2/problems/dm-inactive-device, https://api.x.com/2/problems/dm-not-delivered, https://api.x.com/2/problems/dm-not-found, https://api.x.com/2/problems/dm-not-owner, https://api.x.com/2/problems/dm-participant-not-added, https://api.x.com/2/problems/dm-participant-not-found, https://api.x.com/2/problems/dm-participant-restricted, https://api.x.com/2/problems/dm-participant-unavailable, https://api.x.com/2/problems/dm-rate-limited, https://api.x.com/2/problems/dm-recipient-blocks-sender, https://api.x.com/2/problems/dm-recipient-cannot-receive, https://api.x.com/2/problems/dm-recipient-encrypted-unavailable, https://api.x.com/2/problems/dm-recipient-not-accepting, https://api.x.com/2/problems/dm-recipient-not-found, https://api.x.com/2/problems/dm-recipient-restricts-groups, https://api.x.com/2/problems/dm-recipient-unavailable, https://api.x.com/2/problems/dm-request-in-progress, https://api.x.com/2/problems/dm-safety-limited, https://api.x.com/2/problems/dm-safety-rejected, https://api.x.com/2/problems/dm-sender-blocks-recipient, https://api.x.com/2/problems/dm-sender-declined-dms, https://api.x.com/2/problems/dm-sender-dms-closed, https://api.x.com/2/problems/dm-sender-encrypted-unavailable, https://api.x.com/2/problems/dm-sender-not-in-conversation, https://api.x.com/2/problems/dm-sender-not-permitted, https://api.x.com/2/problems/dm-sender-not-verified, https://api.x.com/2/problems/dm-sender-phone-required, https://api.x.com/2/problems/dm-sender-read-only, https://api.x.com/2/problems/dm-sender-unavailable, https://api.x.com/2/problems/dm-text-empty, https://api.x.com/2/problems/dm-text-too-long, https://api.x.com/2/problems/dm-too-few-participants, https://api.x.com/2/problems/dm-too-many-participants, https://api.x.com/2/problems/dm-unsupported-message` discriminator mapping keys to the `errors/items/` response property for the response status `200`
- **2026-10-26** `23643fd75fe0`: 3 breaking, 2 info
  - the request property `metadata` became required
  - added `#/components/schemas/RecipientNotMessageableProblem, #/components/schemas/DuplicateRuleProblem, #/components/schemas/InvalidRuleProblem` to the response body `oneOf` list for the response status `default`
  - added `#/components/schemas/RecipientNotMessageableProblem, #/components/schemas/DuplicateRuleProblem, #/components/schemas/InvalidRuleProblem` to the `errors/items/` response property `oneOf` list for the response status `200`
  - added `https://api.twitter.com/2/problems/duplicate-rules, https://api.twitter.com/2/problems/invalid-rules, https://api.x.com/2/problems/recipient-not-messageable` mapping keys to the response discriminator for the response status `default`
  - added `https://api.twitter.com/2/problems/duplicate-rules, https://api.twitter.com/2/problems/invalid-rules, https://api.x.com/2/problems/recipient-not-messageable` discriminator mapping keys to the `errors/items/` response property for the response status `200`
- **2026-08-15** `c74357dfe14e`: 12 breaking, 34 warning, 7 info
  - request body became required
  - removed `subschema #1, subschema #2` from the `metadata/geo_restrictions` request property `oneOf` list
  - the `metadata/geo_restrictions` request property type changed from no type to `object`
  - added `#/components/schemas/ResourceNotFoundProblem, #/components/schemas/InvalidRequestProblem, #/components/schemas/NotAuthorizedForResourceProblem, #/components/schemas/NotAuthorizedForFieldProblem, #/components/schemas/FieldUnauthorizedProblem, #/components/schemas/FieldHydrationFailureProblem, #/components/schemas/ResourceUnavailableProblem, #/components/schemas/DisallowedResourceProblem, #/components/schemas/InternalErrorProblem` to the response body `oneOf` list for the response status `default`
  - the response's body type changed from `object` to no type for status `default`
  - the `errors` response property's minItems was decreased from `1` to `0` for the response status `200`
  - added `#/components/schemas/ResourceNotFoundProblem, #/components/schemas/InvalidRequestProblem, #/components/schemas/NotAuthorizedForResourceProblem, #/components/schemas/NotAuthorizedForFieldProblem, #/components/schemas/FieldUnauthorizedProblem, #/components/schemas/FieldHydrationFailureProblem, #/components/schemas/ResourceUnavailableProblem, #/components/schemas/DisallowedResourceProblem, #/components/schemas/InternalErrorProblem` to the `errors/items/` response property `oneOf` list for the response status `200`
  - the `errors/items/` response's property type changed from `object` to no type for status `200`
  - removed the required property `errors/items/title` from the response with the `200` status
  - removed the required property `errors/items/type` from the response with the `200` status
  - removed the required property `title` from the response with the `default` status
  - removed the required property `type` from the response with the `default` status
  - removed the request property `metadata/audience_policy/creator_subscriptions`
  - removed the request property `metadata/audience_policy/x_subscriptions`
  - removed the request property `metadata/preview_image/media_key/media`
  - removed the request property `metadata/preview_image/media_key/media_category`
  - removed the request property `metadata/sensitive_media_warning/adult_content`
  - removed the request property `metadata/sensitive_media_warning/graphic_violence`
  - removed the request property `metadata/sensitive_media_warning/other`
  - removed the request property `metadata/sticker_info/stickers/items/aspect_ratio`
  - removed the request property `metadata/sticker_info/stickers/items/group_annotation_id`
  - removed the request property `metadata/sticker_info/stickers/items/id`
  - removed the request property `metadata/sticker_info/stickers/items/sticker_set_annotation_id`
  - removed the request property `metadata/sticker_info/stickers/items/transform_a`
  - removed the request property `metadata/sticker_info/stickers/items/transform_b`
  - removed the request property `metadata/sticker_info/stickers/items/transform_c`
  - removed the request property `metadata/sticker_info/stickers/items/transform_d`
  - removed the request property `metadata/sticker_info/stickers/items/transform_tx`
  - removed the request property `metadata/sticker_info/stickers/items/transform_ty`
  - removed the optional property `data/associated_metadata/allow_download_status` from the response with the `200` status
  - removed the optional property `data/associated_metadata/alt_text` from the response with the `200` status
  - removed the optional property `data/associated_metadata/audience_policy` from the response with the `200` status
  - removed the optional property `data/associated_metadata/content_expiration` from the response with the `200` status
  - removed the optional property `data/associated_metadata/domain_restrictions` from the response with the `200` status
  - removed the optional property `data/associated_metadata/found_media_origin` from the response with the `200` status
  - removed the optional property `data/associated_metadata/geo_restrictions` from the response with the `200` status
  - removed the optional property `data/associated_metadata/management_info` from the response with the `200` status
  - removed the optional property `data/associated_metadata/preview_image` from the response with the `200` status
  - removed the optional property `data/associated_metadata/sensitive_media_warning` from the response with the `200` status
  - removed the optional property `data/associated_metadata/shared_info` from the response with the `200` status
  - …13 more
- **2025-12-21** `1a92a48036c1`: 17 breaking, 5 warning, 19 info
  - the request property `metadata/alt_text/text` became required
  - the request property `metadata/content_expiration/timestamp_sec` became required
  - the request property `metadata/domain_restrictions/whitelist` became required
  - the request property `metadata/found_media_origin/id` became required
  - the request property `metadata/found_media_origin/provider` became required
  - the request property `metadata/management_info/managed` became required
  - the request property `metadata/preview_image/media_key` became required
  - the request property `metadata/shared_info/shared` became required
  - the request property `metadata/sticker_info/stickers` became required
  - the request property `metadata/upload_source/upload_source` became required
  - removed the enum value `PreviewImage` of the request property `metadata/preview_image/media_key/media_category`
  - added the pattern `^[0-9]{1,19}$` to the request property `metadata/preview_image/media_key/media`
  - the `metadata/geo_restrictions` request property type changed from `object` to no type
  - the `metadata/preview_image/media_key/media` request property type changed from `number` to `string`, and format from `long` to no format
  - added `subschema #1, subschema #2` to the `data/associated_metadata/geo_restrictions` response property `oneOf` list for the response status `200`
  - the `data/associated_metadata/geo_restrictions` response's property type changed from `object` to no type for status `200`
  - the `data/associated_metadata/preview_image/media_key/media` response's property type changed from `number` to `string`, and format from `long` to no format for status `200`
  - removed the request property `metadata/geo_restrictions/blacklisted_country_codes`
  - removed the request property `metadata/geo_restrictions/whitelisted_country_codes`
  - removed the optional property `data/associated_metadata/geo_restrictions/blacklisted_country_codes` from the response with the `200` status
  - removed the optional property `data/associated_metadata/geo_restrictions/whitelisted_country_codes` from the response with the `200` status
  - added the new `TweetImage` enum value to the `data/associated_metadata/preview_image/media_key/media_category` response property for the response status `200`
  - api operation id `metadataCreate` removed and replaced with `createMediaMetadata`
  - api tag `Media` added
  - api tag `MediaUpload` removed
  - the `media_category` request property default value `TweetImage` was added
  - added the new `TweetImage` enum value to the request property `metadata/preview_image/media_key/media_category`
  - added `subschema #1, subschema #2` to the `metadata/geo_restrictions` request property `oneOf` list
  - the response property `data/associated_metadata/alt_text/text` became required for the status `200`
  - the response property `data/associated_metadata/content_expiration/timestamp_sec` became required for the status `200`
  - the response property `data/associated_metadata/domain_restrictions/whitelist` became required for the status `200`
  - the response property `data/associated_metadata/found_media_origin/id` became required for the status `200`
  - the response property `data/associated_metadata/found_media_origin/provider` became required for the status `200`
  - the response property `data/associated_metadata/management_info/managed` became required for the status `200`
  - the response property `data/associated_metadata/preview_image/media_key` became required for the status `200`
  - the response property `data/associated_metadata/shared_info/shared` became required for the status `200`
  - the response property `data/associated_metadata/sticker_info/stickers` became required for the status `200`
  - the response property `data/associated_metadata/upload_source/upload_source` became required for the status `200`
  - the `media_category` response's property default value `TweetImage` was added for the status `200`
  - removed the `PreviewImage` enum value from the `data/associated_metadata/preview_image/media_key/media_category` response property for the response status `200`
  - …1 more
- **2025-05-16** `141a148b1e41`: 2 info
  - removed `https://api.twitter.com/2/problems/oauth1-permissions` mapping keys from the response discriminator for the response status `default`
  - removed `https://api.twitter.com/2/problems/oauth1-permissions` discriminator mapping keys from the `errors/items/` response property for the response status `200`
- **2025-04-29** `18b84dc8a40e`: 1 info
  - endpoint added

---

[Operation](https://skmtc.dev/x/apis/x-api-v2/docs/2/media/metadata/post.md) - [API](https://skmtc.dev/x/apis/x-api-v2.md) - [Page](https://skmtc.dev/x/apis/x-api-v2/changes/2/media/metadata/post)
