🐘
PHP SDK
SDK oficial PHP para a IPTU API
Requisitos
- PHP 8.1 ou superior
- ext-curl
- ext-json
Instalacao
composer require iptuapi/iptuapi-phpInicio 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
| Plano | Requisicoes/mes | Requisicoes/min |
|---|---|---|
| Free | 10 | 10 |
| Starter | 500 | 100 |
| Pro | 5.000 | 500 |
| Enterprise | 100.000 | 10.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
| Codigo | Cidade | Registros |
|---|---|---|
| sp | Sao Paulo | 93M+ |
| bh | Belo Horizonte | 4M+ |
| recife | Recife | 427K+ |
Compatibilidade PSR
- PSR-3: Logger interface
- PSR-4: Autoloading
- PSR-12: Coding style
- PSR-18: HTTP Client (Guzzle)