GLYDE Unity + erecruit

GLYDE Unity provides a unified integration with erecruit's WebApi (Nelson Staffing tenant), exposing candidate records, internally posted positions, candidate applications, and the ...

Guide v1.0.0 Unity API v1.30.1 Updated August 26, 2026

Overview

GLYDE Unity provides a unified integration with erecruit's WebApi (Nelson Staffing tenant), exposing candidate records, internally posted positions, candidate applications, and the full application→submission→placement pipeline through a single ATS-agnostic API layer.

The integration spans the full GLYDE ecosystem: Microsoft Teams, Copilot for Microsoft 365, Power Automate, the GLYDE Unity SDK, and the Model Context Protocol (MCP) for AI agent consumption. All operations are tenant-isolated using client_uuid and authenticated via bearer-token login with fully automatic token management.

erecruit data flows through GLYDE Unity's index-centric normalization pipeline, ensuring consistent data representation across all consumers regardless of erecruit's native conventions — PascalCase payloads, integer entity IDs, and the merged Match pipeline record that collapses application, submission, and placement into one expanding type.

Note: erecruit authentication requires the tenant's EntityID in addition to a username and password. The EntityID is stored as UnityCredentials.tenant and is mandatory — the connector throws before any API call when it is missing. There is no global fallback credential: every client must have tenant credentials provisioned in Azure Key Vault / IntegrationData.

Product Demos

Short walkthroughs of the GLYDE experience across the surfaces this integration powers.

Architecture & Data Flow

GLYDE Unity acts as an orchestration layer between consuming platforms (Teams, Copilot, Power Platform, SDK) and the erecruit WebApi REST API. Requests are authenticated, normalized, and routed through the integration adaptor which handles entity-specific business logic, data mapping, and error classification. Because the erecruit spec exposes no webhook or event endpoints, index freshness is maintained through scheduled and on-demand cache refresh rather than inbound events.

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   │   │
    │  └──────────────────────────────┘   │
    │                                     │
    │  ┌─ Workflow Route Handler ──────┐  │
    │  │  Validation + Orchestration   │  │
    │  └──────────────────────────────┘   │
    │              |                       │
    │              v                       │
    │  ┌─ erecruit Integration Adaptor┐  │
    │  │  candidates.ts / applications│  │
    │  │  Template Method Pattern     │  │
    │  │  Index-centric data mapping  │  │
    │  └──────────────────────────────┘   │
    │              |                       │
    │              v                       │
    │  ┌─ erecruit External Connector ─┐ │
    │  │  erecruit-connector.ts        │  │
    │  │  ConnectorAuthManager (Bearer)│  │
    │  │  OpenAPI-driven operations    │  │
    │  │  ICanonicalEntityOperations   │  │
    │  └──────────────────────────────┘   │
    │      (no inbound webhooks —         │
    │       TTL + scheduled cache refresh)│
    └──────────────|──────────────────────┘
                   |
                   v
    ┌──────────────────────────────────────┐
    │       erecruit WebApi REST API       │
    │  erecruit.nelsonstaffing.com/WebApi  │
    │                                      │
    │   Candidate | Position |             │
    │   CandidateApplication | Match |     │
    │   Company | Contact | Attachment     │
    └──────────────────────────────────────┘
1
Platform Request

Teams, Copilot, Power Automate, or the SDK sends a request to the GLYDE Unity API (e.g., GET /api/unity/candidates/:candidateUUID) 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.

3
Adaptor Selection

The workflow handler calls getIntegrationAdaptor('erecruit') to obtain the erecruit-specific adaptor based on the client's configured ATS integration type.

4
Auto-Authentication

The ConnectorAuthManager automatically retrieves or mints bearer tokens for the client's erecruit tenant via POST /User/ValidateCredentials (UserName + Password + EntityID). Sessions are cached in Redis on a 24-hour revalidation cycle.

5
ATS API Call

The erecruit connector executes the operation against the WebApi using the cleaned OpenAPI specification for request validation and dynamic operation handling. All calls carry Authorization: Bearer {UserId}.

6
Data Normalization

Response data flows through the index-centric pipeline: ATS response → CandidateDataMapper / JobDataMapper / ApplicationDataMapper (driven by types/erecruit/mapping-profile.ts) → canonical index schema. PascalCase fields, _expanded hydration, and integer IDs are resolved entirely inside the mapping profile.

7
Response Delivery

The normalized response is returned to the consuming platform in the GLYDE Unity standard response format, with consistent snake_case field names and structures regardless of erecruit's PascalCase conventions.

8
Cache Refresh

With no inbound events available, the GLYDE Azure AI Search indexes are kept current through TTL-based cache capabilities (14,400s hint) and scheduled/on-demand refresh via the ATS search-cache pipeline.

Authentication

Bearer Token (User_ValidateCredentials)

erecruit uses a login-issued bearer token for authentication. GLYDE Unity's ErecruitConnectorAuthManager (extending BaseBearerTokenAuthManager) handles the complete token lifecycle automatically: it POSTs { UserName, Password, EntityID } to /User/ValidateCredentials, requires IsValid === true, and uses the returned UserId string as the bearer token on every subsequent call (Authorization: Bearer {UserId}). Clients never need to manage tokens directly.

Credential Fields

FieldDescriptionRequired
username erecruit WebApi user name (sent as UserName in the login request) Yes
password erecruit WebApi password (sent as Password in the login request) Yes
tenant erecruit EntityID — the tenant identifier. Mandatory; sent as EntityID in the login request and required to mint any token Yes
service_url Base URL for the erecruit WebApi (defaults to ERECRUIT_API_URL env, then https://erecruit.nelsonstaffing.com/WebApi) No

Session Management

Sessions are cached in Redis with the key pattern session:client:{client_uuid}:integration:erecruit. The session stores the bearer token, expiration timestamp, resolved base URL, and entity id. There is no global fallback credential — every tenant must have credentials provisioned in Azure Key Vault / IntegrationData (getDefaultAuthConfig throws).

Token Refresh

The erecruit bearer token has no known expiry; sessions are revalidated on a 24-hour TTL cycle. When the session expires, ConnectorAuthManager.getAutoAuth() transparently re-runs the User_ValidateCredentials login before the next API call. A 401 from the ATS triggers clearRedisSessionOnly() and a single retry with a freshly minted token.

Capabilities

📦 Two API layers, one integration

This integration exposes erecruit 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 erecruit REST operations the workflow invokes under the hood. You normally never call these directly — but you can, through the ATS proxy (/api/unity/proxy/erecruit/:operationId and the discover/inspect meta-operations). The proxy executes any operation from erecruit'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 erecruit 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 partial
OperationEndpointATS Op
Get Candidate
Index-first retrieval by GLYDE UUID or ATS candidate ID with live/Redis cache merge
GET /api/unity/candidates/:candidateUUID Candidate_Get
Search Candidates (Live Reinforcement)
Weighted search fusing GLYDE indexes with a live erecruit candidate list
POST /api/unity/search/searchCandidates Candidate_List
Find Candidate (Dedup Lookup)
Deterministic lookup (email → phone → name) used by create-or-reuse flows
internal internal (createOrReuseCandidate) Candidate_List / Candidate_ByName
Jobs (Positions) partial
OperationEndpointATS Op
Search Jobs (Live Reinforcement)
Weighted search fusing the GLYDE jobs index with live internally posted positions
POST /api/unity/search/searchJobs Position_GetInternallyPosted
Get Job
Retrieved from the GLYDE search index (no live get-by-id fetch hook on the adaptor)
GET /api/unity/jobs/:jobUUID None (index-only)
Applications partial
OperationEndpointATS Op
Create Application
Link a candidate to a position with a new CandidateApplication record
POST /api/unity/applications CandidateApplication_Post
List Applications by Candidate
Canonical candidate-scoped application list feeding the ATS search-cache pipeline
internal internal (ats-search-cache pipeline) CandidateApplication_GetByCandidateId
List Applications by Position
Position-scoped application list — reachable through the ATS proxy
proxy /api/unity/proxy/erecruit/CandidateApplication_GetByPositionId CandidateApplication_GetByPositionId
Find Application
Candidate- or job-scoped application lookup on the ATS-agnostic filter surface
POST /api/unity/applications/find CandidateApplication_GetByCandidateId / GetByPositionId
Match (Submission / Placement Pipeline) proxy only
OperationEndpointATS Op
Pipeline Records by Candidate
Application→submission→placement pipeline records for one candidate
proxy /api/unity/proxy/erecruit/Match_GetByCandidateId Match_GetByCandidateId
Pipeline Record by ID
Read one match (pipeline) record by integer ID
proxy /api/unity/proxy/erecruit/Match_GetById Match_GetById
Messages (Email / SMS) proxy only
OperationEndpointATS Op
Send Email
Send email via Mailgun through the base messages adaptor
POST /api/unity/messages/send-email Mailgun (no erecruit activity write-back)
Send SMS
Send SMS via Twilio through the base messages adaptor
POST /api/unity/sms/send Twilio (no erecruit activity write-back)
Search (AI-Powered) full
OperationEndpointATS Op
Weighted Candidate Search
Fused GLYDE index + live erecruit candidate search with ranking
POST /api/unity/search/searchCandidates Candidate_List (live reinforcement)
Weighted Job Search
Fused GLYDE index + live erecruit position search with ranking
POST /api/unity/search/searchJobs Position_GetInternallyPosted (live reinforcement)
Conversational AI Search
Natural-language search across candidates and jobs using GLYDE AI
POST /api/unity/search/conversationalAISearch Azure AI Search Index (not direct ATS)
Index Query
Structured OData queries against tenant-scoped GLYDE indexes
POST /api/unity/search/aiSearchIndex Azure AI Search Index
ATS Proxy (Discovery & Execute) full
OperationEndpointATS Op
Discover Operations
List all available erecruit WebApi operations (230 across 198 paths) with schemas and metadata
GET /api/unity/proxy/discover/erecruit OpenAPI spec introspection
Inspect Operation
Full specification for one erecruit operation
GET /api/unity/proxy/inspect/erecruit/:operationId OpenAPI schema introspection
Execute Operation
Execute any of the 230 erecruit spec operations dynamically with vendor-native payloads
POST /api/unity/proxy/erecruit/:operationId Dynamic (per operationId)
Entity Metadata
Field-level metadata for an erecruit entity type, including designer-bound lookup catalogs
GET /api/unity/proxy/meta/erecruit/:entity OpenAPI schema + fieldValueOperations
Events & Webhooks (Inbound) not supported
OperationEndpointATS Op
Receive Event Webhook
Not available — the erecruit WebApi spec exposes no event or webhook endpoints
n/a n/a None

Platform Access

GLYDE Unity provides unified access to erecruit across multiple Microsoft 365 and developer platforms.

💬 Microsoft Teams

Access erecruit data through the GLYDE Unity bot in Teams channels and chats.

Access: Teams Bot Framework → GLYDEBuddy Proxy → Unity REST API → erecruit Adaptor

  • Search candidates and jobs via conversational AI
  • View candidate profiles with live erecruit field merge
  • Review application status and the Match pipeline stage
  • Send emails and SMS through GLYDE-native channels
Copilot for Microsoft 365

Use natural language to interact with erecruit data through the GLYDE Copilot declarative agent.

Access: Copilot Agent → MCP Bridge (GLYDEBuddy) → Unity REST API → erecruit Adaptor

  • Natural language queries ("Show me internally posted positions")
  • Tier-1 weighted searches with live erecruit reinforcement
  • ATS proxy operations for advanced queries (discover → inspect → execute)
  • Entity aliasing resolves GLYDE terms to erecruit vocabulary (job → Position, submission/placement → Match) via atsProfile
  • Operation hints steer agents to the right list/read operation (Candidate_List vs Candidate_Get, etc.)
Power Automate / Power Apps

Automate erecruit workflows using the GLYDE Unity Power Platform connector.

Access: Power Platform Connector → Unity REST API → erecruit Adaptor

  • Create applications linking candidates to positions
  • Run weighted candidate and job searches
  • Execute any erecruit spec operation through the ATS proxy
  • Designer-bound dropdowns for StatusID / TypeID / RatingID and other lookups via cached inspect inputs
  • Note: no event triggers — the erecruit spec has no webhook endpoints; use polling schedules
📦 GLYDE Unity SDK

Programmatic access via the @glydeunity/glyde-api-client npm package.

Access: SDK Client → Unity REST API → erecruit 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
  • Automatic authentication and session management
  • OpenAPI-generated client with full IntelliSense
🤖 MCP (Model Context Protocol)

AI agents and LLMs access erecruit operations through the MCP interface.

Access: MCP Client → Unity MCP Endpoints → Workflow Handlers → erecruit Adaptor

  • 100+ discoverable tools auto-generated from workflow routes
  • ATS proxy tools for dynamic operation discovery and execution
  • Entity metadata tools for field-level schema inspection
  • Filtered schemas (x-NoMCP fields excluded for security)
  • JSON-RPC and REST invocation protocols
🎤 GLYDE Voice Agent

Voice-based interaction for candidate screening and job discovery (ATS-agnostic).

Access: Voice SDK → Unity Voice API → Deepgram → Function Execution

  • Voice-powered candidate screening interviews
  • Job discovery and application via voice
  • Real-time candidate creation during conversations
  • OTP verification for candidate identity

Entity Mappings

erecruit uses different entity names and field conventions. GLYDE Unity normalizes these through the index-centric data pipeline.

Candidate → Candidate

Unity Fielderecruit FieldDirectionNotes
first_name First Read
last_name Last Read
middle_name Middle Read
last_job_title Title Read
last_employer CurrentEmployer Read
availability DateAvailable Read
email _expanded.Communications[] Read Primary-wins, Category-labelled (email)
phone _expanded.Communications[] Read Primary-wins, Category-labelled (phone/mobile)
city / state / zip / address _expanded.DefaultAddress.{City,State,PostalCode,AddressLine1} Read Requires the expand query parameter
country _expanded.DefaultAddress.Country Read
employment_type_preferences IsLookingForPerm / IsLookingForContract / IsLookingForContractToPerm Read Boolean flags folded into a preferences array
ats_candidate_id ID Read Integer; candidate_uuid resolved via ExternalMappings
StatusID / RatingID / AdSource StatusID / RatingID / AdSource Read Tracked as lookups (NamedValue catalogs) — not flattened into the index

Job → Position (PostedPositionResponse)

Unity Fielderecruit FieldDirectionNotes
title Title / PositionTitle Read
ats_job_id ID Read Integer
description WebDescription Read Falls back to _expanded.Description.Text
status _expanded.Status.Name Read StatusID is the raw integer ref; the label only appears when expanded
employment_type PositionType / _expanded.Type.Name Read
department PrimaryDepartmentName Read
company_name / company CompanyName / _expanded.Company.Name Read
company_id / contact_id CompanyID / ContactID Read
external_id ExternalPositionID Read
min_bill_rate / max_bill_rate MinBillRate / MaxBillRate Read
min_pay_rate / max_pay_rate MinPayRate / MaxPayRate Read
salary_min / salary_max HourlyMin / AnnualMin · HourlyMax / AnnualMax Read
start_date / end_date StartDate / EndDate Read
date_posted / updated DatePosted / DateLastOpened Read
recruiter_name RecruiterName Read
city / state / zip / address PrimaryAddress.{City,State,PostalCode,AddressLine1} Read Also _expanded.DefaultAddress on PositionResponse

Application → CandidateApplication

Unity Fielderecruit FieldDirectionNotes
ats_application_id ID Read Integer (PascalCase)
ats_candidate_id CandidateID Read
ats_job_id PositionID Read
ats_match_id MatchID Read Links to the pipeline (Match) record
status / ats_status Status Read String label (unlike Candidate/Position integer StatusIDs)
rejection_reason RejectionReason Read
rejected_on RejectedOn Read
application_source AdSource Read
note Note Read
created / modified CreatedOn Read CreatedOn feeds both; no separate modified timestamp
CandidateID / PositionID (create) CandidateApplicationRequest Write Create posts { CandidateID, PositionID, ApplicationSourceID?, ApplicationNote? } to CandidateApplication_Post

Placement / Submission → Match

Unity Fielderecruit FieldDirectionNotes
(pipeline stage) MatchResponse.Status Read Application→submission→placement as ONE expanding record; Status is the stage label ("Submitted", "Placed")
(hydrated context) MatchResponse._expanded Read Carries Candidate / Position / Company / DefaultAddress when expanded
(link) CandidateApplication.MatchID Read Applications link to their pipeline record via MatchID

Endpoint Reference

MethodUnity EndpointDescriptionATS OperationAuth
GET /api/unity/candidates/:uuid Get candidate by ID (live Candidate_Get + cache merge) Candidate_Get API Key + User UUID
POST /api/unity/search/searchCandidates Weighted candidate search with live reinforcement Candidate_List API Key + User UUID
POST /api/unity/search/searchJobs Weighted job search with live reinforcement Position_GetInternallyPosted API Key + User UUID
POST /api/unity/search/conversationalAISearch AI-powered natural language search (GLYDE index) Azure AI Search API Key + User UUID
POST /api/unity/search/aiSearchIndex Structured OData index query Azure AI Search API Key + User UUID
POST /api/unity/applications Create application (CandidateApplication_Post) CandidateApplication_Post API Key + User UUID
POST /api/unity/applications/find Find applications by candidate/job filter CandidateApplication_GetByCandidateId / GetByPositionId API Key + User UUID
POST /api/unity/messages/send-email Send email (Mailgun, no ATS activity write-back) Mailgun API Key + User UUID
POST /api/unity/sms/send Send SMS (Twilio, no ATS activity write-back) Twilio API Key + User UUID
GET /api/unity/proxy/discover/erecruit Discover all 230 erecruit operations OpenAPI introspection API Key + User UUID
GET /api/unity/proxy/inspect/erecruit/:opId Inspect one operation (full spec) Schema introspection API Key + User UUID
POST /api/unity/proxy/erecruit/:opId Execute any erecruit spec operation (e.g. Match_GetByCandidateId, Position_GetPosition) Dynamic API Key + User UUID
GET /api/unity/proxy/meta/erecruit/:entity Get entity metadata + lookup catalogs Schema + fieldValueOperations API Key + User UUID

Events & Webhooks

The erecruit WebApi specification exposes no event or webhook endpoints. Event capability is registered as disabled (supportLevel: "none") with a polling-fallback note (supportsPollingFallback: true). Index freshness is maintained through the TTL-based cache strategy (14,400s hint) and scheduled / on-demand refresh via the ATS search-cache pipeline. This will be revisited if erecruit exposes events out-of-band.

Configuration Requirements

  • erecruit Credentials (UserName / Password)REQUIRED

    A dedicated erecruit WebApi user name and password for API access. These must be stored in Azure Key Vault via the GLYDE Unity client configuration; there is no global fallback credential.

    username: "glyde-integration@nelsonstaffing.com"

  • EntityID (Tenant Identifier)REQUIRED

    The erecruit EntityID for the tenant. Stored as UnityCredentials.tenant and sent as EntityID in the User/ValidateCredentials login request. Authentication throws before any API call when it is missing.

    tenant: "nelsonstaffing"

  • Integration TypeREQUIRED

    The client's integration_type must be set to "erecruit" in the GLYDE client configuration for the adaptor router to select the correct integration.

    integration_type: "erecruit"

  • API Base URL (Optional)

    Per-tenant service_url override for the erecruit WebApi. Resolution order: tenant service_urlERECRUIT_API_URL env → https://erecruit.nelsonstaffing.com/WebApi.

    service_url: "https://erecruit.nelsonstaffing.com/WebApi"

Known Limitations

  • No webhooks or events. The erecruit WebApi spec has no event/webhook endpoints — event capability is registered disabled with a polling-fallback note; index freshness relies on TTL + scheduled cache refresh.
  • No server-side pagination on core lists. Candidate_List, Position_GetInternallyPosted, and the CandidateApplication list operations return the FULL list — filter client-side.
  • No keyword search. Search is structured-filter only (VendorID, StatusIDs, OwnerID, name parts). searchCapabilities.supportsKeywordSearch is false; keyword-style discovery is served from the GLYDE Azure AI Search index.
  • Field names are PascalCase (First, Last, ID, StatusID) — not camelCase or snake_case. All mapping lives in types/erecruit/mapping-profile.ts.
  • Entity IDs are integers; Match/CandidateApplication cross-reference them via CandidateID / PositionID / MatchID.
  • Match is the pipeline record: application → submission → placement as ONE expanding record (Status is the stage label). There is no separate GLYDE placement entity — Match is registered with canonicalEntity: "other".
  • EntityID (tenant) is mandatory for auth and stored as UnityCredentials.tenant; User_ValidateCredentials returns the bearer token in UserId and IsValid must be true.
  • The bearer token has no known expiry — sessions revalidate on a 24-hour TTL cycle rather than a vendor-provided expiration.
  • Status labels require expansion. Candidate/Position records carry integer StatusID refs; labels only appear in _expanded.Status.Name (requires the expand query parameter). Applications are the exception — they carry string Status labels directly.
  • Statuses/types are NamedValue { ID, Name } lookups (Position_GetStatuses / Position_GetTypes / Candidate_GetRatings / AdSource_GetAdSources, etc.) consumed via fieldValueOperations for designer dropdowns.
  • Candidate create/update are not implemented at the workflow layer (the adaptor inherits the base not-supported defaults). Candidate records flow in through list/get and the search-cache pipeline; use the ATS proxy for vendor-native writes.
  • Job create/update are not implemented and live job get-by-id resolves from the GLYDE index; live single-position reads are available via Position_GetPosition through the ATS proxy.
  • No ATS activity write-back for messages. Email/SMS delivery is GLYDE-native (Mailgun/Twilio); no erecruit activity note is created. Use the ATS proxy for vendor-native note operations.
  • Addresses use PostalCode / AddressLine1 (not Zip / Address1).
  • HireDate / ReHireDate on candidates are placement dates, NOT record timestamps — deliberately never mapped to created/updated. EducationLeveID is a vendor typo on CandidateResponse and is unmapped by design.
  • Outbound create/update field mapping beyond CandidateApplication_Post is not yet implemented in the mapping profile — it defines the inbound field maps used by the ATS search-index pipeline.

Version History

v1.0.0 2026-08-26
  • Initial integration guide creation
  • Documented bearer-token authentication via User_ValidateCredentials (UserName + Password + mandatory EntityID)
  • Documented candidate retrieval with live/cache merge and weighted search live reinforcement
  • Documented job (Position) search via Position_GetInternallyPosted and index-only get-by-id
  • Documented application create/find/list operations (CandidateApplication_Post, GetByCandidateId, GetByPositionId)
  • Documented the Match pipeline record (application→submission→placement as one expanding type)
  • Documented ATS proxy discovery/inspection/execution across all 230 spec operations
  • Documented the NamedValue lookup catalogs feeding designer dropdowns
  • Documented the no-webhook event model with TTL + scheduled cache refresh
  • Documented platform access patterns (Teams, Copilot, Power Platform, SDK, MCP, Voice)
  • Documented entity mappings (Candidate, Position, CandidateApplication, Match)
  • Documented configuration requirements and known limitations