Permit Scouter
Permisos de construcción recientes de seis jurisdicciones de Tampa Bay, Florida, con valor del trabajo, contratista, licencia y oficio (techos, HVAC, solar, piscinas...). Dos herramientas gratuitas; las herramientas de pago cuestan de $0.01 a $0.10 por llamada en USDC vía x402.
Servidor MCP alojado
npx add-mcp 'https://api.permitscouter.com/mcp'Se instala en Claude Code, Codex, Cursor y más
Documentación
Permisos de construcción del área de Tampa Bay, Florida, recopilados cada mañana y normalizados en un solo formato. Cada llamada de pago se liquida con x402: sin cuenta ni clave API, solo una billetera con USDC en Base.
Primeros pasos
La API está en https://api.permitscouter.com. Todas las respuestas son JSON. Prueba primero una ruta gratuita:
curl https://api.permitscouter.com/sample
Una referencia interactiva con todos los parámetros está en /docs de la API. Los agentes y herramientas pueden leer lo mismo como documento OpenAPI en /openapi.json, con el precio de cada ruta de pago en x-payment-info.
Pagar con x402
Si llamas a una ruta de pago sin pagar, obtienes 402 Payment Required. El encabezado PAYMENT-REQUIRED contiene el precio, la red y la dirección a la que pagar. Tu cliente firma una autorización USDC por ese monto y repite la solicitud con ella en el encabezado PAYMENT-SIGNATURE. El encabezado PAYMENT-RESPONSE de la respuesta contiene el recibo de liquidación, incluido el hash de la transacción.
No necesitas ETH para el gas: el pago se liquida por ti. Cualquier cliente x402 funciona. En Python:
pip install "x402[httpx,evm]"
import asyncio
from eth_account import Account
from x402 import x402Client
from x402.http.clients import x402HttpxClient
from x402.mechanisms.evm.exact import register_exact_evm_client
from x402.mechanisms.evm.signers import EthAccountSigner
async def main():
client = x402Client()
register_exact_evm_client(client, EthAccountSigner(Account.from_key("0xYOUR_PRIVATE_KEY")))
async with x402HttpxClient(client) as http:
response = await http.get(
"https://api.permitscouter.com/permits/search",
params={"trade": "roofing", "since": "2026-10-01", "min_value": 10000},
)
print(response.json())
asyncio.run(main())
Mantén la billetera de gastos de tu agente separada de cualquier billetera que guarde ahorros, y cárgala solo con lo que necesite.
GET /permits/search $0.02
Permisos nuevos, primero los más recientes. Dentro de cada día, los permisos con valor de obra y contratista van primero. Hasta 25 por llamada; pagina con offset.
| Parámetro | Qué hace |
|---|---|
trade | Uno de roofing, hvac, solar, pool, electrical, plumbing, windows_doors, new_construction, remodel, demolition |
since, until | Presentado en o después / en o antes de una fecha, YYYY-MM-DD |
min_value | Valor mínimo de obra en dólares estadounidenses |
zip, city | Limitar a un código postal o ciudad |
jurisdiction | Una clave de fuente de /coverage, como tampa o pinellas |
q | Palabras en la descripción de la obra, como heat pump |
include_applications | true para devolver también solicitudes que aún no tienen número de permiso (desactivado por defecto) |
limit, offset | Tamaño de página (1 a 25) y punto de inicio |
{
"total": 21,
"next_offset": 5,
"results": [
{
"permit_key": "tampa:BTR-27-0633248",
"jurisdiction": "City of Tampa",
"permit_number": "BTR-27-0633248",
"record_type": "Residential Roof Trade Permit",
"status": "Issued",
"description": "re-roof",
"address": "4202 W CLEVELAND ST",
"city": "TAMPA",
"zip": "33609",
"applied_date": "2026-10-10",
"valuation": 16998.05,
"contractor_name": "EXCEL EXTERIORS, INC.",
"contractor_license": "CCC1331677",
"contractor_key": "ccc1331677",
"trades": ["roofing"],
"source_url": "https://aca-prod.accela.com/TAMPA/…",
"first_seen": "2026-10-11T00:06:09+00:00",
"last_changed": "2026-10-11T00:07:40+00:00"
}
]
}
GET /permits/{source}/{permit_number} $0.01
Un permiso y cada cambio que hemos registrado en su estado, valor o fecha de emisión, primero los más antiguos. Ejemplo: /permits/tampa/BTR-27-0633248.
GET /properties/history?address=…&zip=… $0.05
Todos los permisos en una dirección de calle, primero los más recientes. Usa la dirección tal como aparece en los resultados, como 4202 W CLEVELAND ST. Añadir zip reduce la coincidencia.
GET /contractors/{contractor_key}/history $0.10
Todos los permisos que un contratista ha obtenido en nuestra área de cobertura, con el valor total de obra, la primera y última fecha de permiso, y un conteo por oficio. El contractor_key está en cada registro de permiso; normalmente es el número de licencia estatal en minúsculas.
Herramientas MCP
Los mismos datos están disponibles como herramientas MCP, para asistentes de IA y marcos de agentes. Conéctate por HTTP transmisible a https://api.permitscouter.com/mcp. No se requiere registro.
| Herramienta | Qué devuelve | Por llamada |
|---|---|---|
coverage | Ciudades cubiertas, conteos de permisos y última hora de actualización | Gratis |
sample_permits | Tres permisos recientes, para ver el formato de registro | Gratis |
search_permits | La misma búsqueda que GET /permits/search | $0.02 |
get_permit | Un permiso con su historial registrado | $0.01 |
property_history | Todos los permisos en una dirección | $0.05 |
contractor_history | El registro completo de permisos de un contratista | $0.10 |
Las herramientas gratuitas funcionan en cualquier cliente MCP. Una herramienta de pago llamada sin pagar devuelve un resultado de error cuyo texto es la solicitud de pago x402; un cliente MCP compatible con x402 la paga y vuelve a llamar con el pago en _meta["x402/payment"]. El recibo vuelve en _meta["x402/payment-response"], y una llamada que falla no se cobra.
En Python, con la biblioteca MCP oficial y el cliente MCP de x402, el pago es automático:
pip install "x402[mcp,evm]" "mcp>=1.20,<2"
import asyncio
from datetime import timedelta
from eth_account import Account
from mcp import ClientSession
from mcp.client.streamable_http import streamablehttp_client
from x402 import x402Client
from x402.mcp import wrap_mcp_client_with_payment
from x402.mechanisms.evm.exact import register_exact_evm_client
from x402.mechanisms.evm.signers import EthAccountSigner
class SessionAdapter:
"""x402's MCP client passes one params dict; the MCP session takes the parts separately."""
def __init__(self, session):
self.session = session
async def call_tool(self, params, read_timeout_seconds=None, **_):
if isinstance(read_timeout_seconds, (int, float)):
read_timeout_seconds = timedelta(seconds=read_timeout_seconds)
return await self.session.call_tool(params["name"], params.get("arguments"),
read_timeout_seconds=read_timeout_seconds,
meta=params.get("_meta"))
async def main():
payments = x402Client()
register_exact_evm_client(payments, EthAccountSigner(Account.from_key("0xYOUR_PRIVATE_KEY")))
async with streamablehttp_client("https://api.permitscouter.com/mcp") as (read, write, _):
async with ClientSession(read, write) as session:
await session.initialize()
paid = wrap_mcp_client_with_payment(SessionAdapter(session), payments, auto_payment=True)
result = await paid.call_tool("search_permits", {"trade": "roofing", "min_value": 10000})
print(result.content)
asyncio.run(main())
Rutas gratuitas
GET /coverage Gratis
Las ciudades cubiertas hoy, conteos de permisos, rango de fechas y cuándo se actualizó cada una por última vez. Verifícalo antes de confiar en una ciudad.
GET /sample Gratis
Tres permisos recientes, para que veas el formato de registro antes de pagar.
GET /health Gratis
status indica si la API está activa; collection indica si los datos están frescos, con cualquier problema listado.
El registro de permiso
- Frescura. Cada fuente se recopila cada mañana y los últimos tres días se revisan de nuevo, por lo que los cambios de estado se detectan.
last_changedmuestra cuándo cambió un registro por última vez. - Valor de obra y contratista se leen de la página propia de cada permiso, normalmente dentro del día de la presentación. Al inicio de la vida de un permiso, cualquiera de los dos puede ser
null. - Privacidad. Los nombres de propietarios y solicitantes nunca se recopilan. Los contratistas son negocios con licencias estatales públicas.
- Precisión. Los registros son datos públicos tal como los publica cada departamento de construcción.
source_urlapunta a dónde provino cada uno.
Errores
El pago solo se liquida cuando una llamada tiene éxito. Si una llamada de pago devuelve un error, tu pago firmado no se cobra.
| Código | Significado |
|---|---|
402 | Pago requerido. Lee el encabezado PAYMENT-REQUIRED, paga y reintenta. |
400 | Un parámetro no es válido, como un oficio desconocido. El mensaje lista los valores permitidos. |
404 | No hay permiso ni contratista con esa clave. |
422 | Un parámetro tiene el formato incorrecto, como limit superior a 25. |