🐘

PHP SDK

SDK oficial PHP para a IPTU API

Packagist v2.0.0PHP 8.1+PSR-3/PSR-18

Requisitos

  • PHP 8.1 ou superior
  • ext-curl
  • ext-json

Instalacao

composer require iptuapi/iptuapi-php

Inicio Rapido

<?php

require_once 'vendor/autoload.php';

use IPTUAPI\IPTUClient;

$client = new IPTUClient('sua_api_key');

// Consulta por endereco
$resultado = $client->consultaEndereco('Avenida Paulista', '1000');
echo "SQL: " . $resultado['data']['sql_base'] . "\n";
echo "Valor Venal: R$ " . number_format($resultado['dados_iptu']['valor_venal'], 2, ',', '.') . "\n";

Configuracao Avancada

use IPTUAPI\IPTUClient;
use IPTUAPI\Config\ClientConfig;
use IPTUAPI\Config\RetryConfig;
use Monolog\Logger;
use Monolog\Handler\StreamHandler;

// Logger PSR-3 (opcional)
$logger = new Logger('iptuapi');
$logger->pushHandler(new StreamHandler('logs/iptuapi.log', Logger::DEBUG));

// Configuracao de retry
$retryConfig = new RetryConfig(
    maxRetries: 3,
    initialDelayMs: 1000,
    maxDelayMs: 30000,
    backoffMultiplier: 2.0
);

// Cliente com configuracao customizada
$config = new ClientConfig(
    timeout: 30,
    retryConfig: $retryConfig,
    logger: $logger
);

$client = new IPTUClient('sua_api_key', $config);

Endpoints da API

consultaEndereco() - Free

Busca dados de IPTU por endereco.

$resultado = $client->consultaEndereco(
    logradouro: 'Avenida Paulista',
    numero: '1000',
    cidade: 'sp',                    // 'sp' | 'bh' | 'recife'
    incluirZoneamento: false         // opcional
);

// Resposta
[
    'success' => true,
    'data' => [
        'sql_base' => '00904801381',
        'logradouro' => 'AV PAULISTA',
        'numero' => '1000',
        'bairro' => 'Bela Vista',
        'cep' => '01310100',
        'area_terreno' => 3487.0,
        'tipo_uso' => 'Predio De Escritorio'
    ],
    'dados_iptu' => [
        'sql' => '00904801381',
        'ano_referencia' => 2024,
        'area_construida' => 24884.0,
        'valor_venal' => 36058.0,
        'valor_terreno' => 32242.0,
        'valor_construcao' => 3816.0
    ]
]

consultaSQL() - Starter+

Busca dados completos pelo numero SQL.

$resultado = $client->consultaSQL(
    numeroContribuinte: '00904801381',
    cidade: 'sp',
    incluirHistorico: true,      // opcional - historico de valores
    incluirComparaveis: true,    // opcional - imoveis similares
    incluirZoneamento: true,     // opcional - dados de zoneamento
    ano: 2024                    // opcional - ano de referencia
);

Transacoes ITBI - Starter+

// Status do dataset ITBI
$status = $client->itbiStatus();

// Transacoes por SQL
$transacoes = $client->itbiTransacoesSQL(
    sql: '00401400010',
    limit: 20    // opcional, max 100
);

// Transacoes por endereco
$transacoes = $client->itbiTransacoesEndereco(
    logradouro: 'Avenida Paulista',
    numero: '1000',      // opcional
    bairro: null,        // opcional
    limit: 20            // opcional
);

// Historico completo de um imovel
$historico = $client->itbiHistorico(sql: '00401400010');

// Estatisticas de bairro
$stats = $client->itbiEstatisticas(
    bairro: 'PINHEIROS',
    ano: 2024    // opcional
);

// Estimativa de valor
$estimativa = $client->itbiEstimativa(
    bairro: 'PINHEIROS',
    areaConstruida: 85.0,
    tipoImovel: 'apartamento',    // opcional
    mesesHistorico: 24            // opcional
);

Valuation (AVM) - Pro+

Estimativa de valor de mercado usando Machine Learning.

$avaliacao = $client->valuationEstimate([
    'area_terreno' => 250,
    'area_construida' => 180,
    'bairro' => 'Pinheiros',
    'zona' => 'ZM',
    'tipo_uso' => 'Residencial',
    'tipo_padrao' => 'Medio',
    'ano_construcao' => 2010    // opcional
]);

// Resposta
[
    'valor_estimado' => 1010464.81,
    'valor_minimo' => 909418.31,
    'valor_maximo' => 1111511.37,
    'valor_m2' => 5613.69,
    'confianca' => 0.7,
    'modelo_versao' => '1.0.0'
]

Tratamento de Erros

use IPTUAPI\IPTUClient;
use IPTUAPI\Exception\IPTUAPIException;
use IPTUAPI\Exception\AuthenticationException;
use IPTUAPI\Exception\ForbiddenException;
use IPTUAPI\Exception\NotFoundException;
use IPTUAPI\Exception\RateLimitException;
use IPTUAPI\Exception\ValidationException;
use IPTUAPI\Exception\ServerException;

$client = new IPTUClient('sua_api_key');

try {
    $resultado = $client->consultaEndereco('Rua Teste', '100');

} catch (AuthenticationException $e) {
    // API Key invalida ou expirada
    echo "Erro de autenticacao: " . $e->getMessage();

} catch (ForbiddenException $e) {
    // Endpoint requer plano superior
    echo "Acesso negado. Plano necessario: " . $e->getRequiredPlan();

} catch (NotFoundException $e) {
    // Imovel nao encontrado
    echo "Nao encontrado: " . $e->getMessage();

} catch (RateLimitException $e) {
    // Limite de requisicoes excedido
    echo "Rate limit. Aguarde " . $e->getRetryAfter() . " segundos";
    sleep($e->getRetryAfter());

} catch (ValidationException $e) {
    // Parametros invalidos
    foreach ($e->getErrors() as $campo => $erros) {
        echo "$campo: " . implode(', ', $erros) . "\n";
    }

} catch (ServerException $e) {
    // Erro no servidor (pode tentar novamente)
    echo "Erro no servidor: " . $e->getMessage();

} catch (IPTUAPIException $e) {
    // Qualquer outro erro da API
    echo "Erro: " . $e->getMessage();
    echo "Request ID: " . $e->getRequestId();
}

Rate Limiting

Verifique seu consumo apos cada requisicao:

$resultado = $client->consultaEndereco('Avenida Paulista', '1000');

$rateLimit = $client->getRateLimit();
if ($rateLimit) {
    echo "Requisicoes restantes: " . $rateLimit->remaining . "\n";
    echo "Limite mensal: " . $rateLimit->limit . "\n";
    echo "Reset em: " . $rateLimit->resetAt->format('Y-m-d H:i:s') . "\n";
}

// ID da requisicao para suporte
echo "Request ID: " . $client->getLastRequestId() . "\n";

Limites por Plano

PlanoRequisicoes/mesRequisicoes/min
Free1010
Starter500100
Pro5.000500
Enterprise100.00010.000

Exemplo Completo

<?php

require_once 'vendor/autoload.php';

use IPTUAPI\IPTUClient;
use IPTUAPI\Config\ClientConfig;
use IPTUAPI\Config\RetryConfig;
use IPTUAPI\Exception\IPTUAPIException;
use IPTUAPI\Exception\RateLimitException;

// Configuracao
$config = new ClientConfig(
    timeout: 30,
    retryConfig: new RetryConfig(maxRetries: 3)
);

$client = new IPTUClient($_ENV['IPTU_API_KEY'], $config);

// Exemplo: Avaliar imovel usando dados ITBI
try {
    // 1. Buscar dados do imovel
    $imovel = $client->consultaEndereco('Avenida Paulista', '1000', 'sp');
    $bairro = $imovel['data']['bairro'];
    $area = $imovel['dados_iptu']['area_construida'];

    echo "Imovel: {$imovel['data']['logradouro']}, {$imovel['data']['numero']}\n";
    echo "Bairro: $bairro\n";
    echo "Area: {$area}m2\n";
    echo "Valor Venal IPTU: R$ " . number_format($imovel['dados_iptu']['valor_venal'], 2, ',', '.') . "\n\n";

    // 2. Buscar estimativa de mercado
    $estimativa = $client->itbiEstimativa(
        bairro: strtoupper($bairro),
        areaConstruida: $area
    );

    echo "=== Estimativa de Mercado (ITBI) ===\n";
    echo "Valor Estimado: R$ " . number_format($estimativa['valor_estimado'], 2, ',', '.') . "\n";
    echo "Faixa: R$ " . number_format($estimativa['faixa_minima'], 2, ',', '.');
    echo " - R$ " . number_format($estimativa['faixa_maxima'], 2, ',', '.') . "\n";
    echo "Baseado em {$estimativa['total_transacoes']} transacoes\n\n";

    // 3. Buscar comparaveis
    $comparaveis = $client->itbiComparaveis(
        bairro: strtoupper($bairro),
        areaMin: $area * 0.8,
        areaMax: $area * 1.2,
        limit: 5
    );

    echo "=== Imoveis Comparaveis ===\n";
    foreach ($comparaveis['transacoes'] as $comp) {
        echo "- {$comp['logradouro']}, {$comp['numero']} ";
        echo "({$comp['area_construida']}m2) - ";
        echo "R$ " . number_format($comp['valor_transacao'], 2, ',', '.') . "\n";
    }

} catch (RateLimitException $e) {
    echo "Rate limit atingido. Aguarde {$e->getRetryAfter()}s\n";
} catch (IPTUAPIException $e) {
    echo "Erro: {$e->getMessage()}\n";
    echo "Request ID: {$e->getRequestId()}\n";
}

Cidades Suportadas

CodigoCidadeRegistros
spSao Paulo93M+
bhBelo Horizonte4M+
recifeRecife427K+

Compatibilidade PSR

  • PSR-3: Logger interface
  • PSR-4: Autoloading
  • PSR-12: Coding style
  • PSR-18: HTTP Client (Guzzle)

Links Uteis