Sandbox
El sandbox te permite integrar sin credenciales reales de portales ni datos de contribuyentes.
Las llaves ck_test_ ejecutan un proveedor simulado que devuelve datos verosímiles y deterministas,
con la misma forma que producción.
Cómo entrar
- Toda cuenta nueva recibe una llave
ck_test_al aceptar la invitación (scope*). - También puedes crear una con
POST /v1/keyssi tu cuenta tienesandbox_enabled. - Envía la llave en
Authorization: Bearer ck_test_.... La API detecta el entorno por el prefijo.
Shell
curl -sS -X POST "https://api.434alchemycode.com/v1/sat/constancias" \
-H "Authorization: Bearer $ALCHEMY_API_KEY_TEST" \
-H "Content-Type: application/json" \
-d '{"company_id": "9b2f5c1e-7a3d-4f8b-9c21-6d4e8a0b5f17", "wait": false}'
El job resultante incluye "sandbox": true y un warning en lenguaje claro:
JSON
{
"object": "job",
"id": "4d1f8c0a-6b2e-4c93-8f51-2a7d9e3b6c08",
"service": "sat.constancia",
"status": "succeeded",
"company_id": "9b2f5c1e-7a3d-4f8b-9c21-6d4e8a0b5f17",
"created_at": "2026-10-31T16:42:07.318920+00:00",
"started_at": "2026-10-31T16:42:08.041228+00:00",
"finished_at": "2026-10-31T16:44:12.882014+00:00",
"units": 1,
"result": {
"rfc": "OMX2503255F9",
"razon_social": "OMNICONMX, S.A. de C.V.",
"tipo_persona": "moral",
"regimen_fiscal": {
"clave": "601",
"descripcion": "General de Ley Personas Morales"
},
"fecha_inicio_operaciones": "2019-04-12",
"estatus_padron": "Activo",
"domicilio": {
"calle": "Av. Insurgentes Sur",
"numero_exterior": "1602",
"numero_interior": "Piso 12",
"colonia": "Crédito Constructor",
"codigo_postal": "03940",
"municipio": "Benito Juárez",
"estado": "Ciudad de México",
"pais": "México"
},
"obligaciones": [
{
"clave": "1",
"descripcion": "Presentar declaraciones mensuales de ISR",
"vencimiento": "2026-12-31",
"estatus": "Vigente"
},
{
"clave": "2",
"descripcion": "Presentar declaraciones mensuales de IVA",
"vencimiento": "2026-12-31",
"estatus": "Vigente"
},
{
"clave": "3",
"descripcion": "Presentar declaración anual de personas morales",
"vencimiento": "2027-03-31",
"estatus": "Vigente"
},
{
"clave": "5",
"descripcion": "Expedir comprobantes fiscales digitales por internet",
"vencimiento": "2026-12-31",
"estatus": "Vigente"
}
],
"actividad_economica": {
"clave": "541110",
"descripcion": "Servicios de consultoría administrativa",
"porcentaje": 100
},
"pdf": {
"paginas": 3,
"generado_en": "2026-10-31T16:44:12+00:00"
}
},
"files": [
{
"id": "a91c4f7e2b6d48c05e3a1f9b7d2c6084",
"name": "constancia-situacion-fiscal.pdf",
"content_type": "application/pdf",
"kind": "document",
"size": 184320,
"sha256": "b7c1e0a4f8d29c63507a4e1b8d3f2c6a9e0b4d7c1a8f5e2d3b6c9a0f4e7d1c28",
"url": "/v1/files/a91c4f7e2b6d48c05e3a1f9b7d2c6084?p=OWIyZjVjMWUtN2EzZC00ZjhiLTljMjEtNmQ0ZThhMGI1ZjE3&exp=1793410512&sig=3f9c1d7a2b6e4c8d0f1a5b9e3c7d2f6a8b0c4e2d"
}
],
"error": null,
"warnings": [
"Respuesta generada en modo sandbox: no proviene de un portal oficial."
],
"sandbox": true,
"links": {
"self": "/v1/jobs/4d1f8c0a-6b2e-4c93-8f51-2a7d9e3b6c08"
}
}Cómo se comportan los datos
- Deterministas: se derivan del RFC (y de la imagen, en CAPTCHA). La misma entrada devuelve el mismo resultado.
- Coherentes con el esquema: mismos campos, tipos y archivos que producción (PDF de prueba de 1 página).
- Sin portales: no se contacta al SAT, IMSS ni Infonavit; no hay tráfico hacia esos sistemas.
- Latencia simulada: ~350 ms configurable, más el tiempo del worker. No representa la latencia real.
- Marca de agua: todo job exitoso en sandbox agrega un warning; no lo presentes como documento oficial.
Credenciales en sandbox
El sandbox sí exige que la empresa tenga credenciales cargadas para los servicios que las requieren. No las valida contra el portal, pero la carga de e.firma sí verifica que el certificado abra, que la llave corresponda y que el RFC coincida.
Para pruebas, usa una e.firma de prueba o de un RFC propio. No cargues la e.firma de un cliente real en una cuenta de sandbox compartida: el material queda cifrado, pero no es necesario para probar.
Sandbox vs producción
| Aspecto | Sandbox (ck_test_) | Producción (ck_live_) |
|---|---|---|
| Proveedor | Simulado (mock) | Portales oficiales (SAT, IMSS, Infonavit) |
| Datos | Generados y deterministas | Reales, del RFC consultado |
| Documentos | PDF/PNG de prueba | Documentos oficiales |
| CAPTCHA | Texto derivado de la imagen | Modelo de visión real |
| Latencia | ~350 ms + worker | 15–90 s según portal |
| Consumo de cuota | Sí, se descuenta | Sí, se descuenta |
| Costo | Sin costo en beta | Sin costo en beta |
| Valor probatorio | Ninguno | Documento oficial según la autoridad |
Qué NO probar en sandbox
- No uses sandbox como evidencia legal ni para validar la situación fiscal de un tercero.
- No esperes que el sandbox detecte credenciales rechazadas por el portal: no hay portal.
- No midas la latencia real de los portales ni la tasa de CAPTCHA con datos simulados.
- No pruebes límites de rate limit del portal de origen: el sandbox no los aplica.
- No cargues datos personales reales de clientes si no son necesarios.
- No asumas que un RFC listado como “crítico” en sandbox lo esté en la lista real del SAT: es sintético.
- No uses una llave
ck_test_contra un endpoint de producción esperando datos reales.
Pasar a producción
- Crea una llave
ck_live_con los scopes mínimos (services:run,jobs:read, etc.). - Registra la empresa real y carga su e.firma vigente y credenciales de portales.
- Ejecuta una consulta de bajo riesgo (por ejemplo, artículo 69-B de tu propio RFC).
- Verifica errores, webhooks y consumo con datos reales antes de liberar a todos tus usuarios.
- Configura alertas de cuota y de jobs fallidos.
El sandbox y producción comparten la misma API y los mismos esquemas: lo que funciona con
ck_test_ funciona con ck_live_ salvo la disponibilidad de credenciales y portales.