### Create Your First Interview Source: https://github.com/canmehmetjs/boooply-sdk-documentation/blob/main/content/getting-started.mdx Create a new AI interview with specified job role, candidate details, skills, and duration. Logs the meeting code and URL. ```javascript const interview = await client.interviews.create({ type: 'ai', jobRole: 'Frontend Engineer', candidate: { name: 'Jane Doe', email: 'jane@example.com', }, skills: ['React', 'TypeScript', 'CSS'], durationMinutes: 20, }); console.log('Interview created:', interview.meetingCode); console.log('Send this URL to the candidate:', interview.url); ``` -------------------------------- ### Initialize the Boooply Client Source: https://github.com/canmehmetjs/boooply-sdk-documentation/blob/main/content/getting-started.mdx Initialize the BoooplyClient with your API key and base URL. Includes an optional timeout setting. ```javascript const { BoooplyClient } = require('@boooply/ai-interviews-sdk'); const client = new BoooplyClient({ apiKey: process.env.BOOOPLY_API_KEY, baseUrl: process.env.BOOOPLY_BASE_URL, timeout: 30000, // optional, default 30s }); ``` -------------------------------- ### Install SDK Source: https://github.com/canmehmetjs/boooply-sdk-documentation/blob/main/content/index.mdx Install the Boooply AI Interviews SDK using npm. ```bash npm install @boooply/ai-interviews-sdk ``` -------------------------------- ### Environment Variables for API Key and Base URL Source: https://github.com/canmehmetjs/boooply-sdk-documentation/blob/main/content/getting-started.mdx Store your Boooply API key and base URL in your .env file for secure access. ```bash # Store in your .env file BOOOPLY_API_KEY=bply_org_xxxxxxxxxxxxx BOOOPLY_BASE_URL=https://api.meetings.boooply.com ``` -------------------------------- ### Full Integration Example Source: https://github.com/canmehmetjs/boooply-sdk-documentation/blob/main/content/sdk/platform-keys.mdx A full backend integration example demonstrating how to connect Boooply for a customer and then create an interview on their behalf. ```javascript // routes/integrations.js — your platform's backend const { BoooplyClient } = require('@boooply/ai-interviews-sdk'); // 1. Customer connects Boooply app.post('/api/connect-boooply', async (req, res) => { const customer = await getCustomer(req.user.orgId); const result = await BoooplyClient.createOrganizationApiKey( { baseUrl: 'https://api.meetings.boooply.com', platformKey: process.env.BOOOPLY_PLATFORM_KEY, }, { userId: req.user.id, userEmail: req.user.email, userName: req.user.name, organizationId: customer.id, organizationName: customer.name, } ); await db.update('customers', customer.id, { boooplyApiKey: result.apiKey }); res.json({ success: true, message: 'Boooply connected' }); }); // 2. Create interview on behalf of customer app.post('/api/interviews', async (req, res) => { const customer = await getCustomer(req.user.orgId); const client = new BoooplyClient({ apiKey: customer.boooplyApiKey, baseUrl: 'https://api.meetings.boooply.com', }); const interview = await client.interviews.create({ type: 'ai', jobRole: req.body.jobRole, candidate: req.body.candidate, skills: req.body.skills, }); res.json(interview); }); ``` -------------------------------- ### List Interviews Request Source: https://github.com/canmehmetjs/boooply-sdk-documentation/blob/main/content/api/interviews.mdx Example GET request to list interviews with query parameters. ```http GET /api/integration/interviews?status=COMPLETED&limit=20 ``` -------------------------------- ### Retrieve Interview Evaluation Source: https://github.com/canmehmetjs/boooply-sdk-documentation/blob/main/content/getting-started.mdx Get the evaluation results for a completed interview using its meeting code. Logs the overall score and recommendation. ```javascript const evaluation = await client.interviews.getEvaluation(interview.meetingCode); console.log('Score:', evaluation.overallScore); // 0-100 console.log('Recommendation:', evaluation.recommendation); // PASS | FAIL | REVIEW console.log('Communication:', evaluation.communication); console.log('Technical:', evaluation.technical); ``` -------------------------------- ### Example API Request with Bearer Token Source: https://github.com/canmehmetjs/boooply-sdk-documentation/blob/main/content/api/authentication.mdx This example shows how to make an API request using a Bearer token in the Authorization header. ```bash curl https://api.meetings.boooply.com/api/integration/interviews \ -H "Authorization: Bearer bply_org_xxxxxxxxxxxxx" ``` -------------------------------- ### Get Recording Response (with recording) Source: https://github.com/canmehmetjs/boooply-sdk-documentation/blob/main/content/api/interviews.mdx Example JSON response when a recording is available. ```json { "success": true, "recording": { "duration": 1234, "format": "mp4", "createdAt": "2026-04-01T14:30:00Z", "videoUrl": "https://s3.amazonaws.com/...?X-Amz-Expires=604800", "videoApiUrl": "https://api.meetings.boooply.com/api/integration/interviews/Boooply-AI-123/recording" } } ``` -------------------------------- ### Generate Job Description Example Source: https://github.com/canmehmetjs/boooply-sdk-documentation/blob/main/content/sdk/ai.mdx Example of how to use the `ai.generateJobDescription` function to create a job description. ```javascript const { description } = await client.ai.generateJobDescription({ jobRole: 'Senior Frontend Engineer', department: 'Engineering', skills: ['React', 'TypeScript', 'GraphQL'], seniority: 'SENIOR', workSetup: 'REMOTE', employmentType: 'FULL_TIME', }); console.log(description); // "We are looking for a Senior Frontend Engineer to join our Engineering team..." ``` -------------------------------- ### Get Participants Response Source: https://github.com/canmehmetjs/boooply-sdk-documentation/blob/main/content/api/interviews.mdx Example JSON response for retrieving interview participants. ```json { "success": true, "participants": [ { "id": "uuid", "name": "Jane Doe", "email": "jane@example.com", "role": "CANDIDATE", "joinToken": "abc123...", "joinedAt": "2026-04-01T14:00:00Z", "leftAt": null, "isActive": true } ], "total": 2 } ``` -------------------------------- ### Get Recording Response (no recording) Source: https://github.com/canmehmetjs/boooply-sdk-documentation/blob/main/content/api/interviews.mdx Example JSON response when no recording is available. ```json { "success": true, "recording": null, "message": "No recording available" } ``` -------------------------------- ### Create Interview Request Example Source: https://github.com/canmehmetjs/boooply-sdk-documentation/blob/main/content/api/interviews.mdx Example cURL request to create an AI-only interview for a Frontend Engineer role. ```bash curl -X POST https://api.meetings.boooply.com/api/integration/interviews \ -H "Authorization: Bearer bply_..." \ -H "Content-Type: application/json" \ -d '{ "meetingType": "AI_ONLY", "jobRole": "Frontend Engineer", "participants": [ { "name": "Jane Doe", "email": "jane@example.com", "role": "CANDIDATE" } ], "skills": ["React", "TypeScript"], "durationMinutes": 20 }' ``` -------------------------------- ### Create an AI Interview Source: https://github.com/canmehmetjs/boooply-sdk-documentation/blob/main/content/index.mdx Create an AI interview using the Boooply SDK. This example shows how to initialize the client and create an interview in one call. ```javascript const { BoooplyClient } = require('@boooply/ai-interviews-sdk'); const client = new BoooplyClient({ apiKey: 'bply_...', baseUrl: 'https://api.meetings.boooply.com', }); // Create an AI interview in one call const interview = await client.interviews.create({ type: 'ai', jobRole: 'Frontend Engineer', candidate: { name: 'Jane Doe', email: 'jane@example.com' }, skills: ['React', 'TypeScript'], durationMinutes: 20, }); console.log(interview.url); // Send this URL to the candidate ``` -------------------------------- ### Get Evaluation Response Example Source: https://github.com/canmehmetjs/boooply-sdk-documentation/blob/main/content/api/evaluation.mdx Example JSON response structure for the Get Evaluation endpoint. ```json { "recommendation": "PASS", "overallScore": 82, "communication": 85, "technical": 78, "cultureFit": 90, "questionEvaluations": [ { "question": "Tell me about your React experience", "score": 8, "feedback": "Strong understanding of React hooks and state management" } ] } ``` -------------------------------- ### Webhook Payload Example Source: https://github.com/canmehmetjs/boooply-sdk-documentation/blob/main/content/webhooks.mdx An example JSON payload for the `interview.recording` event, detailing the data structure and available URLs. ```json { "event": "interview.recording", "data": { "meetingCode": "Boooply-AI-1234567890", "title": "Senior Frontend Engineer Interview", "source": "Acme Corp", "sourceId": "org_7234567890", "sourcePlatform": "AI TalentFlow", "duration": 1234, "format": "mp4", "videoUrl": "https://s3.amazonaws.com/...?X-Amz-Expires=604800&...", "videoApiUrl": "https://api.meetings.boooply.com/api/integration/interviews/Boooply-AI-1234567890/recording", "timestamp": "2026-03-21T18:40:00.000Z" } } ``` -------------------------------- ### Create Organization API Key for a Customer Source: https://github.com/canmehmetjs/boooply-sdk-documentation/blob/main/content/api/authentication.mdx Example of creating a unique API key for a customer organization when they connect Boooply through your platform. The generated key should be stored in your database. ```javascript // When a customer connects Boooply in your platform const result = await BoooplyClient.createOrganizationApiKey( { baseUrl: 'https://api.meetings.boooply.com', platformKey: process.env.BOOOPLY_PLATFORM_KEY, }, { userId: customer.id, userEmail: customer.email, userName: customer.name, organizationId: customer.orgId, organizationName: customer.companyName, } ); // Store this — use it for all API calls on behalf of this customer await db.saveBoooplyApiKey(customer.orgId, result.apiKey); ``` -------------------------------- ### Using the Org Key Source: https://github.com/canmehmetjs/boooply-sdk-documentation/blob/main/content/sdk/platform-keys.mdx Example of initializing BoooplyClient with a customer's stored organization key to perform operations scoped to that customer's organization. ```javascript // For each customer, use their stored org key const client = new BoooplyClient({ apiKey: customer.boooplyApiKey, // the key you stored from createOrganizationApiKey() baseUrl: 'https://api.meetings.boooply.com', }); // Now all operations are scoped to that customer's organization const interview = await client.interviews.create({ type: 'ai', jobRole: 'Frontend Engineer', candidate: { name: 'Jane', email: 'jane@example.com' }, }); ``` -------------------------------- ### Webhook Payload Example Source: https://github.com/canmehmetjs/boooply-sdk-documentation/blob/main/content/guides/ai-interview.mdx Example of the JSON payload received by a webhook endpoint when an evaluation is completed. ```json { "event": "evaluation.completed", "data": { "meetingCode": "Boooply-AI-1234567890", "evaluation": { "overallScore": 82, "recommendation": "PASS" } } } ``` -------------------------------- ### Example Error Response Source: https://github.com/canmehmetjs/boooply-sdk-documentation/blob/main/content/api/errors.mdx An example of a JSON error response from the API. ```json { "success": false, "error": "Invalid or inactive API key.", "code": "INVALID_API_KEY" } ``` -------------------------------- ### Response Body Example Source: https://github.com/canmehmetjs/boooply-sdk-documentation/blob/main/content/api/job-description.mdx Example JSON response from the job description generation API. ```json { "success": true, "description": "We are looking for a Senior Frontend Engineer to join our Engineering team..." } ``` -------------------------------- ### Request Body Example Source: https://github.com/canmehmetjs/boooply-sdk-documentation/blob/main/content/api/job-description.mdx Example JSON payload for the job description generation request. ```json { "jobRole": "Senior Frontend Engineer", "department": "Engineering", "skills": ["React", "TypeScript", "GraphQL"], "seniority": "SENIOR", "workSetup": "REMOTE", "employmentType": "FULL_TIME" } ``` -------------------------------- ### Get the results Source: https://github.com/canmehmetjs/boooply-sdk-documentation/blob/main/content/guides/ai-interview.mdx Fetches interview details and evaluation results after the interview is completed. ```javascript // Check if evaluation is ready const details = await client.interviews.get(interview.meetingCode); if (details.meeting.counts.hasEvaluation) { const evaluation = await client.interviews.getEvaluation(interview.meetingCode); console.log('Recommendation:', evaluation.recommendation); // PASS | FAIL | REVIEW console.log('Overall Score:', evaluation.overallScore); // 0-100 console.log('Communication:', evaluation.communication); console.log('Technical:', evaluation.technical); console.log('Culture Fit:', evaluation.cultureFit); } // Get the full transcript const { transcript } = await client.interviews.getTranscript(interview.meetingCode); ``` -------------------------------- ### Get Interviewer Availability - Calendar Connected Response Source: https://github.com/canmehmetjs/boooply-sdk-documentation/blob/main/content/api/interviews.mdx Example JSON response when the interviewer's Google Calendar is connected. ```json { "success": true, "calendarConnected": true, "email": "bob@company.com", "durationMinutes": 30, "days": 14, "slots": [ { "start": "2026-04-01T09:00:00Z", "end": "2026-04-01T09:30:00Z" }, { "start": "2026-04-01T09:30:00Z", "end": "2026-04-01T10:00:00Z" } ], "total": 42 } ``` -------------------------------- ### Get Interviewer Availability - Calendar Not Connected Response Source: https://github.com/canmehmetjs/boooply-sdk-documentation/blob/main/content/api/interviews.mdx Example JSON response when the interviewer's Google Calendar is not connected. ```json { "success": true, "calendarConnected": false, "slots": [], "message": "This user has not connected their Google Calendar in Boooply. You can provide availableSlots directly when creating the interview." } ``` -------------------------------- ### Transcript Response Example Source: https://github.com/canmehmetjs/boooply-sdk-documentation/blob/main/content/api/transcript.mdx An example of the JSON response structure for the transcript API. ```json { "transcript": [ { "speaker": "AI Interviewer", "role": "AI", "content": "Tell me about your experience with React.", "timestamp": "2026-03-21T14:00:05Z" }, { "speaker": "Jane Doe", "role": "CANDIDATE", "content": "I've been working with React for about 4 years...", "timestamp": "2026-03-21T14:00:12Z" } ] } ``` -------------------------------- ### Create Organization API Key Source: https://github.com/canmehmetjs/boooply-sdk-documentation/blob/main/content/sdk/platform-keys.mdx Example of creating an organization-specific API key using BoooplyClient.createOrganizationApiKey. This is called once per customer when they connect Boooply in your platform. ```javascript const { BoooplyClient } = require('@boooply/ai-interviews-sdk'); // Called when a customer clicks "Connect Boooply" in your platform const result = await BoooplyClient.createOrganizationApiKey( { baseUrl: 'https://api.meetings.boooply.com', platformKey: process.env.BOOOPLY_PLATFORM_KEY, }, { userId: '12345', userEmail: 'admin@acme.com', userName: 'Jane Admin', organizationId: 'org_7234567890', // your platform's org ID organizationName: 'Acme Corporation', teamMembers: [ // optional — import team { email: 'bob@acme.com', name: 'Bob', role: 'ADMIN' }, { email: 'carol@acme.com', name: 'Carol', role: 'MEMBER' }, ], } ); // Store this key — use it for all API calls on behalf of this customer const orgApiKey = result.apiKey; // 'bply_org_xxxxx' await db.saveBoooplyKey(customerId, orgApiKey); ``` -------------------------------- ### Get Interview Transcript Source: https://github.com/canmehmetjs/boooply-sdk-documentation/blob/main/content/sdk/interviews.mdx Fetches the full conversation transcript for an interview. ```javascript const { transcript } = await client.interviews.getTranscript('Boooply-AI-1234567890'); // transcript = [{ speaker, role, content, timestamp }, ...] ``` -------------------------------- ### Node.js Webhook Verification and Handling Source: https://github.com/canmehmetjs/boooply-sdk-documentation/blob/main/content/webhooks.mdx Example implementation in Node.js using Express to verify webhook signatures and process different event types. ```javascript const crypto = require('crypto'); function verifyWebhookSignature(payload, signature, secret) { const expected = crypto .createHmac('sha256', secret) .update(JSON.stringify(payload)) .digest('hex'); return crypto.timingSafeEqual( Buffer.from(signature), Buffer.from(expected) ); } // Express example app.post('/webhooks/boooply', express.json(), (req, res) => { const signature = req.headers['x-boooply-signature']; const isValid = verifyWebhookSignature(req.body, signature, process.env.BOOOPLY_WEBHOOK_SECRET); if (!isValid) { return res.status(401).send('Invalid signature'); } const { event, data } = req.body; switch (event) { case 'interview.evaluation': console.log(`Score: ${data.overallRating}/100 — ${data.recommendation}`); console.log(`Organization: ${data.sourceId}`); // your org ID break; case 'interview.transcript': console.log(`Transcript: ${data.transcriptCount} messages`); break; case 'interview.scores': console.log(`Technical: ${data.technical}, Communication: ${data.communication}`); break; case 'interview.recording': console.log(`Recording: ${data.videoApiUrl}`); break; } res.status(200).send('OK'); }); ``` -------------------------------- ### interview.transcript payload Source: https://github.com/canmehmetjs/boooply-sdk-documentation/blob/main/content/webhooks.mdx Example payload for the `interview.transcript` event, which is fired after transcription completes. ```json { "event": "interview.transcript", "data": { "meetingCode": "Boooply-AI-1234567890", "title": "Senior Frontend Engineer Interview", "meetingType": "AI_ONLY", "isTeamMeeting": false, "candidateName": "Jane Doe", "jobRole": "Senior Frontend Engineer", "source": "Acme Corp", "sourceId": "org_7234567890", "sourcePlatform": "AI TalentFlow", "transcript": [ { "speaker": "AI Interviewer", "text": "Tell me about your experience with React.", "startMs": 12400 }, { "speaker": "Jane Doe", "text": "I've been working with React for 5 years...", "startMs": 15200, "endMs": 28900 } ], "transcriptCount": 24, "timestamp": "2026-03-21T18:30:00.000Z" } } ``` -------------------------------- ### Get Interview Participants Source: https://github.com/canmehmetjs/boooply-sdk-documentation/blob/main/content/sdk/interviews.mdx Retrieves all participants associated with an interview. ```javascript const { participants } = await client.interviews.getParticipants('Boooply-AI-1234567890'); // [{ id, name, email, role, joinToken, joinedAt, leftAt, isActive }] ``` -------------------------------- ### Get Transcript Endpoint Source: https://github.com/canmehmetjs/boooply-sdk-documentation/blob/main/content/api/transcript.mdx The GET endpoint to retrieve the full interview transcript with speaker attribution. ```http GET /api/integration/interviews/:meetingCode/transcript ``` -------------------------------- ### Get Recording Source: https://github.com/canmehmetjs/boooply-sdk-documentation/blob/main/content/sdk/interviews.mdx Retrieves the video recording for a completed interview using the meeting code. ```javascript const { recording } = await client.interviews.getRecording('Boooply-AI-1234567890'); if (recording) { console.log(recording.videoUrl); // pre-signed S3 URL (7 days) console.log(recording.videoApiUrl); // stable URL (always works) console.log(recording.duration); // seconds console.log(recording.format); // 'mp4' } ``` -------------------------------- ### Get Interview Evaluation Source: https://github.com/canmehmetjs/boooply-sdk-documentation/blob/main/content/sdk/interviews.mdx Retrieves AI-generated evaluation and scores for a completed interview. ```javascript const evaluation = await client.interviews.getEvaluation('Boooply-AI-1234567890'); // { recommendation: 'PASS', overallScore: 82, communication: 85, technical: 78, cultureFit: 90 } ``` -------------------------------- ### Get Interview Details Source: https://github.com/canmehmetjs/boooply-sdk-documentation/blob/main/content/sdk/interviews.mdx Retrieves full details for a specific interview using its meeting code. ```javascript const interview = await client.interviews.get('Boooply-AI-1234567890'); ``` -------------------------------- ### Get Interviewer Availability Endpoint Source: https://github.com/canmehmetjs/boooply-sdk-documentation/blob/main/content/api/interviews.mdx The GET endpoint to fetch available time slots for an interviewer. ```http GET /api/integration/availability?email=bob@company.com&duration=30&days=14 ``` -------------------------------- ### Get Organization Details Source: https://github.com/canmehmetjs/boooply-sdk-documentation/blob/main/content/sdk/organization.mdx Retrieves the current organization's details, including its name and slug. ```javascript const org = await client.organization.get(); console.log(org.name); console.log(org.slug); ``` -------------------------------- ### Error Handling in JavaScript Source: https://github.com/canmehmetjs/boooply-sdk-documentation/blob/main/content/api/errors.mdx Example of how to handle API errors using a try-catch block in JavaScript. ```javascript try { const interview = await client.interviews.create({ ... }); } catch (error) { console.error(error.message); // 'Boooply API 400: {...}' console.error(error.status); // 400 console.error(error.response); // Full response } ``` -------------------------------- ### Get Availability Source: https://github.com/canmehmetjs/boooply-sdk-documentation/blob/main/content/sdk/interviews.mdx Fetches available time slots from a team member's Google Calendar connected in Boooply. ```javascript const { calendarConnected, slots } = await client.interviews.getAvailability({ email: 'bob@company.com', durationMinutes: 45, days: 7, }); if (calendarConnected && slots.length > 0) { // Use Boooply's calendar data to create an interview await client.interviews.create({ type: 'human', jobRole: 'Designer', durationMinutes: 45, schedulingMode: 'CANDIDATE_PICKS', availableSlots: slots, participants: [ { name: 'Jane', email: 'jane@example.com', role: 'CANDIDATE' }, { name: 'Bob', email: 'bob@company.com', role: 'INTERVIEWER' }, ], }); } else { // Calendar not connected — provide your own slots or use FIXED mode } ``` -------------------------------- ### Remove Participant Response Source: https://github.com/canmehmetjs/boooply-sdk-documentation/blob/main/content/api/interviews.mdx Example response for successfully removing a participant. ```json { "success": true, "message": "Participant Jane Doe removed" } ``` -------------------------------- ### Reschedule Interview Request Body Source: https://github.com/canmehmetjs/boooply-sdk-documentation/blob/main/content/api/interviews.mdx Example JSON payload for rescheduling an interview. ```json { "scheduledAt": "2026-04-05T14:00:00Z", "durationMinutes": 30, "reason": "Candidate requested" } ``` -------------------------------- ### Get Busy Blocks Endpoint Source: https://github.com/canmehmetjs/boooply-sdk-documentation/blob/main/content/api/interviews.mdx The GET endpoint to fetch raw busy time blocks from a team member's Google Calendar. ```http GET /api/integration/busy-blocks?email=bob@company.com&days=14 ``` -------------------------------- ### Get Busy Blocks Source: https://github.com/canmehmetjs/boooply-sdk-documentation/blob/main/content/sdk/interviews.mdx Fetches raw busy time blocks from a team member's Google Calendar for custom availability logic. ```javascript const { calendarConnected, busyBlocks, timezone } = await client.interviews.getBusyBlocks({ email: 'bob@company.com', days: 7, }); if (calendarConnected) { // Apply your own rules to compute available slots const slots = myScheduler.findOpenSlots(busyBlocks, { timezone }); } ``` -------------------------------- ### Cancel Interview Request Body Source: https://github.com/canmehmetjs/boooply-sdk-documentation/blob/main/content/api/interviews.mdx Example JSON payload for canceling an interview. ```json { "reason": "Position filled" } ``` -------------------------------- ### Response for Calendar Connection Status Source: https://github.com/canmehmetjs/boooply-sdk-documentation/blob/main/content/api/interviews.mdx Example JSON response indicating the status of a calendar connection, including busy blocks. ```json { "success": true, "calendarConnected": true, "email": "bob@company.com", "days": 14, "timezone": "Europe/Berlin", "busyBlocks": [ { "start": "2026-04-01T09:00:00Z", "end": "2026-04-01T10:00:00Z" }, { "start": "2026-04-01T13:00:00Z", "end": "2026-04-01T14:30:00Z" } ], "total": 18 } ``` -------------------------------- ### AI-generated questions only Source: https://github.com/canmehmetjs/boooply-sdk-documentation/blob/main/content/guides/custom-questions.mdx This code snippet shows how to create an interview where the AI generates all questions. The `aiGenerate` property is set to `true`, and the `skills` and `seniority` properties are provided to guide the AI's question generation. ```javascript const interview = await client.interviews.create({ type: 'ai', jobRole: 'Frontend Engineer', candidate: { name: 'Jane', email: 'jane@example.com' }, aiGenerate: true, skills: ['React', 'TypeScript', 'Performance'], seniority: 'SENIOR', }); ``` -------------------------------- ### Get Evaluation Endpoint Source: https://github.com/canmehmetjs/boooply-sdk-documentation/blob/main/content/api/evaluation.mdx Endpoint to retrieve AI-generated evaluation scores and analysis for a completed interview. ```http GET /api/integration/interviews/:meetingCode/evaluation ``` -------------------------------- ### Create a human interview Source: https://github.com/canmehmetjs/boooply-sdk-documentation/blob/main/content/guides/human-interview.mdx Set up a video interview between a candidate and human interviewers, with AI-powered transcription and analysis. ```javascript const interview = await client.interviews.create({ type: 'human', jobRole: 'Product Manager', scheduledAt: '2026-04-01T14:00:00Z', durationMinutes: 45, participants: [ { name: 'Jane Doe', email: 'jane@example.com', role: 'CANDIDATE' }, { name: 'Bob Smith', email: 'bob@company.com', role: 'INTERVIEWER' }, { name: 'Alice Chen', email: 'alice@company.com', role: 'INTERVIEWER' }, ], skills: ['Product Strategy', 'User Research', 'Agile'], questions: [ 'Walk me through a product launch you led', 'How do you prioritize features?', ], }); ``` -------------------------------- ### Create the interview Source: https://github.com/canmehmetjs/boooply-sdk-documentation/blob/main/content/guides/ai-interview.mdx Creates a new AI interview with specified parameters. ```javascript const interview = await client.interviews.create({ type: 'ai', jobRole: 'Senior Frontend Engineer', candidate: { name: 'Jane Doe', email: 'jane@example.com', }, // Optional: provide CV for smarter questions candidateCV: resumeText, // Optional: specify what to evaluate skills: ['React', 'TypeScript', 'System Design'], seniority: 'SENIOR', department: 'Engineering', // Optional: set duration (default: 30 min) durationMinutes: 25, // Optional: let AI generate questions based on the role aiGenerate: true, // Optional: add your own questions too questions: [ 'Describe a complex React architecture you built', 'How do you approach code reviews?', ], }); ``` -------------------------------- ### AI Interview — full options Source: https://github.com/canmehmetjs/boooply-sdk-documentation/blob/main/content/sdk/interviews.mdx Creates an AI interview with a comprehensive set of options, including candidate CV, skills, seniority, job description, and AI-driven question generation. ```javascript // AI Interview — full options const interview = await client.interviews.create({ type: 'ai', jobRole: 'Senior Frontend Engineer', companyName: 'Acme Corp', candidate: { name: 'Jane Doe', email: 'jane@example.com' }, candidateCV: 'Full resume text here...', skills: ['React', 'TypeScript', 'GraphQL'], seniority: 'SENIOR', department: 'Engineering', jobDescription: 'We are looking for a senior frontend engineer...', workSetup: 'REMOTE', employmentType: 'FULL_TIME', durationMinutes: 25, evaluationFocus: 'knowledge', sendCandidateFeedback: true, aiGenerate: true, externalJobId: 'job_abc123', }); ``` -------------------------------- ### VS Code Configuration Source: https://github.com/canmehmetjs/boooply-sdk-documentation/blob/main/content/mcp.mdx Configuration for VS Code to integrate with the Boooply MCP server. ```json { "servers": { "boooply": { "type": "stdio", "command": "npx", "args": ["-y", "@boooply/mcp-server@latest"], "env": { "BOOOPLY_API_KEY": "bply_...", "BOOOPLY_API_URL": "https://api.meetings.boooply.com" } } } } ``` -------------------------------- ### Claude Desktop Configuration Source: https://github.com/canmehmetjs/boooply-sdk-documentation/blob/main/content/mcp.mdx Configuration for Claude Desktop to integrate with the Boooply MCP server. ```json { "mcpServers": { "boooply": { "command": "npx", "args": ["-y", "@boooply/mcp-server@latest"], "env": { "BOOOPLY_API_KEY": "bply_...", "BOOOPLY_API_URL": "https://api.meetings.boooply.com" } } } } ``` -------------------------------- ### Human Interview Source: https://github.com/canmehmetjs/boooply-sdk-documentation/blob/main/content/sdk/interviews.mdx Creates a human-led interview, specifying the job role, scheduled time, and participants with their roles. ```javascript // Human Interview const interview = await client.interviews.create({ type: 'human', jobRole: 'Backend Engineer', scheduledAt: '2026-04-01T14:00:00Z', participants: [ { name: 'Jane Doe', email: 'jane@example.com', role: 'CANDIDATE' }, { name: 'Bob Smith', email: 'bob@company.com', role: 'INTERVIEWER' }, ], skills: ['Node.js', 'PostgreSQL'], }); ``` -------------------------------- ### Send the join URL to the candidate Source: https://github.com/canmehmetjs/boooply-sdk-documentation/blob/main/content/guides/ai-interview.mdx Retrieves the interview join URL and sends it to the candidate via email. ```javascript // The candidate opens this URL in their browser const joinUrl = interview.url; // Example: https://meetings.boooply.com/join/Boooply-AI-1234567890 // Send via your email system await sendEmail({ to: 'jane@example.com', subject: 'Your AI Interview is Ready', body: `Click here to start: ${joinUrl}`, }); ``` -------------------------------- ### SSE Mode Command Source: https://github.com/canmehmetjs/boooply-sdk-documentation/blob/main/content/mcp.mdx Command to run the MCP server in SSE (Server-Sent Events) mode for web-based clients. ```bash BOOOPLY_API_KEY=bply_... BOOOPLY_API_URL=https://api.meetings.boooply.com npx -y @boooply/mcp-server@latest --sse ``` -------------------------------- ### Team Meeting (with recording & transcription) Source: https://github.com/canmehmetjs/boooply-sdk-documentation/blob/main/content/sdk/interviews.mdx Creates a team meeting with a specified schedule, duration, participants, agenda, and enables transcription for recording and AI recap. ```javascript // Team Meeting (with recording & transcription) const meeting = await client.interviews.create({ type: 'team', scheduledAt: '2026-04-01T10:00:00Z', durationMinutes: 60, participants: [ { name: 'Alice', email: 'alice@company.com', role: 'HOST' }, { name: 'Bob', email: 'bob@company.com', role: 'PARTICIPANT' }, { name: 'Carol', email: 'carol@company.com', role: 'PARTICIPANT' }, ], agenda: ['Q1 review', 'Roadmap planning'], transcriptionEnabled: true, // video recording + post-meeting transcript & AI recap }); ``` -------------------------------- ### List Interviews Source: https://github.com/canmehmetjs/boooply-sdk-documentation/blob/main/content/sdk/interviews.mdx Lists interviews with optional filters for status, type, search, and pagination. ```javascript const { interviews, pagination } = await client.interviews.list({ status: 'COMPLETED', // SCHEDULED | ACTIVE | COMPLETED | CANCELLED type: 'AI_ONLY', // AI_ONLY | HUMAN search: 'frontend', // Search by role, candidate, email page: 1, limit: 20, }); ``` -------------------------------- ### Enable feedback Source: https://github.com/canmehmetjs/boooply-sdk-documentation/blob/main/content/guides/candidate-feedback.mdx Set `sendCandidateFeedback: true` when creating the interview: ```javascript const interview = await client.interviews.create({ type: 'ai', jobRole: 'Frontend Engineer', candidate: { name: 'Jane Doe', email: 'jane@example.com' }, sendCandidateFeedback: true, }); ``` -------------------------------- ### Add Participant to Interview Source: https://github.com/canmehmetjs/boooply-sdk-documentation/blob/main/content/sdk/interviews.mdx Adds new participants to an existing interview. ```javascript await client.interviews.addParticipant('Boooply-AI-1234567890', { participants: [ { name: 'New Person', email: 'new@company.com', role: 'INTERVIEWER' } ], }); ``` -------------------------------- ### Environment Variable for Platform Key Source: https://github.com/canmehmetjs/boooply-sdk-documentation/blob/main/content/api/authentication.mdx Stores the platform master key in an environment variable for platform integration. ```dotenv # .env (your platform backend) BOOOPLY_PLATFORM_KEY=bply_platform_xxxxxxxxxxxxx ``` -------------------------------- ### Pass CV as text Source: https://github.com/canmehmetjs/boooply-sdk-documentation/blob/main/content/guides/candidate-cv.mdx You can directly pass the candidate's CV as a string to the `candidateCV` field when creating an interview. ```javascript const interview = await client.interviews.create({ type: 'ai', jobRole: 'Backend Engineer', candidate: { name: 'Jane', email: 'jane@example.com' }, candidateCV: ` Jane Doe Senior Backend Engineer Experience: - 5 years at TechCorp building microservices with Node.js - Led migration from event-driven architecture - Managed team of 4 engineers Skills: Node.js, TypeScript, PostgreSQL, Redis, AWS, Docker Education: BS Computer Science, MIT `, }); ``` -------------------------------- ### Manual questions only Source: https://github.com/canmehmetjs/boooply-sdk-documentation/blob/main/content/guides/custom-questions.mdx This code snippet demonstrates how to create an interview with only manually provided questions. The `aiGenerate` property is set to `false`, and the `questions` array contains specific interview questions. ```javascript const interview = await client.interviews.create({ type: 'ai', jobRole: 'Frontend Engineer', candidate: { name: 'Jane', email: 'jane@example.com' }, aiGenerate: false, questions: [ 'What is your experience with React hooks?', 'How do you handle state management in large apps?', 'Describe your approach to testing React components', 'Tell me about a performance optimization you implemented', ], }); ``` -------------------------------- ### Both — your questions + AI questions Source: https://github.com/canmehmetjs/boooply-sdk-documentation/blob/main/content/guides/custom-questions.mdx This code snippet illustrates creating an interview that includes both custom questions and AI-generated questions. The `aiGenerate` property is `true`, and both `questions` and `skills` are provided. The AI will ask custom questions first, followed by generated ones. ```javascript const interview = await client.interviews.create({ type: 'ai', jobRole: 'Frontend Engineer', candidate: { name: 'Jane', email: 'jane@example.com' }, aiGenerate: true, questions: [ 'Tell me about our product X — what would you improve?', 'How would you approach migrating our jQuery codebase to React?', ], skills: ['React', 'TypeScript'], }); ``` -------------------------------- ### Trigger AI Analysis Source: https://github.com/canmehmetjs/boooply-sdk-documentation/blob/main/content/sdk/interviews.mdx Re-triggers AI analysis on a completed interview. ```javascript await client.interviews.triggerAnalysis('Boooply-AI-1234567890'); ``` -------------------------------- ### Environment Variable for Organization Key Source: https://github.com/canmehmetjs/boooply-sdk-documentation/blob/main/content/api/authentication.mdx Stores the organization API key in an environment variable for direct integration. ```dotenv # .env BOOOPLY_API_KEY=bply_org_xxxxxxxxxxxxx ``` -------------------------------- ### Parse CV from PDF first Source: https://github.com/canmehmetjs/boooply-sdk-documentation/blob/main/content/guides/candidate-cv.mdx If the CV is in PDF format, extract the text content first using a PDF parsing library before passing it to the `candidateCV` field. ```javascript // Use any PDF parser (pdf-parse, pdfjs-dist, etc.) const pdfParse = require('pdf-parse'); const fs = require('fs'); const pdfBuffer = fs.readFileSync('resume.pdf'); const { text } = await pdfParse(pdfBuffer); const interview = await client.interviews.create({ type: 'ai', jobRole: 'Frontend Engineer', candidate: { name: 'Jane', email: 'jane@example.com' }, candidateCV: text, }); ``` -------------------------------- ### mapMicrosoftParticipant Source: https://github.com/canmehmetjs/boooply-sdk-documentation/blob/main/content/sdk/mappers.mdx Map a Microsoft user to a Boooply participant. ```javascript const { mapMicrosoftParticipant } = require('@boooply/ai-interviews-sdk'); const participant = mapMicrosoftParticipant({ displayName: 'Bob Johnson', mail: 'bob@company.com', id: 'ms-user-id-456', role: 'HOST', }); ``` -------------------------------- ### Create Interview Endpoint Source: https://github.com/canmehmetjs/boooply-sdk-documentation/blob/main/content/api/interviews.mdx The POST endpoint for creating a new interview. ```http POST /api/integration/interviews ``` -------------------------------- ### Create a Team Meeting Source: https://github.com/canmehmetjs/boooply-sdk-documentation/blob/main/content/guides/team-meeting.mdx Creates a new team meeting with specified parameters. ```javascript const meeting = await client.interviews.create({ type: 'team', scheduledAt: '2026-04-01T10:00:00Z', durationMinutes: 60, participants: [ { name: 'Alice', email: 'alice@company.com', role: 'HOST' }, { name: 'Bob', email: 'bob@company.com', role: 'PARTICIPANT' }, { name: 'Carol', email: 'carol@company.com', role: 'PARTICIPANT' }, ], agenda: ['Q1 review', 'Roadmap planning', 'Hiring updates'], transcriptionEnabled: true, }); ``` -------------------------------- ### Reschedule Interview Source: https://github.com/canmehmetjs/boooply-sdk-documentation/blob/main/content/sdk/interviews.mdx Reschedules an existing interview to a new time and duration. ```javascript await client.interviews.reschedule('Boooply-AI-1234567890', { scheduledAt: '2026-04-05T14:00:00Z', durationMinutes: 30, reason: 'Candidate requested new time', }); ``` -------------------------------- ### mapGoogleParticipant Source: https://github.com/canmehmetjs/boooply-sdk-documentation/blob/main/content/sdk/mappers.mdx Map a Google OAuth user to a Boooply participant. ```javascript const { mapGoogleParticipant } = require('@boooply/ai-interviews-sdk'); const participant = mapGoogleParticipant({ name: 'Jane Smith', email: 'jane@gmail.com', id: 'google-user-id-123', picture: 'https://...', role: 'INTERVIEWER', // optional, defaults to INTERVIEWER }); ``` -------------------------------- ### Accessing Results Source: https://github.com/canmehmetjs/boooply-sdk-documentation/blob/main/content/guides/team-meeting.mdx Retrieves meeting details and transcript. ```javascript // Get meeting details (includes recap, transcript count, video URL) const details = await client.interviews.get('Team-1234567890'); // Get transcript const { transcript } = await client.interviews.getTranscript('Team-1234567890'); // transcript: [{ speaker: 'Alice', content: 'Let's start...', startMs: 1000, endMs: 3500 }, ...] ``` -------------------------------- ### mapGenericParticipant Source: https://github.com/canmehmetjs/boooply-sdk-documentation/blob/main/content/sdk/mappers.mdx Map any external user to a Boooply participant. ```javascript const { mapGenericParticipant } = require('@boooply/ai-interviews-sdk'); const participant = mapGenericParticipant({ name: 'John Doe', email: 'john@example.com', externalUserId: '12345', authProvider: 'YOUR_PLATFORM', role: 'CANDIDATE', }); ``` -------------------------------- ### interview.evaluation Event Payload Source: https://github.com/canmehmetjs/boooply-sdk-documentation/blob/main/content/webhooks.mdx This JSON payload is fired after AI analysis completes, including the full evaluation details. ```json { "event": "interview.evaluation", "data": { "meetingCode": "Boooply-AI-1234567890", "title": "Senior Frontend Engineer Interview", "meetingType": "AI_ONLY", "candidateName": "Jane Doe", "jobRole": "Senior Frontend Engineer", "source": "Acme Corp", "sourceId": "org_7234567890", "sourcePlatform": "AI TalentFlow", "summary": "Jane demonstrated strong technical skills in React and TypeScript...", "oneLineSummary": "Strong React skills but needs improvement in system design", "overallRating": 3, "recommendation": "PASS", "confidenceLevel": "HIGH", "scores": { "overall": 72, "communication": 80, "technicalSkills": 70, "problemSolving": 65, "cultureFit": 85, "experienceMatch": 70 }, "recruiterSummary": { "tldr": "Solid mid-level React developer", "quickDecision": "ADVANCE" }, "skillsAssessment": [ { "skill": "React", "rating": 4, "evidence": "Explained hooks and context API well" } ], "strengthsAndWeaknesses": { "strengths": [{ "point": "Strong React fundamentals", "evidence": "..." }], "weaknesses": [{ "point": "Limited system design", "evidence": "..." }] }, "redFlags": [{ "flag": "Vague on past projects", "severity": "WARNING", "context": "..." }], "positiveSignals": [{ "signal": "Enthusiastic about the role", "context": "..." }], "sentimentAnalysis": { "enthusiasm": "HIGH", "authenticity": "GENUINE", "stressLevel": "LOW" }, "questionsAsked": [ { "topic": "Technical", "question": "How do you handle state?", "candidateAnswer": "...", "answerQuality": 4, "timestamp": "02:15" } ], "nextSteps": { "recommendation": "Proceed to technical round", "questionsToAsk": ["Describe a system you designed"], "focusAreasForNextRound": ["System design", "TypeScript generics"] }, "ratingsForRecruiters": { "technicalSkills": 70, "communication": 80, "cultureFit": 85, "overall": 72 }, "timestamp": "2026-03-21T18:35:00.000Z" } } ``` -------------------------------- ### Generate Job Description Endpoint Source: https://github.com/canmehmetjs/boooply-sdk-documentation/blob/main/content/api/job-description.mdx The POST endpoint for generating a job description. ```http POST /api/integration/generate-job-description ``` -------------------------------- ### Trigger Analysis Endpoint Source: https://github.com/canmehmetjs/boooply-sdk-documentation/blob/main/content/api/evaluation.mdx Endpoint to re-run AI analysis on a completed interview. ```http POST /api/integration/interviews/:meetingCode/analyze ``` -------------------------------- ### Delete Interview Source: https://github.com/canmehmetjs/boooply-sdk-documentation/blob/main/content/sdk/interviews.mdx Permanently deletes an interview and all associated data. ```javascript await client.interviews.delete('Boooply-AI-1234567890'); ``` -------------------------------- ### interview.scores Event Payload Source: https://github.com/canmehmetjs/boooply-sdk-documentation/blob/main/content/webhooks.mdx This JSON payload is fired alongside 'evaluation' and contains a lightweight payload with just the numerical scores. ```json { "event": "interview.scores", "data": { "meetingCode": "Boooply-AI-1234567890", "candidateName": "Jane Doe", "jobRole": "Senior Frontend Engineer", "source": "Acme Corp", "sourceId": "org_7234567890", "sourcePlatform": "AI TalentFlow", "overallRating": 3, "recommendation": "PASS", "confidenceLevel": "HIGH", "scores": { "overall": 72, "communication": 80, "technicalSkills": 70, "problemSolving": 65, "cultureFit": 85, "experienceMatch": 70 }, "ratingsForRecruiters": { "technicalSkills": 70, "communication": 80, "cultureFit": 85, "overall": 72 }, "oneLineSummary": "Strong React skills but needs improvement in system design", "timestamp": "2026-03-21T18:35:00.000Z" } } ``` -------------------------------- ### Cancel Interview Source: https://github.com/canmehmetjs/boooply-sdk-documentation/blob/main/content/sdk/interviews.mdx Cancels an interview, optionally providing a reason. ```javascript await client.interviews.cancel('Boooply-AI-1234567890', 'Position filled'); ``` -------------------------------- ### Remove Participant from Interview Source: https://github.com/canmehmetjs/boooply-sdk-documentation/blob/main/content/sdk/interviews.mdx Removes a participant from an interview using their participant ID. ```javascript await client.interviews.removeParticipant('Boooply-AI-1234567890', 'participant-uuid'); ``` -------------------------------- ### Python Webhook Signature Verification Source: https://github.com/canmehmetjs/boooply-sdk-documentation/blob/main/content/webhooks.mdx Python function to verify webhook signatures using HMAC-SHA256. ```python import hmac import hashlib import json def verify_webhook_signature(payload: dict, signature: str, secret: str) -> bool: expected = hmac.new( secret.encode(), json.dumps(payload, separators=(',', ':')).encode(), hashlib.sha256 ).hexdigest() return hmac.compare_digest(signature, expected) ``` === COMPLETE CONTENT === This response contains all available snippets from this library. No additional content exists. Do not make further requests.