The same role, typed out four times
An agency that works inside its clients' systems, or a group that runs a different ATS per brand, opens the same role several times over. Each system wants it in its own shape. One asks for a team id, another for a named user to attribute the posting to, a third will not save without an industry, a function and an experience level. The copy is identical. The forms are not, and the fourth version is the one with the typo in the salary.
This play collects the role once and does the translating. What it will not do is decide when the role becomes public. Every system here creates a draft, and drafts are private. Publishing is a separate call, made after you have seen the drafts and said yes once for the whole set.
What you get back
A draft of the role in each connected ATS, then the live role once you approve. And the ledger: a short table with one row per system showing live, draft only, failed or skipped, with the id of the role in that system and the vendor's error where there was one.
The ledger is the part that matters on a bad day. When three systems published and one refused, the ids are what let you finish the fourth without creating the first three again.
Variations worth knowing
One ATS only. The same discipline works for a single system: ids resolved first, a draft, then an approved publish.
Drafts and no further. Ask for the drafts and stop. A hiring manager can review the role inside their own ATS and publish it themselves.
Internal only. Lever publishes to both its public and internal channels unless told otherwise. If the role is for internal candidates, say so before the publish step.
Fill it afterwards. Sourcing for the same role is a separate job: turn a job spec into a ranked shortlist starts from the same spec.
Where this goes wrong
An id that does not exist. A wrong team or location id fails the write, and most of these vendors do not say which field was wrong. The agent asks. It does not guess.
Ashby will not open the job. A job in Ashby cannot be opened without a default interview plan. Give that id at the start if you intend to publish.
SmartRecruiters refuses to publish. Your plan's limit on live ads, a job that needs internal approval first, or a missing compensation band all block the publish call. These are settings on your side, so they are relayed to you and not retried.
Expecting the API to set everything. Recruitee does not accept a salary or an employment type when a role is created. Those are finished inside Recruitee.
A timeout read as a failure. The role may have been created anyway. The agent checks with you or in the ATS before calling again.