/api/sampleColección de una ciudad de evaluación con la forma de los registros de programas con licencia, después de aplicar las reglas publicadas de alcance y cuarentena. No requiere clave.
Evalúe una muestra pública e integre registros de asistencia para reparaciones organizados por ciudad, con alcance por campo en inglés y español, fuentes citadas y señales explícitas de vigencia y cuarentena.
Empiece sin clave
La muestra pública devuelve una colección de una ciudad con la misma forma de registro que usa la API con licencia. Sirve para probar análisis, mapeo de campos, presentación por idioma y advertencias sin crear una cuenta ni enviar información personal.
curl
curl --fail-with-body \
https://www.thegrantmap.com/api/sample \
| python3 -m json.tool
Antes de evaluar o usar la API en producción, revise también la respuesta vigente sobre la salud del conjunto, la puerta de preparación para ventas pagadas y el documento OpenAPI. Estos recursos legibles por máquina forman parte de la evaluación del comprador y no son afirmaciones de marketing. Esta guía se cotejó con esos endpoints públicos el 25 de julio de 2026; las respuestas en ejecución controlan las cifras, fechas, versiones y el estado de preparación que pueden cambiar.
Campo y Zonas Rurales es un piloto separado fuera del contrato de datos Home, por lo que sus endpoints no se incluyen en el documento OpenAPI.
Demostración sin clave
Cargue la muestra pública desde esta página y fíltrela localmente por tipo de proyecto o nombre del programa. El explorador nunca solicita una clave ni envía el texto del filtro al servidor. Muestra como máximo seis registros de vista previa; use el JSON sin procesar para inspeccionar la colección de evaluación devuelta completa. La muestra aplica el mismo alcance de reparaciones del hogar y la misma cuarentena de problemas conocidos que las rutas de programas con licencia, por lo que no representa todas las filas guardadas de la ciudad.
Control de acceso
Los endpoints con licencia exigen una clave en el encabezado de solicitud X-Api-Key. La autenticación de la API conserva un hash unidireccional. Una copia cifrada de entrega para una emisión aprobada de una clave se conserva mientras la entrega esté pendiente o sea ambigua y se elimina cuando un evento firmado del proveedor confirma la entrega. Si la entrega sigue siendo ambigua, los reintentos pueden prolongar esa retención, por lo que aquí no se promete un plazo fijo de eliminación. Este proceso de claves no es un canal de entrega de archivos masivos. El equipo de soporte puede revocar y rotar una clave, pero no puede recuperar el texto sin cifrar después de eliminar la copia cifrada. Guarde el valor sin procesar en un administrador de secretos del servidor o en una variable de entorno local; no lo inserte en JavaScript del navegador.
Solicitud autenticada
echo "Pegue la clave y pulse Return (entrada oculta):"
read -s TGM_API_KEY
printf 'header = "X-Api-Key: %s"\n' "$TGM_API_KEY" | \
curl --fail-with-body --config - \
--header "Accept: application/json" \
"https://www.thegrantmap.com/api/programs/des-moines?type=homeowner&project=exterior"
unset TGM_API_KEY
El ejemplo de shell entrega el encabezado secreto a curl mediante la entrada estándar, de modo que la clave sin procesar no aparece en los argumentos del proceso de curl. La inspección del entorno del proceso aún puede exponer secretos locales; use el administrador de secretos de su plataforma en producción.
Las claves de evaluación tienen límites deliberados. Una clave de prueba vence dentro de 30 días y cubre de uno a cinco slugs aprobados de ciudades activas. El índice de ciudades se filtra a esa lista permitida y se rechazan las solicitudes fuera de ella. Las consultas de evaluación al feed de cambios deben indicar una ciudad aprobada, y el endpoint nacional sin ciudad se reserva para los niveles pagados. Estos límites son controles de evaluación y no representan que se haya entregado el corpus comercial completo.
| Nivel | Límites | Alcance |
|---|---|---|
| Evaluación | 60 por minuto; 2,000 por día | De una a cinco ciudades activas aprobadas; máximo 30 días. |
| Sin fines de lucro | 120 por minuto; 20,000 por día | Solo el alcance de ciudades activas con licencia, después de la revisión manual de elegibilidad y alcance conforme al acuerdo aplicable. |
| Comercial | 600 por minuto; 200,000 por día | Alcance de ciudades activas con licencia conforme al acuerdo aplicable. Las claves guardadas usan el identificador interno de nivel enterprise. |
La tabla describe límites de ejecución, no un menú de compra autoservicio. Solo la oferta comercial anual puede usar pago autoservicio y únicamente mientras la puerta pública de lanzamiento comercial esté en verde. El acceso para organizaciones sin fines de lucro o académicas requiere revisión manual de elegibilidad y alcance. La disponibilidad del piloto asistido está en pausa hasta que se revisen el alcance y las condiciones de retención; ninguna de esas dos vías se ofrece mediante pago autoservicio.
Los límites se determinan a partir del nivel vigente de la clave en el momento de la solicitud. El acceso también puede detenerse cuando una clave vence, se revoca o no puede validarse. El servicio falla de forma cerrada durante una interrupción de la autenticación, en vez de devolver datos con licencia sin validación.
HTTP JSON
/api/sampleColección de una ciudad de evaluación con la forma de los registros de programas con licencia, después de aplicar las reglas publicadas de alcance y cuarentena. No requiere clave.
/api/dataset/healthCobertura publicada más reciente del corpus, medidas separadas de filas y nombres de programas guardados, totales con licencia y en cuarentena, categorías de salud de enlaces, estado de auditoría y notas metodológicas.
/api/data/readinessDecisión de preparación para ventas pagadas que falla de forma cerrada y códigos de bloqueo. Una puerta roja debe detener la compra o la entrega.
/api/dataset/schemaEsquema JSON de un registro de programa, incluido el objeto anidado de vigencia.
/api/dataset/export-schemaEsquema JSON de una fila candidata para una exportación plana. Un esquema no es una oferta, un recibo de entrega ni una aprobación de derechos de fuentes para un archivo.
/openapi.jsonDescripción OpenAPI 3.1 del contrato HTTP público y con licencia.
/api/citiesMetadatos de ciudades activas con licencia. Las claves de evaluación ven solo su lista de ciudades aprobadas.
/api/cities/countsCiudades con licencia, recuentos seguros de programas utilizables y un total agregado.
/api/programs/{city}Registros de reparación del hogar para una ciudad activa después de excluir el alcance adyacente y los problemas conocidos, con filtros opcionales y metadatos de vigencia calculados al servir la respuesta.
/api/programs/{city}/{programId}Un registro que no está en cuarentena. Un registro ausente o en cuarentena devuelve 404.
/api/programs/nationalCuatro registros federales mantenidos que no dependen de una ciudad. Solo para niveles pagados; no es el grupo más amplio de apariencia nacional replicado entre ciudades.
/api/changes?since=YYYY-MM-DD&city={city}&limit=200Cambios recientes detectados, del más nuevo al más antiguo, con ID duraderos de eventos y un nextCursor opaco. Las consultas de evaluación deben incluir el slug de una ciudad aprobada.
Ejemplos del lado del servidor
Estos ejemplos usan variables de entorno para que las credenciales no aparezcan en el control de versiones, los argumentos de procesos ni las URL. El repositorio también incluye clientes pequeños, ejecutables y sin dependencias en docs/examples/grantmap-api/.
Python 3
import json
import os
from urllib.request import Request, urlopen
key = os.environ["TGM_API_KEY"]
request = Request(
"https://www.thegrantmap.com/api/programs/des-moines?project=exterior",
headers={"Accept": "application/json", "X-Api-Key": key},
)
with urlopen(request, timeout=20) as response:
payload = json.load(response)
print(payload["count"])
for program in payload["programs"][:3]:
print(program["id"], program["freshness"]["confidence"])
JavaScript
const key = process.env.TGM_API_KEY;
if (!key) throw new Error("TGM_API_KEY is required");
const response = await fetch(
"https://www.thegrantmap.com/api/programs/des-moines?project=exterior",
{ headers: { Accept: "application/json", "X-Api-Key": key } },
);
const payload = await response.json();
if (!response.ok) {
throw new Error(`${response.status}: ${payload.code ?? payload.error}`);
}
console.log(payload.count);
for (const program of payload.programs.slice(0, 3)) {
console.log(program.id, program.freshness.confidence);
}
Comportamiento de colecciones
Los filtros de listas de programas se combinan con AND lógico. Los valores desconocidos normalmente producen una colección vacía válida en vez de un error de validación, por lo que debe descubrir los valores de filtros a partir de los registros devueltos y distinguir un resultado vacío de una solicitud fallida.
Cuente la unidad correcta. Una fila de ciudad y programa es un registro vinculado a una ciudad. Un mismo programa puede repetirse en muchas colecciones. La salud separa filas, nombres únicos guardados y programas locales únicos. El total por nombre guardado no es un total de identidades sin duplicados porque los nombres genéricos y las variantes pueden unir o dividir programas reales. No cambie el nombre de un total de filas a cantidad de programas diferentes.
| Parámetro | Coincide con | Valor típico |
|---|---|---|
type | eligibilityType | homeowner |
income | Jerarquía de ingresos; any es un valor centinela guardado, no una prueba de que no se aplique una prueba de ingresos. | low |
project | projectTypes, incluidos los alias admitidos. | exterior |
special | specialPopulations; los registros sin una restricción de población guardada pueden permanecer en el resultado. | veterans |
category | Categoría guardada exacta. | home-repair |
status | Etiqueta guardada exacta del estado de los fondos. | available |
Las colecciones de programas por ciudad devuelven una sola matriz filtrada después de las exclusiones. count es el total de resultados de reparación del hogar después de aplicar los filtros. excludedBySafetyPolicy informa los registros coincidentes de alcance adyacente o con problemas conocidos que se retuvieron de esa misma solicitud filtrada, y exclusionPolicyVersion identifica el contrato de la política.
El feed de cambios usa paginación estable por clave. limit acepta de 1 a 1,000. Lea hasMore; mientras sea verdadero, envíe el nextCursor opaco devuelto con los mismos valores de since y city. No se detenga solo porque changes esté vacío: una página puede avanzar sobre eventos sin procesar que se retuvieron de la respuesta con licencia y aun así devolver hasMore: true. Deténgase únicamente cuando hasMore sea falso. La primera página fija snapshotMaxId, por lo que las inserciones posteriores, incluidas las filas con fecha anterior, no pueden cruzar el límite del recorrido. Inicie una nueva solicitud de primera página para descubrir eventos confirmados después de esa instantánea. Las filas de cambios heredadas no incluyen un campo de alcance de reparación del hogar, por lo que debe cotejar el ID de programa de cada evento con el endpoint publicado del programa dentro del alcance antes de usarlo en un sistema posterior.
Las respuestas de programas se serializan mediante la lista permitida del esquema JSON publicado. additionalProperties es falso: los campos internos de revisión, los auxiliares de interfaz y las futuras claves del corpus no son campos de respuesta con licencia, salvo que se revise deliberadamente el contrato publicado.
Integraciones estables
El encabezado de respuesta X-API-Version identifica el contrato HTTP semántico. El contrato servido actualmente es 1.4.0, y los endpoints sin prefijo de versión corresponden al contrato 1.x. Se pueden añadir campos opcionales y endpoints nuevos en una versión menor compatible; un cambio incompatible de respuesta o comportamiento requiere una nueva ruta de versión mayor, como /api/v2, en vez de una mutación silenciosa del contrato 1.x. Lea el encabezado o info.version de OpenAPI en tiempo de ejecución, en vez de suponer que esta página siempre mostrará el valor más reciente.
X-Dataset-Revision identifica una generación efectiva servida. Su huella determinista vincula el contrato y el esquema de revisión de la API, el corpus de ciudades activas incluido en el repositorio, la evidencia actual de vigencia, las correcciones duraderas del fundador, la implementación de enriquecimiento y el alcance con licencia y la política de exclusión activos. Los cuerpos de las respuestas exitosas de colecciones, muestras, salud y feed de cambios también exponen datasetRevision; una respuesta exitosa de detalle lo lleva solo en el encabezado. Las respuestas de error lo omiten en vez de asignar una revisión a un conjunto no disponible. Guárdelo con cada importación o resultado de evaluación para que un informe de defecto pueda identificar la generación exacta que utilizó.
Cada respuesta incluye un X-Request-ID. Un valor proporcionado por el cliente se repite solo si tiene entre 8 y 80 caracteres, empieza con una letra o un dígito ASCII y contiene únicamente letras ASCII, dígitos, ., _, : o -. Si falta o no es seguro, se sustituye por un ID opaco generado por el servicio. No incluya secretos ni información personal, y use este valor, no una clave de API, en un informe de soporte.
Ninguna operación está marcada actualmente como obsoleta. Si se introduce un reemplazo, The Grant Map lo publicará antes del retiro, dará un aviso de al menos 90 días y marcará las respuestas afectadas con los encabezados estándar Deprecation, Sunset y Link hacia el reemplazo. El documento OpenAPI es la fuente de verdad legible por máquina para el contrato y el estado de descontinuación vigentes.
En el host público canónico, /api/sample, /api/dataset/schema, /api/dataset/export-schema y /openapi.json proporcionan un ETag y aceptan If-None-Match; una coincidencia devuelve 304 sin cuerpo. La salud del conjunto y la preparación para ventas pagadas son públicas, pero no forman parte de esa lista permitida de ETag. Las respuestas con licencia permanecen deliberadamente privadas, usan no-store, varían según X-Api-Key y omiten ETag; no debilite ese límite en una caché compartida.
Evidencia, no garantías
Cada programa servido incluye un objeto anidado freshness. Las señales describen lo que The Grant Map ha comprobado; no sustituyen la confirmación con la organización administradora.
live, dead, bot-blocked o unchecked. Que una URL devuelva una respuesta HTTP durante la comprobación confirma solo que respondió. No confirma ningún hecho guardado.linkStatus es unchecked, porque una falla de conexión u otro intento inconcluso también tiene una fecha.source-verified, federal-canonical, model-identity-reviewed, link-verified, link-resolves-unverified o unverified. Lea las descripciones del esquema JSON antes de asignar estas etiquetas a la interfaz de un producto.El esquema ofrece description/description_es, maxAmountLabel/maxAmountLabel_es y deadline/deadline_es. Los nombres de programas no se traducen. Administrador, categoría, estado de los fondos, elegibilidad, tipo de proyecto, población especial, teléfono, URL, monto numérico y campos de evidencia no tienen variantes separadas en español. Un campo de idioma puede estar vacío, desactualizado o ser ambiguo. Inspeccione el esquema y cree una alternativa explícita, en vez de suponer que todos los registros están traducidos por completo.
La cuarentena falla de forma cerrada. Las filas con problemas conocidos se excluyen de las respuestas con licencia de listas y detalles. Una solicitud de detalle en cuarentena devuelve 404 para que quien llama no pueda usar el endpoint como un oráculo de registros suprimidos. Observe excludedBySafetyPolicy, exclusionPolicyVersion y la respuesta pública de salud, en vez de fijar en el código el total de exclusiones de hoy.
Para cualquier decisión relacionada con una solicitud, un presupuesto o una interfaz para consumidores, muestre la URL citada del registro y una advertencia de verificación. El estado de los fondos, los plazos, los montos, la geografía y las reglas de la organización administradora pueden cambiar entre revisiones.
Falle con claridad
| Estado | Significado | Acción del cliente |
|---|---|---|
| 400 | Parámetro inválido, o una consulta de evaluación al feed de cambios omitió la ciudad obligatoria. | Corrija la solicitud; no vuelva a intentarla sin cambios. |
| 401 | Clave ausente o inválida. Los códigos estables incluyen API_KEY_REQUIRED e INVALID_API_KEY. | Cargue el secreto correcto en el servidor. |
| 403 | Clave revocada o vencida, clave de evaluación mal formada o clave fuera de alcance. | Deténgase y resuelva la autorización de acceso o el alcance de la evaluación. |
| 404 | Ciudad o programa no encontrado dentro del alcance activo con licencia, incluido un registro de detalle en cuarentena de seguridad. | No deduzca por qué falta; coteje la respuesta con las señales de salud y política. |
| 429 | Se superó el límite vigente por minuto o por día de la clave. | Respete Retry-After cuando esté presente y aplique reintentos con espera exponencial limitada y variación aleatoria. |
| 503 | La autenticación, el alcance con licencia o el almacenamiento del feed de cambios no están disponibles. | Trátelo como reintentable; nunca lo interprete como un conjunto de datos vacío. |
Error JSON típico
El mensaje exacto puede cambiar; controle el flujo según el estado y el código{
"error": "API key required. Request access at https://www.thegrantmap.com/data",
"code": "API_KEY_REQUIRED"
}
Las rutas con límites de solicitudes publican X-RateLimit-Limit, X-RateLimit-Remaining y X-RateLimit-Reset para la ventana activa. Retry-After acompaña las respuestas reintentables 429 o 503 cuando el servidor puede indicar una espera. Las respuestas con licencia de ciudades y programas se marcan como privadas y no almacenables en caché, y varían según X-Api-Key. Los clientes no deben colocarlas en una caché pública compartida. Los endpoints públicos de transparencia pueden usar políticas de caché diferentes.
No existe un panel de uso aprobado ni un servicio de avisos al 85 % o al 100 %.
Uso seguro
Los ejemplos seguros incluyen una vista de investigación para asesores, una página de recursos para propietarios, un portal de clientes de contratistas, un flujo educativo para la administración de hipotecas o el descubrimiento de asistencia antes del financiamiento de mejoras del hogar. Mantenga el descubrimiento de programas separado, tanto en las operaciones como en el análisis, de las decisiones de crédito, seguro, pago, suscripción crediticia, precio, aprobación, denegación y beneficios automatizados.
La entrega pagada de archivos e instantáneas no está disponible. Esto incluye archivos masivos. El esquema de exportación y el candidato NDJSON interno no crean una oferta de producto. No existe un portal aprobado para compradores ni un canal privado de transferencia, y no se puede prometer ningún archivo hasta que cada dominio de fuente incluido tenga una decisión revisada sobre derechos y se superen todos los controles separados de almacenamiento, autorización, constancia de entrega, revocación, retención y eliminación.
Administración de datos
Reporte un posible problema de un registro por Contacto y soporte o escriba a support@thegrantmap.com. Incluya el slug de la ciudad, el ID del programa, el campo en cuestión, la URL de la fuente oficial pertinente, lo que dice la fuente y la fecha en que la revisó.
No envíe números de Seguro Social, registros bancarios, declaraciones de impuestos, documentos de identidad, información médica ni expedientes de solicitantes con un informe de corrección. El equipo puede solicitar un contexto mínimo por una vía más segura si necesita más información.
Una corrección enviada es evidencia para revisar, no una edición automática. Un cambio de fuente revisado y publicado puede aparecer después en el feed de cambios. No se promete un plazo de respuesta ni de publicación.
Revisión de ingeniería del comprador
excludedBySafetyPolicy y observe exclusionPolicyVersion para detectar cambios de política.Envíe el caso de uso, los usuarios previstos, las ciudades objetivo, los campos requeridos y el calendario de integración. La entrega pagada de archivos no está disponible. No trataremos una consulta como una licencia aprobada ni prometeremos que un alcance específico de la API esté listo.