# X Post Card Renderer

> Run X Post Card Renderer by x online or via API. from $0.00000277/sec, no setup.

**URL:** https://inference.sh/apps/x/post-render
**Last updated:** 2026-11-03

---

Render X/Twitter post cards as PNG images — dark/light theme, profile picture, engagement metrics

- app: `x/post-render`
- maker: [x](https://inference.sh/apps/x.md)
- category: [image](https://inference.sh/apps/category/image.md)
- tasks: [social media](https://inference.sh/apps/tag/social-media.md), [rendering](https://inference.sh/apps/tag/rendering.md)
- price: from $0.00000277/sec
- runs via: api, javascript and python sdk, belt cli, mcp

## post-render API Guide

### About
render x/twitter post cards as png images — dark/light theme, profile picture, engagement metrics

### Get an API Key
Create one in [settings → api keys](https://app.inference.sh/settings/keys). The examples read it from `INFERENCE_API_KEY`.

```bash
export INFERENCE_API_KEY="inf_your_key"
```

### 1. Calling the API

#### Install the Client

```bash
pip install inferencesh
```

#### Run and Get Result
Submit a request and wait for the final result.

```python
import os
from inferencesh import inference

client = inference(api_key=os.environ["INFERENCE_API_KEY"])

## version @4m3ggdc5 pinned
result = client.run({
        "app": "x/post-render@4m3ggdc5",
        "input": {
            "text": "text",
            "author": {
                "name": "name",
                "username": "username",
                "profile_image_url": "profile_image_url"
            }
        }
    })

print(result["output"])
```

#### Stream Live Updates
Get real-time progress updates as the task runs.

```python
import os
from inferencesh import inference

client = inference(api_key=os.environ["INFERENCE_API_KEY"])

## version @4m3ggdc5 pinned
## stream=True yields updates as they arrive
for update in client.run({
        "app": "x/post-render@4m3ggdc5",
        "input": {
            "text": "text",
            "author": {
                "name": "name",
                "username": "username",
                "profile_image_url": "profile_image_url"
            }
        }
    }, stream=True):
    if update.get("progress"):
        print(f"progress: {update['progress']}%")
    if update.get("output"):
        print(f"output: {update['output']}")
```

#### Run in the Background
Start the task and get its id back right away, then check on it with `GET /tasks/{id}`. It is done when `status` is 10 (completed), 11 (failed) or 12 (cancelled).

```python
import os
from inferencesh import inference, TaskStatus

client = inference(api_key=os.environ["INFERENCE_API_KEY"])

## returns as soon as the task is created
task = client.run({
        "app": "x/post-render@4m3ggdc5",
        "input": {
            "text": "text",
            "author": {
                "name": "name",
                "username": "username",
                "profile_image_url": "profile_image_url"
            }
        }
    }, wait=False)

## later: read its current state
state = client.tasks.get(task["id"]).data
if state["status"] == TaskStatus.COMPLETED:
    print(state["output"])
```

### 2. Files

#### Automatic Upload

```python
## local file paths are automatically uploaded
result = client.run({
    "app": "x/post-render@4m3ggdc5",
    "input": {
        "image": "/path/to/local/image.png",  # detected & uploaded
        "audio": "https://example.com/audio.mp3",  # url passed through
    }
})
```

#### Manual Upload

```python
## upload and get a hosted URL
file = client.files.upload("/path/to/file.png")
print(file.uri)  # https://cloud.inference.sh/...
```

### 3. Schema

#### Input
- **text** (string) *required*: Post text content
- **author** (object) *required*: Author info from x/user-get
- **created_at** (string): Post timestamp ISO string
- **like_count** (number): like_count
- **retweet_count** (number): retweet_count
- **reply_count** (number): reply_count
- **view_count** (number): view_count
- **bookmark_count** (number): bookmark_count
- **media_urls** (array): Image URLs embedded in the post
- **theme** (string): theme
- **width** (number): Card width in pixels
- **padding** (number): Outer padding around the card
- **background_color** (string): Outer background color (defaults to match theme)

#### Output
- **image** (any): Rendered post card PNG

## other image apps

- [GPT Image 2.6 Flare](https://inference.sh/apps/openai/gpt-image-2-6-flare.md): $30.00/M output, $5.00/M text input, $8.00/M image input, $0.10/M SVG input, $0.50/M SVG output
- [GPT Image 2.6 Sunburst](https://inference.sh/apps/openai/gpt-image-2-6-sunburst.md): $30.00/M out, $5.00/M text in, $8.00/M img in; SVG $0.10/$0.50/M in/out
- [Gemini Nano Banana 2.1](https://inference.sh/apps/google/gemini-nano-banana-2-1.md): $1.50/M input, $0.0336–$0.1134/image (1K–4K), +$0.014/query Google Search
- [Grok Imagine Image 2.0](https://inference.sh/apps/xai/grok-imagine-image-2-0.md): $0.04/img low 1k, $0.06/img low 2k, $0.06/img med 1k, $0.08/img med 2k; $0.01/source img (edits)
- [GPT Image 2.5 Sunburst](https://inference.sh/apps/openai/gpt-image-2-5-sunburst.md): $0.006-$0.21 per 1024x1024 image: low $0.006, medium $0.013, high $0.053, xhigh $0.094, max $0.21. Larger sizes cost more; edits add ~$0.008 per reference image.

## faq

### how much does X Post Card Renderer cost?

from $0.00000277/sec. you pay per run from your inference shell credits. no subscription is required.

### how do I run X Post Card Renderer via api?

call x/post-render with the javascript or python sdk, the rest api, or `belt app run x/post-render` from a terminal. the api reference on this page lists every input.

### who makes X Post Card Renderer?

X Post Card Renderer is made by x and runs on inference shell. every x app is listed at https://inference.sh/apps/x.

### can my agent use X Post Card Renderer?

yes. agents call it as a tool through the inference shell mcp server (https://api.inference.sh/mcp), the belt cli or the sdk, and pay per run like you do.

### what are the alternatives to X Post Card Renderer?

other image apps on inference shell include GPT Image 2.6 Flare, GPT Image 2.6 Sunburst, Gemini Nano Banana 2.1, Grok Imagine Image 2.0. they run through the same api, so switching is a one-line change.
