CS2 Inspect links
in. Images out.
Render weapons, knives and gloves on a native GPU worker. Receive high-quality WebP images directly or by webhook.
How it works
Send an Inspect link. A native Vulkan GPU worker renders the item directly with alpha and returns the finished image. Jobs are durable, so a disconnected client does not cancel the render.
POST the Inspect link with your API key.
The item is captured and encoded once as WebP.
Wait for a direct response or accept a signed webhook.
Quick start
Use Direct mode for the shortest integration. Keep API keys on your server, never in browser code.
curl --max-time 910 -X POST https://api.cs2screen.com/v1/jobs \
-H 'X-API-Key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"url": "steam://run/730//+csgo_econ_action_preview%20YOUR_CERTIFICATE",
"mode": "front",
"response": "direct",
"returnType": "image"
}' --output item.webpcurl -X POST https://api.cs2screen.com/v1/jobs \
-H 'X-API-Key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"url": "steam://run/730//+csgo_econ_action_preview%20YOUR_CERTIFICATE",
"webhook": "https://example.com/webhooks/cs2screen",
"idempotency_key": "order-12345",
"mode": "both"
}'Request fields
| Field | Default | Use |
|---|---|---|
| url REQUIRED | — | A valid CS2 certificate Inspect link. |
| mode | front | front, back or both. |
| output | fixed | Every job uses a 3840×2160 Vulkan source and returns one 1920×2620 WebP at quality 100. |
| response | webhook | direct waits up to 900 seconds. webhook returns HTTP 202. |
| webhook | — | Required for Webhook mode; optional in Direct mode. Must be a public HTTPS URL. |
| returnType | image | Optional compatibility field. The only supported value is image. |
| id | generated UUID | Your optional job UUID. It is returned in every response and webhook. |
| idempotency_key | — | Use an order ID to safely retry the same request without creating another job. |
Results
Direct mode
Every successful mode returns the raw WebP as image/webp. The body contains only image bytes. Job, image and item data are provided in X-CS2-* response headers.
result_url. The job continues in the background.Webhook mode
The create call returns HTTP 202 with the job id. Later, every successful mode sends the same raw image/webp body and the same metadata headers as Direct mode. If Direct mode also includes a webhook URL, both destinations receive byte-identical WebP data.
Delivery is at least once with up to eight attempts. Deduplicate deliveries using event_id and return any HTTP 2xx quickly.
| Header | Value |
|---|---|
| X-CS2-Job-ID | Job UUID. |
| X-CS2-Mode / X-CS2-View | front, back or both. |
| X-CS2-SHA256 | SHA-256 of the exact WebP body. |
| X-CS2-Width / X-CS2-Height | Final image dimensions (always 1920×2620). |
| X-CS2-Float-Value | Decoded float when present. |
| X-CS2-Metadata | Base64url JSON containing image metadata and decoded item information, including stickers and keychains. |
Verify webhooks
Hash the exact raw WebP request body. The signed message is timestamp + "." + metadataHeader + "." + bodySha256.
| Header | Value |
|---|---|
| X-CS2-Event-ID | Stable delivery UUID. |
| X-CS2-Timestamp | Unix timestamp included in the signature. |
| X-CS2-Signature-Version | image-v1 for successful image delivery. |
| X-CS2-Signature | sha256=<hex> |
import crypto from "node:crypto";
const bodySha256 = crypto.createHash("sha256").update(rawWebpBody).digest("hex");
const expected = "sha256=" + crypto
.createHmac("sha256", WEBHOOK_SECRET)
.update(`${timestamp}.${metadataHeader}.${bodySha256}`, "utf8")
.digest("hex");
const supplied = signature || "";
const valid = expected.length === supplied.length &&
crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(supplied));Also compare bodySha256 with X-CS2-SHA256, reject old timestamps and store event_id with a unique constraint before returning HTTP 2xx. Failed jobs use an application/json error webhook marked json-v1.
Check a job
Returns the queue, render and delivery state. A rendered image is not necessarily delivered yet, so check render_status and delivery_status separately.
curl https://api.cs2screen.com/v1/jobs/JOB_UUID \ -H 'X-API-Key: YOUR_API_KEY'
Fetches a Direct result later. It returns HTTP 202 while the result is still being built.
Optional design and media
Design fields are applied after background removal to the fixed 1920×2620 output. Without a background the canvas remains transparent.
Show optional job fields
| Field | Use |
|---|---|
| with_float | Add the fixed open details layout: white item group, #E8FF33 paint name, Wear/Float/Pattern/Rarity and the wear scale. |
| item_name / paint_name | Optional title overrides. The Vulkan worker resolves missing names from Valve game data. |
| background_color | A named color or #RRGGBB/#RRGGBBAA. |
| background_media_id / background_url | Reusable Media ID or a public HTTPS image URL. |
| logo_media_id / logo_url | Optional logo. Position with logo_offset_start, x/y, opacity and width. |
| watermark_media_id / watermark_url | Optional watermark with the same position controls. |
| no_cache | Force URL media revalidation; limited to once per client and URL every ten minutes. |
Upload reusable media
Upload static PNG, WebP or JPEG bytes once, then use the returned media_id in jobs.
curl -X POST https://api.cs2screen.com/v1/media \ -H 'X-API-Key: YOUR_API_KEY' \ -H 'Content-Type: image/png' \ --data-binary @logo.png
Common responses
| Status | Meaning |
|---|---|
| 200/201 | Result returned or media created. |
| 202 | Job accepted or Direct result still pending. |
| 401 | Missing or invalid API key. |
| 409 | Job ID or idempotency conflict. |
| 422 | Invalid request, Inspect link, webhook or media. |
| 429 | Rate or queue limit. Follow Retry-After. |
| 5xx | Temporary service, render or media failure. |
Integration prompt
Copy this short context into your coding assistant and add your language and framework.