What is Relay & Can I Join?
The Run Free Project allows any vendor/manufacturer willing to participate and capable of meeting minimum technical requirements to provide a snapshot of their B2B wholesale inventory to all of their partner retailers who use the Run Free Project platform at no charge. To learn more about this free service, click here.
If you're a retailer and you're looking for information about the Relay dropship endless aisle feature, you're in the wrong place. Click here to get back on the right path.
The Run Free Vendor Product Import API
The Run Free Vendor Product Import API allows brands to push product data (images, sizes, UPCs, inventory, etc.) into the Run Free platform for consumption and presentation to retailers as part of the Relay product offering. This enables participating stores to extend the inventory they can show online to include sizes, colors, and styles that are out of stock locally.
Authentication
All API requests require a Run Free-issued secret key passed in the Authorization header as a Bearer token:
Authorization: Bearer YOUR_RUNFREE_SECRET_KEY
Your API token is tied to your specific brand. You can only push products and inventory for that brand - you cannot override the brand name in your request body. The platform ignores any brandName field you send and substitutes the brand associated with your token.
Token comparison is exact-string against the token table. Tokens do not expire automatically but can be revoked. Contact Run Free support if you need a new token.
Base URL
https://relay.runfree.run/api/vendor
Submit a Product
POST /api/vendor
Upload a product with its details and current inventory. Each POST updates inventory for one variant (one SKU + size + UPC combination). Submit one request per variant.
Headers
Content-Type: application/json Authorization: Bearer YOUR_RUNFREE_SECRET_KEY
Request body fields
Field | Type | Notes |
| string | Required (see note below). Normalized to alphanumeric characters internally. |
| string | Required to create a new product. |
| string | Recommended. |
| string | Optional. Capped at 100 characters - longer values are silently truncated. |
| number | Optional. Sets both cost and retail on new products. |
| string | Optional. Single character: |
| string | Required for inventory writes. |
| string | Optional. The value |
| string | Optional but recommended for accurate inventory matching. |
| number | Required for inventory. Integer quantity for this SKU + size + UPC combination. Each POST replaces inventory for that single variant record. |
| string | Optional. Provide full HTTPS image URLs. Images are downloaded by the platform and stored internally. The GET response returns the rewritten internal path, not your original URL. Images are only stored on first product creation - subsequent pushes for an existing product do not update images. |
Note on image7: The underlying database supports a seventh image field, but the API does not accept image7. Any value you send in that field is ignored.
Note on brandName: Do not include a brandName field in your request body. The API ignores it and always uses the brand associated with your token.
Example request
{ "sku": "ZOOT-123", "name": "Zoot Suit", "color": "Yellow", "description": "Quality handmade Kazakhstani Zoot Suit.", "price": 999.99, "gender": "M", "size": "L", "width": "", "upc": "ZOOT123-UPC34", "qty": 22, "image1": "https://example.com/images/zoot-front.jpg", "image2": "https://example.com/images/zoot-side.jpg" }Success response
{ "success": true }
About sku validation
The API does not validate that sku is present before calling the database. If sku is missing or empty, a record will be created with an empty SKU, which is difficult to clean up. Always include a non-empty sku in every request.
Retrieve a Product by SKU
GET /api/vendor/{SKU}
Retrieve full product information and all inventory records for a product by its SKU.
Example
GET https://relay.runfree.run/api/vendor/ZOOT-123
Headers
Authorization: Bearer YOUR_RUNFREE_SECRET_KEY
Success response
{ "sku": "ZOOT-123", "name": "Zoot Suit", "color": "Yellow", "description": "Quality handmade Kazakhstani Zoot Suit.", "price": 999.99, "gender": "M", "images": [ "/assets/products/68023-d_zoot-front.jpg", "/assets/products/68023-d_zoot-side.jpg" ], "inventory": [ { "upc": "ZOOT123-UPC34", "size": "L", "width": "", "quantity": 22 }, { "upc": "ZOOT123-UPC31", "size": "S", "width": "", "quantity": 10 } ] }The images array contains the platform's internal asset paths. These are not the original URLs you submitted - the platform downloads and renames images when they are first stored.
The inventory array contains one entry per size/UPC/location combination.
Error format
All errors return HTTP 200 with a JSON body:
{ "error": "Invalid Token" }
Errors this API produces
Error message | Cause |
| The |
| The token is valid but the brand associated with it cannot be found. Contact Run Free support. |
| Returned by |
Note on error messages in the previous version of this article: The earlier version listed "Missing required field: sku" and "Internal server error" as possible errors. These messages are not produced by the current API. If you encounter an error string not listed above, it may be coming from an upstream network layer. Contact support with the full response body.
How image storage works
When you provide an image URL, the platform:
Takes the filename from the URL path (e.g.,
zoot-front.jpgfromhttps://example.com/images/zoot-front.jpg).Renames it to
<brandId>-d_<filename>(e.g.,68023-d_zoot-front.jpg).Stores it at
/assets/products/<renamed-file>on the platform server.Saves the internal path (not your original URL) in the product record.
The GET response will return the internal paths. Plan accordingly if you are comparing your submitted URLs against retrieved image values.
Inventory behavior
Each POST /api/vendor request creates or replaces the inventory quantity for one specific variant: the combination of SKU, size, UPC, and location (location is always defaulted to store 0 for vendor submissions). Sending the same SKU + size + UPC again with a new qty replaces the previous quantity for that record.
Stock on hand for the product is recalculated as the maximum quantity across all variants after each update.
Rate limiting and retries
Contact Run Free support by emailing support@runfreeproject.com or by clicking the blue circle in the bottom right corner of this page and choosing the message option for rate limit guidance specific to your integration. As a general practice, avoid sending the same SKU+variant more than once per inventory cycle.
