#REPSE (STPS)

Devuelve el estado de una Fiscal Entity en el REPSE (Registro de Prestadoras de Servicios Especializados u Obras Especializadas), el padrón público de la STPS (Secretaría del Trabajo y Previsión Social): si el RFC aparece registrado, su folio, razón social, ubicación, vigencia y las actividades que amparaba el registro.

Cuelga de https://api.clarisfy.com/v1/fiscal-entities/ y es tenant-gated: tu organización debe tener una conexión activa al RFC, o el endpoint responde 404.

#Estado REPSE del RFC

GET/fiscal-entities/{fiscal_entity_id}/repse

#Parámetros de ruta

ParámetroTipoDescripción
fiscal_entity_idstringIdentificador de la FiscalEntity (fe_…).
cURL
curl "https://api.clarisfy.com/v1/fiscal-entities/fe_9a1c2b3d4e5f6071/repse" \
  -H "Authorization: Bearer clf_live_secret_9K3mZ1pQ7rTx8vB4nH6dLwYe"
JSON
{
  "rfc": "NAS210518XY0",
  "is_registered": true,
  "is_stale": false,
  "checked_at": "2026-07-30T12:00:00+00:00",
  "folio": "128149",
  "razon_social": "NARA ASSESSMENTS SC",
  "entidad": "Ciudad de México",
  "municipio": "Benito Juárez",
  "num_aviso": null,
  "fecha_aviso": null,
  "vigencia_hasta": "2027-05-18",
  "is_expired": false,
  "days_to_expiry": 292,
  "actividades": [
    {
      "descripcion": "Servicios de consultoría en administración",
      "folio": "128149"
    }
  ]
}

#Campos

CampoTipoDescripción
rfcstringRFC consultado, normalizado en mayúsculas.
is_registeredbooleantrue si el RFC aparece en el padrón REPSE. false es una respuesta real de la STPS ("no está"), no un error.
is_stalebooleantrue si la consulta en caché ya rebasó su ventana de frescura (1 día). El dato sigue siendo el último conocido; usa POST …/repse/refresh si necesitas uno nuevo.
checked_atstring | nullCuándo se consultó la STPS por última vez (ISO 8601).
foliostring | nullFolio del registro en el padrón.
razon_socialstring | nullRazón social como la reporta el padrón (puede diferir de la del SAT).
entidadstring | nullEntidad federativa del registro.
municipiostring | nullMunicipio o alcaldía del registro.
num_avisostring | nullNúmero del "Aviso de registro". La STPS lo devuelve vacío (ver nota abajo).
fecha_avisostring | nullFecha del "Aviso de registro" (YYYY-MM-DD). La STPS la devuelve vacía (ver nota abajo).
vigencia_hastastring | nullFecha de vencimiento del registro (YYYY-MM-DD).
is_expiredbooleantrue si el registro existe pero su vigencia_hasta ya pasó.
days_to_expiryinteger | nullDías hasta vigencia_hasta; negativo si ya venció. null si el padrón no publicó vigencia.
actividadesarrayActividades especializadas amparadas: { "descripcion", "folio" }. Vacío cuando is_registered = false.

#202: el RFC nunca se ha consultado

Si es la primera vez que se pide este RFC, la respuesta es 202 con el header Retry-After y este cuerpo, y la consulta a la STPS queda encolada:

JSON
{
  "status": "checking",
  "rfc": "NAS210518XY0",
  "retry_after_seconds": 15
}

Reintenta el GET después de retry_after_seconds. No trates un 202 como "no registrado" (ver la nota de los tres estados arriba).

#Errores

Código HTTPCausa
202El RFC nunca se ha consultado; la consulta quedó encolada. Cuerpo: {"status":"checking","rfc":"…","retry_after_seconds":15}, más el header Retry-After.
400fiscal_entity_id con formato inválido.
401Header Authorization ausente, mal formado, expirado o revocado.
404Tu organización no tiene una conexión activa a esa Fiscal Entity.

#Actualizar el estado REPSE

POST/fiscal-entities/{fiscal_entity_id}/repse/refresh

Encola una consulta al padrón de la STPS para el RFC y devuelve 202 de inmediato. El resultado se lee después en GET /fiscal-entities/{fiscal_entity_id}/repse: este endpoint no devuelve el registro.

#Parámetros de ruta

ParámetroTipoDescripción
fiscal_entity_idstringIdentificador de la FiscalEntity (fe_…).
cURL
curl -X POST "https://api.clarisfy.com/v1/fiscal-entities/fe_9a1c2b3d4e5f6071/repse/refresh" \
  -H "Authorization: Bearer clf_live_secret_9K3mZ1pQ7rTx8vB4nH6dLwYe"

202 Accepted:

JSON
{
  "status": "queued",
  "rfc": "NAS210518XY0"
}
CampoTipoDescripción
statusstringSiempre queued.
rfcstringRFC cuya consulta se encoló.

#Cooldown de 1 hora por RFC

Hay un cooldown de 1 hora por RFC. Dentro de esa ventana el endpoint responde 429 con el header Retry-After y los segundos restantes anidados dentro de detail:

JSON
{
  "detail": {
    "message": "Ya solicitaste esta actualización hace poco. Intenta más tarde.",
    "retry_after_seconds": 2480
  }
}

La STPS es un sitio público sin contrato de rate-limit publicado, y un registro REPSE cambia en escala de meses: una actualización por hora ya es mucho más frecuente de lo que se mueve el dato. Como la caché es por RFC, el cooldown también lo es — lo comparten todas las organizaciones conectadas a ese RFC.

#Errores

Código HTTPCausa
400fiscal_entity_id con formato inválido.
401Header Authorization ausente, mal formado, expirado o revocado.
404Tu organización no tiene una conexión activa a esa Fiscal Entity.
429Ya se solicitó una actualización de este RFC en la última hora. Incluye Retry-After y detail.retry_after_seconds.

#Vigencia: refresco y alertas automáticas

No necesitas orquestar el refresco de los RFCs que administras:

  • Un proceso diario vuelve a consultar los RFCs con conexión activa cuya consulta está vencida o nunca se hizo, en lotes acotados y en serie (es un sitio público, se consulta con moderación).
  • Ese mismo paso levanta una alerta por organización cuando la vigencia de un registro vence dentro de 60 días o ya venció: critical cuando ya venció, warning mientras solo se aproxima. La alerta está deduplicada por (RFC, vigencia), así que el proceso diario no repite el mismo aviso; solo una nueva vigencia (re-registro) abre una alerta nueva.

La alerta enuncia el hecho y la fecha. No concluye nada sobre deducibilidad ni sobre qué hacer: esa decisión es de tu contador.

#Proveedores cruzados contra el REPSE

GET/cfdi/repse-suppliers

Cruza los emisores de los CFDIs recibidos de un RFC contra el padrón, y reporta cuánto dinero está facturado por proveedores sin registro, con registro vencido o todavía sin verificar. Es la contraparte del endpoint anterior: ahí consultas tu propio registro, aquí el de quienes te facturan.

#Parámetros

ParámetroTipoDescripción
fiscalEntityIdstringRequerido. Typeid del RFC (fe_…).
monthsintegerVentana en meses hacia atrás. Default 12, máximo 24.
limitintegerMáximo de proveedores listados en suppliers. Default 50, máximo 200.

#Campos

CampoTipoDescripción
supplier_countintegerProveedores distintos en la ventana.
registered_countintegerCon registro vigente.
not_registered_countintegerConsultados y ausentes del padrón.
expired_countintegerEn el padrón, con vigencia ya vencida.
unknown_countintegerTodavía no consultados. No es lo mismo que ausentes.
monto_totalstringTotal facturado en la ventana.
monto_no_registradostringFacturado por proveedores ausentes del padrón.
monto_vencidostringFacturado por proveedores con vigencia vencida.
monto_sin_verificarstringFacturado por proveedores aún sin consultar.
truncatedbooleantrue si suppliers se recortó por limit.
suppliers[]arrayrfc, name, status, folio, razon_social, vigencia_hasta, days_to_expiry, checked_at, invoice_count, total_amount.

status de cada proveedor es uno de registered, not_registered, expired o unknown.

Los montos son NUMERIC serializados como string: parséalos con un tipo decimal, no con un float.

cURL
curl "https://api.clarisfy.com/v1/cfdi/repse-suppliers?fiscalEntityId=fe_9a1c2b3d4e5f6071&months=12&limit=50" \
  -H "Authorization: Bearer clf_live_secret_9K3mZ1pQ7rTx8vB4nH6dLwYe"