Refolk
TeardownReading the market

The Duplicate Job Posting Trace, Seven Copies Matched to One Requisition

Start from any one sighting, match every copy of a role to one requisition ID, flag stale and agency copies, and log a single application channel.

21 min readLast reviewed October 27, 2026Read as Markdown

Key takeaways

  • Workday requisition IDs stay the same when a role is reposted, so a shared ID proves two copies are the same job but does not prove the copy in front of you is still open.
  • Only 27.1% of Greenhouse postings are still open 30 days after first sighting, against 69.5% for Ashby, so treat a three-week-old copy of a Greenhouse role as dead until the source page shows it is live.
  • Six months is the most common published candidate-ownership window, Norland's runs 12 months, and some terms cover any job at the employer, not just the one advertised.
  • Under Lithe's terms, an earlier direct application beats an agency submission only if the employer tells the agency in writing within 48 hours, so your timestamped confirmation email is the evidence that settles it.
  • Refolk's index holds 25,509 agency recruiters in the US and 20,039 in the UK, and 72% of a UK sample carry the title Recruitment Consultant, so a search for Recruiter misses most UK agency staff.
  • Greenhouse flags duplicate applicants but does not block them, and it never auto-merges agency-sourced imports, so applying twice leaves a record that a person has to sort out by hand.

This is the trace I run when one role turns up on the employer's careers page, two job boards, an aggregator, and a couple of staffing agency listings. It is for job seekers who need to know which copy is real and live, and which one to apply through without being double-submitted. It gives you a seven-step procedure of about 20 minutes per role, carried through one worked example, and it ends with a logged record of the channel you chose.

What counts as the real copy of a job posting?

The real copy is the posting hosted in the employer's own applicant tracking system, because that is where the requisition ID lives and where every application ends up. Every other copy comes from it and is one of three types: a wrap, a scrape, or an agency mirror.

Two terms first. An applicant tracking system (ATS) is the software an employer uses to publish jobs and store applications. Workday and Greenhouse are the two whose URL formats this guide reads. A requisition ID is the employer's internal number for one approved opening, and it is the only field that can prove two copies are the same job.

Copy typeWhat it isWhat proves itHow it lies
SourceEmployer's ATS pageReq ID in URL and page sourceA repost keeps the ID but shows a new date
WrapBoard listing whose apply opens the sourceApply lands on the ATS URLBoard can strip the source token
ScrapeAggregator copy pulled on a scheduleText matches, apply points elsewhereStays up after the source closes
Agency mirrorAgency rewrite, client often hiddenRecruiter names client and role in writingCan be boilerplate for no live job

The labels matter because each type fails in a different way. A wrap is usually safe to apply through. A scrape is safe only if its apply link still lands on a live source page. An agency mirror changes who can claim a fee if you are hired, which is why it gets its own section below.

The worked example: one role, seven copies

The case is a senior forward deployed engineer role at a software employer that runs a Workday-style careers site. It is a composite. The URL shapes and ID formats come from public Workday and Greenhouse documentation and published scraper notes, and the requisition number R172762 is the format example from those notes, not a live opening. Keep your own posting open in another tab and follow along.

The first sighting was a job board listing. Over the next twenty minutes the trace found seven copies:

  1. The employer careers page, URL ending Sr-Forward-Deployed-Engineer_R172762, labelled "Posted 30+ Days Ago".
  2. A LinkedIn listing created by job wrapping. Job wrapping means the board imports postings from the employer's ATS and sends the apply click back to it.
  3. An Indeed listing with a link to apply on the company's site.
  4. An aggregator copy with the same description text and no visible ID.
  5. Agency A's ad: "our client, a leading software company", a reworded title, and a pay presentation that did not match the careers page.
  6. Agency B's ad: the same distinctive sentence from the description, location narrowed to one city, no client name.
  7. A second aggregator copy whose apply link returned a 404 (page not found).

That gives seven copies with different dates, different pay presentation, and two hidden employers. The question at the start is the one you have now: which of these is real, which is live, and which one should I click?

Where to find the job requisition ID on a careers page

The requisition ID is in two places on the source page: the URL, and the structured data in the page source. Workday puts it at the end of the URL slug, Greenhouse puts it in a gh_jid parameter, and both can expose it as identifier in the page's JSON-LD.

ATSWhere the ID sitsFormat examples
WorkdayEnd of URL slug, after the underscore_R172762, JR2027699, R-292670, 26020274
Greenhousegh_jid URL parameter?gh_jid=12345
Greenhouse source taggh_src URL parameter&gh_src=abcdef
Any ATS with structured dataidentifier in JSON-LDSame value as the URL ID

Workday formats vary by employer, so don't expect an R prefix every time. If a Workday link carries a suffix like ?source=BeameryInvite, that suffix is a channel tag, not part of the ID. Greenhouse's gh_src does the same job. It is a short string of numbers and letters that tells the employer which channel sent you.

Reading the page source

JSON-LD is a block of structured data that employers embed so search engines can read the posting. To find it, open the source page, view the page source, and search for JobPosting. Read these fields:

  • identifier holds the employer's job ID. It proves the match.
  • datePosted is the real posting date. It is more precise than any "30+ days" label.
  • validThrough is the expiry. Google tells employers that to pull a posting they should make sure validThrough is populated and in the past, so a past date here is a strong sign the role is closed.
  • directApply is the employer saying you can apply on that page. Treat it as a claim, not a guarantee.

Only title, description, datePosted and hiringOrganization are required. identifier and validThrough are only recommended, so a missing field proves nothing.

Match evidence, strongest first

  1. Requisition ID in the URL
    Workday underscore suffix or Greenhouse gh_jid, assigned by the employer
  2. identifier in JSON-LD
    The same ID read from the page source, survives some URL rewrites
  3. Distinctive sentence plus location
    Use when the ID is missing, as on some mirrored Workday postings
  4. Title, company and pay
    Weakest, because agencies reword titles and pay presentation varies
Match on the strongest layer a copy still carries, and drop a layer only when the one above it is missing.

In the worked example, the careers page slug ended _R172762, the JSON-LD identifier matched it, datePosted was present, and validThrough was missing. That row, with the ID recorded, is the anchor I compared every other copy against.

The trace, step by step

The trace has seven steps: capture the sighting, find the source, extract the ID and dates, find every copy, classify them, handle the agency copies, and pick and log one channel. No single source publishes the whole sequence. I put it together from ATS documentation, Google's structured-data rules and published agency terms. Each step has a done state, so you know when to move on.

The 20-minute duplicate posting trace

  1. Capture the sighting
    Log the title, location, pay, posted label and URL of the first copy as one row. About 2 minutes.
  2. Find the employer source
    Check the listing for an apply-on-company-site link, and if there is none, go to the company's main website. Done when you hold an ATS-hosted URL.
  3. Extract the requisition ID and dates
    Read the Workday underscore suffix or the Greenhouse gh_jid, then pull identifier, datePosted and validThrough from the page source. Done when one req ID is logged.
  4. Find every copy
    Search the exact title plus one distinctive description sentence, then search the req ID alone. Done when every copy is listed with its URL.
  5. Classify each copy
    Label each one source, wrap, scrape or agency mirror, and compare ID, dates and pay. For a repost, compare requisition number, responsibilities and location.
  6. Deal with agency copies
    Ask the agency in writing to name the client and the role, and check your log for a prior direct application before giving any consent.
  7. Pick one channel and log it
    Apply once and record the timestamp, final URL, req ID and confirmation email. Done when you can prove the date.

How each fork went in the worked example

Steps 1 and 2. The board listing gave me the title, city and a posted label. Its apply button did not go to the employer, so I followed the usual advice: look for a link to apply on the company's site. The Indeed copy had one, and it led to the Workday slug. If none of the copies had offered a link, the next move would have been the company's main website and its careers page.

Step 3. The slug gave ID R172762, and the JSON-LD confirmed it. The "Posted 30+ Days Ago" label only gives a minimum age, not the real one, so I logged datePosted instead.

Step 4. I ran two searches, in this order:

  • "Sr Forward Deployed Engineer" "<one distinctive sentence from the description>" finds copies that kept the text, including agency rewrites that only changed the title.
  • "R172762" finds copies that kept the ID.

The text search found the two aggregator copies and Agency B. The ID search mostly found copies that link back to the source. That gap is why you run both. Nobody has publicly established how reliably the ID survives into board and aggregator copies, so one search alone will miss some.

Step 5. The fork worth slowing down for was copy 7. It carried the same requisition ID, but the posting part of its URL differed from the live page and returned a 404. Workday keeps requisition IDs when a role is reposted, so copy 7 was a scrape of the earlier posting window, left up after that page closed. The role itself was still live under the same ID on the careers page. If I had read the 404 as "job closed", I would have dropped a live role.

Step 6. Agency A named the employer and the role when asked, and they matched R172762. Agency B never named a client.

CopyClassEvidenceVerdict
Careers page (1)SourceID in slug and JSON-LDLive, apply here
LinkedIn, Indeed (2, 3)WrapsApply lands on sourceSame job, skip
Aggregators (4, 7)Scrapes7 links to a dead posting URLIgnore both
Agency A (5)MirrorClient named, matches R172762No consent
Agency B (6)MirrorClient never namedUnverified, no CV

Step 7. I applied once, on the careers page, and logged it. The section on channels below covers why, along with the wrong turn that came before it.

How to tell if a job listing is scraped or expired

A copy is live only if its apply link lands on a source page that is still open. How long scraped copies stay up after the source returns a 404 has not been established publicly, so check the source every time. What is known is how fast sources close and how often some copies refresh.

How fast sources close depends heavily on which ATS hosts them. A public cohort table from JobsPipe tracked how many ATS postings were still open after they were first seen:

BoardOpen at 14 daysOpen at 30 days
Greenhouse35.0%27.1%
Lever66.0%56.7%
Ashby71.6%69.5%

Ashby's survival at 30 days is 2.6x Greenhouse's. In practice, a three-week-old copy of a Greenhouse role is much more likely to be dead than a copy of the same age from an Ashby employer.

Greenhouse postings still open after first sighting

  1. First sighting
    100%

    Every posting in the cohort

  2. Still open at 14 days
    35.0%
  3. Still open at 30 days
    27.1%

    Ashby keeps 69.5% at the same mark

Roughly a quarter of Greenhouse postings are still open 30 days after they are first seen, so an old copy of one is usually dead.

Three refresh mechanisms explain why copies drift away from the source:

  • Scheduled pulls. Talent.com pulls Greenhouse boards every four hours. A copy fed that way should follow the source closely. A copy from an unknown feed might not.
  • Board post lifetimes. Free Indeed posts stay up for up to 30 days in the US and up to 120 days in some other markets. A board copy can expire while the requisition is still open, or outlive it.
  • Combined statuses. Indeed's "job closed or expired" is a single status. It does not mean the role was filled.

When the source page is gone and you need to know what it said or when it went up, Google no longer offers its search cache. The free route is a Wayback Machine snapshot of the source URL, where you can read datePosted and the description as they were captured.

Staffing agency posted the same job as the company: ownership windows

When a staffing agency posts the same job as the company, the agency either has the client's permission to recruit for that role or is advertising speculatively, and the ad alone won't tell you which. The difference matters to you because a CV the agency submits can give it a claim to a fee if you are hired, and that claim runs for a set period.

A candidate-ownership window is the period, set in the agency's terms of business, during which the agency is owed a fee if the employer hires a candidate the agency introduced. RTR (right to represent) is your written consent for an agency to submit you. It should always name one employer and one role.

DocumentWindowScopeDirect-application rule
Fieldfisher terms6 months from CV receiptSpecific roleNot stated
Lithe terms6 months after rejectionFuture roles tooNo fee if notified within 48h
BountyJobs (recommendation)6 monthsAny jobEmployer owns prior 6-month applicants
Norland12 monthsAny engagementNot stated
Dover (survey of practice)6 to 12 monthsVariesFirst introducer

The table shows three patterns:

  • Six months is the most common published figure. One glossary cites 30, 60 or 90 days from first submission. That claim is unverified, so don't plan around it.
  • Scope varies a lot. Fieldfisher ties ownership to the specific role the agent had permission for. BountyJobs and Norland reach any job at the employer.
  • First in time wins, with conditions. Between agencies, Fieldfisher's terms favour the submission made first. Against a direct application, Lithe's terms require the client to tell the agency in writing within 48 hours of the agency's submission. Only then are no fees payable.

The wrong turn: an agency resubmission meets a direct application

In the worked example, the mistake happened before the trace began. The candidate saw Agency A's ad first, replied with a CV, and wrote something like "happy for you to put me forward for suitable roles." The next day they found the careers page and applied directly. Agency A then submitted them to the same employer for the same role.

Here is what the ATS does with that. Greenhouse's duplicate tag matches on email address, phone number and LinkedIn profile URL. It flags duplicates but does not block them. Candidates bulk-imported with an agency source are never auto-merged, and auto-merge does not work backwards. The collision therefore lands in front of a person as a manual alert. If the employer misses the 48-hour notice, a fee dispute can follow, and you are now part of a disagreement that has nothing to do with whether you can do the job.

How an agency collision unfolds

  1. Direct application
    Timestamped confirmation email arrives in your inbox
  2. Agency submits later
    The CV arrives as a separate agency-sourced record
  3. Duplicate alert
    The ATS flags the match but does not auto-merge agency imports
  4. 48-hour notice
    Under Lithe-style terms the employer must tell the agency in writing
  5. Resolution
    The earliest provable date decides who, if anyone, is owed a fee
The ATS hands the collision to a person, and the earliest date anyone can prove decides who is owed a fee.

The fix was quick. The candidate emailed Agency A, withdrew consent for that employer, gave the time of the direct application, and forwarded the confirmation email. One public-sector clause actually requires suppliers to check whether candidates have already applied through the official jobs board. Most agencies won't ask, so tell them.

Reply to an agency ad before sharing a CV
Hi [name],

Thanks for getting in touch about the [title] role. Before I share a CV or agree to representation, could you confirm in writing:

1. The client's name and the exact role title.
2. The client's requisition or job ID, if you have it.
3. That you have the client's permission to recruit for this specific role.

I have already applied directly to [employers from my log], so I do not consent to being submitted to them for any role. Any consent I give will cover one named employer and one named role only.

Thanks,
[name]

Send this before any CV or consent, and list every employer already in your trace log.

Finding the recruiter behind a mirror

To check an agency mirror, look up the recruiter who posted it, and use the job title that recruiters in that country actually carry. In Refolk's index of professional profiles, agency recruiter titles split sharply between the US and the UK.

25,509
Agency recruiters in the United States in Refolk's index
Titled Recruiter or Recruitment Consultant in the Staffing and Recruiting industry. The same query returns 20,039 in the United Kingdom.
MarketTotalTop title in sampleTop employer in sample
United States25,509Recruiter (60%)RCM Healthcare Services (6/25)
United Kingdom20,039Recruitment Consultant (72%)Reed (3/25)
Ratio US:UK1.27xn/an/a

The percentages come from samples of 25 profiles, so treat them as a direction, not a precise share. The US count for RCM Healthcare Services includes one profile spelled "RCM Health Care Services". Coast Personnel Services was next with 4. The practical point holds anyway: if you search "Recruiter" in the UK, you miss most of the people who post agency ads there.

How this goes wrong: failure modes and false positives

Most trace errors come from trusting one field too much: an ID taken to prove the job is open, a label taken as a date, or a status taken as an outcome. Each failure below lists what it looks like and the check that catches it.

The ID tells you it is the same job. It does not tell you the job is still open.
  1. Same req ID read as the same posting window. Workday IDs survive reposts, so a fresh date on a copy can mean a repost, not a scrape. Check: compare the posting suffix in the URL, the part shaped like _3164651-2, against the live page.
  2. No req ID read as a different job. Some Workday tenants leave out the requisition ID on postings mirrored across several career sites. Check: match on a distinctive description sentence and the location instead.
  3. A board application that loses its source token. Greenhouse says some advanced board integrations can remove the source parameter, so the application gets filed under the wrong channel. Check: look for gh_src= in the final application URL before you submit.
  4. "Closed or expired" read as filled. Indeed's combined status does not mean someone was hired. Check: the employer's careers page, then a search on the req ID for a repost.
  5. A copy dated by its listing label. "Posted 30+ Days Ago" is only a minimum, and a missing validThrough hides the real age. Check: datePosted in the page source or a Wayback Machine snapshot.
  6. Agency collision. You apply directly, an agency submits later, and the employer misses the 48-hour notice. Check: refuse RTR for any employer in your log, and keep the timestamp.
  7. Multi-location postings read as separate jobs. Workday's job list can show "5 Locations" without naming them. Check: open the job detail page before counting copies.
  8. Country-blind agency search. Searching "Recruiter" in the UK misses about 72% of the sample, who are titled Recruitment Consultant ([OURS] sample of 25).

What the evidence does not settle

Two questions come up all the time and have no solid answer. First, nobody has published a validated list of signs that an agency ad is fishing for CVs rather than filling a real role. Ask a Manager describes agencies that post boilerplate ads for jobs that don't exist, but that is practitioner testimony. Second, the widely shared ghost-job figure comes from a Resume Builder survey of 650 hiring managers, in which 40% of companies said they had posted a fake listing that year. CV-writing services produced those figures, and one critique notes the source would benefit from candidates being more anxious. My local test is simpler: an agency mirror that won't name the client after one written request stays unverified, and it gets no CV.

Apply on the company website or the job board?

Apply once, through the employer's source page or a wrap that lands on it. Consider an agency route only when the agency has named the client and role in writing, you have not applied already, and you are willing to give consent for that one role.

Here the sources genuinely disagree. Jobscoutly calls applying on both channels reasonable. LoopCV warns that duplicates can create confusing duplicate records. I side with LoopCV, because the ATS documentation supports it. Greenhouse flags duplicates rather than blocking them, and auto-merge does not reach back to existing records. A second application doesn't raise your chances. It leaves two records of you for one requisition, filed under two sources.

Source tracking is weaker than most applicants assume:

  • Integrated boards send applications into the same job record with a source label attached. Greenhouse, for example, receives Talent.com applicants that way.
  • The source token can be lost. Greenhouse says advanced integrations may strip it.
  • LinkedIn job wrapping is not tracked by Greenhouse unless the employer enables source tracking.
  • Batching and separate inboxes. No vendor documentation covers boards that collect applications and send them in batches, or very small firms that set up separate email addresses per source. Practitioner write-ups describe both.

Because the ATS's record of your channel can be wrong, your own log is the record that counts. Whichever channel you pick, tailor against the source page's description, not an agency's rewrite or a scraped copy that may be an older version. Refolk tailors your resume and cover letter to the posting you give it and scores how well you fit, so give it the source text you just verified.

Trace log row, one block per role
Role:
Employer:
Req ID:
Source URL:
datePosted / validThrough:
Copies found (URL | class | ID match | date shown | pay shown):
1.
2.
3.
Agency contacts (agency | recruiter | client named in writing? | consent given?):
Channel chosen:
Applied at (date, time, timezone):
Final application URL, including source tag:
Confirmation email subject and time received:

Paste into a spreadsheet or notes file and fill one line per copy, marking the channel you used as APPLIED.

Keeping the trace log current

A trace log stays useful for as long as an ownership window could still reach you, which under published terms can be 12 months. Board saved-job lists don't last that long: Indeed removes saved jobs older than six months, so the log you keep yourself is the only lasting record.

Re-check in three situations:

  • Before any follow-up message. Reopen the source URL and read validThrough in the page source.
  • When a "new" copy appears. Search its req ID against the log. For a reposted replacement, compare the requisition number, responsibilities and location before treating it as the same job. If the responsibilities changed, run your fit score again in Refolk against the new text before deciding whether to reapply.
  • When an agency calls about an employer already in the log. Read them the date from the log and decline consent.

Before you call the trace done

  • The log holds one source row with a requisition ID, or with a matched description sentence and location if the ID is missing.
  • Every copy has a URL and exactly one label: source, wrap, scrape, or agency mirror.
  • Every scrape's apply link was opened and either lands on the live source or is marked dead.
  • The posting date in the log comes from datePosted or an archive snapshot, not from a "30+ days" label.
  • Multi-location postings were opened to the detail page before being counted as separate jobs.
  • No agency holds consent for this employer unless it named the client and role in writing before I applied.
  • The final application URL was checked for its source tag before submitting.
  • The confirmation email is saved and its timestamp is in the log.

Questions job seekers ask

The same job is posted on multiple sites. Which one should I apply to?

Apply through the employer's own applicant tracking system page, or through a job board listing whose apply button opens that page. Before you apply, match the copies by requisition ID, or by a distinctive description sentence plus location if the ID is missing. Ignore scraped copies whose apply link fails. Apply only once. Greenhouse flags duplicate applicants without blocking them, and its auto-merge does not work backwards, so a second application leaves a second record someone has to clean up.

Is it better to apply on the company website or a job board?

The company website is the safer default because the application lands in the employer's system with no middle step. A job board listing that opens the employer's ATS page is nearly as good. The weak point is source tracking. Greenhouse says some advanced board integrations can strip the gh_src token, and it does not track source from LinkedIn job wrapping unless the employer turns that on. Check the final URL before you submit, and keep your own timestamped record.

An agency submitted me after I applied directly. What happens now?

Usually the earlier date wins, but only if somebody acts on it. Under Lithe's published terms, no fee is payable if the client tells the agency in writing within 48 hours of the agency's submission that you had already applied. Email the agency right away. Withdraw consent for that employer, give the time you applied directly, and forward your confirmation email. Greenhouse does not auto-merge agency imports, so a person at the employer will see a duplicate alert.

How can I tell if a job listing is scraped or expired?

Open the listing's apply link rather than trusting the listing. A scrape usually links somewhere other than the employer's live ATS page, or to an old posting URL that returns a 404. Then check the source page source. A validThrough date in the past means the employer is pulling the role. Labels like Posted 30+ Days Ago only give a minimum age, so read datePosted from the page source or a Wayback Machine snapshot.

Where do I find the job requisition ID on a careers page?

On Workday-style sites the requisition ID is the end of the URL slug after the underscore, for example _R172762. Formats vary by employer, so you may see JR2027699, R-292670 or 26020274. On Greenhouse-style pages it is the gh_jid parameter. Either way, view the page source and search for JobPosting. The identifier field should hold the same value. Some mirrored Workday postings leave the ID out entirely.

Does job closed or expired on Indeed mean the role was filled?

No. Indeed uses one combined status for closed or expired, and it does not mean the role was filled. A free Indeed post stays up for up to 30 days in the US and up to 120 days in some other markets, so the listing can lapse while the requisition is still open. Check the employer's careers page directly, and search the requisition ID in case the role was reposted under the same number.

Put this to work

Paste your career in once. Every application after that is written for you.

Drop a resume or a LinkedIn URL. I rank the live openings against it, rewrite the resume and write a cover letter for the best of them, and fill in the employer's form when you press the button. You read, you decide what goes out.

  1. 01Drop your resume

    A PDF or a LinkedIn URL. About a minute, once.

  2. 02I rank the openings

    Every weekday morning, the live catalog scored against your history. Up to 20 worth your time, not two hundred links.

  3. 03Each one is written up

    Resume rewritten for the posting, a cover letter, a fit score. Press send, or let me fill in the form.

  • New matches ranked and written before you are up.
  • Every bullet stays inside what your history supports. Nothing invented.
  • Queued, submitted, interviewing, offer: one screen, not a spreadsheet.

Free, no card. Up to 25 applications sent a week, and nothing is sent until you say so.

Read next