Uploads
2 endpoints. Each needs an API key or OAuth token with the scope shown; the key already names its store, so paths start at /v1/store. Generated from the live contract; also in openapi.json.
Get a short-lived signed URL to PUT one file to (images for the gallery, private deliverables)
POST
/v1/store/uploadsOr name the store: POST /v1/stores/{storeId}/uploads
Body
purpose"media" | "file" | "image" | "asset"requiredfilenamestringrequiredcontentTypestringrequiredbytesintegerrequired
Response UploadTicket
uploadIdMediaAssetIdrequiredurlstringrequiredmethodstringrequiredheadersobjectrequiredexpiresAtTimestamprequiredmaxBytesintegerrequired
Example
curl -X POST "https://api.shopfa.st/v1/store/uploads" \
-H "Authorization: Bearer $SHOPFAST_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"purpose": "media",
"filename": "string",
"contentType": "string",
"bytes": 1
}'const res = await fetch('https://api.shopfa.st/v1/store/uploads', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.SHOPFAST_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"purpose": "media",
"filename": "string",
"contentType": "string",
"bytes": 1
}),
});
if (!res.ok) throw new Error((await res.json()).detail);
const data = await res.json();import os, requests
res = requests.request(
"POST",
"https://api.shopfa.st/v1/store/uploads",
headers={"Authorization": f"Bearer {os.environ['SHOPFAST_API_KEY']}"},
json={
"purpose": "media",
"filename": "string",
"contentType": "string",
"bytes": 1
},
)
res.raise_for_status()
data = res.json()req, _ := http.NewRequest("POST", "https://api.shopfa.st/v1/store/uploads", strings.NewReader(`{
"purpose": "media",
"filename": "string",
"contentType": "string",
"bytes": 1
}`))
req.Header.Set("Authorization", "Bearer "+os.Getenv("SHOPFAST_API_KEY"))
req.Header.Set("Content-Type", "application/json")
res, err := http.DefaultClient.Do(req)Try it with your key
Check the uploaded bytes (size, real file type, image dimensions) and make the upload usable
POST
/v1/store/uploads/{uploadId}/completeOr name the store: POST /v1/stores/{storeId}/uploads/{uploadId}/complete
Parameters
uploadIdupl_…pathrequired
Response UploadedAsset
uploadIdMediaAssetIdrequiredpurposeUploadPurposerequiredfilenamestringrequiredcontentTypestringrequiredbytesintegerrequiredurlstringrequiredwidthinteger | nullrequiredheightinteger | nullrequiredsha256stringrequired
Example
curl -X POST "https://api.shopfa.st/v1/store/uploads/upl_0123456789abcdefghjk/complete" \
-H "Authorization: Bearer $SHOPFAST_API_KEY"const res = await fetch('https://api.shopfa.st/v1/store/uploads/upl_0123456789abcdefghjk/complete', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.SHOPFAST_API_KEY}`,
},
});
if (!res.ok) throw new Error((await res.json()).detail);
const data = await res.json();import os, requests
res = requests.request(
"POST",
"https://api.shopfa.st/v1/store/uploads/upl_0123456789abcdefghjk/complete",
headers={"Authorization": f"Bearer {os.environ['SHOPFAST_API_KEY']}"},
)
res.raise_for_status()
data = res.json()req, _ := http.NewRequest("POST", "https://api.shopfa.st/v1/store/uploads/upl_0123456789abcdefghjk/complete", nil)
req.Header.Set("Authorization", "Bearer "+os.Getenv("SHOPFAST_API_KEY"))
res, err := http.DefaultClient.Do(req)