Unified Assessment API: Embed Assessments Inside ATS Platforms

Updated:


February 9, 2026

Most assessment integrations rely on application status changes or external tools. Recruiters switch systems, and providers handle fragmented integration logic. Some ATS platforms now support embedded assessment listings, where recruiters select and order assessments directly inside the ATS.

With the Assessment API, the recruiter orders your assessment inside the ATS and the order reaches you by webhook; you don't poll or watch status changes.

What is an Assessment API?

An assessment API allows assessment providers to integrate directly into ATS platforms so recruiters can request candidate assessments without leaving the ATS. Instead of triggering assessments based on status changes, recruiters select assessment packages inside the hiring process, and the order is routed to the provider by webhook.

The Assessment API covers package management, order delivery and result submission for ATSes with an embedded assessment module.

Why ATS-native assessment integrations matter

Recruiters order the assessment at the point of decision, without switching tools, and the result is written back to the system where the hiring decision is made.

Three ways to integrate assessments with Unified

1. Embedded (Assessment API)

  • Recruiter selects assessment inside ATS
  • Best UX, requires ATS support

2. Triggered (ATS API)

  • Trigger on status change
  • Works on any ATS integration that returns applications

3. Verification-style (Verification API)

  • ATS/HRIS calls provider directly
  • No marketplace required

Unified Assessment API

The Unified Assessment API allows assessment and background check providers to integrate directly with Applicant Tracking Systems (ATS) platforms that support embedded assessment listings.

This API enables recruiters to request assessments for candidates directly from within their ATS. The recruiter does not need to log into a separate assessment platform or use a separate system.

Instead, the assessment package is selected inside the ATS, and the request is routed to your platform through Unified.

This is different from triggering assessments based on status changes. It is a recruiter-initiated flow inside the ATS itself.

Core objects in the Assessment API

  • Packages: define assessment offerings, metadata, scoring, and configuration
  • Orders: represent assessment requests, candidate context, and lifecycle state
  • Results: fields on the order (response_score, response_url, response_attributes and others) that you update when the assessment is done

Orders include rich candidate, job, and application context, allowing providers to tailor assessments and return structured results directly into the ATS.

image.png

What can you read and write?

The Assessment API supports both:

  • Creating and managing assessment packages
  • Receiving assessment orders by webhook
  • Updating orders with structured results and scores

Calls go to the source ATS at request time, with no customer records at rest; connection credentials and operational metadata are encrypted at rest.

Using assessment data in AI systems

Because your product holds the structured results it writes back, you can also use them to:

  • Generate candidate summaries and scoring insights
  • Feed structured evaluation data into copilots or hiring assistants
  • Trigger automated follow-ups or recommendations

What you can build with the Assessment API

  • Embedded assessment marketplaces inside ATS platforms
  • Partner integrations with ATS vendors (such as Greenhouse, Ashby, Workable)
  • Candidate evaluation started by the recruiter inside the ATS
  • AI scoring and feedback returned to the ATS

Embedded assessment marketplaces inside ATS

Some ATS platforms support native assessment marketplaces, where providers can list assessment packages directly inside the product.

The Assessment API enables this model by:

  • Listing your packages inside the ATS
  • Allowing recruiters to select assessments directly
  • Sending you each order by webhook
  • Returning results back into the same flow

How the Assessment API differs from other Unified APIs

The Unified Verification API is used by ATS or HRIS platforms to call verification or assessment providers in a unified way.

In that flow:

  • The ATS or HRIS platform initiates the request.
  • They do not need a direct partnership with the assessment provider.
  • The call is routed through Unified using the unified verification data models.

The Assessment API is different.

It is designed for assessment providers who want their assessment packages listed directly inside an ATS that supports embedded assessment integrations.

The integration is initiated by the recruiter inside the ATS, not by the assessment provider or backend workflow.

How This Differs from the Unified ATS API

The Unified ATS API allows assessment providers to listen for job application changes and trigger an assessment when an application reaches a specific status.

That flow works across most ATS platforms supported by Unified and does not require a special assessment marketplace integration.

It is best suited for ATS platforms that do not support embedded assessment listings.

The new Unified Assessment API works in a different way:

  • It connects directly to ATS platforms that have a dedicated 'assessment API.'
  • Your assessment packages are listed inside the ATS.
  • A recruiter manually selects a package for a candidate.
  • The ATS sends an assessment order through Unified.
  • You process the assessment.
  • You update the order.
  • The results are written back into the ATS.

The key difference:

The recruiter stays inside the ATS the entire time.

There is no external trigger based on status change. The recruiter explicitly orders the assessment.

When Should You Use Each?

For assessment providers:

  • Use the Assessment API when the ATS supports embedded assessment listings and you have a partnership with that ATS.
  • Use the ATS API for all other ATS platforms.

Most providers will use both:

  • Assessment API for supported ATS platforms.
  • ATS API as the broad coverage fallback.

The Assessment API reduces recruiter friction but is limited to ATS platforms that expose this functionality.

Who this is for

  • Assessment providers (coding tests, behavioral, psychometric, etc.)
  • Background check and verification providers
  • AI-based candidate evaluation platforms
  • Hiring infrastructure tools integrating into ATS ecosystems

Supported ATS Integrations

As of 19 October 2026, the Assessment API connects to the assessment modules of Ashby, ATS Anywhere, Cornerstone, Greenhouse, JobAdder, PageUp, Paylocity, Recruitee, SmartRecruiters, TalentLyft, Teamtailor and Workable. It also orders assessments from assessment companies such as Berke, The Predictive Index and Wonderlic. See the Assessments integration list.

Each of these has a dedicated assessment integration that is separate from the standard ATS integration.

Only ATS platforms that support embedded assessment listings can be supported through this API.

How do you set up the Assessment API?

Step 1: Create a Connection

First, you need to manually create a connection for your assessment integration. This connection will be used to authenticate requests from the ATS.

When creating the connection, you must supply a Partner API Key in the connection.auth.token field that you generate yourself. You will then share this API key with your end-customer to configure the integration in their ATS.

Always check the authentication requirements for each assessment integration as some will require additional authentication information. For example, Ashby also requires a Customer API Key and a Partner ID.

Example Connection Creation:

{
  "integration_type": "greenhouseassessment",
  "auth": {
    "token": "YOUR_PARTNER_API_KEY"
  },
}

Step 2: Configure Webhooks

You also need to set up webhooks to receive assessment orders from the ATS systems.

Required Webhook

Create a webhook with the following configuration:

  • object_type: assessment_order
  • event: created

This webhook will be triggered whenever a recruiter requests an assessment for a candidate in the ATS.

Optional Webhook

Some ATS vendors (like Ashby) also send order cancellation events. You can optionally create an additional webhook:

  • object_type: assessment_order
  • event: deleted

This webhook will notify you when an assessment order is cancelled.

Step 3: Provide Configuration to Your End-Customer

Once you've created the connection and webhook, provide the following information to your end-customer:

  1. Base URL: https://api.unified.to/assessments/{connection_id}
    • Replace {connection_id} with the actual connection ID from Step 1
  2. Partner API Key: The token value you set in connection.auth.token

Your end-customer will then input these credentials into their ATS software to enable the integration.

The Base URL uses /assessments/ (plural). It's the endpoint the customer's ATS calls, using the Partner API Key. It is a different endpoint from the /assessment/{connection_id}/... paths (singular) under API Endpoints below, which your platform calls with your Unified.to API key.

How the assessment flow works

Here's how the assessment flow works:

  1. Package Configuration: You create assessment packages via the Unified API (w/ assessment packages API endpoints)
  2. ATS Lists Packages: The ATS queries your available packages
  3. Recruiter Orders Assessment: A recruiter selects a package and orders an assessment for a candidate
  4. Webhook Notification: Unified.to sends you a webhook with the order details
  5. Process Assessment: You send the assessment to the candidate and process their response
  6. Submit Results: You submit the assessment results back to Unified.to (w/ assessment order update API endpoint)
  7. Results in ATS: The results appear in the ATS for the recruiter to review

API Endpoints

Assessment Packages

Manage your available assessment packages:

  • POST /assessment/{connection_id}/package - Create a new package
  • GET /assessment/{connection_id}/package - List all packages
  • GET /assessment/{connection_id}/package/{id} - Get a specific package
  • PUT /assessment/{connection_id}/package/{id} - Update a package
  • DELETE /assessment/{connection_id}/package/{id} - Delete a package

Assessment Orders

Update assessment order results:

  • PUT /assessment/{connection_id}/order/{id} - Update an order with results

Webhook Payload

When an assessment order is created, you'll receive a webhook with an AssessmentOrder payload:

{
  "id": "123",
  "package_id": "your_package_id",
  "candidate_id": "candidate_456",
  "application_id": "application_789",
  "job_id": "job_012",
  "profile_first_name": "John",
  "profile_last_name": "Doe",
  "profile_emails": ["candidate@example.com"],
  "status": "OPEN"
}

Submitting Results

Once a candidate completes an assessment, submit the results using the update order endpoint:

PUT /assessment/{connection_id}/order/{order_id}

Example Request:

{
  "status": "COMPLETED",
  "response_score": 85,
  "response_max_score": 100,
  "response_url": "<https://your-platform.com/results/order_123>",
  "response_completed_at": "2024-01-15T10:30:00Z",
  "response_attributes": [
    {
      "type": "TEXT",
      "label": "Overall Assessment",
      "value": "Strong candidate"
    }
  ]
}

status, response_score and response_url are writable on every ATS assessment module; other fields vary, so check the integration page.

The results will then be written back to the ATS system, where recruiters can view them directly.

What should your webhook handler do?

  1. Secure Your API Key: Treat your Partner API Key as sensitive information. Only share it with trusted end-customers.
  2. Handle Webhooks Reliably: Implement retry logic and idempotency checks in your webhook handler to ensure you don't miss or duplicate orders.
  3. Validate Webhook Data: Check the sig256 signature (HMAC-SHA256) and validate the webhook payload to ensure it contains the expected candidate and job information before processing.
  4. Monitor Order Status: Track the status of assessment orders and handle cancellations appropriately when the deleted event webhook is received.

What is an assessment API for recruiting platforms?

An assessment API allows providers to integrate directly with ATS platforms so recruiters can request, manage, and review candidate assessments without leaving the ATS. It delivers orders by webhook and writes structured results back to the same system.

How do assessment providers integrate with ATS platforms?

Assessment providers integrate with ATS platforms either through embedded assessment APIs or through status-based triggers. Embedded integrations allow recruiters to select and order assessments directly inside the ATS, while triggered integrations operate based on application state changes.

Share
All guidesAccounting Account Type Hierarchy in UnifiedAdvertising Report Metrics by IntegrationAmazon S3: Required IAM PermissionsATS to Vector DB: How to Power Talent Intelligence with Real-Time DataBuilding AI applications with Unified and LangbaseConcur & Concur (Company) — Connection GuideConfigure Greenhouse Native Candidate WebhooksConfigure Salesforce Meetings and Notes for UnifiedConnect Amazon Seller Central to Unified.toConnecting BambooHR via OAuth 2Connecting Google Workspace Integrations with a Service AccountCorrect WelcomeKit Scopes for Jungle IntegrationCreating Ads using the Unified Ads APICreating Walmart Items via UnifiedEnd-Users, Integrations, and ConnectionsEnriching Unified Objects with Custom MetadataEnterprise-managed authorization (EMA) with a static keyEnterprise-managed authorization (EMA) with a workspace secretEnterprise-managed authorization (EMA) with Microsoft Entra IDExtended observability — pushing API logs to ClickHouseExtended observability — pushing API logs to Grafana / LokiExtended Observability - Pushing API Logs to your Datadog InstanceFacebook Messenger Webhook SetupFireflies Integration GuideGetting started with WorkableHandling Delegated vs. Application Scopes in Microsoft IntegrationsHiBob & Unified: connection and time off guideHow long are logs retainedHow to access employees and usersHow to add API support for the Create Activity in CrelateHow to Associate a Connection ID with Your End-UserHow to build a Candidate Assessment product withHow to build a candidate sourcing or job board app with Unified.toHow to build a Discord support bot with Unified.to and LangbaseHow to Build a Fintech Application with Unified's Payments APIHow to Build an E-Commerce Product Integration with UnifiedHow to build an invoicing system with Unified.toHow to build Enterprise Search using RAGHow to configure Bullhorn Redirect URI for creating a connectionHow to configure webhooks in HubSpotHow to configure webhooks in Thrive LearningHow to configure webhooks in Toast for UnifiedHow to Connect Anthropic to Real-Time SaaS Data with Unified.to MCP ServerHow to Connect Cohere to Real-Time SaaS Data with Unified.to MCP ServerHow to Connect Google Gemini to Real-Time SaaS Data with Unified.to MCP ServerHow to connect HiBob (Bob) to Unified with OAuth 2.0How to Connect LLMs to Real-Time SaaS Data with Unified.to MCP ServerHow to Connect OpenAI to Real-Time SaaS Data with Unified.to MCP ServerHow to Connect Zoom and Zoom PhoneHow to create a Connection In Microsoft TeamsHow to create a token-based connection in HighlevelHow to Create a Unified.to Connection to HighLevelHow to Create a Xero Connection in Unified.toHow to create and configure webhooksHow to create Connection with HubspotHow to customize portal URLs for Stripe and GoCardlessHow to filter webhook eventsHow-to Get a Private Support Channel for Your Unified IntegrationHow to get help fromHow to get your 8x8 Connect API Key, Account ID and SMS Subaccount ID (optional): Step-by-step guideHow to get your ADP Workforce Now Oauth2 client ID, Oauth2 client secret, Oauth2 PEM certificate and Oauth2 private key: Step-by-step guideHow to get your Amazon S3 AWS Region, AWS S3 Key and AWS S3 Secret: Step-by-step guideHow to get your Ashby API Key: Step-by-step guideHow to get your Brex API token: Step-by-step guideHow to get your Bullhorn OAuth2 Client ID, OAuth2 Client Secret, API Username and API Password: Step-by-step guideHow to get your Ceridian Dayforce Username, Password and Client Namespace: Step-by-step guideHow to get your Crelate API key: Step-by-step guideHow to get your Dashlane API Key: Step-by-step guideHow to get your Deel Access Token: Step-by-step guideHow to get your Dialpad API Key: Step-by-step guideHow to get your Discord OAuth 2 credentials and bot tokenHow to get your ELMO client ID and client secret: Step-by-step guideHow to get your Gainsight Client ID, Client Secret and Gainsight API Domain: Step-by-step guideHow to get your Greenhouse API Key and Job board token: Step-by-step guideHow to get your Helpscout API Key: Step-by-step guideHow to get your HiBob Service User ID and Service User Token: Step-by-step guideHow to get your HighLevel API Key and Location ID: Step-by-step guideHow to get your HubSpot developer key and OAuth 2 credentials (Legacy Apps)How to get your Humaans API Key: Step-by-step guideHow to get your iCIMS API Username, API Password and Customer ID: Step-by-step guideHow to get your JobDiva Client ID, Username/email and Password: Step-by-step guideHow to get your Jobvite API Key, API Key Secret and Email: Step-by-step guideHow to get your Lever API Key: Step-by-step guideHow to get your Loxo Agency slug, API Key and Agency ID: Step-by-step guideHow to get your Microsoft Active Directory / Entra ID Client ID, Client Secret and Tenant ID: Step-by-step guideHow to get your Microsoft Azure AD OAuth 2 credentialsHow to get your OAuth 2 credentials for GmailHow to get your OAuth 2 credentials for Microsoft Dynamics 365How to get your OAuth 2 credentials in PipeDriveHow to get your OpenAI API Key: Step-by-step guideHow to get your Paycom SID/Username and Token/Password: Step-by-step guideHow to get your PCRecruiter Username, Password, Database ID, App Key and App ID: Step-by-step guideHow to get your SAP SuccessFactors (OpenID Connect) Username, Password, Client ID, Client Secret, Dependency Name, IAS Host and API URL: Step-by-step guideHow to get your SAP SuccessFactors Username, Company ID, Password and API URL: Step-by-step guideHow to get your Shopify Admin API access token and Store ID: Step-by-step guideHow to get your Wayfair Client ID, Client Secret and Vendor Encrypted Key: Step-by-step guideHow to get your Workable API Token and Subdomain: Step-by-step guideHow to get your yotpo APP Key / Store ID and Secret Key: Step-by-step guideHow to Handle Attachments in Invoice, Bill and Credit MemoHow to Manage Google Ad Manager Orders, Line Items and Creatives with theHow to migrate or import your integrations into Unified.toHow to obtain your GitHub OAuth2 credentialsHow to Power Claude with Live Customer Data Using Unified MCPHow to receive assessment orders from an ATS with Unified.toHow to register a Google developer app and get OAuth 2 credentialsHow to register a Salesforce developer app and get OAuth 2 credentialsHow to register a Slack developer account and get OAuth 2 credentialsHow to Register a Workday Developer App and Get OAUTH2 CredentialsHow to Register a Workday Developer App and Get OAUTH2/ SOAP CredentialsHow to Register a ZendeskSell Developer App and Get OAUTH2 CredentialsHow to Register a Zoho Developer App and Get OAUTH2 CredentialsHow to Register an ADP Developer App and Get OAUTH2 CredentialsHow to Register an Atlassian Developer App and Get OAUTH2 CredentialsHow to Register your Facebook OAuth2 ApplicationHow to Register your Google Ads OAuth2 ApplicationHow to Register your MetaAds OAuth2 applicationHow To Request & Write Raw Integration DataHow to Retrieve Microsoft Dynamics 365 Business Central CredentialsHow to set up a custom API URL with a CNAMEHow to Set Up a Google Meet Meeting Bot with UnifiedHow to set up a HiBob marketplace installHow to Set Up a Microsoft Teams Bot with UnifiedHow to Set Up a Microsoft Teams Meeting Bot with UnifiedHow to Set Up a Webex Meeting Bot with UnifiedHow to Set Up a Zoom Meeting Bot with UnifiedHow to set up and configure NotionHow to set up Google Business Profile API access and get OAuth 2 credentialsHow to Set Up LinkedIn Webhooks with UnifiedHow to set up native webhooks for QuickBooks Online with UnifiedHow to set up Slack webhooks using event subscriptionsHow to set up Telegram (bot) with Unified.toHow to set up your scopes in HubSpotHow to setup a Freshbooks developer appHow to setup a TikTok Shop applicationHow to Setup AWS Assume Role for AWS Secret ManagerHow to setup Oracle JD EdwardsHow to Setup Quickbooks DesktopHow to setup Sage 100 with Unified.toHow to test webhooks in the Synthetic Data (Sandbox) environmentHow to troubleshoot unhealthy connectionsHow to troubleshoot unhealthy webhooksHow to Use Decision Models with the Unified GenAI APIHow to use SCIM with the Unified APIHow to use the Passthrough APIHow to Use Unified.to's Generative AI API with OpenAI and ClaudeHow to use User Provisioning and Verification with UnifiedHow virtual webhook retry and recovery worksIntegration set-up guide for LeverManaging custom validation rules in SalesforceNetSuite Authentication Setup for UnifiedNotice of Deprecation of Fields and Objects (Nov 2025)Oracle HCM / Taleo OAuth Credentials GuideRetrieval-Augmented Generation (RAG)SalesForce (External Client Apps) on Multiple OrganizationsSAML Single-Sign-OnScaling MCP Tools with Anthropic's (& OpenAI's) Defer LoadingScaling MCP Tools with Anthropic's Programmatic Tool CallingSet Environments for your Unified.to WorkspaceSetting up a Slack Bot Connection with Unified.toSetting up OAuth 2 Credentials for Greenhouse's APIsTrello Connection Guide in UnifiedUnderstanding OAuth2 Authorization flowsUnderstanding Response Time Headers in the Unified APIUnified's MCP ServerUnified MCP Server with LangChain and LangGraphUnlock real-time data with virtual webhooksUse Unified to sign in your users into your applicationVincere OAuth Setup Guide for UnifiedWorkable: Creating candidates and attaching them to jobsWorkday vs Workday Legacy — Why Unified.to Supports BothWorking with hierarchical tree data in Storage, Messaging, and KMS APIs
Are we missing anything? Let us know
Was this page helpful?