Documentation

Documentation

Everything you need to connect your store and start selling.

Step 1

Getting started

FeedPilot connects to your existing store, normalizes your product data for each marketplace, and keeps inventory in sync across all channels. Here is how to get set up.

  1. 1

    Create an account

    Sign up for a free FeedPilot account. No credit card required.

  2. 2

    Connect your store

    Link your Shopify, WooCommerce, or custom store via our secure OAuth flow or API credentials.

  3. 3

    Review your catalog

    FeedPilot imports your products and flags any issues (missing attributes, low-quality images, etc.).

  4. 4

    Configure pricing rules

    Set target margins, account for marketplace fees, and define pricing strategies per channel.

  5. 5

    Publish and monitor

    Push listings to your chosen marketplaces and track performance in your dashboard.

Quick start checklist

  • Create a free FeedPilot account
  • Connect your store (Shopify, WooCommerce, or API)
  • Review and fix any catalog issues flagged
  • Set up your first marketplace channel
  • Configure pricing rules for that channel
  • Publish listings and monitor the dashboard

What we need from your store

To sync your catalog, we need read access to the following:

  • Products: title, description, images, variants, SKUs
  • Inventory: stock levels per location (if applicable)
  • Prices: base price per variant
  • Categories: product type or category (helps with attribute mapping)
Step 2

Integration overview

FeedPilot pulls data from your store, transforms it for each destination, and pushes listings and inventory updates automatically.

How it works

  1. 1 Your store pushes product and inventory data to FeedPilot
  2. 2 We normalize and enrich your catalog for each destination
  3. 3 Listings are created or updated on marketplaces automatically
  4. 4 Inventory syncs keep stock levels accurate across all channels

Catalog sync

We fetch your products on a schedule (daily for Free, hourly for Growth, real-time webhooks for Enterprise).

  • Automatic attribute mapping to marketplace requirements
  • Image validation and quality checks
  • Category and taxonomy alignment
  • Issue flagging with actionable recommendations

Inventory and pricing

Inventory changes in your store propagate to all connected channels automatically.

  • Real-time or scheduled inventory sync
  • Per-channel pricing rules with fee calculations
  • Margin protection and minimum price enforcement
  • Projected profit visibility before publishing

AI agent integration

Your catalog can be exposed to AI shopping assistants via a secure feed. Here is how it works:

  1. 1 AI agent queries FeedPilot for products matching user intent
  2. 2 FeedPilot returns product data, images, and deep links to your storefront
  3. 3 User clicks through and completes checkout on your site
  4. 4 You keep the customer relationship and avoid third-party transaction fees

Supported platforms

We integrate with Shopify, WooCommerce, and custom APIs. Marketplace destinations include Amazon (US, UK, DE, and more), Allegro, eBay, and Etsy. AI agent feeds work with OpenAI, Claude, Gemini, and AWS Bedrock.

REST API · v1

FeedPilot API

A simple JSON-over-HTTPS API to read and manage your products, orders, inventory, feeds, channels, returns, payments and webhooks. Authenticate with a personal access token, hit predictable RESTful endpoints, get paginated JSON.

Base URL & conventions

All endpoints live under the same base URL and accept and return JSON only.

https://app.feedpilot.ai/api/v1/<resource>
  • All requests must include Accept: application/json.
  • All write operations must include Content-Type: application/json with a JSON body.
  • Timestamps are returned in ISO 8601 (UTC).
  • Money fields are decimal strings (e.g. "39.90") to avoid floating-point loss.
  • Multi-store accounts: pass ?store=<id> or header X-Store-Id: <id> to scope requests; otherwise the first store on the account is used.

Authentication

Authenticate with a personal access token sent in the Authorization header. Generate tokens in the admin panel under Settings → API tokens. The token is shown once at creation — copy it then; it is stored as a hash on our side and cannot be retrieved later.

Authorization: Bearer fpt_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Accept: application/json

Test your token by calling GET /api/v1/me — it returns the authenticated user, their stores, and the abilities granted to the current token.

Token scopes (abilities)

Every token carries a list of abilities. Each endpoint requires a specific ability — requests with insufficient abilities return 403 Forbidden. Use * only for trusted automation; prefer least-privilege.

Ability Grants
read:productsList/show products and variants
write:productsCreate/update/delete products and variants
read:ordersList/show orders (orders are read-only)
read:inventoryList/show stock items
write:inventoryUpdate stock item quantities
read:feedsList/show feeds
write:feedsCreate/update/delete feeds and trigger sync
read:channelsList/show channel accounts and listings
write:channelsCreate/update/delete channel accounts and listings
read:returnsList/show returns
write:returnsUpdate return status (accept / reject / refund)
read:paymentsList/show payments
manage:webhooksSubscribe and manage webhook endpoints
*All abilities (full access)

Rate limiting

Default limit: 60 requests per minute per token. Limits are tracked per token + IP. Every response includes the standard headers:

X-RateLimit-Limit: 60
X-RateLimit-Remaining: 47

Exceeding the limit returns 429 Too Many Requests with a Retry-After header indicating the seconds until the next request will be accepted.

Pagination & filters

All list endpoints are paginated. Pass ?page=N&per_page=N (default page=1, per_page=25, max=100). Response includes data, meta, and links.

{
  "data": [...],
  "links": {
    "first": "https://app.feedpilot.ai/api/v1/products?page=1",
    "last":  "https://app.feedpilot.ai/api/v1/products?page=12",
    "prev":  null,
    "next":  "https://app.feedpilot.ai/api/v1/products?page=2"
  },
  "meta": {
    "current_page": 1,
    "last_page": 12,
    "per_page": 25,
    "total": 287
  }
}

List endpoints accept resource-specific filters via query params (e.g. ?status=active). See per-resource sections below.

Errors

All errors return JSON with a top-level message. Validation errors also include errors keyed by field.

{
  "message": "The given data was invalid.",
  "errors": {
    "name": ["The name field is required."],
    "price": ["The price must be a number."]
  }
}
Status Meaning
400Bad request — malformed body, missing store
401Unauthenticated — missing or invalid token
403Forbidden — token lacks required ability or store not accessible
404Not found — resource does not exist or belongs to another store
422Unprocessable entity — validation failed
429Too many requests — rate limit exceeded
500Server error — please retry; report if persistent

Products & variants

Manage your product catalog. Variants are nested under a product; each variant has its own SKU and inventory quantity.

  • GET/api/v1/products — list products
  • GET/api/v1/products/{id} — show one product (with variants)
  • POST/api/v1/products — create product
  • PUT/api/v1/products/{id} — update product
  • DELETE/api/v1/products/{id} — delete product
  • GET/api/v1/products/{id}/variants — list variants of a product
  • POST/api/v1/products/{id}/variants — create variant
  • PUT/api/v1/variants/{id} — update variant (shallow)
  • DELETE/api/v1/variants/{id} — delete variant

Filters: ?status=active|draft|archived, ?search=<query> (matches name + SKU)

Orders

Read-only — orders flow into FeedPilot from connected marketplaces. Subscribe to order.created webhooks to be notified in real time.

  • GET/api/v1/orders — list orders
  • GET/api/v1/orders/{id} — show order with line items

Filters: ?status=pending|processing|shipped|delivered|cancelled|refunded, ?channel_account_id=<id>, ?from=2026-01-01&to=2026-12-31 (ISO dates)

Stock items

Update on_hand or reserved per warehouse-variant pair. available is computed automatically as on_hand − reserved.

  • GET/api/v1/stock-items — list (with warehouse + variant)
  • GET/api/v1/stock-items/{id} — show one
  • PUT/api/v1/stock-items/{id} — update { on_hand?, reserved? }

Filters: ?warehouse_id=<id>, ?variant_id=<id>, ?status=in_stock|low_stock|out_of_stock

Feeds

Product feeds (XML / CSV / Google Merchant). Trigger an ad-hoc sync with the sync action.

  • GET/api/v1/feeds
  • GET/api/v1/feeds/{id}
  • POST/api/v1/feeds — create { name, url, format, schedule? }
  • PUT/api/v1/feeds/{id}
  • DELETE/api/v1/feeds/{id}
  • POST/api/v1/feeds/{id}/sync — queue sync (returns 202)

Channels & listings

Channel accounts represent your seller accounts on marketplaces (Amazon, Allegro, eBay…). Listings are individual product offers on a specific channel.

  • GET/api/v1/channel-accounts
  • POST/api/v1/channel-accounts — create { channel_id, name, credentials, is_active? } (credentials never returned)
  • PUT/api/v1/channel-accounts/{id}
  • DELETE/api/v1/channel-accounts/{id}
  • GET/api/v1/listings
  • POST/api/v1/listings
  • POST/api/v1/listings/generate — bulk-create drafts { channel_account_id, variant_ids: [] }
  • PUT/api/v1/listings/{id}
  • DELETE/api/v1/listings/{id}

Returns

Buyer returns. Update status to accept / reject / mark refunded.

  • GET/api/v1/returns
  • GET/api/v1/returns/{id}
  • PUT/api/v1/returns/{id}{ status, rejection_code?, rejection_reason?, refund_amount? }

Payments

Read-only ledger of payments, refunds, fees and payouts.

  • GET/api/v1/payments
  • GET/api/v1/payments/{id}

Filters: ?type=sale|refund|fee|payout, ?status=pending|completed|failed, ?from=&to=

Webhooks

Subscribe an HTTPS endpoint to receive event notifications. We deliver each event as a POST with a signed JSON body. Failed deliveries retry 3 times (1m, 5m, 30m); after 10 consecutive failures the endpoint is auto-disabled.

Available events

  • order.created
  • order.updated
  • order.shipped
  • order.refunded
  • inventory.updated
  • return.requested
  • return.decided
  • payment.received
  • message.received
  • feed.synced
  • listing.created
  • listing.updated

Subscribe

POST /api/v1/webhooks
Content-Type: application/json
Authorization: Bearer fpt_…

{
  "url": "https://your-app.example.com/hooks/feedpilot",
  "events": ["order.created", "order.shipped", "inventory.updated"],
  "is_active": true
}

The response includes a one-time secret. Save it — it is needed to verify signatures and is never returned again.

Payload format

POST https://your-app.example.com/hooks/feedpilot
Content-Type: application/json
X-FeedPilot-Event: order.created
X-FeedPilot-Signature: sha256=<hex_hmac>
X-FeedPilot-Delivery-Id: wh_01HXY…

{
  "event": "order.created",
  "data": { ...resource payload... },
  "timestamp": "2026-05-02T18:21:00Z"
}

Signature verification (Node.js)

import crypto from "crypto";

function verify(rawBody, signatureHeader, secret) {
  const expected = "sha256=" + crypto
    .createHmac("sha256", secret)
    .update(rawBody)
    .digest("hex");
  return crypto.timingSafeEqual(
    Buffer.from(expected),
    Buffer.from(signatureHeader),
  );
}

Always verify signatures server-side using the raw request body bytes (not the parsed JSON). Reject any request whose signature doesn't match.

Code examples

List products — curl

curl -s https://app.feedpilot.ai/api/v1/products?per_page=10 \
  -H "Authorization: Bearer $FEEDPILOT_TOKEN" \
  -H "Accept: application/json"

Create product — JavaScript (fetch)

const res = await fetch(
  "https://app.feedpilot.ai/api/v1/products",
  {
    method: "POST",
    headers: {
      "Authorization": `Bearer ${process.env.FEEDPILOT_TOKEN}`,
      "Content-Type": "application/json",
      "Accept": "application/json",
    },
    body: JSON.stringify({
      name: "Sage rinse cup · Mint",
      sku: "HP-045",
      price: "39.90",
      status: "active",
    }),
  },
);
const { data } = await res.json();
console.log(data.id);

Update stock — PHP (Guzzle)

use GuzzleHttp\Client;

$client = new Client([
    'base_uri' => 'https://app.feedpilot.ai/api/v1/',
    'headers' => [
        'Authorization' => 'Bearer ' . getenv('FEEDPILOT_TOKEN'),
        'Accept' => 'application/json',
    ],
]);

$response = $client->put("stock-items/$stockItemId", [
    'json' => ['on_hand' => 47],
]);

$data = json_decode($response->getBody(), true)['data'];
echo $data['available']; // 47 (assuming reserved=0)

Versioning

The current version is v1. Breaking changes are introduced under a new path prefix (e.g. /api/v2/). We commit to maintain v1 for at least 12 months after v2 ships, with security fixes thereafter. Subscribe to the changelog at app.feedpilot.ai/docs/api.

Need help?

Email [email protected] or check the FAQ for quick answers. Growth and Enterprise customers have priority response times.