#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
/fiscal-entities/{fiscal_entity_id}/repse#Parámetros de ruta
| Parámetro | Tipo | Descripción |
|---|---|---|
fiscal_entity_id | string | Identificador de la FiscalEntity (fe_…). |
curl "https://api.clarisfy.com/v1/fiscal-entities/fe_9a1c2b3d4e5f6071/repse" \
-H "Authorization: Bearer clf_live_secret_9K3mZ1pQ7rTx8vB4nH6dLwYe"{
"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
| Campo | Tipo | Descripción |
|---|---|---|
rfc | string | RFC consultado, normalizado en mayúsculas. |
is_registered | boolean | true si el RFC aparece en el padrón REPSE. false es una respuesta real de la STPS ("no está"), no un error. |
is_stale | boolean | true 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_at | string | null | Cuándo se consultó la STPS por última vez (ISO 8601). |
folio | string | null | Folio del registro en el padrón. |
razon_social | string | null | Razón social como la reporta el padrón (puede diferir de la del SAT). |
entidad | string | null | Entidad federativa del registro. |
municipio | string | null | Municipio o alcaldía del registro. |
num_aviso | string | null | Número del "Aviso de registro". La STPS lo devuelve vacío (ver nota abajo). |
fecha_aviso | string | null | Fecha del "Aviso de registro" (YYYY-MM-DD). La STPS la devuelve vacía (ver nota abajo). |
vigencia_hasta | string | null | Fecha de vencimiento del registro (YYYY-MM-DD). |
is_expired | boolean | true si el registro existe pero su vigencia_hasta ya pasó. |
days_to_expiry | integer | null | Días hasta vigencia_hasta; negativo si ya venció. null si el padrón no publicó vigencia. |
actividades | array | Actividades 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:
{
"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 HTTP | Causa |
|---|---|
202 | El RFC nunca se ha consultado; la consulta quedó encolada. Cuerpo: {"status":"checking","rfc":"…","retry_after_seconds":15}, más el header Retry-After. |
400 | fiscal_entity_id con formato inválido. |
401 | Header Authorization ausente, mal formado, expirado o revocado. |
404 | Tu organización no tiene una conexión activa a esa Fiscal Entity. |
#Actualizar el estado REPSE
/fiscal-entities/{fiscal_entity_id}/repse/refreshEncola 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ámetro | Tipo | Descripción |
|---|---|---|
fiscal_entity_id | string | Identificador de la FiscalEntity (fe_…). |
curl -X POST "https://api.clarisfy.com/v1/fiscal-entities/fe_9a1c2b3d4e5f6071/repse/refresh" \
-H "Authorization: Bearer clf_live_secret_9K3mZ1pQ7rTx8vB4nH6dLwYe"202 Accepted:
{
"status": "queued",
"rfc": "NAS210518XY0"
}| Campo | Tipo | Descripción |
|---|---|---|
status | string | Siempre queued. |
rfc | string | RFC 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:
{
"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 HTTP | Causa |
|---|---|
400 | fiscal_entity_id con formato inválido. |
401 | Header Authorization ausente, mal formado, expirado o revocado. |
404 | Tu organización no tiene una conexión activa a esa Fiscal Entity. |
429 | Ya 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ó:
criticalcuando ya venció,warningmientras 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
/cfdi/repse-suppliersCruza 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ámetro | Tipo | Descripción |
|---|---|---|
fiscalEntityId | string | Requerido. Typeid del RFC (fe_…). |
months | integer | Ventana en meses hacia atrás. Default 12, máximo 24. |
limit | integer | Máximo de proveedores listados en suppliers. Default 50, máximo 200. |
#Campos
| Campo | Tipo | Descripción |
|---|---|---|
supplier_count | integer | Proveedores distintos en la ventana. |
registered_count | integer | Con registro vigente. |
not_registered_count | integer | Consultados y ausentes del padrón. |
expired_count | integer | En el padrón, con vigencia ya vencida. |
unknown_count | integer | Todavía no consultados. No es lo mismo que ausentes. |
monto_total | string | Total facturado en la ventana. |
monto_no_registrado | string | Facturado por proveedores ausentes del padrón. |
monto_vencido | string | Facturado por proveedores con vigencia vencida. |
monto_sin_verificar | string | Facturado por proveedores aún sin consultar. |
truncated | boolean | true si suppliers se recortó por limit. |
suppliers[] | array | rfc, 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 "https://api.clarisfy.com/v1/cfdi/repse-suppliers?fiscalEntityId=fe_9a1c2b3d4e5f6071&months=12&limit=50" \
-H "Authorization: Bearer clf_live_secret_9K3mZ1pQ7rTx8vB4nH6dLwYe"