API referenceMedia
Get a media file
One photo or file, with a view_url that works for 15 minutes from this response. Fetch it again whenever you need the file; never store the link.
GET
https://app.xplantpro.com/ api/ v1/ assets/ {id}Scope
read:assetsPath parameters
| Name | Type | Required | Description |
|---|---|---|---|
id | string (uuid) | Yes | The record's id. |
Example
curl https://app.xplantpro.com/api/v1/assets/9e1a3c5b-7d9f-4b1d-a3c5-e7f9b1d3f5a7 \
-H "Authorization: Bearer $XPLANT_API_KEY"Response
200 with { "ok": true, "data": … }. data holds the result.
| Field | Type | Required | Description |
|---|---|---|---|
id | string (uuid) | Yes | — |
target | "plant" | "explant" | "contamination" | "sop" | Yes | The kind of record the file is attached to. |
target_id | string (uuid) | Yes | The id of that record. |
kind | string | Yes | What the file is: photo, video, annotation, document, diagram, scan, audio, other. Images attached through the API are photo. |
file_name | string | null | Yes | The file's name as xPlant shows it. |
content_type | string | null | Yes | The file's media type, for example image/jpeg, image/png. |
caption | string | null | Yes | The note stored with the file. |
captured_at | string | null | Yes | When the photo was taken, where that was recorded. ISO 8601. |
uploaded_by | string | null | Yes | User id of the workspace member who added the file. |
created_at | string | null | Yes | When the file was added. ISO 8601. |
view_url | string | null | Yes | A link to the file itself, valid for 15 minutes from this response. Fetch the asset again for a fresh link, and never store one. null when the file cannot be linked. |
view_url_expires_at | string | null | Yes | When view_url stops working. ISO 8601. |
{
"ok": true,
"data": {
"id": "8c2f1a6e-4b3d-4f7a-9e21-5d6c7b8a9f10",
"target": "explant",
"target_id": "3f9a2c1e-7b4d-4e8f-a6c5-1d2e3f4a5b6c",
"kind": "photo",
"file_name": "vessel-12-week-3.png",
"content_type": "image/png",
"caption": "Callus forming at the cut edge",
"captured_at": null,
"uploaded_by": "0d7e4b9a-6f21-4c3e-8a5b-2e9f1c7d4a60",
"created_at": "2026-09-25T14:20:11.000Z",
"view_url": "https://files.example.com/vessel-12-week-3.png?signature=4f9c2e",
"view_url_expires_at": "2026-09-25T14:35:11.000Z"
}
}| Response header | Meaning |
|---|---|
X-Request-Id | Identifies this request. Include it when you contact support. |
Errors
| Status | Code | When |
|---|---|---|
401 | UNAUTHORIZED | The key is missing, malformed or revoked, or its owner is no longer a member of the workspace. |
402 | PAID_PLAN_REQUIRED | The workspace's plan does not include the API. The full API is included with xPlant+ Teams and Enterprise; on Hobby and Pro Lab, keys can connect devices only. |
403 | FORBIDDEN | The key lacks a scope this operation requires, or its owner's current role in the workspace cannot use it — a key never does more than its owner can in xPlant. error names the scope, and for a role, the role it needs. |
403 | DEVICE_TOKEN_NOT_ACCEPTED | A device token was sent; this operation needs a workspace API key. |
404 | NOT_FOUND | No file with this id is attached to a record in the key's workspace. |
429 | RATE_LIMIT_EXCEEDED | Too many requests for this key, device token or workspace. Wait Retry-After seconds. |
500 | ASSET_QUERY_FAILED | The file could not be read. Retry later. |
Branch on code, never on the error text. See Errors.
Attach a media file
Attaches an image to a plant, explant, contamination log or SOP in the workspace. It appears on that record in xPlant exactly like a photo added in the app. Send the image as image_url or as image_base64 — exactly one.
List media recipes
The workspace's culture media recipes that the key's owner can see — their own, and those shared with the workspace or published — newest first, each with its components. Another member's private recipe is not listed. Filter by status.