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ámetroQué hace
tradeUno de roofing, hvac, solar, pool, electrical, plumbing, windows_doors, new_construction, remodel, demolition
since, untilPresentado en o después / en o antes de una fecha, YYYY-MM-DD
min_valueValor mínimo de obra en dólares estadounidenses
zip, cityLimitar a un código postal o ciudad
jurisdictionUna clave de fuente de /coverage, como tampa o pinellas
qPalabras en la descripción de la obra, como heat pump
include_applicationstrue para devolver también solicitudes que aún no tienen número de permiso (desactivado por defecto)
limit, offsetTamañ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.

HerramientaQué devuelvePor llamada
coverageCiudades cubiertas, conteos de permisos y última hora de actualizaciónGratis
sample_permitsTres permisos recientes, para ver el formato de registroGratis
search_permitsLa misma búsqueda que GET /permits/search$0.02
get_permitUn permiso con su historial registrado$0.01
property_historyTodos los permisos en una dirección$0.05
contractor_historyEl 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_changed muestra 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_url apunta 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ódigoSignificado
402Pago requerido. Lee el encabezado PAYMENT-REQUIRED, paga y reintenta.
400Un parámetro no es válido, como un oficio desconocido. El mensaje lista los valores permitidos.
404No hay permiso ni contratista con esa clave.
422Un parámetro tiene el formato incorrecto, como limit superior a 25.