Flavours API
Bulk jobImport

Import Ingredients Upload URL

POST
/api/v2/bulk/ingredients/import/upload-url

Get a presigned S3 POST for uploading a large ingredient spreadsheet directly to storage.

AuthorizationBearer <token>

You can retrieve your token by logging in.

In: header

Header Parameters

X-API-Version*string

API contract version to target. See the Changelog for what changed in each version.

Default"2.0.0"
Value in"2.3.0" | "2.2.0" | "2.1.0" | "2.0.0"

Request Body

application/json

filename?string

This field is required when extension is not present. Must not be greater than 255 characters.

content_type?|

Must not be greater than 255 characters.

size?|

Must be at least 1. Must not be greater than 20971520.

extension*string
Value in"csv" | "xls" | "xlsx"
market_id?|

Must match an existing stored value.

Response Body

application/json

application/json

application/json

application/json

application/json

curl -X POST "https://api.flavours.sa/dev/api/v2/bulk/ingredients/import/upload-url" \  -H "X-API-Version: 2.3.0" \  -H "Content-Type: application/json" \  -d '{    "extension": "xls"  }'
{
  "meta": {
    "code": 200,
    "status": "success",
    "message": "Ingredient import upload URL generated successfully."
  },
  "data": {
    "strategy": "presigned",
    "url": "https://flavours-docs-bucket.s3.amazonaws.com",
    "attributes": {
      "action": "https://flavours-docs-bucket.s3.amazonaws.com",
      "method": "POST",
      "enctype": "multipart/form-data"
    },
    "fields": {
      "acl": "private",
      "key": "imports/quarantine/9ec5efd0-b7db-4c85-bc08-93dfb54614e7/44bd77b3-07ff-4a61-85bd-9bc8a3117bb8/source.xlsx",
      "X-Amz-Credential": "AKIAEXAMPLE/20260823/us-east-1/s3/aws4_request",
      "X-Amz-Algorithm": "AWS4-HMAC-SHA256",
      "X-Amz-Date": "20260823T005810Z",
      "Policy": "eyJleHBpcmF0aW9uIjoiMjAyNi0wOC0yM1QwMToxMzoxMFoiLCJjb25kaXRpb25zIjpbeyJhY2wiOiJwcml2YXRlIn0seyJidWNrZXQiOiJmbGF2b3Vycy1kb2NzLWJ1Y2tldCJ9LFsiZXEiLCIka2V5IiwiaW1wb3J0c1wvcXVhcmFudGluZVwvOWVjNWVmZDAtYjdkYi00Yzg1LWJjMDgtOTNkZmI1NDYxNGU3XC80NGJkNzdiMy0wN2ZmLTRhNjEtODViZC05YmM4YTMxMTdiYjhcL3NvdXJjZS54bHN4Il0sWyJjb250ZW50LWxlbmd0aC1yYW5nZSIsMCwyMDk3MTUyMF0seyJYLUFtei1EYXRlIjoiMjAyNjA4MjNUMDA1ODEwWiJ9LHsiWC1BbXotQ3JlZGVudGlhbCI6IkFLSUFFWEFNUExFXC8yMDI2MDgyM1wvdXMtZWFzdC0xXC9zM1wvYXdzNF9yZXF1ZXN0In0seyJYLUFtei1BbGdvcml0aG0iOiJBV1M0LUhNQUMtU0hBMjU2In1dfQ==",
      "X-Amz-Signature": "bc2056991aa0dbf7cde0c72a134232432f86d87864b6c49f42939d4fafdfbffa"
    },
    "key": "imports/quarantine/9ec5efd0-b7db-4c85-bc08-93dfb54614e7/44bd77b3-07ff-4a61-85bd-9bc8a3117bb8/source.xlsx",
    "max_bytes": 20971520
  }
}
{
  "meta": {
    "code": 401,
    "status": "error",
    "message": "Unauthenticated."
  },
  "data": null
}
{
  "meta": {
    "code": 403,
    "status": "error",
    "message": "Unauthorized."
  },
  "data": null
}
{
  "meta": {
    "code": 404,
    "status": "error",
    "message": "Resource not found."
  },
  "data": null
}
{
  "meta": {
    "code": 500,
    "status": "error",
    "message": "Internal server error."
  },
  "data": null
}