Integrations — EasyVista catalog sync
Integrations — EasyVista catalog sync
What this is for
EasyVista (EV) is one of the ITSM platforms TekReady targets. Once an engagement
has been signed-off in TekReady, the agreed Incident and Request catalogues need to
land in EV’s SD_CATALOG table so the help desk can actually
take tickets against them. This integration removes the “hand-key 200 rows
into EV” step.
TekReady exposes two read-only JSON endpoints, one per catalogue. EasyVista’s
Easy Connect framework pulls those endpoints on a schedule and maps
each node into SD_CATALOG. The integration is one-way: TekReady is the
source of truth, EV is the consumer.
Endpoints
| Incident catalogue | GET /api/v1/tekready/engagements/{code}/easyvista/incident-catalog.json |
|---|---|
| Request catalogue | GET /api/v1/tekready/engagements/{code}/easyvista/request-catalog.json |
The {code} path variable is the engagement’s short code (the
same one that appears in the engagement URL, e.g. ACME-2026).
Authentication
Both endpoints are protected by the standard uControl integration-API-key chain. Send the key on every request as either:
X-Integration-Api-Key: ucm_…, orAuthorization: Bearer ucm_…
The key must have the tekready:read scope and must belong to a user with access to the engagement (the same engagement-access rules that govern the UI apply — see The Engagement Workflow > Engagement access).
An integration key is generated by an admin under Settings → Integration API Keys. Give the EV consultant the key only — never the user password.
Response envelope
Both endpoints return the same shape:
{
"engagementCode": "ACME-2026",
"generatedAt": "2026-05-28T14:22:11Z",
"prefix": "IT / Corporate",
"nodes": [
{
"code": "TEK-ACME-2026-3f9a0c1b2d",
"parentCode": null,
"level": 1,
"label": "IT",
"path": "IT",
"isLeaf": false,
"metadata": null
},
{
"code": "TEK-ACME-2026-9b1c4e7f08",
"parentCode": "TEK-ACME-2026-3f9a0c1b2d",
"level": 2,
"label": "Corporate",
"path": "IT / Corporate",
"isLeaf": false,
"metadata": null
},
{
"code": "TEK-ACME-2026-c0d2a8e913",
"parentCode": "TEK-ACME-2026-9b1c4e7f08",
"level": 3,
"label": "Cannot sign in to Outlook",
"path": "IT / Corporate / Office 365 / Outlook / Cannot sign in",
"isLeaf": true,
"metadata": {
"sla": "Gold",
"impact": "Medium",
"urgency": "High",
"group": "Service Desk",
"workflow": "Standard Incident",
"ticketCode": "INC_OUTLOOK_NO_SIGNIN"
}
}
]
}
Field semantics
code |
Deterministic identifier. Pattern: TEK-{ENGAGEMENT}-{sha1[0..10]}
where the SHA-1 input is the lowercased full path. Same path always
yields the same code — re-running an import is safe. |
|---|---|
parentCode |
The code of the immediate parent, or null for
root nodes. Always references a node that appears earlier in
the nodes array (see Ordering, below). |
level |
1-based depth in the tree. Useful for indenting display or for constraining which EV table the node maps into. |
label |
The name of this level only (not the full path). EV typically maps
this to NAME_EN. |
path |
Prefix + every level above this one + this one, joined with / .
Useful for the EV DESCRIPTION column or for human-readable
logs. |
isLeaf |
true when this node has no children — i.e. it’s
the final selectable category, the one a ticket actually attaches to.
Only leaf nodes carry metadata. |
metadata |
null for non-leaves. On leaves, an object with the
ITSM attributes resolved against the engagement’s other tabs
(SLA, Impact, Urgency, Group, Workflow, ticketCode). Values are
label strings, not internal IDs — EV maps them to its own
lookups. |
Ordering contract
Nodes are emitted parent-first (BFS by level). EV’s loader
must process the array in order — never sort or reverse it. The guarantee:
when the loader reaches node N, every node referenced by N’s
parentCode has already appeared in the stream and been inserted.
This avoids the “child arrives before parent” case that breaks
naive consumers that would otherwise try to forward-reference a parent code that
doesn’t yet exist in SD_CATALOG.
Idempotency
- Codes are deterministic, so UPSERT by
codein EV. A re-run of the same engagement’s endpoint produces the same codes for unchanged rows — no duplicates. - If a row’s levels are edited in TekReady, its
pathchanges ⇒ itscodechanges. EV will see this as a new node; the old one becomes orphaned. The recommended EV-side cleanup is a nightly sweep that deletesSD_CATALOGrows with codes prefixedTEK-{ENGAGEMENT}-that didn’t appear in the most recent pull.
EasyVista Easy Connect configuration
The end-to-end setup on the EV side (do this once per engagement; repeat for the second catalogue):
- In EV Administration → Easy Connect, create a Service with the TekReady base URL. Pick HTTPS, GET, application/json.
- Add the auth header to the Service:
X-Integration-Api-Key: ucm_…. - Create a Resource on the Service:
- URI template:
/api/v1/tekready/engagements/{code}/easyvista/incident-catalog.json(orrequest-catalog.json). - URI variables: add
codewith the engagement code as the value. Important: if you reopen the Resource later, the EV UI does not always re-display this value — re-enter it before saving any change, or the URL is built with an empty path variable and returns a 404. - Test request: should return HTTP 200 and the JSON envelope shown above.
- URI template:
- Create a Connection that uses the Resource.
- Configure the Selector on the Connection — EV uses
JSONSelect (not JSONPath). The selector to pick the array of
node objects is:
.nodes > object - Open the Integration Model and set the Records root node to
['nodes']with the link path['_no_next_page'](the feed is not paginated — this tells EV to stop after one fetch). - Map each JSON field to the matching
SD_CATALOGcolumn:code→CODE,label→NAME_EN,parentCode→PARENT_CODE(or your equivalent), and the leaf metadata fields to their respective columns. - Save, then run the Connection. EV will pull the JSON and write to
SD_CATALOGin parent-first order.
Where the admin URL lives in TekReady
An admin-only panel sits at the top of the Incident Categories and Request Categories tabs once those sections are Final. It shows the full endpoint URL ready to paste into EV’s Resource configuration, plus a button to copy it to clipboard. Non-admin users do not see this panel.
Errors
| 401 | Integration API key missing or invalid. Check the
X-Integration-Api-Key header in the EV Service. |
|---|---|
| 403 | Key is valid but lacks the tekready:read scope, or the
key’s owning user is not a member of this engagement. |
| 404 | No engagement matches {code} — usually a typo or
(in EV) the URI-variable-not-substituted bug above. |
| 500 | Unexpected server-side error. Capture the response body and check the control-plane log for the request ID. |