Added

📊 New GET /estimates endpoint, more income estimates and webhook catch-up

  • Added — New endpoint: GET /estimates/{identifier} — Compute monthly_income, employment_status and tenure for a CURP with your own window, sources and date, including a month-by-month history. It doesn't create a verification and isn't billed.
  • Deprecated — estimated_monthly_income, employment_status and tenure in GET /profile — GET /estimates replaces these three fields. They keep working until November 15, 2026, then they are removed from GET /profile.
  • Improved — estimated_monthly_income is returned for more people — When there is no recent payroll or employment data, GET /profile now uses payroll and employment records from up to the last 12 months, so fewer profiles return null. Applies to estimates computed from now on.
  • Added — New tenure value: less_than_3_months — Employed people who joined their current employer less than 3 months ago now return less_than_3_months instead of null. If you validate this enum strictly, accept the new value.
  • Improved — Auto-disabled webhooks keep your events — If a webhook is auto-disabled after repeated delivery failures, its events are now kept for up to 72 hours and delivered when you re-enable it.

📊 GET /estimates

GET /estimates/{identifier} computes monthly_income, employment_status and tenure for a CURP with your own settings:

  • window_months: 3, 6, 9, 12 or 24 months of history (default 12). With 3 it matches GET /profile.
  • sources: all, invoices (nóminas and own billing) or employments (IMSS/ISSSTE).
  • as_of: compute the values as of a past date, up to 24 months back.
  • history=true: one point-in-time estimate per month, up to 18 months.

The response also includes income_source: where the estimated income comes from.

Same access rules as GET /profile. It doesn't create a verification and isn't billed. See the Estimates guide and the API Reference.

⚠️ Replaces three fields in GET /profile

GET /estimates replaces these fields of GET /profile, which are now deprecated:

Deprecated in GET /profileUse in GET /estimates
estimated_monthly_incomemonthly_income
employment_statusemployment_status
tenuretenure

With window_months=3, GET /estimates returns the same values as GET /profile. The deprecated fields keep working (including the improvements below) until November 15, 2026, then they are removed from GET /profile. Move to GET /estimates before that date, with window_months=3 if you want the same values you get today.

💰 Estimated monthly income

GET /profile/{identifier} used to return estimated_monthly_income only when there was payroll from the last 60 days or an employment record refreshed in the last 90 days. When neither exists, it now falls back to payroll and open IMSS/ISSSTE employment records from the last 12 months. Recent data always takes priority, and jobs with an end date are never used.

employment_status can be unknown while estimated_monthly_income has a value. Existing profiles pick up the change as their estimates are refreshed. See the Profile guide.

🗓️ Tenure

tenure now distinguishes "recently hired" from "no data":

ValueMeaning
less_than_3_monthsNew. employment_status = employed and the current employer's evidence covers less than 3 months
3_months_plus … 12_months_plusUnchanged
nullNot employed, or no employer-level evidence

GET /profile and GET /estimates return the same tenure for the same person.

🔔 Webhooks

When a webhook is auto-disabled after repeated failures, new events for it are kept for up to 72 hours. Once you re-enable that same webhook (fix its URL and turn it back on), they are delivered and show up in the delivery log like any other delivery. Creating a new webhook doesn't release them.

Webhooks you disable yourself still don't keep events while they're off.