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.
Technical questions? Talk to an engineer on WhatsApp — 0% bots.
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.
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.
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.
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 get | Field | What it is for |
|---|---|---|
| Whether they are currently employed | type | The main decision: there is an active IMSS registration, or there is not. |
| Who the employer is | employerName · employerRfc · employerRegistration · state | Legal name, tax ID, employer registration number and state. Compare against the company the person declared. |
| IMSS base salary | baseSalary.amount | The daily salary the employer reports to IMSS, in pesos. |
| Contributed days | contributedDays | Days of the period with contributions. A full month is not the same as a few scattered days. |
| Coverage modality | modality | The type of affiliation per the IMSS catalog: city worker, farm worker, domestic worker, self-employed, government… |
| Confirmed identity | personalInfo · nss | Full name, CURP and NSS exactly as IMSS holds them. |
| Report validity | reportDetails | The period the report covers and its issue date. |
| The official report as a PDF | files[] | 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.
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.
First time using a webhook? We explain it step by step → · See all IMSS services →
The type field names the case with a stable code. Your backend runs a switch, it does not interpret text.
| type | What happened | What to do |
|---|---|---|
SUCCESS | Currently employed. Employer, base salary and contributed days are included. | Proceed. Feed the salary and the days into your decision model. |
INACTIVE_EMPLOYMENT | The person exists at IMSS, but has no active registration today. | Review. Not a rejection: they may be self-employed or between jobs. |
MISMATCH_CURP_NSS | You sent an NSS and it does not match that CURP. | Review. Usually a typo; it can also be someone else's NSS. |
CURP_NOT_FOUND | IMSS could not find that CURP. | Review. Check the CURP against RENAPO. |
PERSON_WITHOUT_NSS | The CURP exists, but has no NSS assigned. | Review. Never registered with IMSS. |
IMSS_INCONSISTENT_DATA | The CURP exists, but its data is inconsistent at IMSS. | Review. The person must clarify it with the institute. |
IMSS_OPERATION_LIMIT | IMSS applied a temporary limit to that query. | Retry later. |
SERVICE_UNAVAILABLE | IMSS is not available. | Retry. Not charged. |
INVALID_REQUEST | The CURP is malformed or the webhook is missing. Answered immediately, when you create the query. | Fix the request. Not charged. |
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.
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"}}'
{
"status": "OK",
"type": "ACCEPTED",
"transactionId": "322e6c8b-0124-5c84-95db-4da04842d0da",
"billable": false
}
{
"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
}
Contribution weeks delivers the official IMSS certificate as a PDF, the full job history and signals for tenure, stability and salary evolution.
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.
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.
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.
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.
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.
Yes. With includePdf: true the result includes the official report as a PDF, at no extra credits.
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.
You get all of them. employmentInformation is a list, each job with its own base salary and contributed days.
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.
2 credits per resolved query. The receipt is not charged and the PDF adds no credits. Plans are published.
No. The result is delivered to your webhook and we do not keep it afterwards. Zero retention across all our regions.
Courtesy credits to query in production. Access is enabled after a brief validation of your company.