The loop
Every connector, regardless of destination, runs the same loop:1
Poll for pending records
Ask MerchantOps for records that have been approved and routed to your
target but not yet reported as done.
2
Transform
Map each MerchantOps record onto whatever shape your system expects
(field names, units, identifiers).
3
Push to your system
Write the record into your destination — call its API, update your
database, drop a file, whatever your system needs.
4
Report the outcome
Tell MerchantOps whether each record succeeded or failed. Reported records
drop out of the next poll; unreported ones come back so you can retry. Send
each outcome exactly once — see Retries and idempotency below.
Setup
1
Register the target
In Settings › Publish Targets, add an integration for your custom
target with a target key (for example
custom) and a poll delivery
mode. No credentials for your system are stored on the MerchantOps side —
your connector authenticates to your system itself.2
Create an API key with a role that grants the connector permissions
The connector API is gated on two permissions:
Settings › API Keys has no scope picker. You create a key and assign it
one or more roles, and the key inherits whatever permissions those roles
bundle. Roles themselves are defined for your organization by MerchantOps,
not in the app.The standard Owner / Admin / Editor / Viewer roles don’t include the
connector permissions — so unless your organization already has a
purpose-built connector role, ask your MerchantOps contact to set one up
bundling the two permissions above, then assign it when you create the key.
The poll endpoint accepts either permission; reporting an outcome
requires
pricing.publish.outcome:write specifically. A read-only
monitoring key can therefore be granted only
pricing.publish.outcome:read.3
Run your connector
Your service holds the key and calls MerchantOps over HTTPS with:The key is organization-scoped — your connector only ever sees records that
belong to your organization.
Poll for pending publishes
Request the records routed to your target that haven’t been reported yet:limit records with the fields you need to publish
them:
Report an outcome
For each record, POST back what happened:string
required
The target you configured (for example
custom).string
required
One of
success, failed, or skipped. Report success or failed for
every record — a skipped outcome is stored on the record but does not count
toward the batch’s progress. If you decided not to write a record into your
system, report it as failed with an error explaining why.number
The HTTP status or internal result code your system returned. Helps debugging.
number
How long your call took.
number
1 for a first-try success; higher if you retried.string
A short failure summary — shown in the publish status UI when the status is
failed.string
The record’s ID in your downstream system, if it has one.
Retries and idempotency
Your connector owns its retry logic entirely. A record stays pending until you POST a terminal outcome, so if your connector crashes mid-run, the record is still pending on the next poll — just pick it up again.A minimal connector
The whole contract fits in one loop:What you get
- Isolation. Your connector talks to MerchantOps only over HTTPS. No shared infrastructure, no special client libraries.
- Org scoping. Your key can only read and update your organization’s records — there’s no way to affect another tenant.
- The same monitoring surface. Your publishes appear in
publish status alongside built-in connectors:
per-target breakdown, per-record outcomes, and job progress. The batch-level
rollup is the one exception — see the
batch_final_statuswarning above.
Next steps
VTEX (reference connector)
A worked example of a built-in connector for catalog and pricing.
Reading publish status
See where your connector’s outcomes show up.