Skip to main content

Run Free Relay Vendor Product Import API

If you're a vendor or manufacturer, this API allows you to send your product inventory data to seed the Relay service to our retailers.

Written by Jeremy

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

sku

string

Required (see note below). Normalized to alphanumeric characters internally.

name

string

Required to create a new product.

color

string

Recommended.

description

string

Optional. Capped at 100 characters - longer values are silently truncated.

price

number

Optional. Sets both cost and retail on new products.

gender

string

Optional. Single character: M, F, or U.

size

string

Required for inventory writes.

width

string

Optional. The value M (medium) is treated as empty.

upc

string

Optional but recommended for accurate inventory matching.

qty

number

Required for inventory. Integer quantity for this SKU + size + UPC combination. Each POST replaces inventory for that single variant record.

image1 - image6

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

Invalid Token

The Authorization header is missing, malformed, or the token does not match an active record.

Invalid Brand

The token is valid but the brand associated with it cannot be found. Contact Run Free support.

Product Not Found

Returned by GET /api/vendor/{SKU} when no product matches the given SKU for your brand.

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:

  1. Takes the filename from the URL path (e.g., zoot-front.jpg from https://example.com/images/zoot-front.jpg).

  2. Renames it to <brandId>-d_<filename> (e.g., 68023-d_zoot-front.jpg).

  3. Stores it at /assets/products/<renamed-file> on the platform server.

  4. 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.

Did this answer your question?