GLYDE Unity + TrackerRMS

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 Tra...

Guide v1.0.0 Unity API v1.34.0 Updated September 12, 2026

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          │
    └──────────────────────────────────────┘
1
Platform Request

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.

2
Authentication & Routing

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.

3
Adaptor Selection

The workflow handler resolves the TrackerRMS adaptor from the client's configured integration_type.

4
Auto-Authentication (OAuth2 + JWT Exchange)

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.

5
ATS API Call

The TrackerRmsConnector executes the operation against the Evo API using the OpenAPI specification (141 operations), sending Authorization: Bearer <JWT>.

6
Data Normalization

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.

7
Cache & Index Write-Through

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:

  1. Refresh token flow: exchange the tenant's stored refresh_token (plus GLYDE's global client_id/client_secret) at /oAuth2/Token, then exchange the OAuth access token for a Tracker JWT at /api/Auth/ExchangeToken.
  2. OAuth access token flow: a previously obtained oauth_access_token is exchanged the same way. When neither exists, the manager throws ATSOAuthRequiredError and the tenant completes the user-consent flow (authorize URL at /oAuth2/Authorize, scope api_access, GLYDE Buddy callback).
The resulting JWT is sent as Authorization: Bearer <JWT>; the optional Tracker REST x-api-key travels alongside it from session context.

Credential Fields

FieldDescriptionRequired
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_IMPLEMENTED update). 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.
Candidates (Resources) partial
OperationEndpointATS 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)
Applications (OpportunityResource) partial
OperationEndpointATS 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
Jobs (Opportunities) proxy only
OperationEndpointATS 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
Search full
OperationEndpointATS 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)
Messages (Email/SMS) partial
OperationEndpointATS 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)
ATS Proxy (Discovery) full
OperationEndpointATS 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.

💬 Microsoft Teams

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
✨ Copilot for Microsoft 365

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
⚡ Power Automate / Power Apps

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
📦 GLYDE Unity SDK

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
🤖 MCP (Model Context Protocol)

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)
🎤 GLYDE Voice Agent

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 FieldTrackerRMS FieldDirectionNotes
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 FieldTrackerRMS FieldDirectionNotes
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 FieldTrackerRMS FieldDirectionNotes
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

MethodUnity EndpointDescriptionATS OperationAuth
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.

EventTriggerPayload
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 accepts maxResults up to 100; above that Tracker returns HTTP 400 ("Maximum Results cannot exceed 100"). Paginate with pageNumber.
  • Resource Search Is a Find, Not Full Text: searchTerm matches the candidate display name (displayAs) only; dedicated email and telephone fields exist. Skills/role/location intents must be served from the GLYDE index (weighted/AI search), not the Tracker leg.
  • Invalid state Silently Returns Zero Rows: the Resource state filter 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: lastupdateddatetime is 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 the opportunityResourceId when 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/ingest imports. Tracker's ClientPagedSearch/ContactPagedSearch remain 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

v1.0.0 2026-09-12
  • 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