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.
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.
Watch it work
1 / 5Architecture & 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 │
└──────────────────────────────────────┘
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.
Unity validates the API key, resolves client_uuid and user_uuid, checks role-based access, and routes to the appropriate workflow handler.
The workflow handler calls getIntegrationAdaptor('erecruit') to obtain the erecruit-specific adaptor based on the client's configured ATS integration type.
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.
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}.
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.
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.
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
| Field | Description | Required |
|---|---|---|
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_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 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 |
| Operation | Endpoint | ATS 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) |
| Operation | Endpoint | ATS 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 |
| Operation | Endpoint | ATS 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 |
| Operation | Endpoint | ATS 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) |
| Operation | Endpoint | ATS 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 |
| Operation | Endpoint | ATS 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 |
| Operation | Endpoint | ATS 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.
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
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.)
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
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
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
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 Field | erecruit Field | Direction | Notes |
|---|---|---|---|
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 Field | erecruit Field | Direction | Notes |
|---|---|---|---|
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 Field | erecruit Field | Direction | Notes |
|---|---|---|---|
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 Field | erecruit Field | Direction | Notes |
|---|---|---|---|
(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
| Method | Unity Endpoint | Description | ATS Operation | Auth |
|---|---|---|---|---|
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.tenantand sent asEntityIDin theUser/ValidateCredentialslogin 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_url→ERECRUIT_API_URLenv →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.supportsKeywordSearchisfalse; 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 intypes/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 (
Statusis the stage label). There is no separate GLYDE placement entity — Match is registered withcanonicalEntity: "other". - EntityID (tenant) is mandatory for auth and stored as
UnityCredentials.tenant;User_ValidateCredentialsreturns the bearer token inUserIdandIsValidmust betrue. - 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
StatusIDrefs; labels only appear in_expanded.Status.Name(requires theexpandquery parameter). Applications are the exception — they carry stringStatuslabels directly. - Statuses/types are
NamedValue { ID, Name }lookups (Position_GetStatuses/Position_GetTypes/Candidate_GetRatings/AdSource_GetAdSources, etc.) consumed viafieldValueOperationsfor 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_GetPositionthrough 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(notZip/Address1). HireDate/ReHireDateon candidates are placement dates, NOT record timestamps — deliberately never mapped to created/updated.EducationLeveIDis a vendor typo onCandidateResponseand is unmapped by design.- Outbound create/update field mapping beyond
CandidateApplication_Postis not yet implemented in the mapping profile — it defines the inbound field maps used by the ATS search-index pipeline.
Version History
- 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