Connect a channel
Let a merchant connect eBay, Shopify, Etsy and more from your app or agent: OAuth links, API-key channels, return URLs and disconnecting.
POST /channel_connections runs the same connect flow as the Nembol
dashboard, on the next free slot for that channel. A second eBay account
becomes a second channel account. Your key needs the channels:connect
scope.
OAuth channels: send the merchant a link
eBay, Etsy, Shopify, WooCommerce, TikTok Shop, Temu, Amazon, Google Merchant Center, Facebook Catalog, Square, Squarespace, Faire, Wix, Facebook, Pinterest and Tumblr need the merchant to log in on the channel and approve Nembol. You get a single-use link, valid 1 hour:
curl -X POST https://api.nembol.com/rest/v1/channel_connections \
-H "Authorization: Bearer $NEMBOL_API_KEY" \
-H "Content-Type: application/json" \
-d '{"channel": "shopify", "params": {"shop": "acme-vintage"},
"return_url": "https://app.example.com/nembol/callback?user=42"}'{
"id": "conn_66f0a1",
"object": "channel_connection",
"status": "pending",
"connect_url": "https://api.nembol.com/rest/v1/connect/…",
"expires_at": "2026-10-07T16:00:00.000Z"
}Open connect_url in the merchant's browser. When they're done they land
on your return_url with the outcome added to its query string:
https://app.example.com/nembol/callback?user=42&connection_id=conn_66f0a1&status=connected&channel_account_id=chac_6aa12cabA link that can't be used also comes back to your return_url: expired
(status=expired&error=link_expired), already used (the current status
and error=link_already_used), or refused (status=failed and the reason,
e.g. plan_not_eligible). Show your own message and create a new link if
needed. The seller never sees a Nembol error page.
Don't trust the query string alone. Confirm with
GET /channel_connections/{id} (connected / failed / expired) or the
channel_account.connected webhook.
AI agents and scripts: leave return_url out. The merchant ends on a
Nembol page saying they can close the tab, and the agent polls the
connection.
Register your return URLs first
return_url must start with a URL registered for the store. This
protects against using Nembol's login flow to send people to arbitrary
sites:
curl -X POST https://api.nembol.com/rest/v1/redirect_urls \
-H "Authorization: Bearer $NEMBOL_API_KEY" \
-H "Content-Type: application/json" \
-d '{"url": "https://app.example.com/nembol/callback"}'Same origin + a path starting with the registered one matches; any query string is allowed. The merchant can also manage the list in Settings → Developers → Redirect URLs.
Channels with API keys: connect at once
Kaufland, OnBuy, PrestaShop and Subito connect with credentials, and the
response is already connected or failed:
curl -X POST https://api.nembol.com/rest/v1/channel_connections \
-H "Authorization: Bearer $NEMBOL_API_KEY" \
-H "Content-Type: application/json" \
-d '{"channel": "kaufland", "params": {"client_key": "…", "secret_key": "…"}}'The keys are passed to the channel and never stored on the connection.
Channels that ask which account to connect
Amazon, Google Merchant Center and Facebook Catalog connect with a link like
the others. After the login the seller may have several accounts to choose
from (several Merchant Center accounts, several businesses). The connection
then becomes needs_choice, its choices list the options, and you finish it
with POST /channel_connections/{id}/choose and the chosen value. With a
single option Nembol picks it and the connection is connected directly.
Disconnect
curl -X POST https://api.nembol.com/rest/v1/channel_accounts/chac_6aa12cab/disconnect \
-H "Authorization: Bearer $NEMBOL_API_KEY" \
-H "Idempotency-Key: $(uuidgen)"Disconnecting stops all sync with that account and can't be undone through the API (reconnecting needs the merchant's login again), so it asks for a confirmation first:
- The first request answers
409 confirmation_requiredwith a description of the consequences and aconfirmation.token. - Show the consequences to the merchant. If they agree, repeat the same
request with the header
Nembol-Confirmation: <token>. The token works once and expires after 10 minutes.
After connecting: imports and sync switches
Through the API a new connection imports nothing: your app owns the catalog. Ask for what you need when you create the connection:
| Option | Default | What it does |
|---|---|---|
import_products | false | Imports the channel's catalog into Nembol once connected. The import is a regular operation: its id is the connection's import_operation_id; follow it with GET /operations/{id} and undo it with POST /imports/{id}/undo |
import_orders | false | Also brings in the orders the shop already had before connecting (a one-time pull) |
New orders are synced from the moment the account is connected, whatever
you choose. (The dashboard always imports both: the seller wants to see
their shop at once.) You can also import later with POST /imports.
A newly connected account has every sync switch off: Nembol edits don't
reach the channel and the channel's sales don't change stock elsewhere until
you turn them on with PATCH /channel_accounts/{id}. See
Edit a product: what reaches the channels.
eBay: Business Policies
To publish on eBay the account must use eBay Business Policies (every listing carries shipping, payment and return policies). Most sellers already do. Connecting never changes this, because enrolling moves the seller's eBay account for good. If the account isn't enrolled, eBay refuses the first publish; enable it explicitly, with the seller's agreement:
curl -X POST https://api.nembol.com/rest/v1/channel_accounts/chac_6aa12cab/enable_business_policies \
-H "Authorization: Bearer $NEMBOL_API_KEY" \
-H "Idempotency-Key: $(uuidgen)"It asks for the two-step confirmation. The answer is ready (policies set,
publishing works) or pending (eBay is migrating the account: call again in
a few minutes). An account already enrolled answers ready and nothing
changes.
Disconnect, then connect the same shop again
A disconnected account keeps its place with the name of its last shop, so
its listings can find it again. The next POST /channel_connections for
that channel brings it back: the answer has reconnects_shop (the shop it
had), and the seller logs into that same shop.
- To connect a different shop instead, send
"new_account": true: it takes a new place. - If the seller logs into another shop without
new_account, the connection fails withdifferent_channel_accountand nothing changes.
Reconnect an expired login
A marketplace login can expire or be revoked (a changed password, an app removed on the channel). The account then shows errors and stops syncing. To fix it without the dashboard, reconnect that same account:
curl -X POST https://api.nembol.com/rest/v1/channel_connections \
-H "Authorization: Bearer $NEMBOL_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{"channel_account_id": "chac_6aa12cab",
"return_url": "https://app.example.com/nembol/callback"}'It works like a new connection (a connect_url for the seller, then
return_url), with three differences:
- The account keeps its id (
chac_…) and every listing linked to it; no new channel account is created and no free slot is needed. - If the seller logs into a different shop or account than the one being
reconnected, nothing changes and the connection fails with
different_channel_account. channelis optional; when sent it must be the account's channel.
Same rules as the dashboard
The API runs the dashboard's own connect flow, so every Nembol rule applies. Nothing an integration does can go beyond what the merchant could do in Nembol:
- One marketplace account, one Nembol store. An eBay (Etsy, Shopify…)
account already connected to any Nembol store can't be connected again;
the connection ends
failedwith the channel's message. - Active subscription required, checked like the dashboard does
(including a live check with the payment provider): otherwise
402 subscription_inactive. - The account the store pays Nembol through (Shopify, WooCommerce or
Wix billing) can't be disconnected:
422 channel_not_disconnectable. - Everything is checked again when the link is opened. If the slot
was taken meanwhile, the plan changed or the subscription lapsed, the
link is refused and the connection ends
failed.
Gotchas
- One link, one use. An opened or expired link can't be reused. Create a new connection.
- Expired login vs disconnected account. An account whose login
expired still exists: reconnect it with
channel_account_id(it keeps its id). An account that was disconnected comes back with the next connection of that channel (same place and listings, a newchac_id: the old id answers404 channel_account_not_foundand its listings now carry the new id inchannel_account_id); see above. - Etsy, second shop: the merchant must be signed out of the first shop on etsy.com before opening the link, or Etsy will sign them into the same shop again.
- Slots fill up. Each channel has a limited number of accounts per
store:
422 channel_slots_fullmeans disconnect one first. - Plan limits apply like in the dashboard:
403 plan_channel_not_includedwhen the plan doesn't include the channel. - No automatic import through the API. A connection made from the
dashboard starts the usual first import; one made through the API imports
only what
import_products/import_ordersask for.
Last updated on October 18, 2026
Need help?
Email us and a human replies, usually within one business day.
Partner program: manage many stores
For software vendors (ERPs, agencies) that run Nembol for their own customers: one company each, one key, one invoice.
Rules and limits
The behaviours an integration should know: variants, texts per channel, images, orders, shipping, timings. Each one is enforced by the API with a clear error.