Overview
GLYDE Unity provides a deep ATS integration with JobDiva, the enterprise staffing ATS, through its V2 API: full candidate CRUD (get, find, create, update, hotlists), job create/update, Submittal (application) create/update and reads, candidate notes/activities with email logging, smart live search with automatic query routing, and 330 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 per-tenant service credentials (clientid / username /
password) exchanged for a 1-hour JobDiva API token managed automatically by the connector.
JobDiva data flows through GLYDE Unity's index-centric normalization pipeline, converting JobDiva's UPPER_CASE create fields and camelCase read fields to GLYDE's canonical snake_case format. Search results are cached in Redis and queued for background Azure AI Search indexing via BullMQ, 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 JobDiva V2 API (https://api.jobdiva.com). Requests are authenticated, normalized, and routed through the integration adaptor's 8 entity sub-adaptors (candidates, jobs, applications, activities/notes, activities-unified, messages, search). The ATS search workflow classifies each query — numeric id lookup, simple name/email find, or broad TalentSearch — before calling JobDiva, and every search feeds the GLYDE cache and index.
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 │
│ ┌─ JobDiva Integration Adaptor ──┐ │
│ │ 8 Entity Sub-Adaptors: │ │
│ │ candidates / jobs / │ │
│ │ applications / activities / │ │
│ │ activities-unified / messages │ │
│ │ search │ │
│ │ │ │
│ │ Query Routing (id vs find vs │ │
│ │ TalentSearch) │ │
│ │ Template Method Pattern │ │
│ │ Index-centric Data Mapping │ │
│ └────────────────────────────────┘ │
│ | │
│ v │
│ ┌─ JobDiva External Connector ───┐ │
│ │ jobdiva-connector.ts │ │
│ │ 330 OpenAPI Operations (V2) │ │
│ │ JobDivaConnectorAuthManager │ │
│ │ /apiv2/authenticate → 1h │ │
│ │ token, Redis-cached │ │
│ └────────────────────────────────┘ │
└──────────────|──────────────────────┘
|
v
┌──────────────────────────────────────┐
│ JobDiva V2 API │
│ https://api.jobdiva.com │
│ /apiv2/... │
│ │
│ Candidate | Job | Submittal | │
│ Company | Note | CandidateHotlist │
└──────────────────────────────────────┘
Teams, Copilot, Power Automate, or SDK sends a request to the GLYDE Unity API (e.g., POST /api/unity/candidates) 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('jobdiva') based on the client's configured integration_type.
The JobDivaConnectorAuthManager loads the tenant's clientid/username/password from Azure Key Vault (falling back to legacy integration data, then syncing back to Key Vault) and calls GET /apiv2/authenticate. The raw response body is the API token, cached in Redis for 1 hour.
The JobDivaConnector executes the operation against the JobDiva V2 API using the OpenAPI specification (330 operations). The token is sent in the Authorization header (no Bearer prefix).
Response data flows through the index-centric pipeline: JobDiva row → JobDiva mapping profile → ATSCacheCandidateSearchIndex (canonical format). UPPER_CASE and camelCase source fields, comma-string skills, and mixed date formats are normalized to GLYDE's snake_case schema with ISO dates.
Search results are cached per profile in Redis, up to 1000 candidate ids are queued for background Azure AI Search indexing (BullMQ, 100ms inter-job delay), and GLYDE UUIDs are resolved/backfilled via ExternalMappings.
Authentication
Per-tenant service credentials with 1-hour API token (apiv2/authenticate)
JobDiva authenticates with a tenant-scoped service account. GLYDE Unity's
JobDivaConnectorAuthManager loads the tenant's clientid,
username, and password from Azure Key Vault (falling back to
legacy integration_data credentials, which are synced back to Key Vault after
a successful auth) and calls GET {base}/apiv2/authenticate?clientid=...&username=...&password=....
The raw response body is the API token. Note this is not RFC 6749 OAuth2 —
it is a simple credential-to-token exchange handled automatically from
client_uuid with no manual token handling.
Credential Fields
| Field | Description | Required |
|---|---|---|
clientid |
JobDiva client/tenant id (numeric, e.g. "1460"). Required for the authenticate call. | Yes |
username |
JobDiva API service account username. Required. | Yes |
password |
JobDiva API service account password. Required. Stored in Azure Key Vault. | Yes |
api_url |
Optional base URL override (defaults to https://api.jobdiva.com; Unity service_url). | No |
authorization_token |
Legacy pre-supplied JobDiva token; still accepted but superseded by the credential-based flow. | No |
Session Management
Sessions are cached in Redis with the key pattern session:client:{clientUuid}:integration:jobdiva.
The session carries the API token with a fixed 1-hour TTL. On expiry the connector
re-authenticates transparently on the next request. There are no deployment-global JobDiva
credentials — authentication fails with an explicit error if the tenant has no
Key Vault or integration-data credentials.
Token Refresh
There is no refresh token: when the 1-hour token lapses, the manager simply
re-runs /apiv2/authenticate with the stored service credentials. Auth
failures on search routes surface as JOBDIVA_AUTH_FAILED (HTTP 401) with
guidance to re-check the tenant's stored credentials.
Capabilities
📦 Two API layers, one integration
This integration exposes JobDiva 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 JobDiva REST operations the workflow
invokes under the hood. You normally never call these directly — but you can, through the
ATS proxy (/api/unity/proxy/jobdiva/:operationId and the discover/inspect meta-operations).
The proxy executes any operation from JobDiva'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 JobDiva 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 |
|---|---|---|
| Create Candidate Create a new candidate in JobDiva with GLYDE DB sync and search indexing |
POST /api/unity/candidates |
createCandidateUsingPOST_1 |
| Update Candidate Update an existing candidate; resolves the ATS id via ExternalMapping and invalidates the per-client ATS search cache on success |
POST /api/unity/candidates/:candidateUUID |
updateCandidateProfileUsingPOST_1 |
| Get Candidate by UUID Retrieve candidate by GLYDE UUID via ExternalMapping lookup, then JobDiva candidate profile (index-first) |
GET /api/unity/candidates/:candidateUUID |
getCandidateProfileUsingGET_1 |
| Get Candidate by ATS ID Retrieve candidate directly by JobDiva candidateId (index-first, Redis cache + live merge) |
GET /api/unity/candidates/:candidateUUID?ats_candidate_id=&ats=jobdiva |
getCandidateProfileUsingGET_1 |
| Find Candidate Find a candidate by firstName/lastName/email/phone (AND-combined natively by JobDiva) |
POST Internal adaptor operation (findCandidate) |
searchCandidateProfileUsingPOST_1 |
| List Candidate Hotlists List a candidate's hotlists (talent pools) by ATS id |
GET Internal adaptor operation (listCandidateHotlistsByAtsId) |
CandidateHotlistListUsingGET_1 |
| Search Candidates Minimal profile search (name/email) via the profile search operation |
POST /api/unity/search/atsSearch |
searchCandidateProfileUsingPOST_1 / TalentSearchUsingPOST |
| Operation | Endpoint | ATS Op |
|---|---|---|
| Create Job Create a new job in JobDiva; recruiter/owner ids are set from the recruiter ExternalMapping when available |
POST /api/unity/jobs |
createJobUsingPOST_1 |
| Update Job Update an existing job; resolves the job ExternalMapping and sets jobId + recruiter fields |
POST /api/unity/jobs/:jobUUID |
updateJobUsingPOST_1 |
| Get Job by UUID / ATS ID Served from the GLYDE Azure index when a hit exists; there is no live JobDiva job-get leg in the adaptor |
GET /api/unity/jobs/:jobUUID |
index-backed |
| Operation | Endpoint | ATS Op |
|---|---|---|
| Create / Update Application JobDiva Submittal create is an upsert — create and update both use the same operation; flat candidateId/jobId/recruiterid/ownerId on the body |
POST /api/unity/applications (+ PUT /api/unity/applications/:uuid) |
createJobApplicationUsingPOST_1 |
| List Applications by ATS Candidate ID List a candidate's Submittal records (application records) |
GET /api/unity/applications/candidate/:atsCandidateId |
CandidateApplicationRecordsUsingGET_1 |
| Find Application by ATS Candidate ID Find applications filtered by candidate — the only supported filter; externalRef / job-only / status filters are rejected |
POST Internal adaptor operation (findApplication) |
CandidateApplicationRecordsUsingGET_1 |
| Operation | Endpoint | ATS Op |
|---|---|---|
| Create Candidate Note (Activity) Create a candidate note mapped from a GLYDE activity, with action type classification (Called→phone_call, Emailed→email_sent, Interview Scheduled→interview_scheduled, SMS Sent→sms_sent, Note→general_note, ...) |
POST /api/unity/activities |
createCandidateNoteUsingPOST_1 |
| Get Candidate Notes Retrieve a candidate's notes from JobDiva |
GET /api/unity/activities/candidate/:entityId |
getCandidateNotesUsingGET |
| Job Notes Not implemented — the connector does not yet expose JobDiva job-order note endpoints |
POST — |
NOT_IMPLEMENTED |
| Operation | Endpoint | ATS Op |
|---|---|---|
| Send Email Send email via Mailgun with automatic candidate-note creation in JobDiva for activity logging |
POST /api/unity/messages/send-email |
Mailgun + createCandidateNoteUsingPOST_1 |
| Operation | Endpoint | ATS Op |
|---|---|---|
| ATS Search (Smart Routing) Live candidate search with automatic query routing: numeric-only query → candidate detail lookup; email or ≤3-word simple queries → profile search; everything else → broad TalentSearch |
POST /api/unity/search/atsSearch |
CandidateDetailUsingGET_1 / searchCandidateProfileUsingPOST_1 / TalentSearchUsingPOST |
| 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) |
| 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) |
| Operation | Endpoint | ATS Op |
|---|---|---|
| Discover Operations List all 330 available JobDiva V2 API operations with schemas, parameters, and LLM metadata |
GET /api/unity/proxy/discover/jobdiva |
OpenAPI spec introspection |
| Inspect Operation Inspect a single operation's input schema before executing |
GET /api/unity/proxy/inspect/jobdiva/:operationId |
OpenAPI spec introspection |
| Execute Operation Execute any discovered JobDiva operation dynamically with auto-authentication |
POST /api/unity/proxy/jobdiva/:operationId |
Dynamic (per operationId) |
| Entity Field Metadata Get field-level metadata for a JobDiva entity type |
GET /api/unity/proxy/meta/jobdiva/:entity |
getEntityMetadata |
Platform Access
GLYDE Unity provides unified access to JobDiva across multiple Microsoft 365 and developer platforms.
Access JobDiva data through the GLYDE Unity bot in Teams channels and chats.
Access: Teams Bot Framework → GLYDEBuddy Proxy → Unity REST API → JobDiva Adaptor
- Search candidates and jobs via conversational AI
- View candidate profiles with JobDiva data
- Send emails with automatic JobDiva note logging
- Create and manage candidate notes
- Create candidates, jobs, and Submittals
- Access ATS proxy for advanced JobDiva queries
Use natural language to interact with JobDiva data through the GLYDE Copilot declarative agent.
Access: Copilot Agent → MCP Bridge (GLYDEBuddy) → Unity REST API → JobDiva Adaptor
- Natural language queries ("Find Java developers in Chicago in JobDiva")
- AI-powered candidate matching and ranking
- Multi-step workflows (search → review → submit)
- ATS proxy with LLM-optimized operation metadata
- Entity and field metadata inspection for schema discovery
Automate JobDiva workflows using the GLYDE Unity Power Platform connector.
Access: Power Platform Connector → Unity REST API → JobDiva Adaptor
- Trigger flows on JobDiva webhook events (Candidate, Job, JobApplication, Submission)
- Create candidates, jobs, and Submittals from forms or external sources
- Sync data between JobDiva and other business systems
- Schedule bulk operations and reports
Programmatic access via the @glydeunity/glyde-api-client npm package.
Access: SDK Client → Unity REST API → JobDiva 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 JobDiva operations through the MCP interface.
Access: MCP Client → Unity MCP Endpoints → Workflow Handlers → JobDiva Adaptor
- 100+ discoverable tools auto-generated from workflow routes
- ATS proxy tools for dynamic JobDiva operation discovery and execution (330 operations)
- Entity metadata tools for field-level schema inspection
- LLM metadata with per-operation guidance (Authorization and clientid hidden as server-provided)
- JSON-RPC and REST invocation protocols
Voice-based interaction with JobDiva data for candidate screening and discovery.
Access: Voice SDK → Unity Voice API → Deepgram → Function Execution → JobDiva Adaptor
- Voice-powered candidate screening interviews
- Job discovery and application via voice (Submittal creation)
- Real-time candidate creation during conversations
- OTP verification for candidate identity
- Context-aware conversation modes (screening, discovery, application)
Entity Mappings
JobDiva uses different entity names and field conventions. GLYDE Unity normalizes these through the index-centric data pipeline.
Candidate → Candidate (UPPER_CASE on create, camelCase on update/read)
| Unity Field | JobDiva Field | Direction | Notes |
|---|---|---|---|
first_name |
FIRSTNAME (create) / firstName (update/read) |
Bidirectional | Required on create |
last_name |
LASTNAME / lastName |
Bidirectional | Required on create |
email |
EMAIL / email (ALTERNATEEMAIL tracked) |
Bidirectional | Required on create |
phone |
CELLPHONE (create) / phone; CELLPHONE, PHONE1/2, HOMEPHONE, WORKPHONE on read |
Bidirectional | — |
address |
ADDRESS1 / address |
Bidirectional | — |
city / state / zip |
CITY / STATE / ZIPCODE (read: zipCode) |
Bidirectional | — |
dob |
DATE_OF_BIRTH / dateOfBirth |
Bidirectional | — |
resume_text |
RESUME_TEXT / resumeText |
Bidirectional | — |
skills |
skills / skillSet |
Read | Comma string normalized to array |
last_job_title / last_employer |
title/currentTitle/occupation · company/currentCompany |
Read | — |
experience_years |
totalExperience / experienceYears |
Read | String normalized to int |
work_authorization |
workAuthorization / visaStatus |
Read | Boolean normalized to Authorized / Not Authorized |
created / updated |
DATECREATED / DATEUPDATED, DATEPROFILEUPDATED, dateLastModified |
Read | ISO date or full datetime |
candidate_uuid |
candidateId (via ExternalMapping) |
Read | — |
Job → Job
| Unity Field | JobDiva Field | Direction | Notes |
|---|---|---|---|
title |
title |
Bidirectional | Required |
description |
description |
Bidirectional | Required |
city |
locality |
Write | Unity city maps to JobDiva locality |
zip |
zip_code |
Write | — |
company |
companyName |
Write | — |
salary_min / salary_max |
salaryMin / salaryMax |
Write | — |
employment_type |
employmentType |
Write | — |
remote_job_type |
remoteJobType |
Write | Truthy value → "Fully remote" |
requirements |
requirements / skills |
Read | — |
Application → Submittal
| Unity Field | JobDiva Field | Direction | Notes |
|---|---|---|---|
ats_candidate_id |
candidateId |
Read | — |
ats_job_id |
jobId (fallback jobOrderId) |
Read | — |
ats_application_id |
applicationId / id |
Read | — |
status |
status / applicationStatus / stage |
Bidirectional | Outbound statusMap: submitted→applied, under_review→in_review, interviewing→interview, offered→offer, hired, rejected, withdrawn; default applied |
summary |
notes / comments |
Read | — |
application_source |
source |
Write | Defaults to "api" |
created |
createdDate / dateCreated / applicationDate |
Read | — |
candidate_uuid / job_uuid (write) |
candidateId / jobId (flat on body) |
Write | — |
Activity (Note) → CandidateNote
| Unity Field | JobDiva Field | Direction | Notes |
|---|---|---|---|
content |
note |
Write | — |
subtype: phone_call |
action: "Called" |
Bidirectional | — |
subtype: email_sent |
action: "Emailed" |
Bidirectional | Emailed also types as email_log via the activity mapper |
subtype: sms_sent |
action: "SMS Sent" |
Bidirectional | — |
subtype: interview_scheduled |
action: "Interview Scheduled" |
Bidirectional | — |
subtype: general_note |
action: "Note" |
Bidirectional | Default action/subtype |
action_date |
actiondate |
Write | — |
candidate_id / job_id |
candidateid / jobid |
Write | — |
recruiter_id |
recruiterid |
Write | From JobDivaConfiguration.glyde_user_id |
Endpoint Reference
| Method | Unity Endpoint | Description | ATS Operation | Auth |
|---|---|---|---|---|
POST |
/api/unity/candidates |
Create candidate | createCandidateUsingPOST_1 |
API Key + User UUID |
PUT |
/api/unity/candidates/:uuid |
Update candidate | updateCandidateProfileUsingPOST_1 |
API Key + User UUID |
GET |
/api/unity/candidates/:uuid |
Get candidate by ID (index-first) | getCandidateProfileUsingGET_1 |
API Key + User UUID |
GET |
/api/unity/candidates/:uuid?ats_candidate_id=&ats=jobdiva |
Get candidate by JobDiva candidateId | getCandidateProfileUsingGET_1 |
API Key + User UUID |
POST |
/api/unity/jobs |
Create job | createJobUsingPOST_1 |
API Key + User UUID |
PUT |
/api/unity/jobs/:uuid |
Update job | updateJobUsingPOST_1 |
API Key + User UUID |
POST |
/api/unity/applications |
Create Submittal (upsert) | createJobApplicationUsingPOST_1 |
API Key + User UUID |
GET |
/api/unity/applications/candidate/:atsCandidateId |
List applications by ATS candidate ID | CandidateApplicationRecordsUsingGET_1 |
API Key + User UUID |
POST |
/api/unity/activities |
Create activity (candidate note) | createCandidateNoteUsingPOST_1 |
API Key + User UUID |
GET |
/api/unity/activities/candidate/:entityId |
Get candidate notes | getCandidateNotesUsingGET |
API Key + User UUID |
POST |
/api/unity/messages/send-email |
Send email + log JobDiva note | Mailgun + createCandidateNoteUsingPOST_1 |
API Key + User UUID |
POST |
/api/unity/search/atsSearch |
ATS search with smart query routing | TalentSearchUsingPOST / searchCandidateProfileUsingPOST_1 / CandidateDetailUsingGET_1 |
API Key + User UUID |
POST |
/api/unity/search/aiSearchIndex |
AI search over the GLYDE index | Azure AI Search |
API Key + User UUID |
POST |
/api/unity/events/webhook/:sourceSystem |
Inbound JobDiva webhook receiver (manual registration) | Webhook callback |
Webhook source resolution |
GET |
/api/unity/proxy/discover/jobdiva |
Discover JobDiva operations (330) | OpenAPI introspection |
API Key + User UUID |
GET |
/api/unity/proxy/inspect/jobdiva/:operationId |
Inspect a JobDiva operation input schema | OpenAPI introspection |
API Key + User UUID |
POST |
/api/unity/proxy/jobdiva/:operationId |
Execute a JobDiva operation | Dynamic |
API Key + User UUID |
GET |
/api/unity/proxy/meta/jobdiva/:entity |
Get entity field metadata | getEntityMetadata |
API Key + User UUID |
Events & Webhooks
JobDiva supports inbound webhooks with manual registration.
JobDiva exposes no remote webhook-management API in the connector spec, so GLYDE Unity
records the default subscription (jobdiva-core-events) with
awaiting-remote-registration semantics: the customer must manually point a JobDiva
webhook at the Unity inbound receiver (POST /api/unity/events/webhook/:sourceSystem).
Once deliveries flow, events are normalized to the canonical EventObject
format via the passthrough normalizer and drive event-assisted cache refresh (4-hour TTL
hint). There is no polling fallback and no event replay — missed
deliveries require a direct entity refresh.
| Event | Trigger | Payload |
|---|---|---|
Candidate.* |
Candidate created, updated, or deleted in JobDiva | candidateId, eventType, timestamp, vendor payload (passthrough-normalized) |
Job.* |
Job created, updated, or deleted in JobDiva | jobId, eventType, timestamp, vendor payload |
JobApplication.* |
Job application change in JobDiva | applicationId, eventType, timestamp, vendor payload |
Submission.* |
Submittal change in JobDiva | submissionId, eventType, timestamp, vendor payload |
Configuration Requirements
-
JobDiva Service CredentialsREQUIRED
Per-tenant API service account (clientid + username + password), stored in Azure Key Vault. There are no deployment-global JobDiva credentials; legacy integration_data credentials are honored and synced back to Key Vault after successful auth. Tenant credentials are NOT environment variables.
clientid: "1460", username: "api_user", password: "********" -
Integration TypeREQUIRED
The client's integration_type must be set to "jobdiva" for the adaptor router to select the JobDiva integration.
integration_type: "jobdiva" -
GLYDE User ID (Notes)REQUIRED
integration_data.JobDivaConfiguration.glyde_user_id is used as the recruiterid on candidate notes created by GLYDE (activities and email logging). Required for note writes.
JobDivaConfiguration.glyde_user_id: 12345 -
API Base URL (Optional)
Override the JobDiva API base URL (defaults to https://api.jobdiva.com) via the JOBDIVA_API_URL environment variable or a per-tenant service_url.
JOBDIVA_API_URL="https://api.jobdiva.com" -
Search Stack (Deployment-Level)
The atsSearch cache/index pipeline requires AZURE_SEARCH_ENDPOINT, AZURE_SEARCH_API_KEY (or AZURE_SEARCH_KEY), and Redis (REDIS_HOST/PORT/PASSWORD) — shared infrastructure, not per-tenant.
AZURE_SEARCH_ENDPOINT="https://.search.windows.net"
Known Limitations
- Job Notes Not Supported: creating or reading JobDiva job-order notes is not implemented (the connector lacks the createJobOrderNote / getJobOrderNotes endpoints); only candidate notes are supported.
- Application Entity Is Called "Submittal": Submittal create is an upsert (create and update share one operation) and returns a boolean, so the created application is read back by listing the candidate's applications and matching jobId.
- Application Lookup by Id Not Supported: there is no get-by-application-id; use list-by-candidate and match. Find filters support atsCandidateId only — externalRef / job-only / status filters are rejected.
- No Universal Query Language: JobDiva has no cross-entity query syntax; search is operation-specific parameters. Pagination also varies by operation (the canonical profile documents from/count with a default of 100).
- Mixed Field-Name Conventions: candidate create uses UPPER_CASE fields (FIRSTNAME, LASTNAME, EMAIL, CELLPHONE) while update and reads use camelCase — the mapper handles both, but raw proxy callers must match the operation's convention.
- atsSearch Forwards a Limited Filter Set: only email, firstName/lastName splits, and city/state/zipCode/country JSON filters reach JobDiva; Unity-side orderby/select are Azure-index concepts and are not forwarded.
- Background Indexing Caps: atsSearch queues up to 1000 candidate ids per search for background Azure AI Search indexing (BullMQ, 100ms inter-job delay, max 3 concurrent workers).
- Token TTL Fixed at 1 Hour: the /apiv2/authenticate token is re-obtained transparently; there is no refresh token. Auth failures surface as JOBDIVA_AUTH_FAILED (HTTP 401) on search routes.
- Dates May Be Date-Only or Full Datetime: JobDiva mixes ISO date-only and full ISO datetime values; the mapper normalizes both.
- Directory Is Index-Only: no live companies/contacts leg is wired (searchCompanyUsingPOST exists in the spec and the proxy tier-1 list, but is not surfaced as directory search). Rows enter the directory via
POST /api/unity/directory/ingestimports or JobDiva webhooks. - Events Require Manual Registration: no remote subscription management, no polling fallback, no replay — the customer registers the webhook in the JobDiva UI.
- Placements & Compliance Not Supported: the connector does not expose JobDiva placement or compliance operations.
Version History
- Initial integration guide creation
- Documented per-tenant service-credential authentication (/apiv2/authenticate, 1-hour token, Key Vault sync-back)
- Documented full candidate CRUD (create/update/get/find/hotlists) with UPPER_CASE vs camelCase field conventions
- Documented job create/update and index-backed job reads
- Documented Submittal (application) upsert semantics and list-by-candidate reads
- Documented candidate notes/activities with JobDivaConfiguration.glyde_user_id recruiter attribution and email logging
- Documented smart-routing ATS search (numeric id → detail, simple → profile search, else TalentSearch) with cache/index write-through
- Documented ATS proxy discovery with 330 operations, inspect, execute, and entity metadata
- Documented manual-registration webhooks (Candidate.*, Job.*, JobApplication.*, Submission.*)
- Documented entity mappings: Candidate, Job, Submittal, CandidateNote