Documentation
Everything you need to connect your store and start selling.
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
Create an account
Sign up for a free FeedPilot account. No credit card required.
- 2
Connect your store
Link your Shopify, WooCommerce, or custom store via our secure OAuth flow or API credentials.
- 3
Review your catalog
FeedPilot imports your products and flags any issues (missing attributes, low-quality images, etc.).
- 4
Configure pricing rules
Set target margins, account for marketplace fees, and define pricing strategies per channel.
- 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)
Integration overview
FeedPilot pulls data from your store, transforms it for each destination, and pushes listings and inventory updates automatically.
How it works
- 1 Your store pushes product and inventory data to FeedPilot
- 2 We normalize and enrich your catalog for each destination
- 3 Listings are created or updated on marketplaces automatically
- 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 AI agent queries FeedPilot for products matching user intent
- 2 FeedPilot returns product data, images, and deep links to your storefront
- 3 User clicks through and completes checkout on your site
- 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.
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/jsonwith 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 headerX-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:products | List/show products and variants |
| write:products | Create/update/delete products and variants |
| read:orders | List/show orders (orders are read-only) |
| read:inventory | List/show stock items |
| write:inventory | Update stock item quantities |
| read:feeds | List/show feeds |
| write:feeds | Create/update/delete feeds and trigger sync |
| read:channels | List/show channel accounts and listings |
| write:channels | Create/update/delete channel accounts and listings |
| read:returns | List/show returns |
| write:returns | Update return status (accept / reject / refund) |
| read:payments | List/show payments |
| manage:webhooks | Subscribe 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 |
|---|---|
| 400 | Bad request — malformed body, missing store |
| 401 | Unauthenticated — missing or invalid token |
| 403 | Forbidden — token lacks required ability or store not accessible |
| 404 | Not found — resource does not exist or belongs to another store |
| 422 | Unprocessable entity — validation failed |
| 429 | Too many requests — rate limit exceeded |
| 500 | Server 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.