Introduction

The Spinwheel API gives you user-permissioned credit data you can act on.

A user consents and verifies their identity — that's Connect. Their Debt Profile comes back with the credit report and every Liability on it. Each Liability is then individually addressable: refresh a balance live from the institution, request a payoff quote, make a payment.

REST over HTTPS, JSON in and JSON out. Every path is prefixed /v1:

POST https://sandbox-api.spinwheel.io/v1/users/connect/sms

The response envelope

Every response, success or failure, has the same two keys:

{
  "status": {
    "code": 400,
    "desc": "FAILED_ELIGIBILITY",
    "messages": [{ "desc": "User failed to meet eligibility requirements." }]
  },
  "data": { }
}

data holds the result. On errors, status.desc is the machine-readable reason and status.messages[].desc is the human-readable one. Branch on status.desc alongside the HTTP status. Each endpoint's reference page lists what it returns.

Two statuses to watch

206 Partial Content is returned by Retrieve a User when the credit file is frozen, locked, fraud-flagged, referred or missing. Handle it as a partial result; status.messages says which condition applied.

429 rarely means you are sending too fast. Most are business rules — one credit report per user per day, five One-Time Passcode (OTP) attempts — that will not clear on backoff. See Rate Limits.

Order of operations

  1. Connect a user. Everything is scoped to a userId, which only comes from a Connect flow: SMS, KBA, pre-verified or network token.
  2. Order a Debt Profile. POST /v1/users/USERID/debtProfile pulls the credit report and score and populates the user's Liabilities. Without it, a connected user has profile data only.
  3. Act on Liabilities. Real-time balances, APR refreshes, payoff quotes and payments all operate per Liability.

Next