# Detail & Texture Source: https://docs.thrixel.com/docs/detail import { Tab, Tabs } from 'fumadocs-ui/components/tabs'; import { Callout } from 'fumadocs-ui/components/callout'; Phase 4 takes a completed submission (the "control mesh") and produces a high-resolution textured model using a GPU pipeline. You can also remesh or retexture an existing Phase 4 result without regenerating from scratch. --- ## Detail and texture a model Requires API key. Generate a high-resolution textured mesh from a parent submission. A reference image and prompt guide the texture style; if omitted, they are auto-generated from the parent. ### Request Body | Name | Type | Description | | --- | --- | --- | | `parent_submission_id` | string (required) | ID of the submission to detail. | | `image` | string | Reference image (base64 or HTTPS URL). Auto-generated if omitted. | | `mesh` | string | Override control mesh (base64 or URL). Defaults to the parent's GLB. | | `prompt` | string | Text description of the desired appearance. | | `seed` | integer | Random seed for reproducibility. 0–999,999. Default: `42`. | | `texture_size` | integer | Output texture resolution. Values: `512`, `768`, `1024`, `2048`. Default: `768`. | | `control_mesh_voxelize_res` | integer | Voxel resolution for mesh conditioning. 256–2048. Default: `512`. | | `decimation_target` | integer | Target triangle count after decimation. 10,000–500,000. Default: `160000`. | | `pipeline_type` | string | Detailer pipeline variant. Values: `1024_cascade`, `1536_cascade`. | | `control_mesh_ss_lat_noise_t0idx` | integer | Sparse-structure noise timestep. 0–12. | | `preserve_parts` | boolean | Keep separate mesh parts intact during decimation. Default: `true`. | | `focus_on_node_names` | string[] | Node names to focus the generation on. Empty = whole mesh. | | `focus_mode` | string | Where to apply focus during generation. Values: `latent`, `sparse_structure`. Default: `latent`. | | `project_id` | string | Assign to a project. | ### Example Request ```bash curl -X POST https://api.thrixel.com/api/v1/detailer/submit \ -H "Authorization: Bearer sk-thrixel-" \ -H "Content-Type: application/json" \ -d '{ "parent_submission_id": "a1b2c3d4-...", "prompt": "weathered bronze, green patina", "texture_size": 1024 }' ``` ### Example Response ```json { "submission_id": "e5f6a7b8-...", "status": "queued", "created_at": "2026-04-20T14:45:30Z", "reference_image_url": "https://api.thrixel.com/api/v1/detailer/reference/e5f6a7b8-..." } ``` --- ## Re-decimate a Phase 4 mesh Requires API key. Produce a new triangle count from an existing Phase 4 checkpoint without regenerating texture. Fast — reuses stored latents. ### Request Body | Name | Type | Description | | --- | --- | --- | | `parent_submission_id` | string (required) | ID of a completed Phase 4 submission. | | `decimation_target` | integer | Target triangle count. 10,000–500,000. Default: `200000`. | | `remesh` | boolean | Run quad remeshing before decimation. Default: `true`. | | `project_id` | string | Assign to a project. | ### Example Request ```bash curl -X POST https://api.thrixel.com/api/v1/detailer/remesh \ -H "Authorization: Bearer sk-thrixel-" \ -H "Content-Type: application/json" \ -d '{ "parent_submission_id": "e5f6a7b8-...", "decimation_target": 80000 }' ``` --- ## Re-texture an existing mesh Requires API key. Regenerate textures for a completed Phase 4 submission. Three modes: rebake (re-project existing), regenerate (new texture from image), or rebake_texture (UV rebake only). ### Request Body | Name | Type | Description | | --- | --- | --- | | `parent_submission_id` | string (required) | ID of a completed Phase 4 submission. | | `texture_size` | integer | Output texture resolution. Values: `512`, `768`, `1024`, `2048`. Default: `1024`. | | `mode` | string | Retexture strategy. Values: `rebake`, `regenerate`, `rebake_texture`. Default: `rebake`. | | `image` | string | Reference image for `regenerate` mode. | | `apply_to_node_names` | string[] | Restrict retexture to specific mesh nodes. | | `project_id` | string | Assign to a project. | ### Example Request ```bash curl -X POST https://api.thrixel.com/api/v1/detailer/retexture \ -H "Authorization: Bearer sk-thrixel-" \ -H "Content-Type: application/json" \ -d '{ "parent_submission_id": "e5f6a7b8-...", "mode": "rebake", "texture_size": 2048 }' ``` --- ## Fetch reference image Public. Returns the user-provided or auto-generated reference image used to guide the Phase 4 pipeline. PNG. ### Path Parameters | Name | Type | Description | | --- | --- | --- | | `submission_id` | string (required) | UUID of a Phase 4 submission. | ### Example Request ```bash curl -L -o reference.png \ https://api.thrixel.com/api/v1/detailer/reference/e5f6a7b8-... ``` --- # Download & Export Source: https://docs.thrixel.com/docs/download import { Tab, Tabs } from 'fumadocs-ui/components/tabs'; import { Callout } from 'fumadocs-ui/components/callout'; GLB is produced when a submission completes. Other formats are converted on-demand: either inline via the unified `/download` endpoint (which waits for the result), or asynchronously via the `/convert` job API. --- ## Download a submission asset Public. Unified endpoint for all downloadable artifacts. GLB is always ready; FBX/OBJ/STL/USDZ trigger an on-demand conversion if not yet cached. ### Path Parameters | Name | Type | Description | | --- | --- | --- | | `submission_id` | string (required) | UUID of the submission. | ### Query Parameters | Name | Type | Description | | --- | --- | --- | | `format` | string | Asset format. Values: `glb`, `fbx`, `obj`, `stl`, `usdz`, `py`, `thumbnail`, `reference_image`. Default: `glb`. | | `index` | integer | Index for `reference_image` format (0–5). Default: `0`. | ### Example Request ```bash # GLB (instant) curl -L -o model.glb \ "https://api.thrixel.com/api/v1/a1b2c3d4-.../download?format=glb" # FBX (triggers conversion, may take a few seconds) curl -L -o model.fbx \ "https://api.thrixel.com/api/v1/a1b2c3d4-.../download?format=fbx" ``` --- ## Queue a conversion job Public. Async alternative to `/download` for non-GLB formats. Returns immediately with a `job_id` to poll. Re-requesting the same (submission, format) returns the existing ready job unless `force=true`. ### Request Body | Name | Type | Description | | --- | --- | --- | | `submission_id` | string (required) | UUID of the submission to convert. | | `format` | string (required) | Target format. Values: `fbx`, `obj`, `stl`, `usdz`. | | `force` | boolean | Re-run the conversion even if a ready job exists. Default: `false`. | ### Example Request ```bash curl -X POST https://api.thrixel.com/api/v1/convert \ -H "Content-Type: application/json" \ -d '{"submission_id": "a1b2c3d4-...", "format": "usdz"}' ``` ### Example Response ```json { "job_id": "f7a8b9c0-...", "submission_id": "a1b2c3d4-...", "format": "usdz", "status": "queued", "error": null, "download_url": null, "status_url": "https://api.thrixel.com/api/v1/convert/f7a8b9c0-..." } ``` --- ## Check conversion status Public. Returns the current status of a conversion job. Poll until status becomes `ready` or `failed`. ### Path Parameters | Name | Type | Description | | --- | --- | --- | | `job_id` | string (required) | UUID returned by `POST /convert`. | ### Example Request ```bash curl https://api.thrixel.com/api/v1/convert/f7a8b9c0-... ``` ### Example Response ```json { "job_id": "f7a8b9c0-...", "submission_id": "a1b2c3d4-...", "format": "usdz", "status": "ready", "error": null, "download_url": "https://api.thrixel.com/api/v1/convert/f7a8b9c0-.../download", "status_url": "https://api.thrixel.com/api/v1/convert/f7a8b9c0-..." } ``` --- ## Download a converted file Public. Returns the converted file once ready. 409 if still queued/running, 410 if the job failed. ### Path Parameters | Name | Type | Description | | --- | --- | --- | | `job_id` | string (required) | UUID of a ready conversion job. | ### Example Request ```bash curl -L -o model.usdz \ https://api.thrixel.com/api/v1/convert/f7a8b9c0-.../download ``` --- # Gallery Source: https://docs.thrixel.com/docs/gallery import { Tab, Tabs } from 'fumadocs-ui/components/tabs'; import { Callout } from 'fumadocs-ui/components/callout'; Published models curated by the Thrixel team. All endpoints are public. --- ## List gallery items Public. Returns a flat list of published gallery items. Each item includes a `parent_id` so you can reconstruct the hierarchy on the client. ### Query Parameters | Name | Type | Description | | --- | --- | --- | | `limit` | integer | Max items. Default: `500`. | ### Example Request ```bash curl "https://api.thrixel.com/api/v1/gallery?limit=100" ``` --- ## Get gallery item Public. Returns a single gallery item plus its direct children. ### Path Parameters | Name | Type | Description | | --- | --- | --- | | `item_id` | string (required) | UUID of the gallery item. | --- ## Get gallery subtree Public. Returns a gallery item plus all descendants as a flat list (max 10 levels deep). Use `parent_id` on each item to rebuild the tree. ### Path Parameters | Name | Type | Description | | --- | --- | --- | | `item_id` | string (required) | UUID of the root gallery item. | --- ## Download a gallery asset Public. Resolves `entity_id` as a gallery item first, then as a submission. Gallery items serve `model.{ext}`; submissions serve `phase{N}.{ext}`. ### Path Parameters | Name | Type | Description | | --- | --- | --- | | `entity_id` | string (required) | UUID of a gallery item or submission. | ### Query Parameters | Name | Type | Description | | --- | --- | --- | | `format` | string | Asset format. Values: `glb`, `fbx`, `obj`, `stl`, `usdz`, `py`, `thumbnail`, `reference_image`. Default: `glb`. | | `index` | integer | Index for `reference_image` format. Default: `0`. | ### Example Request ```bash curl -L -o model.glb \ "https://api.thrixel.com/api/v1/gallery/abc-.../download?format=glb" ``` --- # Getting Started Source: https://docs.thrixel.com/docs/getting-started import { Tab, Tabs } from 'fumadocs-ui/components/tabs'; ## What is Thrixel? Thrixel turns text prompts and reference images into production-ready 3D models through a five-phase pipeline. You submit a request, poll (or stream) until it's ready, then download the result in GLB, FBX, OBJ, STL, or USDZ. ## Base URL ```bash https://api.thrixel.com/api/v1 ``` ## Authentication Authenticated endpoints require an API key passed as a Bearer token. Keys are in the format `sk-thrixel-...` and are issued by the Thrixel team — contact us to obtain one. ```bash Authorization: Bearer sk-thrixel- ``` Public endpoints (info, stream, downloads, convert, gallery) do not require authentication. ## Rate Limits Each API key is subject to three limits (defaults shown — your plan may differ): - **Concurrent jobs** — 3 active (queued or processing) submissions at a time - **Hourly** — 10 requests per rolling hour - **Daily** — 50 requests per rolling 24 hours ## Quickstart Submit a text prompt, wait for the job to complete, and download the GLB: ```bash # 1. Submit a prompt curl -X POST https://api.thrixel.com/api/v1/phase1/submit \ -H "Authorization: Bearer sk-thrixel-" \ -H "Content-Type: application/json" \ -d '{"task": "a small stone gargoyle holding a lantern"}' # → {"submission_id": "abc-123", "status": "queued", "created_at": "..."} # 2. Poll until completed curl https://api.thrixel.com/api/v1/abc-123/info # → {"status": "completed", ...} # 3. Download the GLB curl -L -o model.glb https://api.thrixel.com/api/v1/abc-123/download?format=glb ``` ```python import requests, time BASE = "https://api.thrixel.com/api/v1" KEY = "sk-thrixel-" # 1. Submit r = requests.post( f"{BASE}/phase1/submit", headers={"Authorization": f"Bearer {KEY}"}, json={"task": "a small stone gargoyle holding a lantern"}, ) submission_id = r.json()["submission_id"] # 2. Poll while True: info = requests.get(f"{BASE}/{submission_id}/info").json() if info["status"] in ("completed", "failed"): break time.sleep(5) # 3. Download glb = requests.get(f"{BASE}/{submission_id}/download?format=glb") open("model.glb", "wb").write(glb.content) ``` --- # Thrixel API Source: https://docs.thrixel.com/docs The Thrixel API turns text prompts and reference images into production-ready 3D models through a five-phase pipeline. You submit a request, poll (or stream) until it's ready, then download the result in GLB, FBX, OBJ, STL, or USDZ. ## Where to start - [Getting Started](/docs/getting-started) — base URL, authentication, rate limits, and a quickstart. - [Core Workflow](/docs/workflow) — generation endpoints (Phase 1, 2, 3, 5). - [Track Progress](/docs/progress) — polling, streaming (SSE), and submission listing. - [Detail & Texture](/docs/detail) — Phase 4 GPU detailing, remesh, and retexture. - [Download & Export](/docs/download) — unified download endpoint and async conversion. - [Organize](/docs/organize) — projects, nicknames, archive, pin. - [Gallery](/docs/gallery) — public published models. ## Base URL ```bash https://api.thrixel.com/api/v1 ``` --- # Organize Source: https://docs.thrixel.com/docs/organize import { Tab, Tabs } from 'fumadocs-ui/components/tabs'; import { Callout } from 'fumadocs-ui/components/callout'; Group related submissions into projects, give them nicknames, pin favorites, and archive older work. All endpoints below require authentication and act on resources owned by your API key. ## Projects --- ### List projects Requires API key. Returns all projects owned by the authenticated API key. #### Query Parameters | Name | Type | Description | | --- | --- | --- | | `include_archived` | boolean | Include archived projects. Default: `false`. | #### Example Request ```bash curl -H "Authorization: Bearer sk-thrixel-" \ https://api.thrixel.com/api/v1/projects ``` #### Example Response ```json { "projects": [ { "id": "p1q2r3s4-...", "name": "Gargoyle variations", "description": "Stylistic experiments", "is_archived": false, "created_at": "2026-04-18T09:00:00Z", "updated_at": "2026-04-20T14:00:00Z", "submission_count": 7 } ], "count": 1 } ``` --- ### Create a project Requires API key. #### Request Body | Name | Type | Description | | --- | --- | --- | | `name` | string (required) | Project name. 1–255 characters. | | `description` | string | Optional description. Max 2000 characters. | #### Example Request ```bash curl -X POST https://api.thrixel.com/api/v1/projects \ -H "Authorization: Bearer sk-thrixel-" \ -H "Content-Type: application/json" \ -d '{"name": "Gargoyle variations"}' ``` --- ### Get a project Requires API key. Returns project metadata plus an embedded list of its submissions (soft-deleted excluded). #### Path Parameters | Name | Type | Description | | --- | --- | --- | | `project_id` | string (required) | UUID of the project. | --- ### Update a project Requires API key. Rename or re-describe. At least one field required. #### Path Parameters | Name | Type | Description | | --- | --- | --- | | `project_id` | string (required) | UUID of the project. | #### Request Body | Name | Type | Description | | --- | --- | --- | | `name` | string | New name. 1–255 characters. | | `description` | string | New description. Max 2000 characters. | --- ### Delete a project Requires API key. Permanently deletes the project. Submissions in the project are unlinked (`project_id` set to `null`) — they are not deleted. #### Path Parameters | Name | Type | Description | | --- | --- | --- | | `project_id` | string (required) | UUID of the project. | ## Submission Management --- ### Set or clear the nickname Requires API key. #### Path Parameters | Name | Type | Description | | --- | --- | --- | | `submission_id` | string (required) | UUID of the submission. | #### Request Body | Name | Type | Description | | --- | --- | --- | | `nickname` | string \| null | Display label. Pass `null` to clear. Max 255 characters. | --- ### Archive or unarchive Requires API key. #### Path Parameters | Name | Type | Description | | --- | --- | --- | | `submission_id` | string (required) | UUID of the submission. | #### Request Body | Name | Type | Description | | --- | --- | --- | | `is_archived` | boolean (required) | `true` to archive, `false` to restore. | --- ### Toggle visibility Requires API key. Hides or shows the submission in list endpoints without deleting it. #### Path Parameters | Name | Type | Description | | --- | --- | --- | | `submission_id` | string (required) | UUID of the submission. | #### Request Body | Name | Type | Description | | --- | --- | --- | | `is_visible` | boolean (required) | `true` to show, `false` to hide. | --- ### Pin or unpin Requires API key. Pinned submissions sort to the top of lists. #### Path Parameters | Name | Type | Description | | --- | --- | --- | | `submission_id` | string (required) | UUID of the submission. | #### Request Body | Name | Type | Description | | --- | --- | --- | | `is_pinned` | boolean (required) | `true` to pin, `false` to unpin. | --- ### Assign to a project Requires API key. Move the submission into a project, or pass `null` to remove. Both the submission and the target project must belong to your API key. #### Path Parameters | Name | Type | Description | | --- | --- | --- | | `submission_id` | string (required) | UUID of the submission. | #### Request Body | Name | Type | Description | | --- | --- | --- | | `project_id` | string \| null | UUID of the target project, or `null` to unassign. | --- ### Soft-delete a submission Requires API key. Hides the submission from listings but preserves its data. Include soft-deleted items in `/submissions` via `include_deleted=true`. #### Path Parameters | Name | Type | Description | | --- | --- | --- | | `submission_id` | string (required) | UUID of the submission. | --- # Track Progress Source: https://docs.thrixel.com/docs/progress import { Tab, Tabs } from 'fumadocs-ui/components/tabs'; import { Callout } from 'fumadocs-ui/components/callout'; Once a submission is created, monitor its lifecycle by polling `/info`, streaming `/stream` (Server-Sent Events), or listing all your submissions. --- ## Get submission metadata Public. Returns current status, phase, input, and parent chain. Use this for simple polling. ### Path Parameters | Name | Type | Description | | --- | --- | --- | | `submission_id` | string (required) | UUID returned by any submit endpoint. | ### Example Request ```bash curl https://api.thrixel.com/api/v1/a1b2c3d4-.../info ``` ### Example Response ```json { "submission_id": "a1b2c3d4-...", "phase": 1, "status": "completed", "model": "thrixel+", "input": { "type": "text", "task": "a small stone gargoyle holding a lantern", "image": null, "images": null, "modification_request": null }, "parent_submission_id": null, "nickname": null, "is_archived": false, "is_visible": true, "is_deleted": false, "is_pinned": false, "adaptive_thinking": false, "created_at": "2026-04-20T14:32:11Z", "completed_at": "2026-04-20T14:34:02Z" } ``` --- ## Stream progress (SSE) Public. Server-Sent Events stream that emits progress updates, log messages, and status transitions in real time. Closes automatically when the submission reaches a terminal state. ### Path Parameters | Name | Type | Description | | --- | --- | --- | | `submission_id` | string (required) | UUID returned by any submit endpoint. | ### Example Request ```bash curl -N https://api.thrixel.com/api/v1/a1b2c3d4-.../stream ``` ```javascript const es = new EventSource( "https://api.thrixel.com/api/v1/a1b2c3d4-.../stream" ); es.onmessage = (e) => { const event = JSON.parse(e.data); console.log(event.type, event); }; ``` Event frames arrive as `data:` lines containing JSON. Common shapes: ```json // Progress update {"type": "progress", "percent": 0.42, "message": "Generating geometry..."} // Status change {"type": "status", "status": "processing"} // Terminal event — stream closes after this {"type": "status", "status": "completed"} ``` --- ## List your submissions Requires API key. Returns all submissions owned by the authenticated API key. Filter by status, phase, or project. ### Query Parameters | Name | Type | Description | | --- | --- | --- | | `status` | string | Filter by status. Values: `queued`, `processing`, `completed`, `failed`. | | `phase` | integer | Filter by phase. Values: `1`, `2`, `3`. | | `project_id` | string | Filter by project. | | `include_deleted` | boolean | Include soft-deleted submissions. Default: `false`. | | `limit` | integer | Max results. Default: `50`. | ### Example Request ```bash curl -H "Authorization: Bearer sk-thrixel-" \ "https://api.thrixel.com/api/v1/submissions?status=completed&limit=20" ``` ### Example Response ```json { "submissions": [ { "submission_id": "a1b2c3d4-...", "phase": 1, "status": "completed", "nickname": null, "is_pinned": false, "project_id": null, "created_at": "2026-04-20T14:32:11Z" } ], "count": 1 } ``` --- # Core Workflow Source: https://docs.thrixel.com/docs/workflow import { Tab, Tabs } from 'fumadocs-ui/components/tabs'; import { Callout } from 'fumadocs-ui/components/callout'; Generate a model from a text prompt, images, or an existing mesh. All four endpoints return a `submission_id` that you track via the endpoints on [Track Progress](/docs/progress). --- ## Create a model Requires API key. Start a new generation from a text prompt, a reference image, or up to six images. At least one of `task`, `image`, or `images` is required. ### Request Body | Name | Type | Description | | --- | --- | --- | | `task` | string | Natural-language description of the model to create. | | `image` | string | Single reference image — base64 data URL or HTTPS URL. | | `images` | string[] | Up to 6 reference images (base64 or HTTPS URLs). Mutually exclusive with `image`. | | `model` | string | LLM model override. Leave unset to use the default. | | `project_id` | string | Group the submission under a project. | | `adaptive_thinking` | boolean | Enable deeper reasoning pass. Slower but higher quality. Default: `false`. | ### Example Request ```bash curl -X POST https://api.thrixel.com/api/v1/phase1/submit \ -H "Authorization: Bearer sk-thrixel-" \ -H "Content-Type: application/json" \ -d '{"task": "a small stone gargoyle holding a lantern"}' ``` ```python import requests requests.post( "https://api.thrixel.com/api/v1/phase1/submit", headers={"Authorization": "Bearer sk-thrixel-"}, json={"task": "a small stone gargoyle holding a lantern"}, ) ``` ### Example Response ```json { "submission_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "status": "queued", "created_at": "2026-04-20T14:32:11Z" } ``` --- ## Auto-refine Requires API key. Run a vision-critique pass on a completed Phase 1 or Phase 2 submission. The backend inspects the result and produces an improved version. ### Request Body | Name | Type | Description | | --- | --- | --- | | `parent_submission_id` | string (required) | ID of a completed Phase 1 or Phase 2 submission. | | `project_id` | string | Inherit or override the parent's project. | | `adaptive_thinking` | boolean | Enable deeper reasoning pass. Default: `false`. | ### Example Request ```bash curl -X POST https://api.thrixel.com/api/v1/phase2/submit \ -H "Authorization: Bearer sk-thrixel-" \ -H "Content-Type: application/json" \ -d '{"parent_submission_id": "a1b2c3d4-..."}' ``` ### Example Response ```json { "submission_id": "b2c3d4e5-...", "status": "queued", "created_at": "2026-04-20T14:35:22Z" } ``` --- ## Modify a model Requires API key. Apply a natural-language edit to an existing model. Example: "make the lantern glow blue". ### Request Body | Name | Type | Description | | --- | --- | --- | | `parent_submission_id` | string (required) | ID of the submission to modify. | | `modification_request` | string (required) | Description of the change to apply. | | `project_id` | string | Inherit or override the parent's project. | | `adaptive_thinking` | boolean | Enable deeper reasoning pass. Default: `false`. | ### Example Request ```bash curl -X POST https://api.thrixel.com/api/v1/phase3/submit \ -H "Authorization: Bearer sk-thrixel-" \ -H "Content-Type: application/json" \ -d '{ "parent_submission_id": "a1b2c3d4-...", "modification_request": "make the lantern glow blue" }' ``` ### Example Response ```json { "submission_id": "c3d4e5f6-...", "status": "queued", "created_at": "2026-04-20T14:38:01Z" } ``` --- ## Upload an existing model Requires API key. Bring your own GLB file into Thrixel so you can run Phase 2, 3, or 4 operations on it. Multipart form upload, max 100 MB. ### Request Body | Name | Type | Description | | --- | --- | --- | | `glb_file` | file (required) | Binary `.glb` file (`Content-Type: multipart/form-data`). | | `task` | string | Optional label describing the uploaded model. Max 2000 chars. | | `project_id` | string | Assign to a project. | ### Example Request ```bash curl -X POST https://api.thrixel.com/api/v1/phase5/submit \ -H "Authorization: Bearer sk-thrixel-" \ -F "glb_file=@./my_model.glb" \ -F "task=hand-sculpted base mesh" ``` ```python import requests requests.post( "https://api.thrixel.com/api/v1/phase5/submit", headers={"Authorization": "Bearer sk-thrixel-"}, files={"glb_file": open("my_model.glb", "rb")}, data={"task": "hand-sculpted base mesh"}, ) ``` ### Example Response ```json { "submission_id": "d4e5f6a7-...", "status": "completed", "original_filename": "my_model.glb", "file_size_bytes": 4528192, "created_at": "2026-04-20T14:40:15Z" } ``` ---