IMSS · Employment verification

Is this person working today? IMSS answers.

You send the CURP. Your system receives whether the person is currently employed, which employer has them registered, their IMSS base salary and the contributed days of the period — as JSON, ready for your decision, and with the official IMSS report as a PDF if you ask for it.

input: CURP onlyresult to your webhookoptional official PDF
empleo-imssAPI EXAMPLES

Pick a scenario and see what your system receives:

Fictional data with the exact structure the API returns. None of it belongs to a real person.

Where it fits

Three decisions you make blind today.

The person tells you where they work and how much they earn. This query tells you what their employer reported to IMSS. The gap between the two is exactly where the risk lives.

◈
OnboardingConfirm the job they declared exists and is current before moving further in the process.
$
Credit decisionThe base salary and the contributed days give you a verifiable signal of income and continuity, to size the limit and the term.
⚑
Fraud preventionMade-up jobs, employers that do not exist, inflated income: they show up when you compare what was declared against what the employer reports to IMSS.
Available today

We do not ask you to trust us. Check it.

It is common for IMSS employment verification to appear in a catalog or in some documentation and not exist when it is time to integrate. So before talking to us, there are three things you can check on your own.

1
The endpoint is publishedWith its route, its inputs and its cost in credits, in the open API reference. No sign-up.See the endpoint ↗
2
Every response has its exampleEvery case it can return, with the full JSON for each one. Not a general description: the contract.See the examples ↗
3
You test it with your own casesWe enable courtesy credits in production. You send your own CURPs and see what comes back, before signing anything.Request access →
The API response

JSON your system can already read.

Every value arrives in its own field, with the same name every time. And if you need the document, you ask for it in the same query.

What you getFieldWhat it is for
Whether they are currently employedtypeThe main decision: there is an active IMSS registration, or there is not.
Who the employer isemployerName · employerRfc · employerRegistration · stateLegal name, tax ID, employer registration number and state. Compare against the company the person declared.
IMSS base salarybaseSalary.amountThe daily salary the employer reports to IMSS, in pesos.
Contributed dayscontributedDaysDays of the period with contributions. A full month is not the same as a few scattered days.
Coverage modalitymodalityThe type of affiliation per the IMSS catalog: city worker, farm worker, domestic worker, self-employed, government…
Confirmed identitypersonalInfo · nssFull name, CURP and NSS exactly as IMSS holds them.
Report validityreportDetailsThe period the report covers and its issue date.
The official report as a PDFfiles[]Optional: with includePdf: true you get the IMSS document for your file, at no extra credits.

If they contribute under more than one employer, you get all of them. employmentInformation is a list: each job with its own base salary and contributed days.

One clarification about the salary: it is what the employer reports to IMSS to calculate contributions, and it has legal caps. It is a verifiable income signal — not a payslip, and it excludes bonuses and commissions.

How it works

You send the CURP. The result arrives at your system.

You do not keep a request open or your user waiting in front of the screen. You send the query with an address of yours, called a webhook, and we deliver the result there as soon as it is ready.

{ }
You send the CURPwith your webhook address
You get a receiptwith a query ID
✓
The result arrivesat your webhook, with the same ID

First time using a webhook? We explain it step by step → · See all IMSS services →

Business cases

Every response already carries its decision.

The type field names the case with a stable code. Your backend runs a switch, it does not interpret text.

typeWhat happenedWhat to do
SUCCESSCurrently employed. Employer, base salary and contributed days are included.Proceed. Feed the salary and the days into your decision model.
INACTIVE_EMPLOYMENTThe person exists at IMSS, but has no active registration today.Review. Not a rejection: they may be self-employed or between jobs.
MISMATCH_CURP_NSSYou sent an NSS and it does not match that CURP.Review. Usually a typo; it can also be someone else's NSS.
CURP_NOT_FOUNDIMSS could not find that CURP.Review. Check the CURP against RENAPO.
PERSON_WITHOUT_NSSThe CURP exists, but has no NSS assigned.Review. Never registered with IMSS.
IMSS_INCONSISTENT_DATAThe CURP exists, but its data is inconsistent at IMSS.Review. The person must clarify it with the institute.
IMSS_OPERATION_LIMITIMSS applied a temporary limit to that query.Retry later.
SERVICE_UNAVAILABLEIMSS is not available.Retry. Not charged.
INVALID_REQUESTThe CURP is malformed or the webhook is missing. Answered immediately, when you create the query.Fix the request. Not charged.
Raw infrastructure · 100% REST API

One call. One input.

You send the CURP and your webhook address. Same envelope as every OrigoID service — learn the contract once and it works for IMSS, CURP, INE, RFC and more.

CURP onlyThe NSS is optional: if you send it, we check it against the one IMSS holds for that CURP.
2 credits per resolved queryCharged when there is a result. The receipt is free and the PDF adds no credits.
Zero retentionThe result is delivered to your webhook and we do not keep it afterwards.
empleo-imss
const res = await fetch("https://api.origoid.com/mex/social-security/v1/imss-employment-status-async", {
  method: "POST",
  headers: {
    "x-api-key": process.env.ORIGOID_API_KEY,
    "content-type": "application/json",
  },
  body: JSON.stringify({
    curp: "XEXX010101HNEXXXA4",
    includePdf: true,
    webhook: { url: "https://your-domain.com/hooks/origoid" },
  }),
});

const receipt = await res.json(); // type: "ACCEPTED"
import os, requests

res = requests.post(
    "https://api.origoid.com/mex/social-security/v1/imss-employment-status-async",
    headers={"x-api-key": os.environ["ORIGOID_API_KEY"]},
    json={
        "curp": "XEXX010101HNEXXXA4",
        "includePdf": True,
        "webhook": {"url": "https://your-domain.com/hooks/origoid"},
    },
    timeout=30,
)
receipt = res.json()  # type: "ACCEPTED"
curl -X POST https://api.origoid.com/mex/social-security/v1/imss-employment-status-async \
  -H "x-api-key: $ORIGOID_API_KEY" \
  -H "content-type: application/json" \
  -d '{"curp": "XEXX010101HNEXXXA4", "includePdf": true, "webhook": {"url": "https://your-domain.com/hooks/origoid"}}'
Immediate receipt
{
  "status": "OK",
  "type": "ACCEPTED",
  "transactionId": "322e6c8b-0124-5c84-95db-4da04842d0da",
  "billable": false
}
What arrives at your webhook
{
  "status": "OK",
  "type": "SUCCESS",
  "data": {
    "nss": "00000000000",
    "personalInfo": { "givenNames": "NOMBRE EJEMPLO", "firstSurname": "APELLIDO" },
    "employmentInformation": [{
      "employerName": "EMPRESA EJEMPLO S.A. DE C.V.",
      "employerRfc": "XAXX010101000",
      "state": "CIUDAD DE MEXICO",
      "baseSalary": { "amount": "500.00", "currency": "MXN" },
      "contributedDays": 28
    }],
    "reportDetails": { "reportPeriod": "2026-02" },
    "files": [{ "contentType": "application/pdf", "content": "JVBERi0x…" }]
  },
  "transactionId": "322e6c8b-0124-5c84-95db-4da04842d0da",
  "billable": true
}
Need the whole track record, not just today's job?

Contribution weeks delivers the official IMSS certificate as a PDF, the full job history and signals for tenure, stability and salary evolution.

See contribution weeks →
Has your team never used a webhook?

We prepared a guide that explains it without jargon: what it is, what your system needs to receive the result and how to get it working.

See the webhooks guide →
Why OrigoID

The data is IMSS's. The difference is how it reaches you.

What changes between providers: whether the data arrives ready to decide or has to be read by hand, whether you are told clearly when there is no data, and what happens to your user's information afterwards.

◈
Ready to decideSalary, days and employer in their own fields. Your risk model consumes them directly, without a human in between.
⚑
Never a silenceWhen there is no usable data, the response says why: CURP not found, no NSS assigned or inconsistent data.
§
With the document, if you need itThe official IMSS report as a PDF arrives together with the data, for your file or your audit.
$
Published pricing2 credits per query, and the price per credit drops with your volume. All public. See pricing

OrigoID is not IMSS and does not act on its behalf: it is a technical means of querying and cross-checking against that source. The accuracy and currency of the information depend on the institute itself.

Frequently asked

What people usually ask us.

What do I need to run a query?

Only the person's CURP and your webhook address. The NSS is optional: if you send it, it is checked against the one IMSS has registered for that CURP.

How do I receive the result?

At your webhook. When you create the query you get a receipt with an ID; when the result is ready we send it to your address with that same ID.

Can I receive the official IMSS document?

Yes. With includePdf: true the result includes the official report as a PDF, at no extra credits.

Is the IMSS base salary their actual pay?

Not exactly. It is the daily salary the employer reports to IMSS to calculate contributions, and it has legal caps. It works as a verifiable income signal, but it is not a payslip and excludes bonuses and commissions.

What if they contribute under several employers?

You get all of them. employmentInformation is a list, each job with its own base salary and contributed days.

Is "no current employment" a reason to reject?

No. INACTIVE_EMPLOYMENT means there is no active IMSS registration today. The person may be self-employed, earning informally, or just out of a job.

How much does it cost?

2 credits per resolved query. The receipt is not charged and the PDF adds no credits. Plans are published.

Do you store the query data?

No. The result is delivered to your webhook and we do not keep it afterwards. Zero retention across all our regions.

Try it with your own cases.

Courtesy credits to query in production. Access is enabled after a brief validation of your company.

Request access