Assets Input Migration
The assets field on createPost, editPost, and on thread items (metadata.thread[]) is changing from a multi-field object to an ordered array of typed items. This guide covers what's changing, why, and how to update your code.
Action required by May 25, 2026. The old shape still works today thanks to a transparent translation layer. After that date, requests using the old shape will be rejected with a GraphQL validation error.
What has changed
The assets field on createPost, editPost, and on thread items (metadata.thread[]) changes from a multi-field object { images, videos, documents, link } to an ordered array of typed items [AssetInput!], where each item is exactly one of { image | video | document | link }.
This change introduces a predictable rendering order and a cleaner @oneOf shape (exactly one field per item, enforced by the schema).
Who needs to migrate?
This change affects any code that sends an assets field to createPost, editPost, or inside thread items at metadata.thread[]. If you've integrated with the Buffer API during Beta, that almost certainly includes you.
If you handcraft JSON, your client will not break immediately, but you must complete the migration by the deadline above.
If you use autogenerated GraphQL types (graphql-codegen, gql.tada, apollo codegen, etc.), your generated CreatePostInput.assets type is impacted immediately. Regenerate against the new schema and you'll see exactly which fields need updating.
Detecting old-shape usage
Every API request using the old shape returns a deprecation warning:
"extensions": {
"warnings": [
{
"code": "DEPRECATED_LEGACY_ASSETS_INPUT",
"message": "The legacy AssetsInput shape is deprecated. Send [AssetInput!] instead.",
"paths": ["input.assets"]
}
]
}
If you see this warning in your API responses, your implementation is using the old shape. The paths array tells you exactly which fields you need to update.
Migration details
The mapping is mechanical - same data, just rearranged.
| Old | New |
|---|---|
{ images: [a, b] } |
[{ image: a }, { image: b }] |
{ videos: [v] } |
[{ video: v }] |
{ documents: [d] } |
[{ document: d }] |
{ link: l } |
[{ link: l }] |
{ images: [a], videos: [v] } |
[{ image: a }, { video: v }] |
{} (clear all media on edit) |
[] |
Examples
Creating a post with mixed assets
The mutation itself is unchanged - only the variables shape changes.
Before:
mutation CreatePost($input: CreatePostInput!) {
createPost(input: $input) {
...
}
}
# variables
{
"input": {
"channelId": "…",
"schedulingType": "automatic",
"mode": "addToQueue",
"text": "Hello",
"assets": {
"images": [
{
"url": "https://example.com/a.jpg"
}
],
"videos": [
{
"url": "https://example.com/v.mp4"
}
]
}
}
}
After:
mutation CreatePost($input: CreatePostInput!) {
createPost(input: $input) {
...
}
}
# variables
{
"input": {
"channelId": "…",
"schedulingType": "automatic",
"mode": "addToQueue",
"text": "Hello",
"assets": [
{
"image": {
"url": "https://example.com/a.jpg"
}
},
{
"video": {
"url": "https://example.com/v.mp4"
}
}
]
}
}
Key difference: the order of items in the array determines the order they'll appear in the carousel.
Threaded posts
The same change applies to assets inside thread items in Twitter, Bluesky, Mastodon, and Threads metadata.
Before:
{
"metadata": {
"twitter": {
"thread": [
{ "text": "Part 1", "assets": { "images": [{ "url": "https://example.com/a.jpg" }] } },
{ "text": "Part 2", "assets": { "videos": [{ "url": "https://example.com/v.mp4" }] } }
]
}
}
}
After:
{
"metadata": {
"twitter": {
"thread": [
{ "text": "Part 1", "assets": [{ "image": { "url": "https://example.com/a.jpg" } }] },
{ "text": "Part 2", "assets": [{ "video": { "url": "https://example.com/v.mp4" } }] }
]
}
}
}
Migration timeline
The new shape has been live since May 12, 2026. The old shape will stop being accepted on May 25, 2026. Make sure to complete your migration by that date.
| Date | What happens |
|---|---|
| Before May 25, 2026 | Both shapes accepted. Old shape returns a deprecation warning. |
| May 25, 2026 | Old shape rejected with a GraphQL validation error. New shape required. |
Resources
- Read a full API Changelog
- Try the new shape in the Explorer
- Need help with migration? Join the Buffer community on Discord and share your questions.