Montana (MT) NTX Salvage Title - Developer Guide
1. Overview & Introduction
The Montana (MT) NTX Salvage Title API lets external systems submit and manage Montana salvage title applications through Vitu's national public API platform. It removes the need to interact with the state directly: your integration assembles the transaction data, Vitu processes it, and the API returns generated forms, status updates, and produced documents.
The central noun is the transaction — a single salvage title application containing the vehicle, owner, seller, prior title, and salvage-brand information. A transaction moves through a lifecycle: it is created, optionally updated, and finally committed for processing (or cancelled). During and after processing, a transaction produces forms (generated documents tied to that transaction) and may accrue ticket messages (a comment/correspondence thread used to exchange information and supporting files with Vitu's processing team). Separately, you can upload your own supporting documents and associate them with a transaction.
Because processing is inherently asynchronous, most write operations acknowledge the request immediately and continue working in the background. The API surfaces outcomes through callbacks (webhooks) that you register per request. The callback payload is polymorphic — its shape depends on the type of event (success, failure, and other platform event types). This makes callbacks the primary mechanism for learning the true result of a submission.
The API is served from a single host template with a selectable environment segment. The spec defines three environments (production plus staging and test variants). Treat production as live and state-affecting; use the non-production environments for integration work. Refer to the servers block in the spec for the exact URL template and environment values.
Transactions carry personally identifiable owner information (names, addresses, and business identifiers such as FEIN). Treat all request and response payloads as sensitive and transmit them only over TLS.
2. Getting Started / First Call
Prerequisites
- A registered Vitu client credential (see Authentication).
- Your Vitu Location ID (a UUID). Document and ticket operations require it as a header.
- A publicly reachable HTTPS endpoint if you intend to receive callbacks.
Obtain access
Credentials are issued by Vitu and are available from the Key Management area within Vitu's Developer Portal. Use those credentials to obtain an OAuth 2.0 access token via the client-credentials flow (see the security schemes in the spec).
Minimal happy path
- Obtain a token using your client credentials.
- Create a transaction with
CreateTransaction, supplying the salvage title data and (recommended) acallbackUrl. The response is an asynchronous acknowledgement, not a final result. - Wait for a callback at your registered URL, or retrieve produced documents once processing has advanced.
- List produced forms with
GetTransactionFormsand download them withDownloadTransactionFormsorDownloadTransactionDocument. - Commit the transaction with
CommitTransactionwhen you are ready to finalize, supplying shipping and (where applicable) plate-destination and signer details.
The create/update operations accept the salvage transaction body defined by the
NTXSalvageTransactionDTOschema. For Montana salvage titling, thestateandapplicationTypefields are constrained to Montana salvage values — see the spec for the exact allowed values.
3. Authentication & Access Walkthrough
The spec defines the formal security under two OAuth 2.0 client-credentials schemes: auth0 and keycloak. Both are declared at the API level, meaning a token from either issuer is accepted. Consult the spec's securitySchemes for the authoritative token URLs and scope names (api_access for auth0, oneapi:access for keycloak).
Obtaining and using a token
- Retrieve client credentials from the Key Management area in Vitu's Developer Portal.
- Request an access token from your issuer's token endpoint using the client-credentials grant and the scope defined for that scheme.
- Attach the resulting token as a Bearer credential on every API request.
Token lifecycle
- Tokens are short-lived JWTs; cache and reuse a token until shortly before expiry rather than requesting one per call.
- On a
401response, obtain a fresh token and retry once. A repeated401indicates a credential or scope problem, not an expiry problem. - A
403means the token is valid but the caller lacks permission for the operation — do not retry; resolve entitlements with Vitu.
Two schemes, one choice: Although two issuers are listed, they are alternatives, not a required pair. Pick the issuer for which Vitu provisioned your credentials. If you were issued only one, use only that one.
Environment differences
Use the same credential flow across environments, but note that the token URLs in the spec point at Vitu-hosted issuers; align your token endpoint with the environment you are calling. Non-production environments do not produce state-filed results.
4. Key Concepts & Glossary
| Term | Meaning |
|---|---|
| Transaction | The salvage title application and its data (vehicle, owner, seller, prior title, salvage brands). The root resource of most workflows. Represented by NTXSalvageTransactionDTO. |
| Reference number / Transaction ID | A transaction is addressable by either an integer transaction ID or a UUID reference number. Operations that take a transactionId path parameter accept either form. |
| Transaction type | An optional qualifier on transaction operations (TransactionTypeEnum) identifying the processing family. For this product the salvage title flow is the relevant path; see the spec for enum values. |
| Service type | Whether the request is forms-and-fees only or full service (ServiceTypeEnum). This affects how far Vitu takes the transaction. |
| Form | A document produced by the transaction (FormDocumentDTO), e.g. a generated title form. Forms are listed and downloaded, not uploaded. Some forms carry signing metadata. |
| Document | A file you upload and associate with a transaction (DocumentDTO / upload operation), classified by DocumentTypeEnum. Distinct from forms: documents are inputs, forms are outputs. |
| Location ID | A Vitu-issued UUID identifying the operating location. Required on document and ticket operations via the x-location-id header. |
| Ticket message | An entry in a correspondence thread tied to a transaction, optionally linking uploaded document IDs. Used to exchange information with Vitu processing. |
| Callback | An asynchronous notification POSTed to your callbackUrl when a transaction's state changes. Payload is polymorphic (CallbackDTO and its variants). |
| Commit / Finalize | The act of submitting a transaction for final processing, carrying shipping and plate-destination details (FinalizeDTO). |
How resources relate
- A transaction is the parent of its forms, uploaded documents, and ticket messages.
- Documents are uploaded against a transaction ID and can then be linked into a ticket message.
- Forms exist only once a transaction has been created and processed far enough to generate them.
- Commit is a terminal-intent action on a transaction; cancel is the opposing terminal action.
Lifecycle states
The spec exposes several status enumerations (TransactionStatusEnum, UniversalStatusEnum, and callback-specific status types). Treat these as the source of truth for state values.
5. Common Use Cases & Integration Patterns
5.1 Submit a new salvage title application
CreateTransaction— supply the salvage transaction body and acallbackUrl. Intent: register the application and begin async processing.- Receive a callback (or poll produced forms) to learn the outcome.
GetTransactionForms→DownloadTransactionForms/DownloadTransactionDocument— obtain generated output.CommitTransaction— finalize with shipping/plate/signer details once the application is ready.
5.2 Correct or extend an in-progress transaction
UpdateTransaction— resubmit the transaction body under the existing ID/reference number. Intent: revise data before commit.- Re-check forms and callbacks for the updated result.
5.3 Provide supporting documents
uploadDocument— upload one or more files against the transaction ID, tagging each with aDocumentTypeEnumvalue and supplyingx-location-id. Intent: attach evidence the state or Vitu requires.- Optionally
getDocument/getDocumentContentto verify what was stored;deleteDocumentto remove an incorrect upload.
5.4 Correspond with Vitu processing
uploadDocument(if you need to attach files).createTicketMessage— post a message on the transaction's thread, optionally linking the uploaded document IDs.getTicketMessages— read the thread, including responses.
5.5 Cancel an application
CancelTransaction— cancel the transaction, optionally including a message. Intent: withdraw before finalization.
Ordering, dependencies, and patterns
- Create before everything. Forms, documents, ticket messages, and commit all require an existing transaction.
- Prefer callbacks over polling. Register a
callbackUrlon write operations; only pollGetTransactionFormsas a fallback where a callback endpoint is not available. - Commit last. Treat
CommitTransactionas the final step after the data and any required documents are in place. - Upload before linking. A ticket message can only reference document IDs that already exist from a prior upload.
6. Behavioral & Operational Notes
- Asynchronous acknowledgement. Create, update, commit, and cancel return an accepted-style acknowledgement rather than a completed result. The true outcome arrives via callback or becomes visible on subsequent reads. Do not treat the acknowledgement as success of the underlying titling operation.
- Success is a state, not a status code. Determine real success from the callback variant/status fields or from the transaction's produced forms — not from the HTTP acknowledgement alone.
- Update semantics.
UpdateTransactionaccepts the full transaction body. Treat it as a replace of the submitted transaction representation rather than a field-level merge; send the complete intended state. - Dual identifier addressing. Anywhere a
transactionIdpath parameter appears, either the integer ID or the UUID reference number is accepted. Be consistent within your own records to avoid confusion. - Callback authenticity. When an HMAC key is configured for callbacks, Vitu signs the callback body using HMAC/SHA-256 (base64-encoded). If you rely on callbacks for state, verify the signature before acting. See the callback description in the spec.
- Polymorphic callbacks. The callback body is discriminated by
callbackType. Branch on the discriminator; do not assume a single fixed shape. Some variants carry audit messages, shipment/indicia info, invoicing, or errors. - Location scoping. Document and ticket operations require
x-location-id. Requests without it, or with a location the caller cannot access, will fail authorization/validation. - Blank form generation.
DownloadTransactionDocumentsupports generating a blank version of a form. Use this deliberately; a blank form is not the filled transaction output.
7. Asynchronous / Callback Patterns
Flow. Register a callbackUrl on a write operation. Vitu processes the request in the background and POSTs a callback to your URL when the transaction's state changes. Your endpoint should return a success status to acknowledge receipt.
Correlation. Correlate callbacks to your original request using the reference number / transaction identifier carried in the callback body. Persist the reference number you used at create time so inbound callbacks can be matched.
Payload variants. The body is polymorphic, discriminated by callbackType (success, failure, and additional platform event types). Branch on the discriminator and handle unknown variants defensively.
Integrity. When an HMAC key is configured, verify the HMAC/SHA-256 signature before trusting the payload.
8. Environments & Sandbox Access
The spec defines a production environment plus staging and test variants selected through the host template's environment segment. Use the non-production environments for all integration and certification work; they exercise the same operations and contracts without producing state-filed results. Credentials and environment access are provisioned by Vitu via the Developer Portal's Key Management area. Refer to the spec's servers block for the exact environment values rather than hard-coding URLs.
--
9. Rate Limiting & Quotas
The API signals throttling with a dedicated "too many requests" response that includes a Retry-After header. When you receive it, pause for at least the indicated interval before retrying, and apply exponential backoff with jitter for repeated throttling. The spec defines the response and header; it does not publish fixed numeric quotas, so do not assume specific limits — design your client to react to the signal rather than to a hard-coded rate.
--
10. Error Handling & Troubleshooting
Errors use the spec's Errors / Error schema (or a simple code/message object on some responses). Handle by class rather than by individual code, since specific codes may change.
| Class | Meaning | Retry? | Strategy |
|---|---|---|---|
| Auth (401) | Missing/expired/invalid token | Once, after refreshing the token | If it recurs, treat as a credential/scope issue — stop and fix. |
| Forbidden (403) | Authenticated but not permitted (incl. wrong/absent location) | No | Resolve entitlements or x-location-id with Vitu. |
| Validation (400) | Malformed or invalid request body/params | No | Inspect the Errors payload, correct input, resubmit. |
| Not found (404) | Unknown transaction/document/resource | No | Verify the identifier and that the resource exists in this environment. |
| Rate limit (429) | Throttled | Yes | Honor Retry-After, then exponential backoff with jitter. |
| Server (500) | Unexpected server failure | Yes, cautiously | Retry idempotent reads with backoff; for writes, avoid blind retries — reconcile via callback/read before resubmitting. |
Backoff convention: start around 1s, double each attempt, add jitter, cap total attempts. Never retry 400/403/404 without changing the request.
11. Data Sensitivity & Compliance Notes
Transactions carry owner PII (names, residence and mailing addresses, and business identifiers such as FEIN) and vehicle identifiers (VIN). Transmit only over TLS, restrict storage and log exposure of these fields, and avoid persisting full payloads in plaintext logs. Callbacks may echo owner and vehicle data to your endpoint — secure that endpoint accordingly and verify HMAC signatures where configured. This is handling guidance, not legal advice; confirm your regulatory obligations independently.
12. Support & Resources
For any API assistance, contact Vitu's API support team at [email protected].