SolidATS App Integration API
SolidATS App Integration API Reference
This documentation provides detailed information about the SolidATS API for developers building app integrations.
Authentication
All API requests require authentication using an API key that you receive when you register your app in the SolidATS marketplace.
Authorization: Bearer YOUR_API_KEY
Webhook Endpoints
Receiving Assessment Requests
Your app must expose a webhook endpoint to receive assessment requests from SolidATS.
URL: Your specified webhook URL (configured during app registration) Method: POST Content-Type: application/json
Request Payload Schema
{ v?: string // API version field to handle schema evolution job: { description: string skills: { slug: string // Skill slug exp_level: 1|2|3|4 // 1 = just scratched the surface; 2 = using occasianaly, from time to time; 3 = strong theory and practice; 4 = this is my day to day used skill } // Skills are what is expected of the candidate to know for the job and at what level prompt: string // Additional job prompt for the position } // Job details candidate_id: string // Candidate ID on the system candidate_parsed_cv: { summary?: string // If there was a summary in the CV or cover letter from the application education: [string] // Education details, like schools, colleges, universities, etc. experience: [string] // Jobs with titles, time ranges, descriptions hobbies: [string] // Hobbies or other activities listed if found raw: string // Whole CV as text, just in case there were some other good details } // Anonymized and structured CV information of the candidate application_form: { ...object // Custom form questions skills: [ // Candidate will be able to add limited number of primary skills { slug: string // Skill slug exp_level: 1|2|3|4 // 1 = just scratched the surface; 2 = using occasianaly, from time to time; 3 = strong theory and practice; 4 = this is my day to day used skill } ] } // Information provided by the candidate pipeline_step_id: string // ID of the step on the pipeline, so we could map back the results call_secret: string // Additional, unique secret to verify the response is from intended source current_rating?: number // If user has a rating, it will be shown here. Rating goes 0..100 step_prompt?: string // Some pipeline step can have additional prompt integration_config: object // Each registered app has config schema, which is configured when app is installed to the team comments: [{ created_at: DateTime // When it was made content: string // Text of comment is_human_created: bool // Was it written by the human or other app }] // All the previously written comments about the candidate context: [object] // All previous assessment additional context created_at: DateTime // Just a timestamp when this request was issued}
Responding to Assessment Requests
Your app can respond in two ways:
- Synchronous response: Return the assessment result directly in the webhook response
- Asynchronous response: Return a 202 Accepted status and later submit results to the SolidATS callback endpoint
Response Schema
{ // Required fields (must be included in response) candidate_id: string // Candidate ID on the system; must match the ID from the request pipeline_step_id: string // ID of the step on the pipeline; must match the ID from the request call_secret: string // Secret verification token; must match the token from the request rating: number // Assessment rating score between 0-100
// Optional fields (can be included but not required) v?: string // API version field to handle schema evolution app_id?: string // Your APP ID on the system (optional but helpful for tracking) context?: object // Assessment additional context (results, notes, artifacts, etc.) comment?: string // Comment about the assessment result status?: any // Status of assessment (any format is accepted, not validated) failure_details?: string // Details about any failures during assessment created_at?: string|DateTime // Timestamp when the response was generated}
Response Format Flexibility
The system accepts several response formats for maximum compatibility:
- Standard object response:
{ "candidate_id": "test_123", "pipeline_step_id": "step_456", "call_secret": "abc123xyz", "rating": 85, "comment": "Great candidate!"}
- Array of responses (first item will be used):
[ { "candidate_id": "test_123", "pipeline_step_id": "step_456", "call_secret": "abc123xyz", "rating": 85 }]
- Nested response under “output” key:
{ "output": { "candidate_id": "test_123", "pipeline_step_id": "step_456", "call_secret": "abc123xyz", "rating": 85 }}
The system will automatically sanitize and normalize these different formats before processing.
Validation Notes
- Required fields must be present and valid; responses will be rejected if these are missing
- Field matching: The
candidate_id
,pipeline_step_id
, andcall_secret
values must match those from the original request - Rating: Must be a number between 0-100
- Status: Any value is accepted (string, number, etc.) and is not validated
- app_id: Optional identifier to help with tracking and debugging
Asynchronous Callback
For assessments that take longer to process, use the asynchronous pattern.
URL: https://api.solidats.com/webhook/app-callback Method: POST Content-Type: application/json Headers:
- Authorization: Bearer YOUR_API_KEY
- X-SolidATS-App-ID: YOUR_APP_ID
The request body should match the Response Schema above.
Status Codes
- 200 OK: Assessment completed successfully
- 202 Accepted: Assessment in progress (for async processing)
- 400 Bad Request: Invalid payload
- 401 Unauthorized: Authentication failed
- 403 Forbidden: Insufficient permissions
- 404 Not Found: Resource not found
- 500 Internal Server Error: Server-side error
Implementation Examples
Node.js Example (Express)
const express = require('express');const app = express();app.use(express.json());
app.post('/webhook/assessment', (req, res) => { const { candidate_id, pipeline_step_id, call_secret, candidate_parsed_cv, application_form, integration_config, job } = req.body;
// Process assessment // ...
// Return immediate response res.json({ app_id: 'your-app-id', candidate_id, pipeline_step_id, call_secret, rating: 85, // 0-100 score based on your assessment context: { // Additional assessment data skills_matched: ['JavaScript', 'React', 'Node.js'], strengths: ['Problem solving', 'Communication'], areas_for_improvement: ['Database design'] }, comment: 'Strong candidate with excellent frontend skills. Consider for technical interview.', status: 200 });});
app.listen(3000, () => { console.log('Assessment webhook server running on port 3000');});
Python Example (Flask)
from flask import Flask, request, jsonifyimport jsonfrom datetime import datetime
app = Flask(__name__)
@app.route('/webhook/assessment', methods=['POST'])def process_assessment(): data = request.get_json()
# Extract necessary information candidate_id = data.get('candidate_id') pipeline_step_id = data.get('pipeline_step_id') call_secret = data.get('call_secret') parsed_cv = data.get('candidate_parsed_cv', {}) application_form = data.get('application_form', {}) job_details = data.get('job', {})
# Process assessment # ...
# Return assessment result return jsonify({ 'candidate_id': candidate_id, 'pipeline_step_id': pipeline_step_id, 'call_secret': call_secret, 'rating': 78, 'app_id': 'your-app-id', # Optional but helpful for tracking 'context': { 'assessment_details': 'Custom assessment data' }, 'comment': 'Candidate shows promising skills in data analysis.', 'status': 200, 'created_at': datetime.now().isoformat() })
if __name__ == '__main__': app.run(debug=True, port=5000)