Developers

Trustvane API reference

A simple JSON API over HTTPS. Authenticate with a key you create on your developer page, then read your own account data. Version v1.

Overview

Every endpoint lives under /api/v1/, takes and returns JSON, and is scoped to the business your key belongs to. There is no business or user id in any URL — a key can only ever see its own account.

The base URL is your Trustvane app host:

https://app.trustvane.com/api/v1

Authentication

Send your key as a Bearer token in the Authorization header on every request. An X-Api-Key header is also accepted.

curl https://app.trustvane.com/api/v1/me/business \
  -H "Authorization: Bearer tv_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

Keys look like tv_live_ followed by 48 characters. You create and revoke them on the developer page. The full key is shown to you exactly once, at creation — Trustvane stores only a one-way hash of it, so a lost key must be replaced, never recovered. Treat a key like a password: keep it server-side, never commit it, and revoke it the moment it may have leaked.

Plans & access

API access is included on every paid plan. A key inherits whatever your plan currently includes, resolved live on each request — so upgrading or downgrading changes what your existing keys can do without re-issuing them. Endpoints marked Growth+ require the Growth plan or higher; a key on a lower plan gets a 403 tier_too_low for those, and full access to the rest.

An expired or cancelled plan disables API access entirely — requests return 402 no_active_plan until a plan is active again.

Responses

Every response is a JSON object with an ok flag. On success, the payload is under data:

{ "ok": true, "data": { ... } }

On failure, ok is false and an error object carries a stable code and a human-readable message:

{ "ok": false, "error": { "code": "tier_too_low", "message": "..." } }

Always branch on ok and the HTTP status, and match on error.code rather than the message text, which may change.

Errors

StatusCodeMeaning
401unauthorizedNo key was provided.
401invalid_keyThe key is unknown, revoked, or not linked to a business.
402no_active_planThe account has no active paid plan.
403tier_too_lowYour plan does not include this endpoint.
404unknown_resourceNo such endpoint.
405method_not_allowedWrong HTTP method (these endpoints are GET-only).
500server_errorSomething went wrong on our side. Never carries your data or a stack trace.

Read endpoints

These return your own data. Each is a GET and is scoped to your business.

GET /api/v1/me/business All plans

Your business profile as you entered it, plus its Secretary-of-State verification verdict.

{
  "ok": true,
  "data": {
    "id": "b2c4…-guid",
    "legalName": "Acme Supply LLC",
    "dba": "Acme",
    "entityType": "Llc",
    "ein": "12-3456789",
    "website": "https://acme.example",
    "industry": "Wholesale",
    "dunsNumber": "123456789",
    "address": { "line1": "…", "city": "…", "state": "CO", "postalCode": "…", "country": "US" },
    "formationState": "WY",
    "yearOrganized": 2021,
    "foundedDate": "2021-04-12T00:00:00",
    "verification": { "status": "Verified", "verifiedUtc": "…", "nextCheckUtc": "…" },
    "isFurnishable": true,
    "createdUtc": "…"
  }
}
GET /api/v1/me/fundability All plans

Your latest Fundability Readiness snapshot — a 0–100 readiness index built from data Trustvane already holds. data is null if no score has been computed yet.

{ "ok": true, "data": { "score": 72, "band": "Strong", "factorsJson": "[…]", "createdUtc": "…" } }

Not a credit score. It measures how ready your business looks to a lender, not your creditworthiness.

GET /api/v1/me/score-history All plans

Recent fundability snapshots, newest first — the trend behind the current score. Optional ?take= (default 12, max 60).

{ "ok": true, "data": [ { "score": 72, "band": "Strong", "createdUtc": "…" }, … ] }
GET /api/v1/me/tradelines All plans

The trade relationships you track and whether each is reporting to the bureaus.

{
  "ok": true,
  "data": [
    {
      "id": "…-guid",
      "vendorName": "Uline",
      "vendorEin": "12-3456789",
      "accountNumber": "12345",
      "netTermsDays": 30,
      "currentBalance": 1800.00,
      "highCredit": 2500.00,
      "balanceAsOf": "2026-08-01",
      "aging": {
        "amt0to30": 1800.00, "amt31to60": 0, "amt61to90": 0,
        "amt91to120": 0, "amt121plus": 0, "totalPastDue": 1800.00
      },
      "reportingStatus": "Expected",
      "confirmationSource": "CatalogExpected",
      "reportsTo": { "dun": true, "experian": false, "equifax": false, "cortera": false },
      "isActive": true,
      "attestedUtc": "…",
      "createdUtc": "…"
    }
  ]
}

Expected is not Confirmed. A vendor believed to report is only Expected until a payment actually lands on your file.

GET /api/v1/me/ucc Growth+

UCC financing statements on public record naming your business as debtor, from the most recent search we ran.

{
  "ok": true,
  "data": [
    {
      "stateCode": "WY",
      "fileNumber": "2022-1234567",
      "fileDate": "04/12/2022",
      "securedParty": "Example Capital",
      "collateral": "All assets",
      "status": "Active",
      "isActive": true,
      "firstSeenUtc": "…",
      "lastSeenUtc": "…"
    }
  ]
}

An empty array means the most recent search found nothing — not that no search has run. The Liens page in-app distinguishes those states in full.

GET /api/v1/me/compliance Growth+

The compliance and filing obligations Trustvane tracks for your business (annual reports, registered agent, taxes, BOI, and any you added).

{
  "ok": true,
  "data": [
    {
      "id": "…-guid",
      "title": "State annual report",
      "category": "State filing",
      "cadence": "Annual",
      "dueDate": "2026-04-15T00:00:00",
      "status": "Open",
      "verifyWith": "Secretary of State",
      "verifyUrl": "https://…"
    }
  ]
}

Dates are estimates to confirm with the named authority — informational, not legal advice.

Report your tradelines

Add and maintain the trade relationships you report. Anything you add here is furnished to the CredX bureau on the next push, landing as an honest self-reported reference on your business. Available on every paid plan. Accepts a JSON body or form fields.

POST /api/v1/me/tradelines All plans

Create a tradeline. Only vendorName is required. You may also send the vendor's identity, the account's balances and aging, and the date those figures are current as of.

curl -X POST https://app.trustvane.com/api/v1/me/tradelines \
  -H "Authorization: Bearer tv_live_..." \
  -H "Content-Type: application/json" \
  -d '{
    "vendorName": "Uline",
    "vendorDba": "Uline Shipping Supplies",
    "vendorState": "IL",
    "vendorEin": "12-3456789",
    "accountNumber": "12345",
    "netTermsDays": 30,
    "creditLimit": 2500,
    "highCredit": 2500,
    "currentBalance": 1800,
    "amt0to30": 1800,
    "balanceAsOf": "2026-08-01",
    "accountOpenedDate": "2025-06-01",
    "reportsExperian": true,
    "note": "Account #12345",
    "attested": true,
    "attestedName": "Jordan Doe"
  }'

Returns 201 with the created tradeline (its id is a GUID you use below).

Fields

All optional except vendorName. Vendor identity: vendorDba, vendorAddress, vendorCity, vendorZip, vendorPhone, vendorWebsite, vendorState (2-letter), vendorEin. Account: accountNumber, netTermsDays, creditLimit, accountOpenedDate. Trade experience: currentBalance, highCredit, aging buckets amt0to30 / amt31to60 / amt61to90 / amt91to120 / amt121plus, and balanceAsOf (the date those figures are current as of). Bureau bits: reportsExperian, reportsDun, reportsEquifax, reportsCortera.

Validation & attestation

vendorEin must be a 9-digit federal EIN (any punctuation is accepted; it is stored as ##-#######). All amounts must be non-negative and balanceAsOf cannot be in the future. Because a tradeline is furnished to the bureau as a self-reported line on your file, you must send attested: true to affirm the information is accurate; optionally include attestedName. A failed check returns 400 with a validation_failed code. Non-blocking data-quality hints (for example, aging buckets that don't add up to the balance) come back in a warnings array on an otherwise successful response.

PUT /api/v1/me/tradelines/{id} All plans

Update a tradeline. Send only the fields you want to change. A change re-queues the line to furnish an update on the next push. Changing any balance, aging bucket, EIN or balanceAsOf requires re-sending attested: true.

DELETE /api/v1/me/tradelines/{id} All plans

Remove a tradeline you no longer want to report.

Credit pulls & bulk lists

Pull CredX business credit reports and order curated company lists, billed on net-30 terms against your Trustvane account — each charge is a normal net-terms purchase that also builds your own Experian file. A net-30 line must be approved by an admin first; request it from your developer page. Report pulls need the Growth plan; bulk orders need Pro.

Pricing is set by Trustvane and shown on your developer page and in each response. A pull that returns only public directory data (an unclaimed business) is not billed.

GET /api/v1/credit/search Growth+

Find a business and its CredX account id. Free — no charge, no quota. ?q=<name> or ?ein=<ein>.

{ "ok": true, "data": { "count": 1, "results": [
  { "accountId": "1000042", "name": "Acme Supply LLC", "city": "Denver", "state": "CO", "claimed": true }
] } }
POST /api/v1/credit/reports Growth+

Pull a full credit report. Pass accountId (from search) or ein to resolve one. Billed net-30 on success.

curl -X POST https://app.trustvane.com/api/v1/credit/reports \
  -H "Authorization: Bearer tv_live_..." \
  -d "accountId=1000042"
{ "ok": true, "data": {
  "id": "…-guid", "limited": false, "billed": true,
  "charge": { "amount": 2.95, "invoiceNumber": "TV-000123", "dueUtc": "…", "terms": "NET 30" },
  "availableCredit": 497.05,
  "report": { "business": { … }, "scores": { … }, "principals": [ … ], "tradeLines": [ … ] }
} }

A GET to the same path returns your pull history and net-30 credit state (limit, available, price).

POST /api/v1/credit/bulk Pro

Order a curated company list. Body: state, industry (or NAICS), count, optional note. Billed net-30 up front; the list is compiled and delivered, and the order status is available with a GET.

{ "ok": true, "data": {
  "id": "…-guid", "status": "Queued", "estimatedRecords": 250, "price": 125.00,
  "charge": { "amount": 125.00, "invoiceNumber": "TV-000124", "dueUtc": "…", "terms": "NET 30" }
} }

Coming next

More of the CredX bureau surface (monitoring webhooks, richer bulk delivery) will be documented here as it ships.

Ready to build? Create your first key on the developer page.