API Reference

The storq.io API is organized around REST. Our API has predictable resource-oriented URLs, accepts JSON request bodies, returns JSON responses, and uses standard HTTP response codes and authentication.

Authentication

Authenticate your API requests by including your API key in the Authorization header.

curl https://storq.io/api/v1/products \
  -H "Authorization: Bearer fsk_live_..."
require "net/http"
require "uri"

uri = URI("https://storq.io/api/v1/products")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true

request = Net::HTTP::Get.new(uri)
request["Authorization"] = "Bearer fsk_live_..."

response = http.request(request)
puts response.body
const response = await fetch("https://storq.io/api/v1/products", {
  headers: {
    "Authorization": "Bearer fsk_live_..."
  }
});

const data = await response.json();
console.log(data);
import requests

response = requests.get(
    "https://storq.io/api/v1/products",
    headers={"Authorization": "Bearer fsk_live_..."}
)

print(response.json())

Keep your API keys secure. Do not share your secret API keys in publicly accessible areas such as GitHub, client-side code, and so forth.

Products

List All Products

GET /api/v1/products

Returns a list of all products in your account.

Parameters

Name Type Description
sku string Filter by SKU (exact match)
search string Search products by name or SKU

Example Request

curl https://storq.io/api/v1/products \
  -H "Authorization: Bearer fsk_live_..."
require "net/http"
require "uri"

uri = URI("https://storq.io/api/v1/products")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true

request = Net::HTTP::Get.new(uri)
request["Authorization"] = "Bearer fsk_live_..."

response = http.request(request)
data = JSON.parse(response.body)
const response = await fetch("https://storq.io/api/v1/products", {
  headers: {
    "Authorization": "Bearer fsk_live_..."
  }
});

const data = await response.json();
import requests

response = requests.get(
    "https://storq.io/api/v1/products",
    headers={"Authorization": "Bearer fsk_live_..."}
)

data = response.json()

Example Response

{
  "products": [
    {
      "id": 1,
      "name": "Wireless Mouse",
      "sku": "MOUSE-001",
      "barcode": "100000000001",
      "created_at": "2026-01-15T10:30:00Z",
      "updated_at": "2026-01-15T10:30:00Z"
    }
  ]
}

Retrieve a Product

GET /api/v1/products/:id

Retrieve details of a specific product.

Example Request

curl https://storq.io/api/v1/products/1 \
  -H "Authorization: Bearer fsk_live_..."
require "net/http"
require "uri"

uri = URI("https://storq.io/api/v1/products/1")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true

request = Net::HTTP::Get.new(uri)
request["Authorization"] = "Bearer fsk_live_..."

response = http.request(request)
product = JSON.parse(response.body)
const response = await fetch("https://storq.io/api/v1/products/1", {
  headers: {
    "Authorization": "Bearer fsk_live_..."
  }
});

const product = await response.json();
import requests

response = requests.get(
    "https://storq.io/api/v1/products/1",
    headers={"Authorization": "Bearer fsk_live_..."}
)

product = response.json()

Example Response

{
  "id": 1,
  "name": "Wireless Mouse",
  "sku": "MOUSE-001",
  "barcode": "100000000001",
  "created_at": "2026-01-15T10:30:00Z",
  "updated_at": "2026-01-15T10:30:00Z"
}

Create a Product

POST /api/v1/products

Create a new product.

Parameters

Name Type Description
name string Required. Product name
sku string Required. Unique SKU

Example Request

curl https://storq.io/api/v1/products \
  -H "Authorization: Bearer fsk_live_..." \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Wireless Keyboard",
    "sku": "KEYB-001"
  }'
require "net/http"
require "uri"
require "json"

uri = URI("https://storq.io/api/v1/products")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true

request = Net::HTTP::Post.new(uri)
request["Authorization"] = "Bearer fsk_live_..."
request["Content-Type"] = "application/json"
request.body = { name: "Wireless Keyboard", sku: "KEYB-001" }.to_json

response = http.request(request)
product = JSON.parse(response.body)
const response = await fetch("https://storq.io/api/v1/products", {
  method: "POST",
  headers: {
    "Authorization": "Bearer fsk_live_...",
    "Content-Type": "application/json"
  },
  body: JSON.stringify({
    name: "Wireless Keyboard",
    sku: "KEYB-001"
  })
});

const product = await response.json();
import requests

response = requests.post(
    "https://storq.io/api/v1/products",
    headers={"Authorization": "Bearer fsk_live_..."},
    json={"name": "Wireless Keyboard", "sku": "KEYB-001"}
)

product = response.json()

Update a Product

PUT /api/v1/products/:id

Update an existing product.

Example Request

curl -X PUT https://storq.io/api/v1/products/1 \
  -H "Authorization: Bearer fsk_live_..." \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Updated Product Name"
  }'
require "net/http"
require "uri"
require "json"

uri = URI("https://storq.io/api/v1/products/1")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true

request = Net::HTTP::Put.new(uri)
request["Authorization"] = "Bearer fsk_live_..."
request["Content-Type"] = "application/json"
request.body = { name: "Updated Product Name" }.to_json

response = http.request(request)
product = JSON.parse(response.body)
const response = await fetch("https://storq.io/api/v1/products/1", {
  method: "PUT",
  headers: {
    "Authorization": "Bearer fsk_live_...",
    "Content-Type": "application/json"
  },
  body: JSON.stringify({
    name: "Updated Product Name"
  })
});

const product = await response.json();
import requests

response = requests.put(
    "https://storq.io/api/v1/products/1",
    headers={"Authorization": "Bearer fsk_live_..."},
    json={"name": "Updated Product Name"}
)

product = response.json()

Stock

Check Stock Levels

GET /api/v1/stock

Get current stock levels for all products.

Parameters

Name Type Description
sku string Filter by product SKU

Example Response

{
  "stock": [
    {
      "product_id": 1,
      "sku": "MOUSE-001",
      "warehouse_id": 1,
      "location_id": 5,
      "quantity": 100
    }
  ]
}

Receive Stock

POST /api/v1/stock/receive

Add stock to a location.

Parameters

Name Type Description
sku string Required. Product SKU
quantity integer Required. Quantity to receive
location_id integer Required. Destination location

Example Request

curl https://storq.io/api/v1/stock/receive \
  -H "Authorization: Bearer fsk_live_..." \
  -H "Content-Type: application/json" \
  -d '{
    "sku": "MOUSE-001",
    "quantity": 50,
    "location_id": 5
  }'
require "net/http"
require "uri"
require "json"

uri = URI("https://storq.io/api/v1/stock/receive")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true

request = Net::HTTP::Post.new(uri)
request["Authorization"] = "Bearer fsk_live_..."
request["Content-Type"] = "application/json"
request.body = { sku: "MOUSE-001", quantity: 50, location_id: 5 }.to_json

response = http.request(request)
const response = await fetch("https://storq.io/api/v1/stock/receive", {
  method: "POST",
  headers: {
    "Authorization": "Bearer fsk_live_...",
    "Content-Type": "application/json"
  },
  body: JSON.stringify({
    sku: "MOUSE-001",
    quantity: 50,
    location_id: 5
  })
});

const data = await response.json();
import requests

response = requests.post(
    "https://storq.io/api/v1/stock/receive",
    headers={"Authorization": "Bearer fsk_live_..."},
    json={"sku": "MOUSE-001", "quantity": 50, "location_id": 5}
)

data = response.json()

Adjust Stock

POST /api/v1/stock/adjust

Adjust stock quantity (e.g., for corrections or damage).

Parameters

Name Type Description
sku string Required. Product SKU
quantity integer Required. Adjustment amount (negative to decrease)
location_id integer Required. Location to adjust
reason string Reason for adjustment

Orders

Create an Order

POST /api/v1/orders

Create a new order for fulfillment.

Parameters

Name Type Description
customer_email string Required. Customer email address
line_items array Required. Array of line items

Example Request

curl https://storq.io/api/v1/orders \
  -H "Authorization: Bearer fsk_live_..." \
  -H "Content-Type: application/json" \
  -d '{
    "customer_email": "[email protected]",
    "line_items": [
      {
        "sku": "MOUSE-001",
        "quantity": 2
      }
    ]
  }'
require "net/http"
require "uri"
require "json"

uri = URI("https://storq.io/api/v1/orders")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true

request = Net::HTTP::Post.new(uri)
request["Authorization"] = "Bearer fsk_live_..."
request["Content-Type"] = "application/json"
request.body = {
  customer_email: "[email protected]",
  line_items: [{ sku: "MOUSE-001", quantity: 2 }]
}.to_json

response = http.request(request)
order = JSON.parse(response.body)
const response = await fetch("https://storq.io/api/v1/orders", {
  method: "POST",
  headers: {
    "Authorization": "Bearer fsk_live_...",
    "Content-Type": "application/json"
  },
  body: JSON.stringify({
    customer_email: "[email protected]",
    line_items: [
      { sku: "MOUSE-001", quantity: 2 }
    ]
  })
});

const order = await response.json();
import requests

response = requests.post(
    "https://storq.io/api/v1/orders",
    headers={"Authorization": "Bearer fsk_live_..."},
    json={
        "customer_email": "[email protected]",
        "line_items": [
            {"sku": "MOUSE-001", "quantity": 2}
        ]
    }
)

order = response.json()

Retrieve an Order

GET /api/v1/orders/:id

Get order details.

Check Order Status

GET /api/v1/orders/:id/status

Get current fulfillment status of an order.

Example Response

{
  "id": 1,
  "status": "shipped",
  "fulfillment_status": "complete",
  "tracking_number": "1Z999AA10123456784",
  "shipped_at": "2026-01-16T14:20:00Z"
}

Customers

List All Customers

GET /api/v1/customers

Returns a paginated list of all customers in your account.

Example Response

{
  "customers": [
    {
      "id": 1,
      "name": "Acme Corp",
      "email": "[email protected]",
      "phone": "+44 20 7946 0958",
      "company_name": "Acme Corporation",
      "billing_vat_number": "GB123456789",
      "payment_method": "pay_later",
      "notes": null,
      "addresses": [
        {
          "id": 1,
          "label": "Head Office",
          "line1": "123 Main St",
          "line2": null,
          "city": "London",
          "postcode": "EC1A 1BB",
          "country": "GB",
          "default_billing": true,
          "default_shipping": true
        }
      ],
      "created_at": "2026-01-15T10:30:00Z",
      "updated_at": "2026-01-15T10:30:00Z"
    }
  ]
}

Retrieve a Customer

GET /api/v1/customers/:id

Retrieve details of a specific customer, including their recent orders.

Create a Customer

POST /api/v1/customers

Create a new customer.

Parameters

Name Type Description
name string Required. Customer name
email string Email address (unique per account)
phone string Phone number
company_name string Company name
billing_vat_number string VAT number for billing
payment_method string pay_later or pay_now
notes string Internal notes
addresses_attributes array Array of address objects with label, line1, line2, city, postcode, country, default_billing, default_shipping

Example Request

curl https://storq.io/api/v1/customers \
  -H "Authorization: Bearer fsk_live_..." \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Acme Corp",
    "email": "[email protected]",
    "company_name": "Acme Corporation",
    "payment_method": "pay_later"
  }'
require "net/http"
require "uri"
require "json"

uri = URI("https://storq.io/api/v1/customers")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true

request = Net::HTTP::Post.new(uri)
request["Authorization"] = "Bearer fsk_live_..."
request["Content-Type"] = "application/json"
request.body = {
  name: "Acme Corp",
  email: "[email protected]",
  company_name: "Acme Corporation",
  payment_method: "pay_later"
}.to_json

response = http.request(request)
customer = JSON.parse(response.body)
const response = await fetch("https://storq.io/api/v1/customers", {
  method: "POST",
  headers: {
    "Authorization": "Bearer fsk_live_...",
    "Content-Type": "application/json"
  },
  body: JSON.stringify({
    name: "Acme Corp",
    email: "[email protected]",
    company_name: "Acme Corporation",
    payment_method: "pay_later"
  })
});

const customer = await response.json();
import requests

response = requests.post(
    "https://storq.io/api/v1/customers",
    headers={"Authorization": "Bearer fsk_live_..."},
    json={
        "name": "Acme Corp",
        "email": "[email protected]",
        "company_name": "Acme Corporation",
        "payment_method": "pay_later"
    }
)

customer = response.json()

Update a Customer

PUT /api/v1/customers/:id

Update an existing customer.

Example Request

curl -X PUT https://storq.io/api/v1/customers/1 \
  -H "Authorization: Bearer fsk_live_..." \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Acme Corporation"
  }'
require "net/http"
require "uri"
require "json"

uri = URI("https://storq.io/api/v1/customers/1")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true

request = Net::HTTP::Put.new(uri)
request["Authorization"] = "Bearer fsk_live_..."
request["Content-Type"] = "application/json"
request.body = { name: "Acme Corporation" }.to_json

response = http.request(request)
customer = JSON.parse(response.body)
const response = await fetch("https://storq.io/api/v1/customers/1", {
  method: "PUT",
  headers: {
    "Authorization": "Bearer fsk_live_...",
    "Content-Type": "application/json"
  },
  body: JSON.stringify({
    name: "Acme Corporation"
  })
});

const customer = await response.json();
import requests

response = requests.put(
    "https://storq.io/api/v1/customers/1",
    headers={"Authorization": "Bearer fsk_live_..."},
    json={"name": "Acme Corporation"}
)

customer = response.json()

Errors

storq.io uses conventional HTTP response codes to indicate the success or failure of an API request.

Code Description
200 OK - Request succeeded
201 Created - Resource created successfully
400 Bad Request - Invalid request parameters
401 Unauthorized - Invalid or missing API key
404 Not Found - Resource doesn't exist
422 Unprocessable - Validation failed
500 Server Error - Something went wrong

Error Response Format

{
  "error": "Product not found",
  "status": 404
}