Overview
GLYDE Unity integrates with TrackerRMS, the recruiting and staffing CRM/ATS, through its Evo REST API: candidate (Resource) retrieval by GLYDE UUID or Tracker id, live candidate/job search against Tracker's paged search operations, application (OpportunityResource) reads and creation, API-managed webhooks for Resource, Opportunity, and Application changes, and 141 operations exposed through the GLYDE ATS proxy.
The integration spans the full GLYDE platform: Microsoft Teams, Copilot for Microsoft 365,
Power Automate, the GLYDE Unity SDK, the Model Context Protocol (MCP) for AI agents, and the
GLYDE Voice Agent. All operations are tenant-isolated using client_uuid and
authenticated via OAuth2 with a JWT token exchange — GLYDE's Tracker
app credentials are deployment-global, and each tenant authorizes once through a refresh
token that GLYDE exchanges for a ~7-day Tracker JWT.
TrackerRMS data flows through GLYDE Unity's index-centric normalization pipeline, converting Tracker's PascalCase fields (GivenName, FamilyName, PostCode) to GLYDE's canonical snake_case format with ISO dates. Search results are cached in Redis and queued for background Azure AI Search indexing; inbound webhooks keep the cache fresh (event-assisted caching, 4-hour TTL hint).
Architecture & Data Flow
GLYDE Unity acts as an orchestration layer between consuming platforms (Teams, Copilot, Power Platform, SDK) and the TrackerRMS Evo REST API (https://evousapi.tracker-rms.com). Requests are authenticated, normalized, and routed through the integration adaptor's candidates, applications, and search sub-adaptors; jobs are index-only and advanced operations run through the ATS proxy. The adaptor's live search legs classify free text into Tracker's strict find semantics (name vs email vs phone) before calling SearchResources / OpportunityPagedSearch.
Teams / Copilot / Power Platform / SDK / MCP Client
|
v
┌─────────────────────────────────────┐
│ GLYDE Unity REST API │
│ api.glydeunity.com/api/unity/* │
│ │
│ ┌─ Auth Middleware ─────────────┐ │
│ │ API Key / JWT / Trusted App │ │
│ │ Role-based access control │ │
│ └──────────────────────────────┘ │
│ | │
│ v │
│ ┌─ TrackerRMS Integration Adaptor ┐ │
│ │ Sub-Adaptors: │ │
│ │ candidates (GetResource) │ │
│ │ applications (Opportunity- │ │
│ │ Resource search/create) │ │
│ │ search (custom find legs) │ │
│ │ messages / jobs (base) │ │
│ └────────────────────────────────┘ │
│ | │
│ v │
│ ┌─ TrackerRMS External Connector ┐ │
│ │ tracker-rms-connector.ts │ │
│ │ 141 OpenAPI Operations │ │
│ │ TrackerRmsConnectorAuth- │ │
│ │ Manager: OAuth2 + Exchange │ │
│ │ Token → JWT (~7 days) │ │
│ └────────────────────────────────┘ │
└──────────────|──────────────────────┘
|
v
┌──────────────────────────────────────┐
│ TrackerRMS Evo REST API │
│ https://evousapi.tracker-rms.com │
│ /api/v1/... │
│ │
│ Resource | Opportunity | │
│ OpportunityResource | Project | │
│ Client | Contact | Webhook │
└──────────────────────────────────────┘
Teams, Copilot, Power Automate, or SDK sends a request to the GLYDE Unity API (e.g., POST /api/unity/search/atsSearch) with API key + user context headers.
Unity validates the API key, resolves client_uuid and user_uuid, checks role-based access, and routes to the appropriate workflow handler. Both tracker and trackerrms integration type values normalize to the canonical tracker.
The workflow handler resolves the TrackerRMS adaptor from the client's configured integration_type.
The TrackerRmsConnectorAuthManager validates the cached Tracker JWT (Redis, ~7-day expiry derived from the JWT exp claim). On expiry it exchanges the tenant's refresh token (plus GLYDE's global client credentials from Key Vault) via /oAuth2/Token and /api/Auth/ExchangeToken. The optional REST x-api-key is preserved in session context.
The TrackerRmsConnector executes the operation against the Evo API using the OpenAPI specification (141 operations), sending Authorization: Bearer <JWT>.
Response rows flow through the index-centric pipeline: Tracker row → Tracker mapping profile → canonical index document (snake_case, ISO dates). Mixed-case envelopes (resources/Results) are unwrapped via configured row keys.
Search results are cached per profile in Redis, candidate/job ids are queued for background Azure AI Search indexing (BullMQ), and GLYDE UUIDs are resolved/backfilled via ExternalMappings.
Authentication
OAuth2 authorization flow with JWT token exchange
TrackerRMS uses an OAuth2 authorization flow followed by a JWT exchange.
GLYDE Unity's TrackerRmsConnectorAuthManager (extending
BaseOAuth2AuthManager) drives two token flows automatically:
- Refresh token flow: exchange the tenant's stored
refresh_token(plus GLYDE's globalclient_id/client_secret) at/oAuth2/Token, then exchange the OAuth access token for a Tracker JWT at/api/Auth/ExchangeToken. - OAuth access token flow: a previously obtained
oauth_access_tokenis exchanged the same way. When neither exists, the manager throwsATSOAuthRequiredErrorand the tenant completes the user-consent flow (authorize URL at/oAuth2/Authorize, scopeapi_access, GLYDE Buddy callback).
Authorization: Bearer <JWT>; the optional
Tracker REST x-api-key travels alongside it from session context.
Credential Fields
| Field | Description | Required |
|---|---|---|
refresh_token |
Per-tenant OAuth2 refresh token obtained through the user-consent flow; exchanged for a Tracker JWT automatically. | No |
oauth_access_token |
Alternative to refresh_token: a previously obtained OAuth access token to exchange for a JWT. | No |
client_id |
GLYDE-side Tracker Evo API client id (deployment-global; defaults to EvoApi_1.0). Stored in Key Vault (TrackerClientId). | Yes |
client_secret |
GLYDE-side Tracker Evo API client secret (deployment-global). Stored in Key Vault (TrackerClientSecret). | Yes |
tenant |
Tracker tenant identifier for the client. | Yes |
x-api-key |
Optional Tracker REST API key preserved in session context and sent as a request header. | No |
base_url |
Optional per-tenant API base URL override (defaults to https://evousapi.tracker-rms.com). | No |
Session Management
Sessions are cached in Redis with the key pattern session:client:{clientUuid}:integration:tracker.
The session carries the Tracker JWT and the x-api-key context. Tracker omits
expires_in on the exchange response, so the session expiry is derived from the
JWT exp claim (~7 days) and the JWT itself is re-validated before each use.
Token Refresh
When the JWT is expired or invalid, the manager re-runs the refresh-token flow
(Tier 1) or the OAuth access-token exchange (Tier 2) automatically. Two implementation
quirks are handled for you: the scope parameter must NOT be sent to
/oAuth2/Token (Tracker rejects it with invalid_grant), and a
tenant secret mis-seeded with the REST API key is detected and discarded in favor of the
deployment-global secret.
Capabilities
📦 Two API layers, one integration
This integration exposes TrackerRMS through two distinct layers, and every capability below tells you which layer it runs on. Reading the table without this context is the most common source of confusion, so here is the distinction:
1. GLYDE Unity workflow endpoints (the Endpoint column) are GLYDE's own, ATS-agnostic APIs
(/api/unity/*). They are the recommended path for every consumer — Teams, Copilot, Power Automate, the Chrome Extension, and the SDK.
Each one is an orchestrated workflow: GLYDE handles authentication, tenant isolation, validation, data normalization into GLYDE's canonical format,
database sync, and search indexing. You talk to GLYDE in GLYDE's vocabulary; GLYDE talks to the ATS behind the scenes.
2. ATS proxied calls (the ATS Op column) are the raw TrackerRMS REST operations the workflow
invokes under the hood. You normally never call these directly — but you can, through the
ATS proxy (/api/unity/proxy/tracker/:operationId and the discover/inspect meta-operations).
The proxy executes any operation from TrackerRMS's OpenAPI specification verbatim: request and response shapes are the vendor's own,
no GLYDE normalization is applied. Use it for advanced or niche operations GLYDE has not (yet) wrapped in a workflow — it inherits GLYDE's
authentication, tenant isolation, and OAuth token management, but you are speaking the vendor's dialect, so field names, casing, and payloads match
the TrackerRMS spec exactly.
Rule of thumb: start with the workflow layer; drop to the proxy only when a workflow for what you need does not exist.
Status badges on each capability card grade the workflow layer coverage for that entity:
- full — complete workflow coverage: create, read, update (where the ATS API allows it), and GLYDE-side persistence/indexing all work.
- partial — the entity is supported, but one or more workflow operations are unavailable, not supported by the ATS API itself, or served differently (e.g. reads resolved from the GLYDE search index instead of a live ATS call, missing job-note support, or a
NOT_IMPLEMENTEDupdate). Read each operation's notes for the specific gap. The raw operations may still be reachable through the ATS proxy. - proxy only — no GLYDE workflow wraps this entity; access is exclusively via raw proxied ATS calls with vendor-native payloads.
- not supported — neither a workflow nor a usable proxy operation exists for this entity.
| Operation | Endpoint | ATS Op |
|---|---|---|
| Get Candidate by UUID Retrieve candidate by GLYDE UUID via ExternalMapping lookup, then Tracker GetResource (index-first) |
GET /api/unity/candidates/:candidateUUID |
GetResource |
| Get Candidate by ATS ID Retrieve candidate directly by Tracker numeric Resource id (index-first, Redis cache + live merge) |
GET /api/unity/candidates/:candidateUUID?ats_candidate_id=&ats=tracker |
GetResource |
| Create / Update Candidate Not supported at the adaptor level — no Tracker outbound candidate mapping is implemented; candidate creation flows through find-and-reuse (GLYDE index) or the ATS proxy |
POST — |
not supported (find-only reuse) |
| Operation | Endpoint | ATS Op |
|---|---|---|
| List / Find Applications Search OpportunityResources by opportunityId, resourceId, and/or state (max 100 rows per call — Tracker returns HTTP 400 above that) |
GET /api/unity/applications/candidate/:atsCandidateId |
SearchOpportunityResources |
| Create Application Add a Resource to one or more Opportunities (resourceId, opportunityIds[], statusId default 1, placementSource default "glyde", optional note) |
POST /api/unity/applications |
AddOpportunityResource |
| Update Application Not supported for TrackerRMS — stage moves happen in Tracker or via the ATS proxy |
PUT — |
not supported |
| Operation | Endpoint | ATS Op |
|---|---|---|
| Job Reads (Index) Job lookups are served from the GLYDE Azure index when a hit exists; there is no live Tracker job leg in the adaptor |
GET /api/unity/jobs/:jobUUID |
index-backed |
| Job Search (Live) Live job search via OpportunityPagedSearch with the same find-semantics classification as candidate search |
POST /api/unity/search/atsSearch (job mode) |
OpportunityPagedSearch |
| Operation | Endpoint | ATS Op |
|---|---|---|
| ATS Search (Candidates) Live candidate search against SearchResources with automatic input classification: email-shaped input → email field, phone-shaped → telephone, name-like → searchTerm (matches displayAs only), other keywords → browse mode (recent list) |
POST /api/unity/search/atsSearch |
SearchResources |
| AI Search Index Search the GLYDE normalized Azure AI Search index (candidates/jobs) with client_uuid scoping — the recommended path for skills/location queries |
POST /api/unity/search/aiSearchIndex |
Azure AI Search Index (not direct ATS) |
| ATS Proxy Search Direct search against Tracker via the ATS proxy (SearchResources, SearchOpportunities, SearchOpportunityResources, SearchProjects, list paged searches) |
POST POST /api/unity/proxy/tracker/:operationId |
Dynamic (per operationId) |
| Operation | Endpoint | ATS Op |
|---|---|---|
| Send Email / SMS Send email via the GLYDE Mailgun pipeline and SMS via Twilio. TrackerRMS has no activity write-back in the current integration, so sends are logged in GLYDE only |
POST /api/unity/messages/send-email |
GLYDE Mailgun / Twilio (no Tracker write-back) |
| Operation | Endpoint | ATS Op |
|---|---|---|
| Discover Operations List all 141 available Tracker Evo API operations with schemas, parameters, and LLM metadata |
GET /api/unity/proxy/discover/tracker |
OpenAPI spec introspection |
| Inspect Operation Inspect a single operation's input schema before executing |
GET /api/unity/proxy/inspect/tracker/:operationId |
OpenAPI spec introspection |
| Execute Operation Execute any discovered Tracker operation dynamically with auto-authentication |
POST /api/unity/proxy/tracker/:operationId |
Dynamic (per operationId) |
Platform Access
GLYDE Unity provides unified access to TrackerRMS across multiple Microsoft 365 and developer platforms.
Access TrackerRMS data through the GLYDE Unity bot in Teams channels and chats.
Access: Teams Bot Framework → GLYDEBuddy Proxy → Unity REST API → TrackerRMS Adaptor
- Search candidates and jobs via conversational AI
- View candidate profiles with Tracker data
- Send emails and SMS via the GLYDE pipeline
- Create applications (add Resource to Opportunity)
- Receive event-driven notifications for Tracker changes
- Access ATS proxy for advanced Tracker queries
Use natural language to interact with TrackerRMS data through the GLYDE Copilot declarative agent.
Access: Copilot Agent → MCP Bridge (GLYDEBuddy) → Unity REST API → TrackerRMS Adaptor
- Natural language queries ("Find Java developers in Chicago")
- AI-powered candidate matching and ranking via the GLYDE index
- Multi-step workflows (search → review → submit)
- ATS proxy with LLM-optimized operation metadata
Automate TrackerRMS workflows using the GLYDE Unity Power Platform connector.
Access: Power Platform Connector → Unity REST API → TrackerRMS Adaptor
- Trigger flows on Tracker webhook events (Resource, Opportunity, Application)
- Create applications from forms or external sources
- Sync data between Tracker and other business systems
- Execute any Tracker API operation through the ATS proxy
Programmatic access via the @glydeunity/glyde-api-client npm package.
Access: SDK Client → Unity REST API → TrackerRMS Adaptor
- Type-safe TypeScript API client with Zod validation
- FlexibleUnityApi for multiple input formats (UUID, ATS ID, object)
- Direct workflow operations and ATS proxy access
- OpenAPI-generated client with full IntelliSense
AI agents and LLMs access TrackerRMS operations through the MCP interface.
Access: MCP Client → Unity MCP Endpoints → Workflow Handlers → TrackerRMS Adaptor
- 100+ discoverable tools auto-generated from workflow routes
- ATS proxy tools for dynamic Tracker operation discovery and execution
- Machine-readable searchFieldSemantics for Tracker's find-not-fulltext search model
- LLM metadata (Authorization and x-api-key hidden as server-provided)
Voice-based interaction with TrackerRMS data for candidate screening and discovery.
Access: Voice SDK → Unity Voice API → Deepgram → Function Execution → TrackerRMS Adaptor
- Voice-powered candidate screening interviews
- Job discovery and application via voice
- OTP verification for candidate identity
Entity Mappings
TrackerRMS uses different entity names and field conventions. GLYDE Unity normalizes these through the index-centric data pipeline.
Candidate → Resource
| Unity Field | TrackerRMS Field | Direction | Notes |
|---|---|---|---|
first_name |
GivenName (fallback FirstName) |
Read | — |
last_name |
FamilyName (fallback Surname) |
Read | — |
middle_name |
MiddleName |
Read | — |
email |
Email (fallback EmailAddress) |
Read | — |
phone |
Mobile (fallback MobilePhone, Phone, workTelephone, homeTelephone) |
Read | — |
city |
City (fallback Town) |
Read | — |
state |
State (fallback Region, county) |
Read | — |
zip |
PostCode (fallback PostalCode, ZipCode) |
Read | — |
country |
Country |
Read | — |
resume_summary |
ProfileSummary (fallback Summary, Bio) |
Read | — |
resume_text |
ProfileText (fallback ResumeText) |
Read | — |
status |
resourceStatusName |
Read | — |
created / updated |
DateAdded / LastUpdated (lastUpdatedDateTime) |
Read | ISO 8601 |
candidate_uuid |
Id (via ExternalMapping) |
Read | — |
Job → Opportunity
| Unity Field | TrackerRMS Field | Direction | Notes |
|---|---|---|---|
title |
publishTitle → opportunityName |
Read | — |
description |
publishDescription → opportunityDescription |
Read | — |
client_requirements |
winStrategy (Strategy/Commentary pane) |
Read | — |
requirements |
publishSkills |
Read | — |
locality |
locationCity → location → publishLocation |
Read | — |
state |
locationState |
Read | — |
job_status |
opportunityStatusDesc |
Read | — |
archived |
active |
Read | Inverted: n/no/false/0/inactive/closed map to archived=1 |
last_modified |
lastUpdatedDateTime → dateOpened |
Read | — |
job_uuid |
opportunityId (via ExternalMapping) |
Read | — |
Application → OpportunityResource (assignment: Project)
| Unity Field | TrackerRMS Field | Direction | Notes |
|---|---|---|---|
ats_candidate_id |
resourceId |
Read | — |
ats_job_id |
opportunityId (or opportunityIds[0]) |
Read | — |
ats_application_id |
opportunityResourceId, else composite opportunityId:resourceId |
Read | Composite id is required for application lookups |
status |
status / statusName |
Read | — |
application_source |
placementSource |
Write | Defaults to "glyde" on create |
created / modified |
dateAssigned / updatedDate |
Read | — |
job_title |
opportunityName |
Read | — |
candidate_uuid / job_uuid (create) |
resourceId / opportunityIds[] |
Write | AddOpportunityResource; statusId defaults to 1 |
Endpoint Reference
| Method | Unity Endpoint | Description | ATS Operation | Auth |
|---|---|---|---|---|
GET |
/api/unity/candidates/:uuid |
Get candidate by GLYDE UUID (index-first, live GetResource fallback) | GetResource |
API Key + User UUID |
GET |
/api/unity/candidates/:uuid?ats_candidate_id=&ats=tracker |
Get candidate by Tracker Resource id | GetResource |
API Key + User UUID |
POST |
/api/unity/search/atsSearch |
Live candidate/job search with find-semantics classification | SearchResources / OpportunityPagedSearch |
API Key + User UUID |
GET |
/api/unity/applications/candidate/:atsCandidateId |
List applications by Tracker Resource id | SearchOpportunityResources |
API Key + User UUID |
POST |
/api/unity/applications |
Create application (add Resource to Opportunity) | AddOpportunityResource |
API Key + User UUID |
POST |
/api/unity/messages/send-email |
Send email (GLYDE pipeline; no Tracker write-back) | GLYDE Mailgun |
API Key + User UUID |
POST |
/api/unity/search/aiSearchIndex |
AI search over the GLYDE normalized index | Azure AI Search |
API Key + User UUID |
POST |
/api/unity/events/webhook/:clientUuid/tracker |
Inbound Tracker webhook receiver | Webhook callback |
Webhook signature/tenant resolution |
GET |
/api/unity/proxy/discover/tracker |
Discover Tracker operations (141) | OpenAPI introspection |
API Key + User UUID |
GET |
/api/unity/proxy/inspect/tracker/:operationId |
Inspect a Tracker operation input schema | OpenAPI introspection |
API Key + User UUID |
POST |
/api/unity/proxy/tracker/:operationId |
Execute a Tracker operation | Dynamic |
API Key + User UUID |
Events & Webhooks
TrackerRMS supports API-managed inbound webhooks. GLYDE Unity
provisions webhook registrations remotely through Tracker's own webhook API
(AddHook, Update, GetHooksList,
DeleteHook), pointing them at the Unity inbound receiver
(POST /api/unity/events/webhook/:clientUuid/tracker). Registration is
idempotent — existing hooks are detected and reused. Events are normalized to the
canonical EventObject format via the passthrough normalizer and drive
event-assisted cache refresh (4-hour TTL hint).
Subscription Model
The default outbound subscription (tracker-app-notifications) delivers
rollup event types candidate.*, job.*, and
application.* to platform trigger subscriptions. There is no polling
fallback and no event replay — if a webhook delivery is missed, refresh the
entity via a direct read.
| Event | Trigger | Payload |
|---|---|---|
Resource.Created |
When a new Resource (candidate) is created in Tracker | resourceId, recordType, action, timestamp |
Resource.Updated |
When a Resource is modified in Tracker | resourceId, recordType, action, changed fields, timestamp |
Resource.Deleted |
When a Resource is removed in Tracker | resourceId, recordType, action, timestamp |
Opportunity.Created / Updated / Deleted |
When an Opportunity (job) is created, modified, or removed | opportunityId, recordType, action, timestamp |
Application.Created / Updated / Deleted |
When an OpportunityResource (application) is created, modified, or removed | opportunityResourceId, recordType, action, timestamp |
Configuration Requirements
-
Tenant OAuth Grant (Refresh Token)REQUIRED
Each tenant completes the Tracker OAuth consent flow once (GLYDE Buddy callback) or supplies a refresh token / OAuth access token. Stored per tenant in Key Vault; exchanged for a Tracker JWT automatically.
refresh_token: "xxxxxxxx" -
GLYDE Tracker App Credentials (Deployment-Global)REQUIRED
The GLYDE-side Evo API client id and client secret, stored as Azure Key Vault secrets (TrackerClientId / TrackerClientSecret) and wired via TRACKER_CLIENT_ID / TRACKER_CLIENT_SECRET. Shared across tenants; a tenant secret mis-seeded with the REST API key is detected and discarded.
TRACKER_CLIENT_ID="EvoApi_1.0", TRACKER_CLIENT_SECRET="********" -
Tracker REST API Key (Optional)
Optional per-tenant x-api-key for the Tracker REST surface; preserved in session context and sent alongside the JWT.
api_key: "xxxxxxxx" -
Integration TypeREQUIRED
The client's integration_type must be "tracker" (or "trackerrms", which normalizes to "tracker") for the adaptor router to select the TrackerRMS integration.
integration_type: "tracker" -
Environment Configuration
Deployment-level env vars: TRACKER_CLIENT_ID, TRACKER_CLIENT_SECRET, TRACKER_OAUTH_BASE_URL (regional: evoapius/evoapica/evoapi), TRACKER_REDIRECT_URI, and TRACKER_RMS_API_URL (defaults to https://evousapi.tracker-rms.com).
TRACKER_OAUTH_BASE_URL="https://evoapius.tracker-rms.com" -
TrackerConfiguration (Deep Links)
The tenant's TrackerConfiguration.TenantURL enables GLYDE deep links back into Tracker entity summaries (https://<sub>.tracker-rms.com/Tracker/Candidate|Job/Summary?id=...).
TrackerConfiguration.TenantURL: "https://myco.tracker-rms.com"
Known Limitations
- 100-Row Hard Cap: every Tracker
Search*operation acceptsmaxResultsup to 100; above that Tracker returns HTTP 400 ("Maximum Results cannot exceed 100"). Paginate withpageNumber. - Resource Search Is a Find, Not Full Text:
searchTermmatches the candidate display name (displayAs) only; dedicatedemailandtelephonefields exist. Skills/role/location intents must be served from the GLYDE index (weighted/AI search), not the Tracker leg. - Invalid
stateSilently Returns Zero Rows: the Resourcestatefilter takes pipeline stage values only (Applied, CVReview, CVSend, Shortlisted, Interview, Offer, Working, Rejected, Complete, Internal, ShortlistedByUser, ShortlistedByResource). Omit it by default — values like "open" or "active" return empty results without an error. - Sort Column Restrictions:
sortBy: lastupdateddatetimeis the only confirmed valid sort (Tracker-wide audit column); other values (e.g. the OpenAPI sample "name") are invalid. - No Candidate Create/Update: no Tracker outbound candidate mapping is implemented; candidate writes must go through the ATS proxy.
- No Application Update: only creation (
AddOpportunityResource) and reads (SearchOpportunityResources) are supported. - Composite Application Id: Tracker has no get-by-id for applications — lookups require the composite
opportunityId:resourceId(or theopportunityResourceIdwhen present). - No Live Job Leg: job get/find are index-only; live Tracker job operations go through the proxy (
SearchOpportunities,GetOpportunity). - No Communication Write-Back: emails/SMS sent through GLYDE are never logged back into Tracker as notes/activities.
- No Directory Live Leg: company/contact directory search is index-only for Tracker; rows enter the directory via
POST /api/unity/directory/ingestimports. Tracker'sClientPagedSearch/ContactPagedSearchremain reachable through the ATS proxy. - No Polling Fallback or Replay: events are webhook-only; missed deliveries require a direct entity refresh.
- Empty Results Are a Success: empty Tracker search results return a success envelope with an explicit "do not retry alternative operations" message, to stop LLM escalation to other Tracker ops.
Version History
- Initial integration guide creation
- Documented OAuth2 + JWT exchange authentication with deployment-global app credentials and per-tenant refresh tokens
- Documented candidate reads (GetResource), OpportunityResource application reads/creation, and index-backed job access
- Documented find-semantics live search (SearchResources / OpportunityPagedSearch) with input classification
- Documented API-managed webhooks (AddHook provisioning) for Resource, Opportunity, and Application events
- Documented ATS proxy discovery with 141 operations, inspect, and execute
- Documented entity mappings: Resource, Opportunity, OpportunityResource (Project assignments)
- Documented find-not-fulltext limitations, the 100-row cap, and silent state-filter behavior