Rent Roll API
Rent Roll API de extração de rent roll com verificação integrada
Documentação
Documentação da API
Um único endpoint faz o trabalho: envie um rent roll, receba dados estruturados com um relatório de verificação determinístico. Sem jobs assíncronos, sem polling — uma única chamada HTTP.
Especificação legível por máquina: OpenAPI 3.0 (openapi.json) — importe no Postman, Insomnia ou sua ferramenta de geração de código.
Autenticação
Passe sua chave de API no cabeçalho X-Api-Key (ou como token bearer). Obtenha uma chave na página de preços; gerencie-a na sua conta.
X-Api-Key: rr_live_your_key_here
ou
Authorization: Bearer rr_live_your_key_here
Sem chave? O aplicativo web permite 3 extrações gratuitas/dia por IP para avaliação.
POST/v1/extract
Extrai dados estruturados de um documento. Envie multipart/form-data com um campo file.
Entradas suportadas
- PDF — digital ou escaneado (OCR tratado automaticamente), até 25 MB
- Excel —
.xlsx,.xlsm - CSV, HTML
Parâmetros de consulta
| Parâmetro | Valores | Padrão | Descrição |
|---|---|---|---|
| format | json · csv · xlsx | json | Formato da resposta. csv/xlsx retornam um arquivo para download. |
Exemplo
curl -X POST "https://rentrollapi.com/v1/extract?format=json"
-H "X-Api-Key: rr_live_your_key_here"
-F "file=@rent-roll.pdf"
SDK .NET
Cliente oficial no NuGet: RentRollAPI.Client (netstandard2.0 / net8.0).
dotnet add package RentRollAPI.Client
using RentRollApi.Client;
using var client = new RentRollClient("rr_live_your_key_here"); var result = await client.ExtractAsync("rent-roll.pdf");
Console.WriteLine($"{result.Units.Count} units, confidence {result.Verification.DocumentConfidence:P0}"); foreach (var check in result.Verification.Checks) Console.WriteLine($"[{check.Result}] {check.Name}: {check.Detail}");
// Or get Excel / CSV directly: byte[] xlsx = await client.ExtractToXlsxAsync(stream, "rent-roll.pdf");
Resposta (JSON)
Cada campo carrega um valor, status (Extracted / Missing / Flagged) e confiança. O bloco de verificação é calculado deterministicamente — os totais são re-somados e reconciliados com o que o documento declara, para que você saiba quando confiar na saída.
{ "propertyName": { "value": "Maplewood Commerce Center", "status": "Extracted", "confidence": 0.9 }, "asOfDate": { "value": "2026-06-30", "status": "Extracted", "confidence": 0.9 }, "units": [ { "unitNumber": { "value": "101", "status": "Extracted", "confidence": 0.9 }, "tenantName": { "value": "Cedar Point Dental", "status": "Extracted", "confidence": 0.9 }, "squareFeet": { "value": 1850, "status": "Extracted", "confidence": 0.9 }, "monthlyRent": { "value": 4625.0, "status": "Extracted", "confidence": 0.9 }, "leaseStart": { "status": "Missing" }, "leaseEnd": { "value": "2028-03-31", "status": "Extracted", "confidence": 0.9 }, "occupancy": { "value": "Occupied", "status": "Extracted", "confidence": 0.9 } } ], "totals": { "unitCount": 8, "monthlyRent": 28155.0, "squareFeet": 13750 }, "verification": { "documentConfidence": 0.9, "flaggedFieldCount": 0, "allChecksPassed": true, "checks": [ { "name": "UnitCountReconciliation", "result": "Pass", "detail": "Extracted 8 units; document states 8." }, { "name": "TotalMonthlyRentReconciliation", "result": "Pass", "detail": "Computed 28,155.00 vs stated 28,155.00 (within tolerance)." }, { "name": "TotalSquareFeetReconciliation", "result": "Pass", "detail": "Computed 13,750.00 vs stated 13,750.00 (within tolerance)." }, { "name": "DuplicateUnits", "result": "Pass", "detail": "No duplicate unit numbers." }, { "name": "LeaseDateOrder", "result": "Pass", "detail": "All lease end dates follow start dates." }, { "name": "NonNegativeRents", "result": "Pass", "detail": "No negative rents." } ] } }
Erros
| Status | Significado |
|---|---|
| 400 | Campo de arquivo ausente/vazio, arquivo acima de 25 MB ou formato desconhecido |
| 401 | Chave de API inválida ou revogada |
| 422 | Documento não suportado ou ilegível |
| 429 | Cota mensal excedida e sem créditos pré-pagos restantes (ou limite de demonstração atingido) |
Todos os erros retornam {"error": "human-readable message"}.
POST/v1/extract/operating-statement
Extrai um T12 / demonstrativo operacional (relatório de receitas e despesas dos últimos doze meses) em itens de linha estruturados. Mesmas entradas, autenticação, medição e opções de format que /v1/extract — uma extração conta como um documento contra sua cota.
Exemplo
curl -X POST "https://rentrollapi.com/v1/extract/operating-statement"
-H "X-Api-Key: rr_live_your_key_here"
-F "file=@t12.pdf"
{ "propertyName": { "value": "Maplewood Apartments", "status": "extracted", "confidence": 0.95 }, "basis": { "value": "Accrual", "status": "extracted", "confidence": 0.9 }, "months": ["2025-08", "2025-09", "...", "2026-07"], "lineItems": [ { "label": { "value": "Gross Potential Rent", "status": "extracted", "confidence": 0.95 }, "kind": "Income", "category": "GrossPotentialRent", "monthlyValues": [ { "value": 52000, "status": "extracted", "confidence": 0.9 }, "..." ], "total": { "value": 631200, "status": "extracted", "confidence": 0.95 } } ], "verification": { "documentConfidence": 0.9, "allChecksPassed": true, "checks": [ { "name": "RowTotalReconciliation", "result": "pass", "detail": "All 15 row totals reconcile with their monthly values." }, { "name": "NoiReconciliation", "result": "pass", "detail": "EGI − OpEx matches stated NOI (within tolerance)." } ] } }
Verificações determinísticas: totais de linha vs valores mensais, EGI = soma das receitas, Total OpEx = soma das despesas, NOI = EGI − OpEx, despesas não negativas e continuidade de meses consecutivos. O kind do item de linha é Income, Expense, Subtotal ou Other; o category normaliza rótulos em ~23 categorias padrão (RealEstateTaxes, Insurance, Utilities, RepairsMaintenance, Payroll, ManagementFee, ...). Linhas de contra-receita, como vacância e concessões, são do tipo Receita com valores negativos.
Servidor MCP (assistentes de IA)
RentRollAPI também é um servidor Model Context Protocol. Aponte qualquer cliente compatível com MCP (Claude, ChatGPT, Copilot, Cursor...) para o endpoint streamable-HTTP e ele ganha as ferramentas extract_rent_roll e extract_operating_statement:
{ "mcpServers": { "rentrollapi": { "type": "http", "url": "https://rentrollapi.com/mcp", "headers": { "X-Api-Key": "rr_live_your_key_here" } } } }
Omita o cabeçalho para usar a permissão gratuita de demonstração de 3 documentos/dia. A medição é idêntica à API REST.
Endpoints da conta
Todos autenticados com o mesmo cabeçalho X-Api-Key.
| Endpoint | Descrição |
|---|---|
| GET/api/account | Plano, uso mensal, cota restante, créditos pré-pagos |
| POST/api/account/rotate | Emite uma nova chave, revoga imediatamente a atual (créditos são mantidos) |
| POST/api/portal | Retorna uma URL do Stripe Customer Portal — upgrade, downgrade, cancelamento, faturas |
| POST/api/credits/checkout | Retorna uma URL do Stripe Checkout para uma recarga de 25 créditos aplicada a esta chave |
Cotas e cobrança
- Assinaturas (Starter 50/mês, Pro 300/mês): a cota é redefinida no dia 1º (UTC). O excedente usa créditos pré-pagos quando você os tem.
- Pré-pago: cada extração consome um crédito pré-pago.
- Os créditos nunca expiram e sobrevivem à rotação de chave e ao cancelamento da assinatura.
Tratamento de dados
Os documentos são processados em memória e nunca são armazenados após a conclusão da extração. Consulte a política de privacidade.