Rent Roll API

Rent Roll API de extração de rent roll com verificação integrada

Documentação

Um único endpoint faz o trabalho: envie um rent roll e 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

Envie sua chave de API no cabeçalho X-Api-Key (ou como bearer token). Obtenha uma chave na página de preços; gerencie-a em sua conta.

X-Api-Key: rr_live_your_key_here
# or
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âmetroValoresPadrãoDescrição
formatjson · csv · xlsxjsonFormato 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

StatusSignificado
400Campo file ausente/vazio, arquivo acima de 25 MB ou format desconhecido
401Chave de API inválida ou revogada
422Documento não suportado ou ilegível
429Cota 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

Extraia 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"

Resposta (JSON)

{
  "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; 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 HTTP streamable e ele ganha 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 franquia 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.

EndpointDescrição
GET /api/accountPlano, uso mensal, cota restante, créditos pré-pagos
POST /api/account/rotateEmite uma nova chave e revoga imediatamente a atual (os créditos são transferidos)
POST /api/portalRetorna uma URL do Stripe Customer Portal — upgrade, downgrade, cancelamento, faturas
POST /api/credits/checkoutRetorna uma URL do Stripe Checkout para um pacote de 25 créditos aplicado a esta chave

Cotas e cobrança

  • Assinaturas (Starter 50/mês, Pro 300/mês): a cota é redefinida no dia 1º (UTC). Excedente usa créditos pré-pagos quando disponíveis.
  • Pré-pago: cada extração consome um crédito pré-pago.
  • Os créditos nunca expiram e sobrevivem à rotação de chaves e ao cancelamento da assinatura.

Tratamento de dados

Os documentos são processados em memória e nunca armazenados após a conclusão da extração. Consulte a política de privacidade.