Every equipment-retrieval (or delivery) request enters the platform through one of four channels. All four land in the same system of record, run through the same scheduling engine, and emit the same lifecycle webhooks.
| Channel | Who uses it | How |
|---|---|---|
| Web form | Corporate clients, concierge staff | Sign in to the portal → New request → fill the form (one request at a time). |
| REST API | Client IT systems (ServiceNow, Workday, etc.) | POST /api/v1/requests/asset-movements with a Bearer token. |
| CSV bulk | Clients submitting many requests at once | Download the template, fill rows, upload it in the portal or POST to the import endpoint. |
| MCP | AI agents / assistants | Connect to the RIA MCP server; call the create_request / get_status tools (§8). |
The REST API and MCP server use OAuth 2.0 client-credentials (machine-to-machine). Web-form users authenticate with their own portal login; CSV uploads in the portal inherit that session.
# OAuth 2.0 client credentials POST https://auth.retrieveitassets.com/oauth/token Content-Type: application/json { "client_id": "YOUR_CLIENT_ID", "client_secret": "YOUR_CLIENT_SECRET", "audience": "YOUR_AUDIENCE", "grant_type": "client_credentials" }
# Response { "access_token": "eyJ...", "token_type": "Bearer", "expires_in": 86400 }
Send it on every request: Authorization: Bearer YOUR_ACCESS_TOKEN
If you were issued an API key instead of OAuth credentials, send it directly — no token exchange needed: X-Api-Key: YOUR_API_KEY
Every integration is assigned a numeric clientId. Always send it in the payload — credentials are authorized only for specific clientId values. An unauthorized value returns 403 client_mismatch.
movementType is required and is the contract-level discriminator for delivery vs. retrieval. Do not infer direction from the free-text requestDetails. Allowed values: retrieval, delivery.
shippingCode keeps its own existing meaning and is not the delivery/retrieval discriminator — only movementType sets direction.| Field | Req? | Meaning |
|---|---|---|
movementType | yes | retrieval or delivery. |
employeeName | yes | The employee the equipment is picked up from / delivered to. |
employeePhone | rec. | Used by the contact agent to reach the employee. |
customerTrackingNumber | opt | Your own reference; echoed back on status and webhooks. |
pickupAddress1 / pickupAddress2 | yes | Street of the pickup location. |
pickupCity / pickupState / pickupZip | yes | ZIP routes the request to a queue and timezone. |
finalDestination | yes | Where the assets go (e.g. "RetrieveITAssets Concierge" for a retrieval). |
requestDetails | rec. | Free text: what to pick up, notes, access instructions. |
clientId | yes | Your assigned integration id. |
source | opt | Originating system label, e.g. ServiceNow, Workday. |
| POST /api/v1/requests/asset-movements | Submit one or more asset-movement requests. |
| GET /api/v1/submissions/{submissionId} | Check processing status of a submission. |
| GET /api/v1/submissions/latest?clientId={id} | Latest submission for a client. |
| POST /api/v1/requests/{requestId}/cancel | Cancel a request (if state allows). |
| POST /api/v1/requests/{requestId}/clone | Clone an existing request. |
| POST /api/v1/imports/customers | Import / update employee (customer) records. |
POST /api/v1/requests/asset-movements
Authorization: Bearer YOUR_ACCESS_TOKEN
Content-Type: application/json
Idempotency-Key: 11111111-2222-3333-4444-555555555555
{
"clientId": 95,
"source": "ServiceNow",
"items": [{
"movementType": "retrieval",
"employeeName": "Jane Smith",
"employeePhone": "555-123-4567",
"customerTrackingNumber": "RET-1001",
"pickupAddress1": "123 Main St",
"pickupCity": "Boston",
"pickupState": "MA",
"pickupZip": "02101",
"finalDestination": "RetrieveITAssets Concierge",
"requestDetails": "Pick up laptop, dock, and charger from employee home."
}]
}
Submit → receive 202 Accepted with a submissionId → poll the status endpoint until processing completes.
{ "submissionId": "6c600f5ebe27427287...", "status": "Pending", "createdAt": "2026-04-30T14:00:00Z" }
Put a client-generated unique id (UUID) in the Idempotency-Key header per logical submission. Reuse the same key only when retrying the exact same submission. Do not use clientId or submissionId as the key.
For submitting many requests at once. Download the template, one request per row, then upload it in the portal or POST it to the import endpoint.
| GET /api/requests/template.csv | Download the bulk-request CSV template. |
| POST /api/requests/import | Upload a filled CSV (multipart file) → bulk create. |
The header row must be exactly:
movementType,employeeName,employeePhone,customerTrackingNumber,pickupAddress1, pickupAddress2,pickupCity,pickupState,pickupZip,finalDestination,requestDetails,clientId,source
movementType must be retrieval or delivery (required, sets direction)."ModernIT, 123 XX Street".pickupAddress2).movementType,employeeName,...,finalDestination,requestDetails,clientId,source
retrieval,Jane Smith,...,RetrieveITAssets Concierge,"Pick up laptop and dock.",95,ServiceNow
delivery,Taylor Quinn,...,"ModernIT, 123 XX Street",Deliver laptop to employee.,95,Workday
Signed-in portal users submit one request at a time through a guided form whose fields map one-to-one to the contract in §3. The form enforces the required fields and the retrieval/delivery choice before it will submit, so a web-form request is always contract-valid. On submit it creates the same request record as the API and CSV paths and returns a request number the user can track in the portal.
The platform sends outbound webhooks as a request moves through its lifecycle. Delivery and retrieval share the same event catalog.
| Event | Fires when |
|---|---|
request.created | A request is accepted into the system of record. |
request.pickup_completed | The concierge marks the pickup done. |
request.shipped | The assets are shipped. |
request.completed | The request is fully closed. |
request.failed | The request could not be completed. |
Security headers: X-T2-Signature, X-T2-Timestamp, X-T2-EventId. Validate the HMAC-SHA256 signature, enforce a replay window on the timestamp, and process idempotently by eventId. Status polling remains available for reconciliation alongside webhooks.
MCP is how AI agents talk to the platform. Instead of hand-writing HTTP calls, an assistant connects to the RIA MCP server, which exposes a small set of typed tools. The agent picks a tool, fills its inputs, and the server performs the same authenticated API call under the hood — with the same auth, the same contract, and the same guardrails as the REST API.
clientId). The server advertises its tools on connect.create_request with structured inputs. The server validates against the §3 contract and calls the REST API.| Tool | What it does |
|---|---|
create_request | Create one asset-movement request (the §3 contract as typed inputs). |
bulk_create_requests | Create many requests from a list (the CSV equivalent). |
get_status | Look up a submission or request's current status. |
list_requests | List a client's requests, filterable by status — read-only. |
cancel_request | Cancel a request where its state allows (guarded). |
Every MCP tool runs under the same scoped credential as the API: it can only touch data for its authorized clientId, read-only tools cannot write, and write tools that change state (cancel) are permission-gated. The MCP server never exposes credentials, accounting, or delete operations.
| Status | Meaning |
|---|---|
400 | Validation failure — e.g. missing movementType or a required address field. |
401 | Missing or invalid bearer token / API key. |
403 | Missing scope, unauthorized clientId, or unauthorized source. |
404 | Unknown submissionId or requestId. |
409 | Action not allowed for the request's current state. |
https://api.retrieveitassets.com · Auth https://auth.retrieveitassets.com · Support [email protected]