For AI agents: this page is also available as Markdown at https://docs.refabric.com/api-reference/platform/files/upload-a-file.md, and the index of every page is https://docs.refabric.com/llms.txt.
Platform API › Files
Upload a file
201 with the file's address (file:…), which any task input takes.
https://api.refabric.com/v1/filesimport os
import requests
url = "https://api.refabric.com/v1/files"
payload = { "url": "string" }
headers = {
"Authorization": f"Key {os.environ['REFABRIC_API_KEY']}",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.json()){
"url": "https://files.refabric.com/art/3f2a.png",
"media_type": "image/png",
"file": "art:3f2a",
"task": "image.expand",
"job_id": "9b2f4c1d0e8a",
"created_at": "2026-10-05T09:30:12Z",
"data": {}
}Modes
- 1. By URL (JSON
{url}) — a public https address; a URL that already has an address answers that file. - 2. By bytes (multipart) — the file itself.
Authentication. A key with files:write: an upload is stored in your account.
Key features
- Accepted types: PNG, JPEG, WebP, GIF, BMP or PDF. The size cap is read live from
GET /v1/meta.
Common use cases
- Give a product photo an address once and pass it to several tasks.
- Attach what you know about the product (
name,external_id,items).
Conflicts. The same url answers the same file; the same url with different details answers 409 conflict. Bytes sent again create a new file.
See also
GET /v1/files/{ref}POST /v1/tasks/{name}
Authorization
Authorization: Key $REFABRIC_API_KEYScope: files:write
Parameters
Header parameters
- stringoptional
The contract version you wrote against (a date). Absent: the current version.
format: date
- stringoptional
Your own id for this request; we answer it back under X-Client-Request-ID.
max length 128
Body
application/json
- stringrequired
A URL of a stored object. The same file sent at different spellings of its URL is one file.
min length 1
- stringoptionalDefault:
The product's name, shown in listings.
- stringoptionalnullable
Your own id for the product (SKU). A number is taken as text.
- stringoptionalDefault:
A fit note: how the garment fits or should sit.
- stringoptional
What the product is. The shoots read it from the product: how it is worn, framed and restored.
Values
top— Shirts, blouses, T-shirts, knitwear and other upper-body garments. When the product is worn on the upper body.bottom— Trousers, skirts, shorts and other lower-body garments. When the product is worn on the lower body.dress— Dresses and jumpsuits — one piece covering upper and lower body. When the product is one piece covering upper and lower body.outerwear— Coats, jackets and blazers worn over other garments. When the product is worn over other garments.full_look— A complete outfit of several garments worn together. When the photo shows a whole outfit rather than one garment.accessory— Bags, belts, hats, scarves, jewellery and similar items. When the product is an accessory: a bag, belt, hat, scarf or jewellery.shoe— Footwear. When the product is footwear.swimwear— Swimsuits, bikinis and swim shorts. When the product is swimwear.lingerie— Underwear and sleepwear. When the product is underwear or sleepwear.
- array<object>optional
Your other photos of the product: its back/side, its label, its details.
- stringrequired
What the photo is.
Values
detail— A close crop of one detail of a look or a product (a collar, a pocket). When the image is a close crop of one detail.product— A photo of the product itself, as supplied (view: which side). When the photo is the product itself;viewsays which side.label— A photo of the product's label (care, size or brand label). When the photo is of the product's label.
- stringrequired
The photo: a url,
file:…orart:….min length 1
- stringoptionalDefault:
Which side it shows:
back·sidefor aproductphoto (required),front·backfor adetail(optional); alabelhas none.
Response
201 — Created: the body is what was made.
- stringrequired
Where the file is. A public, permanent address you can open or download.
Example:
https://files.refabric.com/art/3f2a.png - stringrequired
The file's standard media type.
Example:
image/png - stringrequired
Its address; pass it to a task as it is.
Example:
art:3f2a - stringoptionalnullable
The task that made it.
Example:
image.expand - stringoptionalnullable
The job that made it.
Example:
9b2f4c1d0e8a - stringoptionalnullable
When it was made, ISO-8601 in UTC.
Example:
2026-10-05T09:30:12Z - objectoptionalnullable
What the file means, in the record vocabulary.
- stringoptionalnullable
The record's name.
Example:
SS27 - stringoptionalnullable
What the record is, in words.
Example:
A calm palette. - stringoptionalnullable
Whether it can be used yet.
Values
processing— Still being made or analysed. Read it again later.ready— Finished. It can be passed to a task.failed— It could not be made. Its content is missing.
Example:
ready - array<object>optionalnullable
Its colours.
Example:
[{"hex":"#1f2a44"}]- stringrequired
The colour as
#rrggbb.Example:
#1f2a44 - stringoptionalnullable
Its name, when known.
Example:
Navy - stringoptionalnullable
The nearest Pantone code, when known.
Example:
19-4024 TCX
- array<object>optionalnullable
Its parts (a pose preset: its poses and views).
Example:
[{"type":"fabric"}]ItemEntry
- stringrequired
What the part is.
Values
fabric— A fabric: its swatch or a photo of it. When the image is a fabric swatch or a photo of a fabric.print— A print or pattern. When the image is a print or pattern.look— A garment or outfit, as a photo or a design. When the image is a garment or an outfit.detail— A close crop of one detail of a look or a product (a collar, a pocket). When the image is a close crop of one detail.design— One cell of a range plan: a design made for one garment line.other— Any other image the record holds. When the image is none of the other kinds.product— A photo of the product itself, as supplied (view: which side). When the photo is the product itself;viewsays which side.label— A photo of the product's label (care, size or brand label). When the photo is of the product's label.ghost— The product on an invisible (ghost) mannequin (view: which side). When you want the product shown on an invisible mannequin.flat— The product laid flat, as a flat-lay photo (view: which side). When you want the product laid flat.close_up— A close-up of the product's fabric and finish (one per product in a shoot). Notdetail, which is a crop of one trim or component of a look. When you want a close-up of the product's fabric and finish.
Example:
fabric - stringoptionalnullable
Which side it shows.
Example:
front - stringoptionalnullable
Its name.
Example:
Wool twill - stringoptionalnullable
Your own id for it, when you sent one.
Example:
SKU-1 - stringoptionalnullable
What it is, in words.
Example:
A navy wool twill. - stringoptionalnullable
Its image — pass it to a task as it is.
Example:
https://files.refabric.com/art/3f2a.png - stringoptionalnullable
Whether it can be used yet.
Values
processing— Still being made or analysed. Read it again later.ready— Finished. It can be passed to a task.failed— It could not be made. Its content is missing.
Example:
ready
PresetItem
- stringrequired
How the entry names what it wants: a saved pose, an image, words, or a product view.
Example:
view - stringrequired
The pose's address (
pose:…); empty for a view.Example:
pose:812 - stringrequirednullable
The pose's camera angle.
Example:
front - stringrequirednullable
The product view it shows.
Example:
back
- array<string>optionalnullable
Words that sum it up.
Example:
["tailoring"]
- 400 — The request cannot be read as it was sent (a header, the URL or the body's form).
- 401 — No valid API key was sent.
- 403 — Your key or your plan does not allow this.
- 409 — The request conflicts with the current state of what it names.
- 413 — The body is larger than this operation takes.
- 415 — The body's media type is not one this operation takes.
- 422 — A field is missing or has a value this operation cannot use.
- 429 — Too many requests: wait for the number of seconds in the Retry-After header.
- 500 — Something went wrong on our side; retry, and quote the request id if it keeps happening.