Idaho (ID) Title & Registration - Developer Guide
1. Overview & Introduction
The Idaho (ID) Title & Registration API lets you submit vehicle title and registration transactions to the Idaho Department of Motor Vehicles (DMV) through Vitu, and receive back processing status and confirmation data. It is the electronic vehicle registration (EVR) integration point for dealers and their software providers who need to file title/registration work programmatically instead of through manual DMV channels.
The central domain object is the transaction. A transaction bundles everything the DMV needs to evaluate one title/registration filing: the vehicle, the owner(s) and any co-owner, optional lessee/lessor and lienholder parties, trade-ins, and the registration action being requested. The transaction request body is defined by the IDEVRTransactionDTO schema. The nature of the filing is expressed through two related concepts: the transactionType (an operational routing dimension — see TransactionTypeEnum) and the applicationType inside the transaction body (the DMV work being requested, e.g. title-and-registration vs. title-only).
Processing is asynchronous. When you submit a transaction, the API accepts it for background processing rather than returning a finished result inline. Final outcomes — success, failure, DMV desk status, EVR results, or invoicing — are delivered through callbacks to a URL you supply, described by the CallbackDTO family. A transaction is identified for later reference by both a server-assigned numeric transactionId and a client-visible UUID refNumber.
The API is served from a single environment-parameterized base URL with three deployment targets (api for production, api-stage, and api-test); see the servers block in the spec for the exact host template. All access is via OAuth 2.0 client credentials.
Sensitive data: transaction bodies carry personally identifiable and regulated information (SSN, FEIN, driver license numbers, dates of birth, owner/lessee addresses). Treat all request and callback payloads as sensitive. See Data Sensitivity & Compliance Notes.
> Corresponding Title & Registration Notifications product: The Title & Registration Notifications product serves as a complementary offering to this Title & Registration service. Together, the transaction and notification capabilities provide a complete ecosystem for both initiating vehicle transaction requests and staying informed of relevant updates through secure, automated notifications. See that product in the Catalog for more details.
2. Getting Started / First Call
Prerequisites
- A Vitu-issued OAuth 2.0 client credential (client ID and secret).
- The ability to reach the environment host for your target (
api-testis the right starting point). - If you want to receive results, a network-accessible HTTPS endpoint to act as your callback receiver.
Obtain access
Credentials are issued by Vitu and are available from the Key Management area within Vitu's Developer Portal. Use those credentials with the client-credentials flow described in the spec's keycloak security scheme.
Minimal happy path
- Get a token. Exchange your client credentials for an access token at the token endpoint defined in the
keycloaksecurity scheme, requesting theoneapi:accessscope. - Submit a transaction. Call the
CreateTransactionoperation with anIDEVRTransactionDTObody. Provide your callback URL and, if relevant, thetransactionType. This operation returns an acceptance response — it does not return the final result. - Receive the outcome. Your callback endpoint receives a
CallbackDTOwhen processing reaches a terminal or notable state. Correlate it back to your submission usingrefNumber. - (Optional) Amend. If you need to change an in-flight or draft transaction, call
UpdateTransactionwith the transaction's identifier.
Note — request body detail: The
IDEVRTransactionDTOschema is large and mostly optional at the schema level. The spec does not encode which fields are conditionally required for a givenapplicationTypeorregistration.action.
3. Authentication & Access Walkthrough
The API defines a single security scheme, keycloak, using the OAuth 2.0 client-credentials flow with the scope oneapi:access. The formal definition (token URL, refresh URL, scope name) lives in the spec's securitySchemes — refer to it there rather than to any copy.
There is only one authentication mechanism. If your integration assumes API keys or an authorization-code/user-login flow, that expectation does not apply here — this is a machine-to-machine flow.
Obtaining and using tokens
- Retrieve your client ID and secret from the Key Management area of Vitu's Developer Portal.
- Request an access token from the token endpoint in the
keycloakscheme, requesting theoneapi:accessscope. - Attach the returned bearer token to each API request as an
Authorization: Bearer <token>header.
Token lifecycle
- Access tokens expire. Cache and reuse a token until shortly before its expiry, then request a fresh one; do not request a new token per call.
- On a
401response, obtain a fresh token and retry once. If the retry still fails with401, treat it as a credential/configuration problem, not a transient error. - A
403means the caller authenticated successfully but lacks permission — do not retry; escalate to obtain the correct access.
Environment differences
The env server variable selects the deployment.
4. Key Concepts & Glossary
| Term | Meaning |
|---|---|
| Transaction | The core unit of work: one title/registration filing, represented on input by IDEVRTransactionDTO. Identified by a numeric transactionId and a UUID refNumber. |
transactionType | Operational routing/category for the request (see TransactionTypeEnum, e.g. EVR / Interstate / DMV desk contexts). Distinct from applicationType. |
applicationType | The DMV work being requested within the transaction body (e.g. title-and-registration, title-only). Note the transaction body's applicationType and the callback's ApplicationTypeEnum are defined separately in the spec and do not enumerate identical value sets. |
serviceType | The service level Vitu performs (see ServiceTypeEnum, e.g. forms-and-fees vs. full service). |
| Registration action | What is being done with plates/registration for this filing (e.g. new registration, plate transfer, temporary tag) — see the registration.action field. |
| Owner / Co-owner / Lessee / Lessor / Lienholder | The parties on the filing. The owner is the primary party; co-owner, lessee(s), lessor, and lienholder are optional related parties carried in the same transaction body. |
| Vehicle / Trade-in | The vehicle being titled/registered, plus zero or more trade-in vehicles that may offset taxable value. |
| Callback | An asynchronous notification delivered to your callback URL, modeled by CallbackDTO and its subtypes (see below). |
refNumber | Client-facing UUID used to correlate a submission with its callbacks. |
transactionId | Server-assigned numeric identifier for the transaction. |
| Indicia / shipment | Shipping/tracking information for produced documents or plates, surfaced in success callbacks via IndiciaDTO. |
How resources relate
There is effectively one addressable resource — the transaction — with all parties and the vehicle embedded within it. There are no separately created child resources to link; you assemble the full picture in a single IDEVRTransactionDTO.
Lifecycle and callback types
A transaction moves through states over its lifetime. The CallbackDTO discriminator (callbackType) selects which callback shape you receive:
- SUCCESS — terminal success detail, including status, any audit messages, and shipment/indicia info.
- FAILURE — processing failed; carries error detail.
- EVR — EVR-specific result (e.g. assigned plate, control number).
- DMVDESK — DMV-desk deal status detail, including bundle errors flagged as fixable/fixed.
- INVOICED — invoicing detail for one or more transactions and their fees.
The exact status vocabularies (TransactionStatusEnum, UniversalStatusEnum, EDealStatus) and each callback subtype's fields are defined in the spec; consult it for authoritative values.
5. Common Use Cases & Integration Patterns
Each scenario references operations by name. Ordering and correlation are the parts the spec cannot express.
Scenario A - Submit a new title/registration filing
- Acquire a token (client-credentials,
oneapi:access). - Assemble the transaction body (
IDEVRTransactionDTO): vehicle, owner(s), registration action, and the appropriateapplicationType/serviceType. - Call
CreateTransaction, supplying yourcallbackUrland, where applicable,transactionType. - Store the
refNumberyou sent (and the returned identifiers if present) so you can correlate callbacks. - Wait for a callback. Branch on
callbackType: handle SUCCESS/EVR/INVOICED as progress or completion, and FAILURE as needing correction.
Scenario B - Amend an in-flight or draft transaction
- Acquire a token.
- Call
UpdateTransactionwith the transaction's identifier (numerictransactionIdor UUIDrefNumber— the path parameter accepts either) and the revised body. - Await the resulting callback as in Scenario A.
Use
UpdateTransactionfor corrections and for progressing a saved draft (saveForLater).
Scenario C - Correct a rejected filing
- Receive a FAILURE (or a DMVDESK callback carrying
bundleErrors). - Inspect the error/bundle-error detail. For DMV-desk bundle errors, the
fixableflag indicates whether the issue can be resolved and re-submitted. - Call
UpdateTransactionwith corrections. - Await the next callback.
Recommended patterns
- Async-first, callback-driven. These operations return acceptance, not results. Design around receiving callbacks; do not block waiting on the initial response for outcome data.
- Idempotency via
refNumber. Generate and retain a stablerefNumberper logical filing so you can correlate and de-duplicate. (See the operational note on retry semantics.) - Secure your callback receiver. Callbacks may be signed (see Asynchronous / Callback Patterns); verify signatures and require HTTPS.
6. Behavioral & Operational Notes
- Acceptance ≠ completion. A successful response to
CreateTransaction/UpdateTransactionmeans the request was accepted for asynchronous processing. The true outcome arrives only via callback. Never treat the initial response as confirmation of a filed transaction. - Correlate on
refNumber. Callbacks carryrefNumber; some subtypes also carrytransactionId.refNumberis the reliable correlation key because you control it and can set it before submission. - Identifier flexibility on update. The
UpdateTransactionpath identifier accepts either the numerictransactionIdor the UUIDrefNumber. Choose one consistently within your integration. saveForLaterdrafts. The body includes asaveForLaterflag; a saved transaction is a draft rather than a submitted filing.
7. Asynchronous / Callback Patterns
The API delivers results through the onStatusChange callback declared on the transaction operations. You supply callbackUrl at submission time; Vitu POSTs a CallbackDTO to it when status changes.
Flow:
- Submit with a
callbackUrlthat is HTTPS and network-reachable from Vitu. - Your endpoint receives a
CallbackDTO; dispatch oncallbackType(SUCCESS, FAILURE, EVR, DMVDESK, INVOICED). - Correlate to your original submission via
refNumber. - Respond with a success status (per the callback's declared responses) to acknowledge receipt.
Signing: The spec indicates that when an HMAC key is configured, callbacks are signed using HMAC/SHA-256 (base64-encoded). Verify this signature before trusting a payload.
> Corresponding Title & Registration Notifications product: The Title & Registration Notifications product serves as a complementary offering to this Title & Registration service. Together, the transaction and notification capabilities provide a complete ecosystem for both initiating vehicle transaction requests and staying informed of relevant updates through secure, automated notifications. See that product in the Catalog for more details.
8. Environments & Sandbox Access
Three deployment targets are exposed via the env server variable: production (api), staging (api-stage), and test (api-test). Begin integration against api-test. Credentials are environment-specific and issued from the Key Management area of Vitu's Developer Portal. Refer to the spec's servers block for the exact host template.
9. Rate Limiting & Quotas
Responses carry rate-limit headers (RateLimit-Limit, RateLimit-Reset), and 429 responses include Retry-After. Read these headers by name rather than hard-coding limits; the numeric values are governed by the server and may change.
Convention: On 429, wait for the interval indicated by Retry-After before retrying. If absent, use exponential backoff with jitter. Proactively slow down as RateLimit-Limit/RateLimit-Reset indicate you are approaching the window boundary.
10. Error Handling & Troubleshooting
Handle failures by class, not by individual code. The Errors schema (an array of Error) is the primary error body for validation, not-found, and server responses; auth and rate-limit responses use a code/message object. Refer to the spec for exact shapes and status codes.
| Class | Meaning | Retry? | Strategy |
|---|---|---|---|
| Auth (unauthenticated) | Missing/expired/invalid token. | Once, after refreshing the token. | Get a new token; if it still fails, treat as configuration error. |
| Auth (forbidden) | Authenticated but not permitted. | No. | Escalate to obtain correct access/scope. |
| Validation | The request or transaction body is malformed or business-invalid. | No (not without changes). | Read the Errors detail, correct the payload, and resubmit via UpdateTransaction (or a new CreateTransaction). |
| Not found | The referenced transaction does not exist. | No. | Verify the identifier (transactionId / refNumber). |
| Rate limit | Too many requests. | Yes. | Honor Retry-After; otherwise exponential backoff with jitter. |
| Server | Transient server-side failure. | Yes. | Exponential backoff with jitter; cap attempts, then alert. |
Backoff convention: exponential with jitter, a sane maximum attempt count, and a stop condition once errors are clearly non-transient (auth-forbidden, validation, not-found).
11. Data Sensitivity & Compliance Notes
Transaction payloads and callbacks contain regulated personal data — SSN, FEIN, driver license numbers, dates of birth, and residential/mailing addresses for owners, co-owners, and lessees.
- Transmit only over TLS; the API and callback receiver must both use HTTPS.
- Minimize retention of raw PII; store only what your workflow requires.
- Restrict access to submitted payloads and received callbacks.
- Verify callback authenticity (HMAC signature) before processing.
This is handling guidance, not legal advice.
12. Support & Resources
For any API assistance, contact Vitu's API support team at [email protected].