GLYDE Unity + Loxo

GLYDE Unity integrates with Loxo, the recruiting CRM and ATS, through a read-and-search-focused integration: candidate retrieval by GLYDE UUID or Loxo person id, pipeline (Deal) reads and creation, an...

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

Overview

GLYDE Unity integrates with Loxo, the recruiting CRM and ATS, through a read-and-search-focused integration: candidate retrieval by GLYDE UUID or Loxo person id, pipeline (Deal) reads and creation, and Loxo's REST API exposed end-to-end through the GLYDE ATS proxy — 185 operations across people, jobs, deals, companies, job contacts, and list endpoints.

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 a per-tenant Bearer API token with the agency slug automatically injected into every call.

Loxo data flows through GLYDE Unity's index-centric normalization pipeline, converting Loxo's snake_case fields to GLYDE's canonical snake_case index schema. Search results are cached in Redis and queued for background Azure AI Search indexing, so the GLYDE index (powering conversational and weighted search) keeps improving as recruiters use the platform.

Architecture & Data Flow

GLYDE Unity acts as an orchestration layer between consuming platforms (Teams, Copilot, Power Platform, SDK) and the Loxo REST API (https://app.loxo.co/api). Requests are authenticated, normalized, and routed through the integration adaptor's candidates and applications sub-adaptors; jobs, notes, and advanced operations are served through the index or the ATS proxy. The connector auto-injects the tenant agency_slug into every request, so callers never handle tenant routing themselves.

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                       │
    │  ┌─ Loxo Integration Adaptor ─────┐ │
    │  │  Sub-Adaptors:                 │ │
    │  │   candidates (people:show)     │ │
    │  │   applications (deals)         │ │
    │  │   messages / search (base)     │ │
    │  │                                │ │
    │  │  Index-first lookups           │ │
    │  │  Template Method Pattern       │ │
    │  └────────────────────────────────┘ │
    │              |                       │
    │              v                       │
    │  ┌─ Loxo External Connector ──────┐ │
    │  │  loxo-connector.ts             │ │
    │  │  185 OpenAPI Operations        │ │
    │  │  LoxoConnectorAuthManager      │ │
    │  │  Bearer api_key + agency_slug  │ │
    │  │  auto-injection                │ │
    │  └────────────────────────────────┘ │
    └──────────────|──────────────────────┘
                   |
                   v
    ┌──────────────────────────────────────┐
    │          Loxo REST API               │
    │   https://app.loxo.co/api            │
    │   /{agency_slug}/...                 │
    │                                      │
    │  people | jobs | deals | companies   │
    │  job_contacts | lists (statuses,     │
    │  types) | documents                  │
    └──────────────────────────────────────┘
1
Platform Request

Teams, Copilot, Power Automate, or SDK sends a request to the GLYDE Unity API (e.g., GET /api/unity/candidates/:uuid) 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 resolves the Loxo adaptor from the client's configured integration_type: "loxo".

4
Auto-Authentication (API Key)

The LoxoConnectorAuthManager loads the tenant's api_key and agency_slug from Azure Key Vault (secret {clientUuid}-loxo-credentials) and builds a Bearer session cached in Redis for 24 hours.

5
ATS API Call

The LoxoConnector executes the operation against the Loxo REST API using the OpenAPI specification (185 operations). The agency_slug is injected into request params automatically and the token is sent as Authorization: Bearer <api_token>.

6
Data Normalization

Response data flows through the index-centric pipeline: Loxo row → mapping profile → ATSCacheCandidateSearchIndex (canonical format). Loxo's loosely typed response schemas are normalized into GLYDE's snake_case canonical format with ISO dates.

7
Response Delivery

The normalized response is returned in the GLYDE Unity standard response format; search hits are cached in Redis and candidate ids are queued for background Azure AI Search indexing via BullMQ.

Authentication

Bearer API token (per-tenant API key)

Loxo authenticates with a static API key sent as Authorization: Bearer <api_token>. GLYDE Unity's LoxoConnectorAuthManager (extending BaseBearerTokenAuthManager) loads the tenant's api_key and tenant (agency slug) from Azure Key Vault or the client's integration configuration and builds the session automatically from client_uuid — no OAuth flow and no manual token handling. Loxo API keys do not expire, so there is no refresh flow.

Credential Fields

FieldDescriptionRequired
api_key Loxo API key for the tenant (required). Written straight to Key Vault at activation time. Yes
tenant Loxo agency slug (e.g. "hru-tech"). Required for all API calls; injected into every request path/params automatically. Yes
service_url Optional base URL override (defaults to https://app.loxo.co/api). No

Session Management

Sessions are cached in Redis with the key pattern session:client:{clientUuid}:integration:loxo. The session carries the Bearer token and the agency slug. Because Loxo API keys are static, the session is simply rebuilt from Key Vault when the 24-hour validity window lapses or when a request is rejected as unauthenticated.

Token Refresh

No refresh flow exists or is needed — Loxo API keys are long-lived. GLYDE Unity deliberately does not support deployment-global Loxo credentials: every tenant must have its own api_key + tenant in Key Vault, and authentication fails with an explicit error listing the missing fields otherwise.

Capabilities

📦 Two API layers, one integration

This integration exposes Loxo 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 Loxo REST operations the workflow invokes under the hood. You normally never call these directly — but you can, through the ATS proxy (/api/unity/proxy/loxo/:operationId and the discover/inspect meta-operations). The proxy executes any operation from Loxo'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 Loxo 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 (People) partial
OperationEndpointATS Op
Get Candidate by UUID
Retrieve candidate by GLYDE UUID via ExternalMapping lookup, then Loxo people:show (index-first)
GET /api/unity/candidates/:candidateUUID people:show
Get Candidate by ATS ID
Retrieve candidate directly by Loxo numeric person id (index-first, live fallback)
GET /api/unity/candidates/:candidateUUID?ats_candidate_id=&ats=loxo people:show
Create or Reuse Candidate
Deduplication-first operation: finds an existing candidate (GLYDE index) and reuses it; live candidate creation is not supported for Loxo
POST /api/unity/candidates find-only (no live create)
Applications (Deals) partial
OperationEndpointATS Op
List Applications by ATS Candidate ID
List a person's pipeline records (Deals) via Lucene query person_id:{id}, following scroll_id pagination (up to 10 pages)
GET /api/unity/applications/candidate/:atsCandidateId deals:index
Find Application
Find a Deal by candidate + job (person_id:{x} AND job_id:{y}); filtering by externalRef or status is not supported
POST Internal adaptor operation (findApplication) deals:index
Create Application
Create a Deal linking a person to a job (deal[person_id], deal[job_id], optional deal[name])
POST /api/unity/applications deals:create
Update Application
Not supported for Loxo — the adaptor provides no update hooks; stage moves happen in Loxo or via the ATS proxy
PUT — not supported
Jobs proxy only
OperationEndpointATS Op
Job Reads (Index)
Job lookups are served from the GLYDE Azure index when a hit exists; there is no live Loxo job leg in the adaptor
GET /api/unity/jobs/:jobUUID index-backed
Search full
OperationEndpointATS Op
AI Search Index
Search the GLYDE normalized Azure AI Search index (candidates/jobs) with client_uuid scoping
POST /api/unity/search/aiSearchIndex Azure AI Search Index (not direct ATS)
ATS Search (Loxo-native)
Search Loxo people/jobs/deals directly — ATS-native params passed straight through (OData translation not applied)
POST POST /api/unity/proxy/loxo/{people:index|jobs:index|deals:index} people:index / jobs:index / deals:index
Conversational AI Search
Natural language search across candidates and jobs using GLYDE AI with Azure AI Search
POST /api/unity/search/conversationalAISearch Azure AI Search Index (not direct ATS)
Messages (Email/SMS) partial
OperationEndpointATS Op
Send Email
Send email via the GLYDE Mailgun pipeline. Loxo has no note/activity write-back in the current integration, so the send is logged in GLYDE only
POST /api/unity/messages/send-email GLYDE Mailgun (no Loxo write-back)
ATS Proxy (Discovery) full
OperationEndpointATS Op
Discover Operations
List all 185 available Loxo API operations with schemas, parameters, and LLM metadata
GET /api/unity/proxy/discover/loxo OpenAPI spec introspection
Inspect Operation
Inspect a single operation's input schema before executing
GET /api/unity/proxy/inspect/loxo/:operationId OpenAPI spec introspection
Execute Operation
Execute any discovered Loxo operation dynamically with auto-authentication (agency_slug auto-injected)
POST /api/unity/proxy/loxo/:operationId Dynamic (per operationId)
Entity Field Metadata
Get field-level metadata for a Loxo entity type
GET /api/unity/proxy/meta/loxo/:entity getEntityMetadata

Platform Access

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

💬 Microsoft Teams

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

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

  • Search candidates and jobs via conversational AI
  • View candidate profiles with Loxo data
  • Send emails via the GLYDE pipeline
  • Create pipeline records (Deals) for candidates
  • Access ATS proxy for advanced Loxo queries
✨ Copilot for Microsoft 365

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

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

  • Natural language queries ("Find Java developers in Chicago in Loxo")
  • AI-powered candidate matching and ranking
  • Multi-step workflows (search → review → contact)
  • ATS proxy with LLM-optimized operation metadata
⚡ Power Automate / Power Apps

Automate Loxo workflows using the GLYDE Unity Power Platform connector.

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

  • Create applications (Deals) from forms or external sources
  • Sync data between Loxo and other business systems
  • Execute any Loxo API operation through the ATS proxy
  • Schedule bulk operations and reports
📦 GLYDE Unity SDK

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

Access: SDK Client → Unity REST API → Loxo 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 Loxo operations through the MCP interface.

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

  • 100+ discoverable tools auto-generated from workflow routes
  • ATS proxy tools for dynamic Loxo operation discovery and execution
  • Entity and field metadata inspection for schema discovery
  • LLM metadata with per-operation guidance (Authorization, api_key, agency_slug hidden as server-provided)
🎤 GLYDE Voice Agent

Voice-based interaction with Loxo data for candidate screening and discovery.

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

  • Voice-powered candidate screening interviews
  • Job discovery and application via voice
  • Real-time candidate reuse during conversations (dedup-first)
  • OTP verification for candidate identity

Entity Mappings

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

Candidate → Person

Unity FieldLoxo FieldDirectionNotes
first_name first_name (fallback firstName) Read —
last_name last_name (fallback lastName) Read —
email email Read —
phone phone (fallback mobile) Read —
city city Read —
state state Read —
country country Read —
zip zip (fallback postal_code) Read —
resume_text description (fallback resume) Read —
status status Read Rendered as ats_status on the index document
candidate_uuid id (via ExternalMapping) Read Mapped through GLYDE ExternalMapping table
created / updated created / updated (fallback created_at / updated_at) Read ISO 8601

Job → Job

Unity FieldLoxo FieldDirectionNotes
title title (fallback name, job_title) Read —
description description (fallback job_description) Read —
company company_name (fallback company) Read —
employment_type job_type (fallback employment_type) Read —
city / state / zip / country city / state / zip / country Read —
job_uuid id (via ExternalMapping) Read —

Application → Deal

Unity FieldLoxo FieldDirectionNotes
ats_candidate_id person_id (nested person.id accepted) Read —
ats_job_id job_id (nested job.id accepted) Read —
ats_application_id id Read —
status stage (fallback stage_name, status) Read Loxo pipeline stage maps to GLYDE status
application_source source Read —
job_title job_title (fallback name, title) Read —
candidate_uuid / job_uuid (create) deal[person_id] / deal[job_id] Write deals:create; deal[name] defaults to "GLYDE Application"

Endpoint Reference

MethodUnity EndpointDescriptionATS OperationAuth
GET /api/unity/candidates/:uuid Get candidate by GLYDE UUID (index-first, live people:show fallback) people:show API Key + User UUID
GET /api/unity/candidates/:uuid?ats_candidate_id=&ats=loxo Get candidate by Loxo person id people:show API Key + User UUID
POST /api/unity/applications Create application (Deal) deals:create API Key + User UUID
GET /api/unity/applications/candidate/:atsCandidateId List applications by Loxo person id deals:index API Key + User UUID
POST /api/unity/messages/send-email Send email (GLYDE pipeline; no Loxo 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/search/conversationalAISearch Conversational AI search Azure AI Search API Key + User UUID
GET /api/unity/proxy/discover/loxo Discover Loxo operations (185) OpenAPI introspection API Key + User UUID
GET /api/unity/proxy/inspect/loxo/:operationId Inspect a Loxo operation input schema OpenAPI introspection API Key + User UUID
POST /api/unity/proxy/loxo/:operationId Execute a Loxo operation Dynamic API Key + User UUID
GET /api/unity/proxy/meta/loxo/:entity Entity field metadata getEntityMetadata API Key + User UUID

Events & Webhooks

Loxo event ingestion is not currently active. A default event subscription (loxo-core-events, matching Candidate.*, Job.*, Application.*) is registered in a disabled state, and no Loxo poller has been implemented — the subscription is deliberately disabled to avoid a misleading "active" configuration. A passthrough inbound normalizer exists for Loxo, so webhooks configured manually in the Loxo UI pointing at POST /api/unity/events/webhook/:clientUuid/loxo can be received, but there is no remote subscription management, polling fallback, or event replay. Until the poller ships, candidate/job data reaches the GLYDE index via search-time caching and background indexing rather than event-driven refresh.

Configuration Requirements

  • Loxo API KeyREQUIRED

    Per-tenant API key generated in Loxo. Written straight to Azure Key Vault (secret {clientUuid}-loxo-credentials) at activation time. Global/deployment-wide credentials are deliberately not supported.

    api_key: "xxxxxxxxxxxxxxxxxxxxxxxx"

  • Agency Slug (Tenant)REQUIRED

    The Loxo agency slug identifying the tenant. Required on every Loxo API call; GLYDE Unity auto-injects it into request params, but it must be present in the stored credentials.

    tenant: "hru-tech"

  • Integration TypeREQUIRED

    The client's integration_type must be set to "loxo" for the adaptor router to select the Loxo integration.

    integration_type: "loxo"

  • API Base URL (Optional)

    Override the Loxo API base URL (defaults to https://app.loxo.co/api). Configured via the LOXO_API_URL environment variable or a per-tenant service_url.

    LOXO_API_URL="https://app.loxo.co/api"

Known Limitations

  • Read/Search-Focused Integration: candidate create/update are not implemented at the adaptor level (no Loxo outbound candidate mapping). Use the ATS proxy (people:create, people:update, people:update_by_email) when writes are required.
  • Loxo Entity Vocabulary: the candidate entity is called Person, and the application entity is called Deal. The adaptor and LLM metadata map these synonyms automatically, but raw proxy calls use Loxo names.
  • Cursor Pagination (scroll_id): Loxo list endpoints paginate with scroll_id + per_page (default 20), not offset/page. Application listing follows up to 10 scroll pages per request.
  • agency_slug Required Everywhere: all Loxo operations are namespaced under the agency slug; GLYDE Unity injects it automatically, but credentials missing the tenant slug will fail.
  • Application Update Not Supported: only Deal creation and reads are implemented. Stage changes happen in Loxo or via the ATS proxy.
  • Find Application Filters: applications can be found by person_id + job_id only; filtering by externalRef or status is rejected by the adaptor.
  • No Live Job Leg: the jobs sub-adaptor is the base implementation, so job get/find are index-only; live Loxo job operations go through the proxy (jobs:index, jobs:show, jobs:apply).
  • No Notes/Activities Write-Back: the unified-activities sub-adaptor is not wired for Loxo; emails and SMS sent through GLYDE are not logged back into Loxo.
  • Events Disabled: no poller, disabled default subscription, no remote subscription management, no replay (see the Events section).
  • No Directory Live Leg: company/contact directory search is index-only for Loxo; rows enter the directory via POST /api/unity/directory/ingest imports.
  • Loosely Typed Responses: many Loxo OpenAPI response schemas are empty ({}); the connector unwraps rows via configured row keys (results/people/data etc.) rather than schema validation.

Version History

v1.0.0 2026-09-12
  • Initial integration guide creation
  • Documented Bearer API-key authentication with per-tenant Key Vault credentials and agency_slug auto-injection
  • Documented candidate reads (index-first people:show), pipeline (Deal) reads/creation, and index/proxy job access
  • Documented Loxo-native search via people:index / jobs:index / deals:index with scroll_id pagination
  • Documented ATS proxy discovery with 185 operations, inspect, execute, and entity metadata
  • Documented entity mappings: Person, Job, Deal
  • Documented disabled event posture and read-focused limitations