REST Services Endpoints
API Endpoint Summary
Quick-reference table of every endpoint.
The snippets below are not executable code, they are for reference purposes only.
System & Configuration
Method | Endpoint | Description |
|---|---|---|
GET |
| Test connection (no auth) |
GET |
| Get server UTC time |
GET |
| Get all item types (tabs) |
GET |
| Get a single tab by ID |
GET |
| Get filtered tabs |
GET |
| Get available actions for a tab |
POST |
| Get data dictionary fields |
Item Operations
Method | Endpoint | Description |
|---|---|---|
GET |
| Get item by ID (IRItem format) |
GET |
| Get web UI URL for item |
POST |
| Search items (non-paged) |
POST |
| Search items (paged) |
POST |
| Create or update items |
DELETE |
| Delete item |
GET |
| Get item by ID (IRSItem format) |
POST |
| Search items (IRSItem, paged) |
POST |
| Create or update items (IRSItem) |
DELETE |
| Delete item (IRSItem) |
History & Transfers
Method | Endpoint | Description |
|---|---|---|
POST |
| Search item history |
GET |
| History by item ID |
GET |
| History by barcode |
POST |
| Transfer items to a location |
POST |
| Batch transfer to multiple locations |
Checkout Requests
Method | Endpoint | Description |
|---|---|---|
GET |
| Get all requests |
GET |
| Get request by ID |
POST |
| Create checkout request |
PUT |
| Update request (approve/fulfill/reject) |
DELETE |
| Delete request |
POST |
| Search requests |
Data Import & File Operations
Method | Endpoint | Description |
|---|---|---|
GET |
| Get all import profiles |
GET |
| Check if the profile is for edocs |
GET |
| Get field mappings for profile |
POST |
| Trigger data import |
POST |
| Upload file in chunks |
POST |
| Retrieve import log/error file |
Lists, Relationships & Utilities
Method | Endpoint | Description |
|---|---|---|
GET |
| Get all list items |
GET |
| Get list item by ID |
GET |
| Get list metadata |
POST |
| Create many-to-many relationship |
DELETE |
| Delete many-to-many relationship |
POST |
| Clear M2M cache |
GET |
| Get picklist for item type |
GET |
| Get label profiles for item type |
Tab Controller (Item Types)
Retrieves metadata about Gimmal Physical Tabs (item types).
GET /api/Tab
Returns all tabs defined in the system.
GET /api/Tab/{id}
Returns a single tab by its ID.
GET /api/Tab?itemtypefilter={filter}
Returns a filtered subset. Values: picklist (requestable items that can be contained) or topshelfuser (top-level, user, or shelf items).
IRTab Response Fields
Property | Type | Description |
|---|---|---|
| integer | Tab ID (this is the TabId you pass to other endpoints) |
| string | Singular display name (e.g., "Box") |
| string | Plural display name (e.g., "Boxes") |
| Boolean | Whether items can be transferred |
| Boolean | Whether items can be checked out |
| Boolean | Whether barcodes are auto-generated |
| Boolean | If false, likely a logical tab |
| string | Prefix for auto-generated barcodes |
| integer | Length of auto-generated barcodes |
| Boolean | Electronic document tab |
| integer | Display order in UI |
| Boolean | Whether retention schedules apply |
| integer | Special type identifier |
Example: Get All Tabs
GET "http://your-server/api/Tab" \
-H "Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ="
[
{
"Id": 201, "SingularName": "Location", "PluralName": "Locations",
"IsMoveable": false, "IsRequestable": false, "AutoGenerateBarcode": true,
"BarcodePrefix": "LOC", "BarcodeLength": 10, "IsEdoc": false
},
{
"Id": 202, "SingularName": "Box", "PluralName": "Boxes",
"IsMoveable": true, "IsRequestable": true, "AutoGenerateBarcode": true,
"BarcodePrefix": "BOX", "BarcodeLength": 10, "IsEdoc": false
}
]
Action Controller
Retrieves available actions for a given item type. Actions represent operations such as transfer, checkout, or custom workflows.
GET /api/Action/{TabId}
IRAction Response Fields
Property | Type | Description |
|---|---|---|
| string | Name of the action |
| string | Human-readable caption |
| string | URL command identifier (for mobile clients) |
| string | Object to include as POST body |
| integer | Associated tab ID (if applicable) |
| string | Associated tab name |
| string | Associated column name |
Example
GET "http://your-server/api/Action/202" \
-H "Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ="
Dictionary Controller
Queries the data dictionary to retrieve field definitions for item types. Essential for building dynamic forms.
POST /api/dictionary
Request Body
Parameter | Type | Required | Description |
|---|---|---|---|
| integer | Yes | Item type ID |
| string | Yes |
|
SpecialSearch Options
Value | Description |
|---|---|
| Fields visible in quick search, sorted by display order, respecting role-based visibility |
| Returns only BARCODE, QUICK_DESCRIPTION, and ITEM_TYPE_ID |
| All fields visible on the item view page, including FK output columns |
Example Request & Response
POST "http://your-server/api/dictionary" \
-H "Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=" \
-H "Content-Type: application/json" \
-d '{ "TabId": 202, "SpecialSearch": "quicksearch" }'
[
{ "Caption": "Barcode", "ColumnName": "BARCODE", "ID": "101" },
{ "Caption": "Description", "ColumnName": "QUICK_DESCRIPTION", "ID": "102" },
{ "Caption": "Department", "ColumnName": "DEPT_NAME_ALIAS", "ID": "304$DEPT_NAME" }
]
For FK output columns, the ID field uses the format {FKDictionaryColumnID}${OutputFieldName}.
Item Controller
The primary controller for item operations using the full IRItem format with column metadata.
Get Item by ID
GET /api/item/{id}
Example Request & Response
GET "http://your-server/api/item/12345" \
-H "Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ="
{
"columns": [
{ "ColumnName": "I_ID", "Caption": "Item ID", "Value": 12345, "Type": "System.Int32" },
{ "ColumnName": "I_BARCODE_STRING", "Caption": "Barcode", "Value": "BOX001", "Type": "System.String" },
{ "ColumnName": "QUICK_DESCRIPTION","Caption": "Description","Value": "Box of Financial Records", "Type": "System.String" },
{ "ColumnName": "I_IT_ID", "Caption": "Item Type", "Value": 202, "Type": "System.Int32" }
],
"TabSingularName": "Box",
"EdocFile": null,
"ContentType": null,
"RoutingEnabled": false,
"QuickDescription": "Box of Financial Records",
"Barcode": "BOX001",
"TabId": 202
}
Get Item View URL
GET /api/viewurl/{ItemId}
Returns the web application URL for viewing a specific item in the Gimmal Physical UI.
GET "http://your-server/api/viewurl/12345" \
-H "Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ="
→ "https://hostname.gimmal.com/ItemView.aspx?id=12345"
Search Items (Non-Paged)
POST /api/itemsearch
Request Body
Parameter | Type | Required | Description |
|---|---|---|---|
| string | No |
|
| integer | Yes* | Item type ID (*not required for mycontents or barcode search) |
| string | No | Barcode for lookup, or keyword for keyword search |
| object | No | Dictionary of field name → value pairs |
| Boolean | No | Include a base64-encoded edoc file |
| Boolean | No | Return only view-page fields |
| Boolean | No | Return descriptive text for FKs |
| datetime | No | For topshelfuser: items after this date |
SpecialSearch Reference
Value | Behavior |
|---|---|
| Exact match on SearchTerms, or barcode lookup if Barcode is provided |
| SQL LIKE search — use |
| All items marked as missing for the given TabId |
| Top-level, user, and shelf items (for mobile sync) |
| Global keyword search across all fields |
| All items checked out to the authenticated user |
Limitation: You cannot use this endpoint to search using a Range Field.
Example: Search by Barcode
POST "http://your-server/api/itemsearch" \
-H "Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=" \
-H "Content-Type: application/json" \
-d '{ "SpecialSearch": "none", "Barcode": "BOX001" }'
Example: LIKE Search by Description
POST "http://your-server/api/itemsearch" \
-H "Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=" \
-H "Content-Type: application/json" \
-d '{
"SpecialSearch": "like",
"TabId": 202,
"SearchTerms": { "QUICK_DESCRIPTION": "Financial%" }
}'
Paged Search
POST /api/itemsearch/paged
Same parameters as /api/itemsearch plus:
Parameter | Type | Default | Description |
|---|---|---|---|
| integer | 1 | 1-based page number |
| integer | 50 | Items per page (max 100) |
Paged Response Envelope
{
"Items": [ /* array of IRItem objects */ ],
"PageNumber": 1, "PageSize": 50, "TotalCount": 150,
"TotalPages": 3, "HasNextPage": true, "HasPreviousPage": false
}
Page numbers are 1 based, not 0 based. Requesting
PageNumber: 0may return unexpected results.For
like,none, andmissingsearches, paging is at the database level.For
topshelfuser,keyword, andmycontents, results are fetched first, then paged in memory.
Create / Update Items
POST /api/item
Accepts an array of items. Include I_ID column to update; omit it to create. When creating, provide an IRColumn entry for each required field.
Key Columns
Column | Purpose |
|---|---|
| Item ID — include for updates, omit for creates |
| Item Type ID — required for creation |
| Barcode — auto-generated if omitted |
| Item description |
| Current Location ID |
| Base64-encoded file content (edoc items) |
| MIME type of the edoc file |
| Filename — required when EdocFile is provided |
For updates, put I_ID in the columns array, not in IRItem.Id. Putting the ID in the wrong place creates a new item instead of updating!
Example: Create a New Item
POST "http://your-server/api/item" \
-H "Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=" \
-H "Content-Type: application/json" \
-d '[{
"columns": [
{ "ColumnName": "I_IT_ID", "Value": 202 },
{ "ColumnName": "QUICK_DESCRIPTION", "Value": "New Box of Records" },
{ "ColumnName": "I_ID", "Value": 100 }
]
}]'
{
"Result": true,
"Message": "1 items successful",
"ItemResults": [
{ "Result": true, "ItemBarcode": "BOX100", "ItemId": 12346, "Message": null }
]
}
Delete Item
DELETE /api/item/{id}
Sets I_Deleted to true. Validates: user has delete rights, item has no contents, item has no children.
Example
DELETE "http://your-server/api/item/12345" \
-H "Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ="
{ "Result": true, "ItemBarcode": "BOX001", "ItemDescription": "Box of Records", "Message": null }
Simplified Item Controller (SItem)
Same functionality as the Item Controller but uses the compact IRSItem format.
GET /api/sitem/{id}
{
"cols": [
{ "n": "I_ID", "v": 12345 },
{ "n": "I_BARCODE_STRING", "v": "BOX-001" },
{ "n": "QUICK_DESCRIPTION","v": "Financial Records 2024" }
],
"EdocFile": null, "ContentType": null
}
POST /api/sitemsearch
Supports all SpecialSearch types plus "advanced" with wildcards (*, ?) and operators (>=, <=, !=).
POST /api/sitem
Add I_ID to update an item; do not include I_ID to create a new item.
DELETE /api/sitem/{id}
Delete an item. Same validation rules as Item Controller.
Item History Controller
Retrieves audit trail records for items.
POST /api/itemhistory/search
Parameter | Type | Required | Description |
|---|---|---|---|
| integer | Yes | Item type to search |
| string | No | Filter by barcode |
| string | No | Filter by user name |
| string | No | CREATE, UPDATE, DELETE, TRANSFER, CHECKIN, CHECKOUT, MOVE, MARK_MISSING, MARK_FOUND |
| datetime | No | Date range (inclusive) |
| integer | No | Default: 1 |
| integer | No | Default: 50, Max: 1000 |
| string | No | Default: |
| Boolean | No | Default: true |
GET /api/itemhistory/item/{itemId}
GET /api/itemhistory/barcode/{barcode}
Key History Record Fields
Field | Description |
|---|---|
| Timestamp (user's time zone) |
| Action type string |
| Full name of user |
| Source (Web, API, Import) |
| Formatted display text |
Example: Get History by Barcode
GET "http://your-server/api/itemhistory/barcode/BOX001" \
-H "Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ="
Transfer Controller
Moves items to new locations with validation and audit trail support.
POST /api/transfer
Example Request & Response
POST "http://your-server/api/transfer" \
-H "Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=" \
-H "Content-Type: application/json" \
-d '{
"Location": "0000000208",
"Items": ["0000000201", "0000000202"],
"CirculationRoute": "",
"Comments": ""
}'
{
"Message": "2 transferred to 0000000208",
"Result": true,
"ItemResults": [
{
"LocationBarcode": "0000000208", "LocationDescription": "Warehouse A",
"ItemId": 12345, "ItemBarcode": "0000000201",
"ItemDescription": "Financial Records 2024",
"Result": true, "Reason": 0, "Message": null
},
{
"LocationBarcode": "0000000208", "LocationDescription": "Warehouse A",
"ItemId": 12346, "ItemBarcode": "0000000202",
"ItemDescription": "HR Files 2024",
"Result": true, "Reason": 0, "Message": null
}
]
}
POST /api/transferbatch
Accepts an array of transfer requests for multiple locations in one call.
Transfer Reason Codes
Code | Name | Description |
|---|---|---|
0 | Success | Transfer completed |
1 | FailedLocationCannotContainItem | Container rule violation |
2 | FailedLocationBarcodeNotFound | Location barcode invalid |
3 | FailedItemBarcodeNotFound | Item barcode invalid |
4 | FailedItemNotMoveable | The item is non-moveable |
5 | FailedUnknownReason | General failure (often security) |
6 | MandatoryFieldMissing | Required field is empty |
Transfer Process: Validate location → Validate items → Security check → Container validation → Moveability check → Update location → Clear missing flag → Create circulation history → Save → Return results.
Transfers can partially succeed. The overall Result is false if any item fails, but items that succeeded are still saved. Always check individual ItemResults.
Request Controller (Checkout Requests)
Manages the item checkout workflow: request → approve → fulfill → return.
GET /api/Request
Returns all checkout requests. Empty response if none exist.
GET /api/Request/{id}
Returns a single request by ID.
POST /api/Request
Creates a new checkout request.
Property | Type | Required | Description |
|---|---|---|---|
| integer | Yes | ID of the item being requested |
| integer | Yes | 1 = Delivery, 2 = Pickup, 4 = Renew |
| integer | No | Destination user/location (auto-selected if omitted) |
| string | No | Comment |
Example: Create a Delivery Request
POST "http://your-server/api/Request" \
-H "Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=" \
-H "Content-Type: application/json" \
-d '{ "ItemId": 40000, "RequestType": 1, "DestinationItemId": 201 }'
{
"Request": { "Id": 500, "ItemId": 40000, "RequestType": 1, "Status": 0, ... },
"ItemBarcode": "FILE-001",
"ItemDescription": "Personnel File",
"Message": null,
"Result": true
}
PUT /api/Request/{id}
Updates an existing request. Status is required in the body.
Status Value | Meaning |
|---|---|
1 | Approved |
2 | Fulfilled |
3 | Rejected |
5 | Deleted |
Example: Fulfill a Request
PUT "http://your-server/api/Request/500" \
-H "Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=" \
-H "Content-Type: application/json" \
-d '{ "Status": 2, "DestinationItemId": 201 }'
DELETE /api/Request/{id}
Deletes a request. Returns HTTP status "OK" on success.
POST /api/requestsearch
Advanced search for requests.
Property | Type | Description |
|---|---|---|
| Boolean | Only the current user's requests |
| integer | 1 = Approved (picklist), 2 = Fulfilled (pickup report) |
| integer | Filter by item type |
| Boolean | Include item/destination descriptions |
Interchange Controller (Data Import)
GET /api/getInterchangeProfiles
Returns all import profiles with configuration (delimiter, text qualifier, type).
Interchange Types
ID | Type | Behavior |
|---|---|---|
1 | Add | Creates new only; errors on key match |
2 | Modify | Updates existing only; errors on no match |
3 | Add/Modify | Creates or updates based on key fields |
4 | Request | Creates requests instead of items |
GET /api/getIsProfileForEdocs?ProfileID={id}
Returns Boolean — is this profile for electronic documents?
GET /api/getfields?intID={id}
Returns field mappings (which import columns map to which Gimmal fields).
POST /api/import
Triggers an async import. File must already exist on the server.
{
"InterchangeProfileID": 1,
"FileName": "boxes_import_20240223.csv",
"QueueLabels": true,
"Email": "admin@example.com",
"ImportSpecName": "Box Import - February 2024"
}
Important: File must exist at {InfolinxTempFolder}\Interchange\{FileName}. Use /api/sendChunks to upload it first. Imports run as background jobs — you'll get an email when done.
IO Controller (File Operations)
POST /api/sendChunks
Uploads files in chunks.
FileLocationType | Name | Save Path |
|---|---|---|
1 | Edoc |
|
2 | Interchange |
|
3 | Label |
|
4 | Report |
|
For Interchange files, the server renames the file with a sequence prefix: IX_{sequence}_{filename}. You must use the filename from the first chunk's response for all subsequent chunks, or they'll go to a different file.
POST /api/GetLogErrorFile
Retrieves import log (.log) or error (.errors) files in chunks.
Files older than 1 hour are auto-cleaned after retrieval.
Chunk Size Recommendations
File Size | Chunk Size |
|---|---|
< 1 MB | Single chunk |
1–10 MB | 1 MB |
10–100 MB | 1–2 MB |
> 100 MB | 5 MB |
Lists Controller
GET /api/lists/{tableName}
All items from a list table.
GET /api/lists/{tableName}/{id}
Specific list item by ID.
GET /api/lists/{tableName}/metadata
Metadata about the list table.
Response Structure
{
"Id": "en-US_100", "Value": "Warehouse A - Shelf 1",
"DisplayText": "Warehouse A - Shelf 1", "ParentId": "10",
"TableName": "LOCATION", "SecuredId": 0,
"AdditionalFields": { "L_BARCODE_STRING": "LOC-A-001", "L_IT_ID": 5 }
}
Localization: List IDs are prefixed with language code (e.g., en-US_100).
Common List Tables
Table | Description | Hierarchical |
|---|---|---|
LOCATION | Physical locations | Yes |
DEPARTMENT | Departments | No |
ROLE | User roles | No |
ITEM_TYPE | Item types | No |
RETENTION_SCHEDULE | Retention schedules | No |
CLASSIFICATION | Classifications | No |
MEDIA_TYPE | Media types | No |
CONTAINER_TYPE | Container types | No |
Many-to-Many Controller
POST /api/manytomany
Creates a many-to-many relationship using string values.
{ "ManyToManyTableId": 123, "ItemValue": "John Doe", "ListValue": "Active" }
DELETE /api/manytomany
Deletes a relationship using the same identifiers.
POST /api/ClearManytoManyCache
Clear server-side cache after bulk operations.
Picklist Controller
GET /api/Picklist/{TabId}
Returns picklist rows for the specified item type.
Property | Type | Description |
|---|---|---|
| Dictionary | Key-value pairs of picklist data |
| string | Item description |
| integer | Item ID |
| integer | Tab ID |
Label Profiles
GET /api/labelprofiles/{TabId}
Returns label queue profiles for the specified item type.
Property | Type | Description |
|---|---|---|
| string | Profile name |
| integer | Profile ID |
| integer | Vendor ID |
Server Time
GET /api/ServerTime
Returns the server's current UTC time as a string. Useful for synchronizing client timestamps.
GET "http://your-server/api/ServerTime" \
-H "Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ="
→ "2026-02-23T15:30:00Z"