Skip to main content
The GET /v1/merchants endpoint returns a paginated list of merchants from across all affiliate networks. A single brand may appear on multiple rows when it is carried by more than one network — each row represents that merchant through a specific network.
Five networks require additional credentials before their products will sync: Adservice, Belboon, Effiliation, Partnerize, and The Affiliate Gateway. Without these credentials, the API returns 422 and products remain unavailable. Configure them under Pools → Sources on the relevant pool.

Endpoint

Query parameters

Pass extended=1 on every request. Whether the extended fields come back by default depends on your account, so don’t assume they will. extended=1 is what returns providers, canonical, categories, countries, currencies, supports, supports_deeplinking, cookie_duration, home_url, object_id, and slug — and it’s harmless if your account already returns them. If a response is missing providers or commissionable links, add the flag.

Base parameters

integer
Set to 1 to return the extended merchant object — providers, canonical, categories, countries, currencies, supports, supports_deeplinking, cookie_duration, home_url, object_id, and slug. Use the integer 1, not true. Some accounts return these fields by default; passing the flag guarantees it. Several filters (relationship_status, credential_id) require it, and the set of values accepted by fields differs between the standard and extended responses.
string
Comma-separated list of fields to include in each merchant object. Omit to return all fields.
integer
Page number. Defaults to 1.
integer
Results per page. Defaults to 100.
Partial, case-insensitive match on merchant name or website URL (home_url), e.g. Walmart or walmart.com. Does not match nmer_/mer_ object IDs, the internal numeric id, or origin_id — use origin_ids for an exact origin-ID match.
string
Comma-separated numeric network IDs to filter results.
string
Comma-separated origin IDs from the source network.
string
Record types to filter by (array form, e.g. type[]=service&type[]=products). Values: products, service, promotions (alias coupons), plus special values all, none. A merchant matches if it has any of them.
string
Comma-separated country codes to filter by.
integer
Return only merchants with at least this many products.
integer
Return only merchants with at most this many products.

Filter parameters

string
Filter by the workspace’s relationship status with the merchant. Values: approved, pending, rejected, terminated, available, unavailable, unknown. Requires extended=1 and a valid API key.
relationship_status reads from merchant sync — the process that refreshes your approval records from your connected network credentials. With sync enabled, results reflect an update from within the last 24 hours. Without it, the filter returns an empty set rather than an error — including on an account with no network credential at all (e.g. Shopnomix-only): verified live, every status value returned 0 merchants despite 14+ merchants showing providers[].shopnomix.status: "approved". There is no equivalent filter for Shopnomix (or other non-network provider) standing today.
string
Network credential ULID. When combined with relationship_status, restricts the approval lookup to that specific credential. Requires extended=1.
string
Bare ULID of a pool belonging to your team — the pool_-prefixed object_id form returns 422 (“The selected pool id is invalid.”), so strip the prefix. Restricts the merchant list to only the merchants collected into that pool, and resolves providers[] approvals/links against that pool’s own network credentials (Pools → Sources) instead of your account’s default pool. Requires extended=1. Returns 422 if the pool doesn’t exist or belongs to another team. Omit it and the list is unscoped, with links resolved against your account’s default pool.
This is a different merge than pool_id on /v1/products, /v1/products/omni, or /v1/promotions — there, the pool’s network_ids/merchant_ids are combined with whatever you pass. Here, pool_id is a hard scope: only merchants collected into that pool come back, and there’s no separate merchant_ids filter for it to merge with. See Pools.
string
Comma-separated canonical merchant IDs (mer_ ULID format).
string
Comma-separated category IDs (cat_ ULID format).
string
Filter by category name. Max 255 characters.
string
Comma-separated ISO 3166-1 alpha-2 country codes the merchant operates in.
string
Comma-separated country codes for the merchant’s origin country.
string
Comma-separated country codes for the merchant’s market countries.
string
Comma-separated ISO 4217 currency codes (3-character).
string
Comma-separated ISO 639-1 language codes (2-character).
string
Comma-separated merchant types. Values: standard, asn.
Filter by Shopnomix availability. Values: direct, indirect, verified, any, none.
integer
Return only merchants with at least this many promotions.
integer
Return only merchants with at most this many promotions.
integer
Set to 1 to return only merchants with a stored commissionable_url template.This is not a “merchants I can link” filter. A link built from a synced approval’s tracking URL needs no template, so this excludes merchants that do return a populated providers[].url. On a synced network this filter can match well under half a pool’s merchants, while every merchant it excludes still returns a usable url. To test for a usable link, read providers[].url.

Example request

cURL

Response

Response fields

meta object

integer
Total matching merchants.
integer
Index of the first result on this page.
integer
Index of the last result on this page.
integer
Current page number.
integer
Total pages available.
integer
Results per page.
array
Fields included in each merchant object.
string
Request trace ID for support use.

Merchant object

integer
Numeric merchant ID (legacy). Use object_id for new integrations.
string
Unique identifier in nmer_ULID format. Represents this merchant on a specific network.
string
Short-form identifier (e.g. nmer_as46gj2g).
string
The merchant’s ID in the originating network. May be null.
string
Merchant display name.
string
Merchant description. May be null.
array
Canonical domain(s) for the merchant.
string
Merchant homepage URL.
string
Merchant icon URL.
string
Merchant logo URL.
integer
Products available from this merchant.
integer
Promotions available from this merchant.
boolean
Whether the merchant has any associated content.
Cookie window as ISO 8601 duration (e.g. P1M2D). null if not reported.
boolean
Whether the merchant supports deep linking. null if unknown.
array
Product categories. Each item has id, breadcrumb, name, shopify_id, google_id.
array
ISO 3166-1 alpha-2 country codes where this merchant operates.
array
ISO 4217 currency codes supported.
object
What the merchant monetizes: products, services, promotions (booleans).
array
The ways you can earn commission on this merchant — one entry per network/subnetwork. May be empty. See Outclick links for how the tracked outclick link works.
object
The affiliate network for this merchant.
object
The deduplicated canonical merchant record. null if none exists.
array
Merchant classification. Values: standard, asn (Amazon Seller Network).
Third-party services available. Keys are service identifiers; values are direct, indirect, or verified. null if none.
For each merchant we work down three options and stop at the first one that yields something:
  1. A link built for you. Some networks build a link for one named publisher and hand it to us with your ID already in it. No slots left to fill — publish it as-is. This is the common case.
  2. A shared template. More often for some networks, we hold one link for the merchant that everyone shares, with a slot where the ID goes. You fill {AFF_ID} (and optionally {SUB_ID}) before publishing, or let the outclick fill it at click time.
  3. No link. The merchant still comes back with its name, logo and everything else we know — just nothing to link with. That’s an answer, not a failure: the merchant exists and isn’t monetizable by you yet.
The case that looks like a template but isn’t. Sometimes the link we hold already has a real ID in the slot, and it belongs to someone else. That is not a template, whatever it looks like, and we never pass it on — every click would pay the wrong publisher. Those merchants fall to option 3 and return no link, even though the database plainly holds a URL for them. This is the usual explanation when a merchant you’d expect to be linkable comes back empty.
Which lands you in one of three states: When each field is null:
  • url — no built tracking link. It’s populated whenever your approval record carries one (Shopnomix builds it from a resolved campaign id instead). It is not gated on status — a provider showing available or pending can still return a usable url, and an approved one can return null if no tracking link was stored. Read url, not status, to decide whether you have a ready-made link. Note that a populated url is not always a finished link: Shopnomix bakes in campaign_id but leaves source={SUB_ID} for you to fill.
  • template — the network stored no shareable placeholder form for this merchant, or the only stored link has a real publisher ID baked into it and so can’t be shared (see the note above). Shopnomix always has a template when the merchant has a home URL. For AdMedia merchants, template is also withheld from accounts without the AdMedia grant.
  • outclick — nothing to wrap (url and template both null); or the merchant is priced per click (CPC); or the provider’s link is built from your own login credentials, which a merchant-level link has nowhere to carry. That last case is detected per merchant, not taken from a fixed list — every link is tested before it’s offered and quietly dropped if a slot comes back unfilled, since a broken link is worse than no link. Adservice, Belboon and Partnerize commonly land here.
Two account-level switches withhold links everywhere rather than per merchant:
  • Outclick disabled on your account — every outclick on every merchant is withheld until it’s switched back on.
  • No team context — requests that resolve no team (queued exports, for example) mint no outclick links at all.

Getting from “Shareable” to “Built for you”

A provider stays in the Shareable state until two separate things are both true. Missing either one keeps url at null:
  1. You’re connected. The provider is configured as a source on the pool your request resolves to — Pools → Sources — or, failing that, at the account level, which is where resolution falls back to.
  2. The network has sent us a working link for this merchant. Check url itself, not status — the two don’t always move together.
Shopnomix has no separate approval step. A Shopnomix source with a campaign ID is sufficient on its own — url builds as soon as that’s configured, and status reads approved for every merchant on that credential. Neither confirms Shopnomix has approved this specific merchant — only that a campaign credential resolves. Configuration is per pool, so check the right one. If your request carries a pool_id, that pool’s own sources are what count first — a provider configured on a different pool never applies. Omit pool_id and the request resolves to your account’s default pool instead. Pool scoping is not provider isolation. Credential resolution is pool-first, then account: for a provider the pool owns no credential for, the request falls back to your account-level credential. So a pool set up for one network still returns links for other providers — verified live, an AdMedia-only pool returned a working Shopnomix url for every merchant in it, carrying the account credential’s campaign rather than the pool’s. The same merchant can therefore come back with a different campaign_id under two different pools. Each provider carries an outclick — a link routed through Affiliate.com’s redirector (outclick.co) rather than sent straight to the network. When a visitor follows it, Affiliate.com records the click, then forwards them to the provider with your credentials, so the click lands in your report. The url and template links, by contrast, go straight to the network and are not recorded by us — both carry your credentials to the same destination; the difference is only whether we record the click. Using outclick isn’t required — url and template work fine as standalone links — but it’s strongly recommended, since it’s the only one of the three that gives you click-level reporting. Every outclick also carries the merchant’s plain home page inside it, so you can request the ordinary uncommissioned link instead of the affiliate one without building anything yourself. AdMedia links are the exception — they’re format-locked and always resolve to the AdMedia redirect.
AdMedia replaces the network entry rather than adding to it. For a merchant reaching us through AdMedia, the url, template and outclick on the network provider are AdMedia’s own — there is no separate admedia entry in providers. Only accounts granted AdMedia access see them; to everyone else the merchant looks like it has no link. Shopnomix, by contrast, runs alongside the network provider, so a merchant can carry both.
  • Fill the slots. A shared outclick ends with ?affiliate_id={AFF_ID}&sub_id={SUB_ID} — replace {AFF_ID} with your affiliate/campaign ID and {SUB_ID} with your sub-ID.
  • The outclick param is affiliate_id / sub_id for every provider except AdMedia. Affiliate.com’s redirector maps them to each provider’s native parameter on the way through, so you never use the provider-specific name on an outclick — with that one exception. Those names otherwise appear only on the direct url / template links:
  • AdMedia uses its own native names. Its outclick carries aff_id / sub_id plus cid and ref_id, which have no generic equivalent. Don’t “correct” it to affiliate_id.
  • The slots disappear as values resolve. They’re optional overrides, not requirements. An AdMedia merchant with an Affiliate ID saved on the pool returns ?sub_id={SUB_ID} only; one with cid, sub_id and ref_id also saved returns no query string at all. A synced Awin merchant likewise arrives with the publisher id already baked into url and nothing left to fill.
  • Merchants-only naming. These {AFF_ID}/{SUB_ID} tokens are how the merchants response spells the slots. The Products and Promotions endpoints still use @@@/###, and the merchant’s stored commissionable_url keeps @@@ — only the merchants response was renamed.
  • Reporting. Merchant outclicks appear under the merchant offer type: GET /v1/reports/outclick?offer_type=merchant (the report defaults to product).
  • Deep links are not tracked here. The deeplink builder produces a provider redirect (not an outclick), so deep-linked clicks don’t appear in the outclick report — only the homepage-level outclick does.

Error responses