# How to add alt text to images on X and LinkedIn

On **X**, attach a photo, select **+Alt** in the mobile app or **Add description** on the web, write the description
and select **Done**. On **LinkedIn**, upload the image, select **Alt.text** on desktop or **ALT** on mobile, write the
description and select **Save** or **Done**. Do this for each image before publishing.

Alt text describes the image to someone who cannot see it. It is separate from the post's visible caption, and a
screen reader can read it alongside the post. You don't need a scheduling tool to add it in either app.

The networks' own help pages and API documentation were **checked on October 26, 2026**. X Help was checked through
its search-indexed text because direct access returned 403; X's API reference and LinkedIn's help and API docs were
read directly. This is a documentation check, not a live posting test. Sources are linked beside the claims below.

## Alt-text character limits: app and API are different contracts

| Network and route | Documented maximum per image | Where the number comes from |
|---|---|---|
| X app and web | 1,000 characters | X's image-description help |
| X API v2 | 1,000 characters | `metadata.alt_text.text` in the media metadata reference |
| LinkedIn app and web | No numeric maximum stated in the cited help page | Use the composer's own validation; the API number below is not proof of the app's limit |
| LinkedIn API | 4,086 characters | LinkedIn's Images and MultiImage API docs; they recommend fewer than 120 characters |

A maximum is not a target. Use enough words to convey what matters, not every character the field accepts. LinkedIn's
**fewer-than-120 recommendation is guidance, not its 4,086-character API maximum**. A third-party tool may validate a
different length, so check the route you actually use.

## Why image descriptions matter

A screenshot, chart or photo can carry the main point of a post. Without a useful description, someone using a screen
reader may receive the caption but miss the evidence or instructions inside the image. LinkedIn's
[accessibility help](https://www.linkedin.com/help/linkedin/answer/a522523) explicitly describes alt text as a way for
screen-reader users to understand images. X's
[image-description help](https://help.x.com/en/using-x/picture-descriptions) explains how to make photos accessible.

Write for that person, not for a search ranking. Alt text is not a place for promotional copy, keyword stuffing or a
second unrelated caption. It does not replace captions for speech in a video or make a PDF document accessible.

## Add alt text on X: iPhone, Android and web

X's [instructions for image descriptions](https://help.x.com/en/using-x/picture-descriptions) give these routes:

1. Start a post and attach a photo.
2. On **iPhone or Android**, tap **+Alt** on the image. On **x.com**, click **Add description** below the image.
3. Describe the image, using up to **1,000 characters**, then select **Done**.
4. Repeat for every attached image. Reopen a description to check or edit it before posting.
5. Review the complete post and publish when you are ready.

X also calls the control **+ALT** in its
[short image-description guide](https://help.x.com/en/using-x/add-image-descriptions). A described image has an **ALT**
badge that readers can select to read the description. The description is attached to the image, not inserted into
the post's text. These are instructions for photos, not a video-captioning workflow.

## Add alt text on LinkedIn: desktop and mobile

LinkedIn's [own alt-text help](https://www.linkedin.com/help/linkedin/answer/a522523) documents the following steps:

1. Start a post and upload your image.
2. On **desktop**, click **Alt.text** below the image. In the **mobile app**, tap **ALT** below the image.
3. Enter the description. Select **Save** on desktop or **Done** on mobile.
4. Repeat for each image, review the post, then publish when ready.

LinkedIn can generate a description if you don't supply one. Its help says desktop uploaders receive a notification
when this happens, while mobile uploaders do not. That is not a guarantee that an automatic description captures your
chart's conclusion, the text in a screenshot or why this particular photo matters. Write and review your own when that
context is important.

The cited help page gives **no numeric app limit**. LinkedIn's API documents **4,086 characters**, but it would be
misleading to promise that the native composer accepts that many based only on the API. Check descriptions before
publishing rather than relying on a later edit; this guide does not establish an after-publication editing workflow.

## Write a description that supplies the missing information

X's [writing guidance](https://help.x.com/en/using-x/write-image-descriptions) recommends clear, objective descriptions
and including relevant text from the image. Don't infer someone's emotions, identity or intent from their appearance.
If an image contains too much text to fit, summarize the important part and put a link to the original document in the
post rather than burying it in alt text. Avoid needlessly repeating information the post already provides.

For example, for a synthetic bar chart, **“Bar chart: 24 drafts in September and 36 in October, a 50% increase”** conveys
more than “Chart of drafts.” For a screenshot, describe the relevant control or result and transcribe the words needed
to understand it. For multiple images, give each its own description; don't copy the same generic sentence onto all of
them. Use extra detail when it changes the meaning, not simply because there is room.

## X API: write media metadata before attaching the image

For an integration you control, upload the image first and retain its media ID. The current
[X media metadata endpoint](https://docs.x.com/x-api/media/create-media-metadata) is **`POST https://api.x.com/2/media/metadata`**.
Its request body uses **`id`**, not `media_id`, and nests the description under **`metadata.alt_text.text`**:

```json
{
  "id": "1234567890123456789",
  "metadata": {
    "alt_text": {
      "text": "Bar chart: 24 drafts in September and 36 in October, a 50% increase."
    }
  }
}
```

This is an illustrative metadata body with a placeholder ID, not a runnable posting recipe. The text maximum is
**1,000 characters**. Use authorized user-context credentials; the OAuth 2.0 route requires `media.write`. Send metadata
before creating the post that attaches that media ID. Putting `alt_text` in the post's visible `text` is not the same
operation, and an upload's success alone does not establish that the description was saved. Check the metadata
response and don't silently discard a failure in your own integration.

These are the current **v2** fields. Don't mix them with an older v1.1 media-metadata example that uses a different
endpoint or body. For the surrounding upload and post fields, see the
[X threads, polls and media guide](/docs/guides/x-api-threads-polls-media).

## LinkedIn API: put altText on each post image

Upload the image through the Images API to obtain an image URN. LinkedIn's
[Images API example](https://learn.microsoft.com/en-us/linkedin/marketing/community-management/shares/images-api?view=li-lms-2026-10)
then creates a post through **`POST /rest/posts`**, with the description in **`content.media.altText`** and the image
URN in **`content.media.id`**. Here is just the content fragment, not a complete publish request:

```json
{
  "content": {
    "media": {
      "id": "urn:li:image:EXAMPLE",
      "altText": "Bar chart: 24 drafts in September and 36 in October, a 50% increase."
    }
  }
}
```

For multiple images, the
[MultiImage API](https://learn.microsoft.com/en-us/linkedin/marketing/community-management/shares/multiimage-post-api?view=li-lms-2026-10)
puts each image URN and description in **`content.multiImage.images[].id`** and **`content.multiImage.images[].altText`**.
The documented maximum is **4,086 characters** and the recommendation is **fewer than 120**. Both references here use
LinkedIn API version **202610**. Alt text belongs in these post-content fields; a filename, a visible `commentary`
caption or an upload initialization is not a substitute.

A complete integration also needs member consent, the right publishing permission and the version headers. Those
requirements are separate from naming the field correctly. See the
[LinkedIn personal-profile API guide](/docs/guides/linkedin-api-personal-profile) for the permission boundaries.

## One other option: prepare image descriptions in Flaghand

If an AI agent prepares your posts, **Flaghand is one option** for carrying alt text with the draft rather than asking
you to retype it in each app. Its [drafts and media reference](https://app.flaghand.com/docs/drafts-and-media) documents a library
image's default **`alt`** and a draft's per-image **`media[].alt`** override. If the draft omits that override, the library
description is copied into the draft. The implemented checks enforce X's 1,000-character and LinkedIn's 4,086-character
image limits; these are platform constraints, not writing targets.

Agents can upload, draft, check and request approval through the API or MCP. **Agent tokens cannot approve, schedule
or publish.** The owner reviews the exact snapshot, including the image descriptions, and approves with a passkey.
LinkedIn support is for personal profiles, not company Page publishing. LinkedIn live post read-back is unavailable
with Flaghand's current permissions, so a returned post link is not a verified match of the live image description.
The [agent reference](https://app.flaghand.com/docs/agents) explains that boundary.

**Public sign-up is not open yet.** [Join the Flaghand waitlist](/schedule) if this workflow fits. For a photo you are
posting yourself today, the native X or LinkedIn controls above are the simpler option.

[All guides](/docs/guides.md)
