{"activeVersionTag":"latest","latestAvailableVersionTag":"latest","collection":{"info":{"_postman_id":"47f33eb7-53ed-45cd-be7d-a771fcb6cd61","name":"MyInterview API","description":"The myInterview API enables you to build services and solutions where you can utilise the myInterview platform and one-way (async) video interviews.\n\n# Overview\n\n# Getting Started with the API\n\nThis guide provides an overview of the basic flow for using the API, from creating a job and inviting candidates to receiving notifications and analyzing completed video interviews.\n\n## 1\\. Create a Job\n\nStart by creating a Job Model, which serves as the foundation for your video interviews. Use the `createJob` or `createJobWithCandidates` API endpoints to define various aspects of the interview, such as questions, link appearance, and description.\n\n## 2\\. Create a Candidate\n\nNext, create a Candidate Model for each candidate you want to invite to the video interview. Provide the necessary information for generating an invitation and ensure the Candidate Model is associated with the Job Model created earlier.\n\n## 3\\. Invite a Candidate to a Job\n\nUtilize the candidate information to generate a personalized myInterview video interview link and send it to the candidates, inviting them to participate in the video interview associated with the Job Model.\n\n## 4\\. Setup a Webhook Notification\n\nOnce candidates have been invited, set up a webhook to receive real-time notifications when candidates complete their video interviews. Configure the webhook by providing a URL where POST requests will be sent upon video completion.\n\n## 5\\. Get Candidate's Video Analysis\n\nAfter candidates have completed their video interviews, use the API to access and analyze the videos. Retrieve information about the candidate's performance, including video content and any available metadata, to evaluate their suitability for the position.\n\n## API Flow\n\n1. **Create a Job**: Configure a Job Model using the `createJob` or `createJobWithCandidates` API endpoints.\n2. **Create a Candidate**: Create a Candidate Model for each candidate and associate it with the Job Model.\n3. **Invite a Candidate to a Job**: Send personalized interview links to candidates, inviting them to participate in the video interview.\n4. **Setup a Webhook Notification**: Monitor the status of candidate video interviews using the webhook notifications.\n5. **Get Candidate's Video Analysis**: Access completed video interviews and analyze the candidate's performance.\n    \n\nBy following this basic flow, you can efficiently manage and monitor video interviews, streamlining the recruitment process and helping you identify the best talent for your organization.\n\n> Note \n  \n\n- We packaged in a single call job creation, candidate creation and inviting the candidates for convenience, as it is the most common use case.\n    \n\nSDK's\n\nServer-side helper libraries (AKA Server-side SDKs) make it easy for you to use MyInterview's REST APIs.\n\n| **sdk** | **url** |\n| --- | --- |\n| Node.js | [https://www.npmjs.com/package/myinterview](https://www.npmjs.com/package/myinterview) |\n\nThe rootURL for myInterview web service is [https://api-ga.myinterview.com/api](https://api-ga.myinterview.com/api).\n\nThe myInterview API is organized around [REST](http://en.wikipedia.org/wiki/Representational_State_Transfer). Our API has predictable resource-oriented URLs, accepts [form-encoded](https://en.wikipedia.org/wiki/POST_(HTTP)#Use_for_submitting_web_forms) request bodies, returns [JSON-encoded](http://www.json.org/) responses, and uses standard HTTP response codes, authentication, and verbs.\n\n# Authentication\n\nThe myInterview API uses API keys to authenticate requests. Contact your account success manager to get your keys. (You will need company_id, secret_key, access_key)\n\nYour API keys carry many privileges, so be sure to keep them secure! Do not share your secret API keys in publicly accessible areas such as Git, client-side code, and so forth.\n\nAll API requests must be made over [HTTPS](http://en.wikipedia.org/wiki/HTTP_Secure). Calls made over plain HTTP will fail. API requests without authentication will also fail.\n\nAuthenticate to the myInterview API requires your to implement the following:\n\n1. header 'x-myinterview-timestamp' with timestamp in UTC epoch time (milliseconds).\n2. header 'x-myinterview-key' with their access key.\n3. header 'x-myinterview-signed' base64 token using hmac 'SHA-256' hashed by the secret, hashing the timestamp in 'milliseconds'+\".\"+company_id together\n    \n\n### Example in NodeJS\n\n``` javascript\n// How to populate the header\nconst crypto = require('crypto');\nconst config = {\n  accessKey: \"yourAccessKey\"\n  secret: \"myinterviewsecret\",\n  companyId: \"companyId\",\n}\nfunction makeApiToken(secret, clientId, accessKEY, timestamp) {\n  return crypto\n    .createHmac('sha256', secret)\n    .update(timestamp.toString() + '.' + clientId)\n    .digest('base64');\n}\nfunction populateHeaders(config) {\n    const timestamp = Date.now();\n    const token = makeApiToken(config.secret, config.companyId, config.accessKey, timestamp);\n    return {\n      'x-myinterview-timestamp': timestamp.toString(),\n      'x-myinterview-key': config.accessKey,\n      'x-myinterview-signed': token,\n    };\n}\n\n```\n\n### Example in Ruby\n\n``` ruby\nrequire 'openssl'\n# How to populate the header\nconfig = {\n  accessKey: \"yourAccessKey\",\n  secret: \"myinterviewsecret\",\n  companyId: \"companyId\",\n}\ndef make_api_token(secret, client_id, access_key, timestamp)\n  hmac = OpenSSL::HMAC.new(secret, OpenSSL::Digest.new('sha256'))\n  hmac.update(\"#{timestamp}.#{client_id}\")\n  Base64.strict_encode64(hmac.digest)\nend\ndef populate_headers(config)\n  current_time = Time.now\n  timestamp = (current_time.to_f * 1000).to_i # milliseconds\n  token = make_api_token(config[:secret], config[:companyId], config[:accessKey], timestamp)\n  {\n    'x-myinterview-timestamp' => timestamp.to_s,\n    'x-myinterview-key' => config[:accessKey],\n    'x-myinterview-signed' => token\n  }\nend\n\n```\n\n# Rate Limits\n\nWe currently rate limit by the number of calls per hour. We also limit by the number of assets (jobs, candidates etc) you are allowed to create according to your subscription.\n\nResponse headers:\n\n1. X-RateLimit-Limit : The maximum number of requests you're permitted to make per hour.\n2. X-RateLimit-Remaining : The number of requests remaining in the current rate limit window.\n3. X-RateLimit-Reset : the time left in seconds at which the current rate limit window resets in UTC epoch.\n    \n\n# Webhooks\n\nWebhooks allow you to get event notifications back to your system. When one of those events is triggered, we’ll send a HTTP POST payload to the webhook’s configured URL. You can specify a custom webhook URL for each event type in MyInterview.\n\n# Pagination\n\nAll resources with a list endpoint (candidates, videos) have pagination support. By default, the limit is set to 20 results.\n\n| **#** |  |\n| --- | --- |\n| limit | A limit on the number of objects to be returned. The limit can range between 1 and 100 items. If no limit is specified, the default for that endpoint is used. |\n| skip | An offset token specifying the next page of results to return. A paginated list response will include a next attribute that includes an offset token, which can be used as an input parameter to the next request. If an offset is not passed in, the API will fetch the first page of results. |\n\n# Errors\n\nMyInterview uses conventional HTTP response codes to indicate the success or failure of an API request. In general: Codes in the 2xx range indicate success. Codes in the 4xx range indicate an error that failed given the information provided (e.g., a required parameter was omitted, a candidate invite failed, etc.). Codes in the 5xx range indicate an error with myInterview's servers (these are rare).\n\nSome errors that could be handled programmatically include an error code that briefly explains the error reported.\n\nHTTP STATUS CODE SUMMARY\n\n| # |  |\n| --- | --- |\n| 200 - OK | Everything worked as expected. |\n| 400 - Bad Request | The request was unacceptable, often due to missing a required parameter. |\n| 401 - Unauthorized | No valid API key provided. |\n| 402 - Request Failed | The parameters were valid but the request failed. |\n| 403 - Forbidden | The API key doesn't have permissions to perform the request. |\n| 404 - Not Found | The requested resource doesn't exist. |\n| 429 - Too Many Requests | Too many requests hit the API too quickly. We recommend an exponential backoff of your requests. |\n| 500, 502, 503, 504 - Server Errors | Something went wrong on myInterview's end. (These are rare.) |\n\nmyInterview ERROR CODES\n\n| # |  |\n| --- | --- |\n| 0 | OK |\n| 1 | CREATED |\n| 2 | UPDATED |\n| 3 | DELETED |\n| 10000 | WRONG_ACCESS_KEY |\n| 10001 | WRONG_TOKEN |\n| 10002 | TOKEN EXPIRED |\n| 10003 | ACCESS_DENIED |\n| 10004 | TOO_MANY_REQUESTS |\n| 10005 | UNAUTHORIZED |\n| 10006 | UNAUTHORIZED_SCOPE |\n| 10007 | NOT_FOUND |\n| 10008 | VALIDATION |\n| 10009 | BAD_WEBHOOK_REQUEST |\n| 10010 | UNAUTHORIZED_IP |\n| 10011 | EXPIRED |\n| 10012 | MISSING_QUERY_PARAMS |\n| 10013 | OVER_USAGE_SUBSCRIPTION |\n| 10014 | UNAUTHORIZED_REFERRER |\n| 10015 | UNAUTHORIZED_INTEGRATION |\n| 50000 | SERVER_ERROR |\n| 50001 | MISSING_CONFIG |\n\n# API Keys\n\nYour API keys are available under integrations page of your myInterview dashboard.\n\nThe following table outlines the key management activities.\n\n| Category | Description |\n| --- | --- |\n| test mode Keys | Private keys used for API authentication with the test mode environment. You can validate your api calls format, before going live. MyInterview generates the initial set of keys when you add \"myInterview API \" from integrations page. |\n| Production Keys | Private keys used for API authentication with the Production environment. MyInterview generates the initial set of keys when you add \"myInterview API \" from integrations page. |\n\n| **DO not expose your myInterview credentials to end-users as part of the bundled HTML/JavaScript sent to their browser.** |\n| --- |\n\n# TestMode\n\nThe test mode is not connected to any Database all the call are just checking if the payload or the url are correct if you try to create or update nothing will be saved as all the response are mock data.\n\n## TimezoneForInvite\n\nYou can get the list of timezones on this [link](https://api-ga.myinterview.com/timezones)","schema":"https://schema.getpostman.com/json/collection/v2.0.0/collection.json","isPublicCollection":false,"owner":"15331641","collectionId":"47f33eb7-53ed-45cd-be7d-a771fcb6cd61","publishedId":"TzCV3jmZ","public":true,"publicUrl":"https://api-docs.myinterview.com","privateUrl":"https://go.postman.co/documentation/15331641-47f33eb7-53ed-45cd-be7d-a771fcb6cd61","customColor":{"top-bar":"FFFFFF","right-sidebar":"303030","highlight":"f15c5a"},"documentationLayout":"classic-double-column","customisation":null,"version":"8.10.1","publishDate":"2021-12-21T16:21:29.000Z","activeVersionTag":"latest","documentationTheme":"light","metaTags":{},"logos":{}},"statusCode":200},"environments":[],"user":{"authenticated":false,"permissions":{"publish":false}},"run":{"button":{"js":"https://run.pstmn.io/button.js","css":"https://run.pstmn.io/button.css"}},"web":"https://www.getpostman.com/","team":{"logo":"https://res.cloudinary.com/postman/image/upload/t_team_logo_pubdoc/v1/team/768118b36f06c94b0306958b980558e6915839447e859fe16906e29d683976f0","favicon":"https://myinterview.com/favicon.ico"},"isEnvFetchError":false,"languages":"[{\"key\":\"csharp\",\"label\":\"C#\",\"variant\":\"HttpClient\"},{\"key\":\"csharp\",\"label\":\"C#\",\"variant\":\"RestSharp\"},{\"key\":\"curl\",\"label\":\"cURL\",\"variant\":\"cURL\"},{\"key\":\"dart\",\"label\":\"Dart\",\"variant\":\"http\"},{\"key\":\"go\",\"label\":\"Go\",\"variant\":\"Native\"},{\"key\":\"http\",\"label\":\"HTTP\",\"variant\":\"HTTP\"},{\"key\":\"java\",\"label\":\"Java\",\"variant\":\"OkHttp\"},{\"key\":\"java\",\"label\":\"Java\",\"variant\":\"Unirest\"},{\"key\":\"javascript\",\"label\":\"JavaScript\",\"variant\":\"Fetch\"},{\"key\":\"javascript\",\"label\":\"JavaScript\",\"variant\":\"jQuery\"},{\"key\":\"javascript\",\"label\":\"JavaScript\",\"variant\":\"XHR\"},{\"key\":\"c\",\"label\":\"C\",\"variant\":\"libcurl\"},{\"key\":\"nodejs\",\"label\":\"NodeJs\",\"variant\":\"Axios\"},{\"key\":\"nodejs\",\"label\":\"NodeJs\",\"variant\":\"Native\"},{\"key\":\"nodejs\",\"label\":\"NodeJs\",\"variant\":\"Request\"},{\"key\":\"nodejs\",\"label\":\"NodeJs\",\"variant\":\"Unirest\"},{\"key\":\"objective-c\",\"label\":\"Objective-C\",\"variant\":\"NSURLSession\"},{\"key\":\"ocaml\",\"label\":\"OCaml\",\"variant\":\"Cohttp\"},{\"key\":\"php\",\"label\":\"PHP\",\"variant\":\"cURL\"},{\"key\":\"php\",\"label\":\"PHP\",\"variant\":\"Guzzle\"},{\"key\":\"php\",\"label\":\"PHP\",\"variant\":\"HTTP_Request2\"},{\"key\":\"php\",\"label\":\"PHP\",\"variant\":\"pecl_http\"},{\"key\":\"powershell\",\"label\":\"PowerShell\",\"variant\":\"RestMethod\"},{\"key\":\"python\",\"label\":\"Python\",\"variant\":\"http.client\"},{\"key\":\"python\",\"label\":\"Python\",\"variant\":\"Requests\"},{\"key\":\"r\",\"label\":\"R\",\"variant\":\"httr\"},{\"key\":\"r\",\"label\":\"R\",\"variant\":\"RCurl\"},{\"key\":\"ruby\",\"label\":\"Ruby\",\"variant\":\"Net::HTTP\"},{\"key\":\"shell\",\"label\":\"Shell\",\"variant\":\"Httpie\"},{\"key\":\"shell\",\"label\":\"Shell\",\"variant\":\"wget\"},{\"key\":\"swift\",\"label\":\"Swift\",\"variant\":\"URLSession\"}]","languageSettings":[{"key":"csharp","label":"C#","variant":"HttpClient"},{"key":"csharp","label":"C#","variant":"RestSharp"},{"key":"curl","label":"cURL","variant":"cURL"},{"key":"dart","label":"Dart","variant":"http"},{"key":"go","label":"Go","variant":"Native"},{"key":"http","label":"HTTP","variant":"HTTP"},{"key":"java","label":"Java","variant":"OkHttp"},{"key":"java","label":"Java","variant":"Unirest"},{"key":"javascript","label":"JavaScript","variant":"Fetch"},{"key":"javascript","label":"JavaScript","variant":"jQuery"},{"key":"javascript","label":"JavaScript","variant":"XHR"},{"key":"c","label":"C","variant":"libcurl"},{"key":"nodejs","label":"NodeJs","variant":"Axios"},{"key":"nodejs","label":"NodeJs","variant":"Native"},{"key":"nodejs","label":"NodeJs","variant":"Request"},{"key":"nodejs","label":"NodeJs","variant":"Unirest"},{"key":"objective-c","label":"Objective-C","variant":"NSURLSession"},{"key":"ocaml","label":"OCaml","variant":"Cohttp"},{"key":"php","label":"PHP","variant":"cURL"},{"key":"php","label":"PHP","variant":"Guzzle"},{"key":"php","label":"PHP","variant":"HTTP_Request2"},{"key":"php","label":"PHP","variant":"pecl_http"},{"key":"powershell","label":"PowerShell","variant":"RestMethod"},{"key":"python","label":"Python","variant":"http.client"},{"key":"python","label":"Python","variant":"Requests"},{"key":"r","label":"R","variant":"httr"},{"key":"r","label":"R","variant":"RCurl"},{"key":"ruby","label":"Ruby","variant":"Net::HTTP"},{"key":"shell","label":"Shell","variant":"Httpie"},{"key":"shell","label":"Shell","variant":"wget"},{"key":"swift","label":"Swift","variant":"URLSession"}],"languageOptions":[{"label":"C# - HttpClient","value":"csharp - HttpClient - C#"},{"label":"C# - RestSharp","value":"csharp - RestSharp - C#"},{"label":"cURL - cURL","value":"curl - cURL - cURL"},{"label":"Dart - http","value":"dart - http - Dart"},{"label":"Go - Native","value":"go - Native - Go"},{"label":"HTTP - HTTP","value":"http - HTTP - HTTP"},{"label":"Java - OkHttp","value":"java - OkHttp - Java"},{"label":"Java - Unirest","value":"java - Unirest - Java"},{"label":"JavaScript - Fetch","value":"javascript - Fetch - JavaScript"},{"label":"JavaScript - jQuery","value":"javascript - jQuery - JavaScript"},{"label":"JavaScript - XHR","value":"javascript - XHR - JavaScript"},{"label":"C - libcurl","value":"c - libcurl - C"},{"label":"NodeJs - Axios","value":"nodejs - Axios - NodeJs"},{"label":"NodeJs - Native","value":"nodejs - Native - NodeJs"},{"label":"NodeJs - Request","value":"nodejs - Request - NodeJs"},{"label":"NodeJs - Unirest","value":"nodejs - Unirest - NodeJs"},{"label":"Objective-C - NSURLSession","value":"objective-c - NSURLSession - Objective-C"},{"label":"OCaml - Cohttp","value":"ocaml - Cohttp - OCaml"},{"label":"PHP - cURL","value":"php - cURL - PHP"},{"label":"PHP - Guzzle","value":"php - Guzzle - PHP"},{"label":"PHP - HTTP_Request2","value":"php - HTTP_Request2 - PHP"},{"label":"PHP - pecl_http","value":"php - pecl_http - PHP"},{"label":"PowerShell - RestMethod","value":"powershell - RestMethod - PowerShell"},{"label":"Python - http.client","value":"python - http.client - Python"},{"label":"Python - Requests","value":"python - Requests - Python"},{"label":"R - httr","value":"r - httr - R"},{"label":"R - RCurl","value":"r - RCurl - R"},{"label":"Ruby - Net::HTTP","value":"ruby - Net::HTTP - Ruby"},{"label":"Shell - Httpie","value":"shell - Httpie - Shell"},{"label":"Shell - wget","value":"shell - wget - Shell"},{"label":"Swift - URLSession","value":"swift - URLSession - Swift"}],"layoutOptions":[{"value":"classic-single-column","label":"Single Column"},{"value":"classic-double-column","label":"Double Column"}],"versionOptions":[],"environmentOptions":[{"value":"0","label":"No Environment"}],"canonicalUrl":"https://api-docs.myinterview.com/view/metadata/TzCV3jmZ"}