Kentucky (KY) Title & Registration API - Developer Guide
1. Overview & Introduction
The Kentucky (KY) Title & Registration API submits and processes title and registration transactions with the Kentucky Department of Motor Vehicles (DMV) and returns transaction status and confirmation data. It is one of Vitu's Electronic Vehicle Registration (EVR) interfaces, intended for dealers and their software providers who need to originate DMV title/registration work programmatically rather than through a manual portal.
The core noun is the transaction — a single title and/or registration submission for one vehicle. A transaction bundles everything the DMV needs to evaluate the work: the vehicle, one or more parties (owner, co-owner, lessor/lessee, lienholder, prior owner), insurance, prior-title information, and the registration action being requested. Each transaction carries a client-supplied reference identifier (refNumber, a UUID) and, once accepted into the Vitu system, a Vitu-assigned numeric transaction identifier. Both forms of identifier are accepted where an existing transaction must be addressed.
Processing is asynchronous. Submitting or updating a transaction returns an acceptance acknowledgement, not a final result. The authoritative outcome — DMV status, audit messages, assigned plate, shipment/indicia details, invoiced fees — is delivered through a callback to a URL you supply. Callbacks are typed (success, failure, EVR, DMVDESK, invoiced), and you correlate each callback to your original request via refNumber.
Environments follow a single server template with an environment variable: api (production), api-stage, and api-test. The environment forms part of the host; see the spec's servers block for the exact template. Credentials are environment-specific and issued by Vitu.
Sensitive-data note: transaction payloads contain personally identifiable information (owner/lessee names, dates of birth, driver license numbers, addresses, contact details) and vehicle/financial data. Treat all request and callback payloads as regulated PII. See Data Sensitivity.
> 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
- Familiarity with REST and OAuth 2.0 client-credentials.
- A set of Vitu-issued client credentials for the target environment. Obtain these from the Key Management area within Vitu's Developer Portal.
- A network-accessible HTTPS endpoint to receive callbacks, if you want asynchronous results delivered (recommended — see Async Patterns).
Shortest path to one successful submission
- Obtain an access token using the client-credentials grant against the token endpoint defined by the
keycloaksecurity scheme, requesting theoneapi:accessscope. - Build a transaction payload conforming to the
KYEVRTransactionDTOschema. Include a client-generatedrefNumber(UUID) so you can correlate results. - Call the transaction-creation operation (
CreateTransaction), attaching the bearer token. Optionally supply yourcallbackUrland set the transaction type as appropriate for KY EVR work. - Receive the acceptance acknowledgement. This confirms the request was accepted for asynchronous processing — it is not the final outcome.
- Wait for the callback at your
callbackUrl, or otherwise coordinate with Vitu on result retrieval. Match the callback to your submission viarefNumber.
Refer to the spec for the exact request body, query parameters, headers, and response shapes for
CreateTransaction.
3. Authentication & Access Walkthrough
Authentication uses OAuth 2.0 client credentials. The formal definition — grant type, token URL, and scope — lives in the spec under the keycloak security scheme; that is the single source of truth.
Obtaining credentials. Client credentials are issued by Vitu and are managed in the Key Management area of Vitu's Developer Portal. Credentials are environment-specific.
Obtaining a token. Exchange your client credentials at the token endpoint defined by the keycloak scheme, requesting the oneapi:access scope. You receive a bearer access token.
Attaching the token. Send the token as a bearer credential on every API call. All operations require the oneapi:access scope.
Token lifecycle. Access tokens expire. Cache and reuse a token until shortly before expiry, then request a new one. On a 401, discard the cached token, obtain a fresh one, and retry once; if it recurs, treat it as a credential/configuration problem rather than retrying in a loop. On a 403, the caller authenticated but lacks permission — do not retry; verify scope and entitlement.
Single scheme only. Only one security scheme (keycloak, client-credentials) is defined. There is no API-key or authorization-code alternative — do not build for one.
4. Key Concepts & Glossary
| Term | Meaning |
|---|---|
| Transaction | The central resource: one title and/or registration submission for a single vehicle, carrying the vehicle, parties, insurance, prior-title, and registration action. Modeled by KYEVRTransactionDTO. |
| refNumber | Client-supplied UUID identifying a transaction. Used to correlate callbacks back to your submission. |
| transactionId | Vitu-assigned numeric identifier for a transaction. Either this or refNumber may be used to address an existing transaction. |
| Transaction type | Classifies the processing channel (see TransactionTypeEnum). For this API the relevant channel is KY EVR; supply the type per the spec. |
| Application type | What is being requested for the vehicle (e.g. title-and-registration, title-only, tax-only). See the applicationType field on KYEVRTransactionDTO. |
| Service type | Distinguishes a forms-and-fees service from a full service (ServiceTypeEnum). |
| Registration action | The registration operation requested (e.g. new registration, plate transfer, temporary tag). See the registration.action field. |
| Parties | The people/entities on a transaction: owner, co-owner, lessor, lessee(s), lienholder, prior owner. Each has its own sub-object within the transaction payload. |
| Callback | An asynchronous, typed notification delivered to your callbackUrl reporting an outcome or status change. Modeled by CallbackDTO and its typed variants. |
| Callback type | Discriminator (callbackType) selecting the concrete callback variant — success, failure, EVR, DMVDESK, invoiced. |
| Indicia / shipment | Shipping/tracking data (carrier, tracking, destination) returned on successful transactions via IndiciaDTO. |
| Control number | The dealer's own reference (e.g. stock or deal number) carried on the vehicle and echoed back. |
Relationships & lifecycle. A transaction is created, may be updated while still in progress, and moves through DMV processing asynchronously. Status is expressed through several enums depending on context (TransactionStatusEnum, UniversalStatusEnum, and callback-specific status fields). Consult the spec for the authoritative status value sets.
5. Common Use Cases & Integration Patterns
5.1 Submit a new title/registration transaction
- Obtain a token (§3).
- Assemble a
KYEVRTransactionDTOwith a client-generatedrefNumber, the vehicle, applicable parties, insurance, prior-title, and the registration action. - Call
CreateTransaction, supplying yourcallbackUrland the appropriate transaction type. - Persist the
refNumber(and the returned identifier if provided) against your local record. - Wait for the callback to report the outcome; branch on
callbackType.
Intent: originate DMV work and receive its result asynchronously.
5.2 Correct or complete an in-progress transaction
- Identify the transaction by
transactionIdorrefNumber. - Call
UpdateTransactionwith the revised payload. - Await a fresh callback reflecting the updated processing state.
Intent: amend a submission — for example, after a validation failure callback, or to complete a draft.
5.3 Draft / save-for-later flow
The payload supports a saveForLater flag. Use it to create a transaction that is staged rather than fully submitted, then finalize later via UpdateTransaction.
Intent: stage work before committing it to DMV processing.
5.4 Handling outcome callbacks
Callbacks are typed via the callbackType discriminator:
- Success — processing completed; carries status, audit messages, shipment/indicia, assigned identifiers.
- Failure — processing failed; carries
errorsfor diagnosis and remediation (often via §5.2). - EVR / DMVDESK — channel-specific status, including assigned plate and deal status.
- Invoiced — fee/billing detail for the transaction(s).
Always correlate on refNumber, dispatch on callbackType, and treat unknown types defensively.
Sync vs. async. All meaningful results arrive asynchronously via callback. Do not treat the synchronous acceptance response as an outcome.
6. Behavioral & Operational Notes
- Asynchronous acceptance. The success response to create/update signals accepted for processing, not completed. The real result comes via callback. Design for this or you will misreport outcomes.
- Correlation is your responsibility. Supply and store a
refNumber; it is the key that ties callbacks back to your submission. - Update semantics.
UpdateTransactionaddresses an existing transaction by either identifier form. The spec does not state whether the update is a full replace or a partial merge of theKYEVRTransactionDTO. Flag: confirm replace-vs-merge behavior with Vitu before relying on partial updates; until confirmed, send a complete payload. - Idempotency. No idempotency key mechanism is defined. Retrying
CreateTransactionmay create duplicate transactions. Guard against duplicate submission on your side (e.g. by not re-issuing a create for an already-acceptedrefNumber). - Callback security. The spec notes that when an HMAC key is configured for callbacks, the payload is signed using HMAC/SHA-256 (base-encoded). If you configure signing, verify the signature on receipt. Coordinate key setup with Vitu.
- Callback acknowledgement. Your callback endpoint is expected to return a success acknowledgement to indicate acceptance. Delivery/retry behavior for un-acknowledged callbacks is not specified — see §9.
- On-behalf-of header. An optional header lets a request act on behalf of a specific user. Use only if Vitu has provisioned this for your integration; otherwise omit.
7. Asynchronous / Callback Patterns
Conceptual flow. You submit (or update) a transaction and provide a callbackUrl. The transaction is processed asynchronously. When status changes or a result is available, Vitu POSTs a typed CallbackDTO to your URL. Your endpoint validates and acknowledges it.
Correlation. Match each callback to its originating request using refNumber (present on the callback base). Dispatch handling on callbackType.
Signing. If an HMAC key is configured, callbacks are signed with HMAC/SHA-256. Verify before trusting payload contents.
> 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 environments are available via the server template's environment variable: api (production), api-stage, and api-test. Use api-test for initial integration and api-stage for pre-production validation. Credentials are issued per environment through the Developer Portal's Key Management area; a token obtained for one environment is not valid for another.
See §3's flag regarding the auth (token) endpoint host, which does not appear to be environment-templated the way the API host is — confirm the correct token endpoint per environment with Vitu.
9. Rate Limiting & Quotas
Responses carry rate-limit headers (RateLimit-Limit, RateLimit-Reset) and, on throttling, a Retry-After header. Read these headers rather than hardcoding values; the numeric limits are not fixed in this guide and live in the spec/runtime headers. On a throttled response, wait for the period indicated by Retry-After (or until RateLimit-Reset) before retrying, and apply backoff for repeated throttling. See §11 for the retry classification.
10. Error Handling & Troubleshooting
Handle errors by class, not by memorizing individual codes (which drift). Error payloads for request failures use the Errors schema; some auth/throttle responses use a simpler code/message object. Consult the spec for exact shapes.
| Class | Meaning | Retryable? | Action |
|---|---|---|---|
| Auth (unauthorized) | Missing/expired/invalid token. | Once, after refresh | Obtain a new token and retry a single time; then stop and investigate credentials. |
| Forbidden | Authenticated but not permitted. | No | Verify scope/entitlement; contact support. |
| Validation (bad request) | Payload failed validation. | No (until fixed) | Inspect the Errors payload, correct the data, resubmit (create) or UpdateTransaction. |
| Not found | Referenced resource/transaction does not exist. | No | Verify the identifier (transactionId / refNumber). |
| Rate limit | Too many requests. | Yes | Honor Retry-After / RateLimit-Reset, then retry with backoff. |
| Server error | Fault on Vitu/DMV side. | Yes, cautiously | Retry with exponential backoff and a capped number of attempts; if persistent, contact support. |
Backoff convention. For retryable classes, use exponential backoff with jitter, respecting Retry-After when present, and cap total attempts. Never retry validation or forbidden failures without changing the request.
Note: processing failures (as opposed to submission errors) are reported asynchronously via failure-type callbacks, not synchronous error responses. Diagnose those from the callback's errors content.
11. Data Sensitivity & Compliance Notes
Transaction payloads and callbacks carry PII (names, dates of birth, driver license numbers, addresses, contact details) and financial data (selling price, fees, trade-in values). Handling expectations:
- Transmit only over the provided HTTPS endpoints; never log full payloads containing PII/license numbers.
- Restrict access to stored
refNumber↔PII mappings. - Secure your callback endpoint (HTTPS, signature verification where HMAC is configured).
- Retain data only as long as your DMV/business obligations require.
This is handling guidance, not legal advice.
12. Support & Resources
For any API assistance, contact Vitu's API support team at [email protected].