├── .nvmrc ├── CNAME ├── docs ├── CNAME ├── images │ ├── logo.png │ ├── favicon.ico │ ├── auditor-events.png │ ├── candidate-events.png │ ├── live-interview-events.png │ ├── auditor-events.svg │ ├── client-events.svg │ └── live-interview-events.svg ├── graphql │ ├── types │ │ ├── fonts │ │ │ └── webfonts │ │ │ │ ├── SalesforceSans-Bold.eot │ │ │ │ ├── SalesforceSans-Thin.eot │ │ │ │ ├── SalesforceSans-Bold.woff │ │ │ │ ├── SalesforceSans-Bold.woff2 │ │ │ │ ├── SalesforceSans-Italic.eot │ │ │ │ ├── SalesforceSans-Italic.woff │ │ │ │ ├── SalesforceSans-Light.eot │ │ │ │ ├── SalesforceSans-Light.woff │ │ │ │ ├── SalesforceSans-Light.woff2 │ │ │ │ ├── SalesforceSans-Regular.eot │ │ │ │ ├── SalesforceSans-Thin.woff │ │ │ │ ├── SalesforceSans-Thin.woff2 │ │ │ │ ├── SalesforceSans-Italic.woff2 │ │ │ │ ├── SalesforceSans-Regular.woff │ │ │ │ ├── SalesforceSans-Regular.woff2 │ │ │ │ ├── SalesforceSans-BoldItalic.eot │ │ │ │ ├── SalesforceSans-BoldItalic.woff │ │ │ │ ├── SalesforceSans-BoldItalic.woff2 │ │ │ │ ├── SalesforceSans-LightItalic.eot │ │ │ │ ├── SalesforceSans-LightItalic.woff │ │ │ │ ├── SalesforceSans-ThinItalic.eot │ │ │ │ ├── SalesforceSans-ThinItalic.woff │ │ │ │ ├── SalesforceSans-ThinItalic.woff2 │ │ │ │ └── SalesforceSans-LightItalic.woff2 │ │ ├── scripts │ │ │ ├── focus-active.js │ │ │ ├── toggle-navigation.js │ │ │ └── filter-types.js │ │ ├── assets │ │ │ ├── require-by.css │ │ │ ├── line-link.js │ │ │ └── code.css │ │ └── styles │ │ │ ├── _override.scss │ │ │ ├── _custom.scss │ │ │ └── graphdoc.scss │ ├── index.css │ └── index.html ├── learn-api │ └── index.html ├── index.css ├── webhooks │ ├── index.css │ └── index.html ├── index.html └── diagrams │ └── webhooks-flow.drawio ├── .prettierrc.json ├── .gitignore ├── serve_docs.py ├── LICENSE ├── package.json └── README.md /.nvmrc: -------------------------------------------------------------------------------- 1 | v20 2 | -------------------------------------------------------------------------------- /CNAME: -------------------------------------------------------------------------------- 1 | graphql.codesignal.com 2 | -------------------------------------------------------------------------------- /docs/CNAME: -------------------------------------------------------------------------------- 1 | developer.codesignal.com -------------------------------------------------------------------------------- /.prettierrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "printWidth": 100, 3 | "singleQuote": true 4 | } 5 | -------------------------------------------------------------------------------- /docs/images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CodeSignal/developer-docs/master/docs/images/logo.png -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | .vscode 3 | .idea/* 4 | node_modules/* 5 | __pycache__ 6 | docs/diagrams/.* 7 | -------------------------------------------------------------------------------- /docs/images/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CodeSignal/developer-docs/master/docs/images/favicon.ico -------------------------------------------------------------------------------- /docs/images/auditor-events.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CodeSignal/developer-docs/master/docs/images/auditor-events.png -------------------------------------------------------------------------------- /docs/images/candidate-events.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CodeSignal/developer-docs/master/docs/images/candidate-events.png -------------------------------------------------------------------------------- /docs/images/live-interview-events.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CodeSignal/developer-docs/master/docs/images/live-interview-events.png -------------------------------------------------------------------------------- /docs/graphql/types/fonts/webfonts/SalesforceSans-Bold.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CodeSignal/developer-docs/master/docs/graphql/types/fonts/webfonts/SalesforceSans-Bold.eot -------------------------------------------------------------------------------- /docs/graphql/types/fonts/webfonts/SalesforceSans-Thin.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CodeSignal/developer-docs/master/docs/graphql/types/fonts/webfonts/SalesforceSans-Thin.eot -------------------------------------------------------------------------------- /docs/graphql/types/fonts/webfonts/SalesforceSans-Bold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CodeSignal/developer-docs/master/docs/graphql/types/fonts/webfonts/SalesforceSans-Bold.woff -------------------------------------------------------------------------------- /docs/graphql/types/fonts/webfonts/SalesforceSans-Bold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CodeSignal/developer-docs/master/docs/graphql/types/fonts/webfonts/SalesforceSans-Bold.woff2 -------------------------------------------------------------------------------- /docs/graphql/types/fonts/webfonts/SalesforceSans-Italic.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CodeSignal/developer-docs/master/docs/graphql/types/fonts/webfonts/SalesforceSans-Italic.eot -------------------------------------------------------------------------------- /docs/graphql/types/fonts/webfonts/SalesforceSans-Italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CodeSignal/developer-docs/master/docs/graphql/types/fonts/webfonts/SalesforceSans-Italic.woff -------------------------------------------------------------------------------- /docs/graphql/types/fonts/webfonts/SalesforceSans-Light.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CodeSignal/developer-docs/master/docs/graphql/types/fonts/webfonts/SalesforceSans-Light.eot -------------------------------------------------------------------------------- /docs/graphql/types/fonts/webfonts/SalesforceSans-Light.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CodeSignal/developer-docs/master/docs/graphql/types/fonts/webfonts/SalesforceSans-Light.woff -------------------------------------------------------------------------------- /docs/graphql/types/fonts/webfonts/SalesforceSans-Light.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CodeSignal/developer-docs/master/docs/graphql/types/fonts/webfonts/SalesforceSans-Light.woff2 -------------------------------------------------------------------------------- /docs/graphql/types/fonts/webfonts/SalesforceSans-Regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CodeSignal/developer-docs/master/docs/graphql/types/fonts/webfonts/SalesforceSans-Regular.eot -------------------------------------------------------------------------------- /docs/graphql/types/fonts/webfonts/SalesforceSans-Thin.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CodeSignal/developer-docs/master/docs/graphql/types/fonts/webfonts/SalesforceSans-Thin.woff -------------------------------------------------------------------------------- /docs/graphql/types/fonts/webfonts/SalesforceSans-Thin.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CodeSignal/developer-docs/master/docs/graphql/types/fonts/webfonts/SalesforceSans-Thin.woff2 -------------------------------------------------------------------------------- /docs/graphql/types/fonts/webfonts/SalesforceSans-Italic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CodeSignal/developer-docs/master/docs/graphql/types/fonts/webfonts/SalesforceSans-Italic.woff2 -------------------------------------------------------------------------------- /docs/graphql/types/fonts/webfonts/SalesforceSans-Regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CodeSignal/developer-docs/master/docs/graphql/types/fonts/webfonts/SalesforceSans-Regular.woff -------------------------------------------------------------------------------- /docs/graphql/types/fonts/webfonts/SalesforceSans-Regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CodeSignal/developer-docs/master/docs/graphql/types/fonts/webfonts/SalesforceSans-Regular.woff2 -------------------------------------------------------------------------------- /docs/graphql/types/fonts/webfonts/SalesforceSans-BoldItalic.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CodeSignal/developer-docs/master/docs/graphql/types/fonts/webfonts/SalesforceSans-BoldItalic.eot -------------------------------------------------------------------------------- /docs/graphql/types/fonts/webfonts/SalesforceSans-BoldItalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CodeSignal/developer-docs/master/docs/graphql/types/fonts/webfonts/SalesforceSans-BoldItalic.woff -------------------------------------------------------------------------------- /docs/graphql/types/fonts/webfonts/SalesforceSans-BoldItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CodeSignal/developer-docs/master/docs/graphql/types/fonts/webfonts/SalesforceSans-BoldItalic.woff2 -------------------------------------------------------------------------------- /docs/graphql/types/fonts/webfonts/SalesforceSans-LightItalic.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CodeSignal/developer-docs/master/docs/graphql/types/fonts/webfonts/SalesforceSans-LightItalic.eot -------------------------------------------------------------------------------- /docs/graphql/types/fonts/webfonts/SalesforceSans-LightItalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CodeSignal/developer-docs/master/docs/graphql/types/fonts/webfonts/SalesforceSans-LightItalic.woff -------------------------------------------------------------------------------- /docs/graphql/types/fonts/webfonts/SalesforceSans-ThinItalic.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CodeSignal/developer-docs/master/docs/graphql/types/fonts/webfonts/SalesforceSans-ThinItalic.eot -------------------------------------------------------------------------------- /docs/graphql/types/fonts/webfonts/SalesforceSans-ThinItalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CodeSignal/developer-docs/master/docs/graphql/types/fonts/webfonts/SalesforceSans-ThinItalic.woff -------------------------------------------------------------------------------- /docs/graphql/types/fonts/webfonts/SalesforceSans-ThinItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CodeSignal/developer-docs/master/docs/graphql/types/fonts/webfonts/SalesforceSans-ThinItalic.woff2 -------------------------------------------------------------------------------- /docs/graphql/types/fonts/webfonts/SalesforceSans-LightItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CodeSignal/developer-docs/master/docs/graphql/types/fonts/webfonts/SalesforceSans-LightItalic.woff2 -------------------------------------------------------------------------------- /serve_docs.py: -------------------------------------------------------------------------------- 1 | import http.server 2 | import os 3 | 4 | def main(): 5 | pwd = os.getcwd() 6 | try: 7 | os.chdir("./docs") 8 | http.server.test(http.server.SimpleHTTPRequestHandler) 9 | finally: 10 | os.chdir(pwd) 11 | 12 | if __name__ == "__main__": 13 | main() 14 | -------------------------------------------------------------------------------- /docs/graphql/types/scripts/focus-active.js: -------------------------------------------------------------------------------- 1 | (function () { 2 | var navScroll = document.getElementById('navication-scroll'); 3 | var header = document.querySelector('nav header'); 4 | var active = document.querySelector('.slds-is-active a'); 5 | 6 | if(active) 7 | navScroll.scrollTop = active.offsetTop - header.offsetHeight - Math.ceil(active.offsetHeight / 2) 8 | })() -------------------------------------------------------------------------------- /docs/graphql/types/scripts/toggle-navigation.js: -------------------------------------------------------------------------------- 1 | (function () { 2 | 3 | var ACTIVE_CLASS = 'is-active'; 4 | var navigation = document.querySelector('nav'); 5 | var toggles = document.querySelectorAll('.js-toggle-navigation'); 6 | 7 | function toggleNavigation() { 8 | navigation.classList.contains(ACTIVE_CLASS) ? 9 | navigation.classList.remove(ACTIVE_CLASS) : 10 | navigation.classList.add(ACTIVE_CLASS); 11 | } 12 | 13 | Array.prototype.forEach.call( 14 | toggles, 15 | /** 16 | * @param {HTMLElement} toggle 17 | */ 18 | function (toggle) { 19 | toggle.addEventListener('click', toggleNavigation); 20 | } 21 | ) 22 | 23 | })() -------------------------------------------------------------------------------- /docs/graphql/types/assets/require-by.css: -------------------------------------------------------------------------------- 1 | div.require-by.anyone, 2 | ul.require-by a { 3 | max-width: 100%; 4 | overflow: hidden; 5 | text-overflow: ellipsis; 6 | white-space: nowrap; 7 | display: block; 8 | } 9 | 10 | div.require-by.anyone { 11 | background-color: #f0f8fc; 12 | border: 1px solid #d8dde6; 13 | color: grey; 14 | padding: 2rem; 15 | text-align: center; 16 | margin: 1rem 0; 17 | border-radius: 0.25rem; 18 | } 19 | 20 | ul.require-by { 21 | margin: 0; 22 | padding: 0; 23 | } 24 | 25 | ul.require-by a { 26 | border-left: .25rem solid transparent; 27 | border-top: 1px solid transparent; 28 | border-bottom: 1px solid transparent; 29 | padding: .5rem 1.5rem; 30 | } 31 | 32 | ul.require-by a:hover { 33 | text-decoration: none; 34 | background-color: #f0f8fc; 35 | border-color: #d8dde6; 36 | border-left-color: #005fb2; 37 | } 38 | 39 | ul.require-by a em { 40 | margin-left: 1rem; 41 | font-size: .75rem; 42 | color: grey; 43 | } -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 CodeSignal 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /docs/learn-api/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | CodeSignal Learn API for Developers 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "developer-docs", 3 | "version": "1.0.0", 4 | "description": "The most advanced technical interview and assessment platform.", 5 | "main": "", 6 | "scripts": { 7 | "build": "rm -rf docs/graphql/types && graphqldoc --force", 8 | "test": "echo \"Error: no test specified\" && exit 1", 9 | "start": "python3 -m serve_docs 8000", 10 | "prettify-webhooks": "prettier --write docs/webhooks" 11 | }, 12 | "repository": { 13 | "type": "git", 14 | "url": "git+https://github.com/CodeSignal/developer-docs.git" 15 | }, 16 | "author": "", 17 | "license": "MIT", 18 | "bugs": { 19 | "url": "https://github.com/CodeSignal/developer-docs/issues" 20 | }, 21 | "homepage": "https://github.com/CodeSignal/developer-docs#readme", 22 | "dependencies": { 23 | "graphqldoc": "^2.5.2" 24 | }, 25 | "graphqldoc": { 26 | "endpoint": "https://app.codesignal.com/graphql", 27 | "output": "./docs/graphql/types", 28 | "title": "CodeSignal GraphQL API", 29 | "favicon": "", 30 | "logo": "" 31 | }, 32 | "devDependencies": { 33 | "prettier": "^2.8.4" 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /docs/index.css: -------------------------------------------------------------------------------- 1 | body { 2 | margin: 0; 3 | padding: 0; 4 | font-family: 'Work Sans', sans-serif; 5 | color: #33485f; 6 | font-size: 1em; 7 | line-height: 1.8; 8 | } 9 | 10 | h1, h2, h3 { 11 | line-height: 1.25; 12 | margin: 0; 13 | } 14 | 15 | h1 { 16 | font-size: 1.75em; 17 | } 18 | 19 | h2 { 20 | font-size: 1.5em; 21 | } 22 | 23 | h3 { 24 | font-size: 1.25em; 25 | } 26 | 27 | .page-container { 28 | height: 100vh; 29 | background-color: #002570; 30 | display: flex; 31 | flex-direction: column; 32 | align-items: center; 33 | } 34 | 35 | .page-body { 36 | height: 100vh; 37 | width: 1024px; 38 | max-width: 1024px; 39 | background-color: #f5f6f7; 40 | } 41 | 42 | .logo-link { 43 | display: inline-block; 44 | } 45 | 46 | .header { 47 | font-family: 'JetBrains Mono', monospace; 48 | } 49 | 50 | .header-title { 51 | text-align: center; 52 | } 53 | 54 | .header-subtitle { 55 | font-size: 1em; 56 | text-align: center; 57 | } 58 | 59 | .main-content { 60 | height: 100%; 61 | display: flex; 62 | flex-direction: column; 63 | align-items: center; 64 | justify-content: center; 65 | } 66 | 67 | .main-content > *:not(:first-child) { 68 | margin-top: 32px; 69 | } 70 | 71 | .doc-link { 72 | font-size: 1.3em; 73 | display: block; 74 | font-family: 'JetBrains Mono', monospace; 75 | } 76 | -------------------------------------------------------------------------------- /docs/graphql/index.css: -------------------------------------------------------------------------------- 1 | body { 2 | margin: 0; 3 | padding: 0; 4 | font-family: 'Work Sans', sans-serif; 5 | color: #33485f; 6 | font-size: 1em; 7 | line-height: 1.8; 8 | } 9 | 10 | h1, h2, h3 { 11 | line-height: 1.25; 12 | margin: 0; 13 | } 14 | 15 | h1 { 16 | font-size: 1.75em; 17 | } 18 | 19 | h2 { 20 | font-size: 1.5em; 21 | } 22 | 23 | h3 { 24 | font-size: 1.25em; 25 | } 26 | 27 | pre { 28 | white-space: pre-wrap; 29 | padding: 16px; 30 | color: #21cf82; 31 | background-color: black; 32 | } 33 | 34 | pre > code { 35 | font-family: 'JetBrains Mono', monospace; 36 | } 37 | 38 | .mono { 39 | font-family: 'JetBrains Mono', monospace; 40 | } 41 | 42 | .page-container { 43 | background-color: #002570; 44 | display: flex; 45 | flex-direction: column; 46 | align-items: center; 47 | } 48 | 49 | .page-body { 50 | max-width: 1024px; 51 | background-color: #f5f6f7; 52 | } 53 | 54 | .header { 55 | display: flex; 56 | flex-direction: row; 57 | justify-content: start; 58 | padding: 16px 16px 32px; 59 | } 60 | 61 | .main-content { 62 | padding: 0 48px 16px 48px; 63 | } 64 | 65 | .section { 66 | margin-top: 40px; 67 | } 68 | 69 | .section > h2 { 70 | padding-bottom: 24px; 71 | } 72 | 73 | .subsection { 74 | margin-bottom: 24px; 75 | } 76 | 77 | .doc-link { 78 | font-size: 1.3em; 79 | display: block; 80 | } 81 | 82 | .schema-link { 83 | margin-top: 8px; 84 | padding-left: 16px; 85 | } -------------------------------------------------------------------------------- /docs/webhooks/index.css: -------------------------------------------------------------------------------- 1 | body { 2 | margin: 0; 3 | padding: 0; 4 | font-family: 'Work Sans', sans-serif; 5 | color: #33485f; 6 | font-size: 1em; 7 | line-height: 1.8; 8 | } 9 | 10 | h1, 11 | h2, 12 | h3 { 13 | line-height: 1.25; 14 | margin: 0; 15 | } 16 | 17 | h1 { 18 | font-size: 1.75em; 19 | } 20 | 21 | h2 { 22 | font-size: 1.5em; 23 | } 24 | 25 | h3 { 26 | font-size: 1.25em; 27 | } 28 | 29 | table { 30 | width: 100%; 31 | } 32 | 33 | pre { 34 | white-space: pre-wrap; 35 | padding: 16px; 36 | color: #21cf82; 37 | background-color: black; 38 | } 39 | 40 | pre > code { 41 | font-family: 'JetBrains Mono', monospace; 42 | } 43 | 44 | li:not(:first-child) { 45 | margin-top: 12px; 46 | } 47 | 48 | .mono { 49 | font-family: 'JetBrains Mono', monospace; 50 | } 51 | 52 | .page-container { 53 | background-color: #002570; 54 | display: flex; 55 | flex-direction: column; 56 | align-items: center; 57 | } 58 | 59 | .page-body { 60 | max-width: 1024px; 61 | background-color: #f5f6f7; 62 | } 63 | 64 | .header { 65 | display: flex; 66 | flex-direction: row; 67 | justify-content: start; 68 | padding: 16px 16px 32px; 69 | } 70 | 71 | .main-content { 72 | padding: 0 48px 16px 48px; 73 | } 74 | 75 | .section { 76 | margin-top: 40px; 77 | } 78 | 79 | .section > h2 { 80 | padding-bottom: 24px; 81 | } 82 | 83 | .subsection { 84 | margin-bottom: 24px; 85 | } 86 | 87 | .footer { 88 | margin-bottom: 16px; 89 | margin-left: 48px; 90 | } 91 | 92 | .doc-link { 93 | font-size: 1.3em; 94 | display: block; 95 | } 96 | -------------------------------------------------------------------------------- /docs/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | CodeSignal API for Developers 10 | 11 | 12 | 13 | 14 | 15 |
16 |
17 |
18 |
19 | 20 | CodeSignal home 21 | 22 |

API for Developers

23 |
24 |
Connect to the most advanced technical interview and assessment platform.
25 |
26 | GraphQL API 27 | Webhook API 28 | Learn API 29 |
30 |
31 |
32 |
33 | 34 | -------------------------------------------------------------------------------- /docs/graphql/types/assets/line-link.js: -------------------------------------------------------------------------------- 1 | (function () { 2 | ready(function () { 3 | var tables = window.document.getElementsByClassName('code'); 4 | 5 | for (var i = 0; i < tables.length; i++) { 6 | var table = tables[i]; 7 | 8 | table.addEventListener('click', onClick); 9 | } 10 | 11 | window.addEventListener("hashchange", onHashChange, false); 12 | 13 | onHashChange(); 14 | }); 15 | 16 | function onHashChange() { 17 | var id = window.location.href.split('#')[1]; 18 | 19 | if (!id) { 20 | return; 21 | } 22 | 23 | var lcid = id.indexOf('C') === -1 ? id.replace('L', 'LC') : id; 24 | var lineCode = window.document.getElementById(lcid); 25 | 26 | if (!lineCode) { 27 | return; 28 | } 29 | 30 | var highlighted = lineCode.closest('.code').getElementsByClassName('highlighted'); 31 | 32 | for (var i = 0; i < highlighted.length; i++) { 33 | highlighted[i].classList.remove('highlighted'); 34 | } 35 | 36 | lineCode.classList.add('highlighted'); 37 | } 38 | 39 | function onClick(e) { 40 | var target = e.target; 41 | 42 | if (!target.classList.contains('td-index')) { 43 | return; 44 | } 45 | 46 | var href = window.location.href.split('#')[0]; 47 | 48 | window.location.href = href + '#' + target.id; 49 | } 50 | 51 | function ready(fn) { 52 | if (document.attachEvent ? document.readyState === "complete" : document.readyState !== "loading"){ 53 | fn(); 54 | } else { 55 | document.addEventListener('DOMContentLoaded', fn); 56 | } 57 | } 58 | })(); 59 | 60 | // https://developer.mozilla.org/ru/docs/Web/API/Element/closest 61 | (function(e){ 62 | e.closest = e.closest || function(css){ 63 | var node = this; 64 | 65 | while (node) { 66 | if (node.matches(css)) return node; 67 | else node = node.parentElement; 68 | } 69 | return null; 70 | } 71 | })(Element.prototype); -------------------------------------------------------------------------------- /docs/graphql/types/styles/_override.scss: -------------------------------------------------------------------------------- 1 | .slds-scrollable::-webkit-scrollbar { 2 | width: 10px; 3 | height: 10px 4 | } 5 | 6 | .slds-scrollable::-webkit-scrollbar:window-inactive { 7 | opacity: 0 8 | } 9 | 10 | .slds-scrollable::-webkit-scrollbar-thumb { 11 | background: #e0e5ee; 12 | border-radius: .5rem; 13 | box-shadow: #a8b7c7 0 0 0 1px inset 14 | } 15 | 16 | .slds-scrollable::-webkit-scrollbar-track { 17 | background: #a8b7c7 18 | } 19 | 20 | .slds-scrollable--y { 21 | -webkit-overflow-scrolling: touch; 22 | max-height: 100%; 23 | overflow: hidden; 24 | overflow-y: auto 25 | } 26 | 27 | .slds-scrollable--y::-webkit-scrollbar { 28 | width: 10px; 29 | height: 10px 30 | } 31 | 32 | .slds-scrollable--y::-webkit-scrollbar:window-inactive { 33 | opacity: 0 34 | } 35 | 36 | .slds-scrollable--y::-webkit-scrollbar-thumb { 37 | background: #e0e5ee; 38 | border-radius: .5rem; 39 | box-shadow: #a8b7c7 0 0 0 1px inset 40 | } 41 | 42 | .slds-scrollable--y::-webkit-scrollbar-track { 43 | background: #a8b7c7 44 | } 45 | 46 | .slds-scrollable--x { 47 | -webkit-overflow-scrolling: touch; 48 | max-width: 100%; 49 | overflow: hidden; 50 | overflow-x: auto 51 | } 52 | 53 | .slds-scrollable--x::-webkit-scrollbar { 54 | width: 10px; 55 | height: 10px 56 | } 57 | 58 | .slds-scrollable--x::-webkit-scrollbar:window-inactive { 59 | opacity: 0 60 | } 61 | 62 | .slds-scrollable--x::-webkit-scrollbar-thumb { 63 | background: #e0e5ee; 64 | border-radius: .5rem; 65 | box-shadow: #a8b7c7 0 0 0 1px inset 66 | } 67 | 68 | .slds-scrollable--x::-webkit-scrollbar-track { 69 | background: #a8b7c7 70 | } 71 | 72 | .slds-scrollable--x::-webkit-scrollbar-track, 73 | .slds-scrollable--y::-webkit-scrollbar-track { 74 | background: rgba(255, 255, 255, 0.1); 75 | } 76 | 77 | .slds-scrollable--x::-webkit-scrollbar-thumb, 78 | .slds-scrollable--y::-webkit-scrollbar-thumb { 79 | background: rgba(0, 0, 0, 0.1); 80 | box-shadow: none; 81 | } 82 | 83 | .material-icons.slds-button__icon { 84 | font-size: .875rem; 85 | vertical-align: text-bottom; 86 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # CodeSignal Developer Docs 2 | 3 | A place to put documentation about interacting with our APIs. 4 | 5 | ## Running locally 6 | You can view the documentation site locally by running `npm start` -- you just need to have Python 3 installed on your local machine. 7 | The start script serves the docs here: http://localhost:8000 8 | 9 | Since it's a static site, you can also just open `/docs/index.html` directly in a web browser if you prefer. 10 | 11 | ## Modifying the event diagrams 12 | 13 | The diagrams are generated using the following tool [diagrams](https://app.diagrams.net). 14 | 15 | 1. Go to that specific URL. 16 | 2. Open existing diagram. 17 | 3. Open `docs/diagrams/webhooks-flow.drawio` file. 18 | 4. Make all the needed changes. 19 | - Note that the document has 2 pages -- one with the entire flow and one with individual sections. 20 | 5. Save the changes and put the resulting file on the repository to overwrite `docs/diagrams/webhooks-flow.drawio` file. 21 | 22 | To update each image: 23 | 24 | 1. Select everything you'd like to export. 25 | 2. Click on File -> Export -> PNG. 26 | 3. Make sure 'Selection Only' checkbox is checked. 27 | 4. Overwrite the existing images with the new ones. 28 | 29 | ## Generating GraphQL docs 30 | GraphQL API docs are generated with graphqldoc: 31 | https://github.com/codesignal/graphqldoc 32 | 33 | To generate documentation: 34 | - The default endpoint is set to [http://app.codesignal.com/graphql](https://app.codesignal.com/graphql), so ensure that latest version is deployed already. 35 | - Check out this repository and run `npm install`, then `npm run build`. 36 | - Static pages will be generated under `/docs/graphql/types`. 37 | - Make sure they look okay, then commit and push. 38 | 39 | ## How to publish updated docs 40 | This repo is hosted with GitHub Pages, so any change under `/docs` on the `master` branch will be published here: 41 | https://codesignal.github.io/developer-docs/ 42 | Which in return should be redirected to this subdomain: developer.codesignal.com 43 | 44 | That's it! You should see your changes there once they reach the master branch, as long as they are under `/docs`. 45 | 46 | Don't change the GraphQL `/docs/types/` pages manually, since your changes will be overwritten the next time those pages are generated. 47 | It's okay to change other pages manually. 48 | -------------------------------------------------------------------------------- /docs/graphql/types/scripts/filter-types.js: -------------------------------------------------------------------------------- 1 | (function () { 2 | var HIDE_CLASS = 'slds-hide'; 3 | var ITEM_CLASS = 'slds-item'; 4 | 5 | /** 6 | * @class Item 7 | * @param {HTMLLIElement} li 8 | */ 9 | function Item(li) { 10 | this.li = li; 11 | this.type = li.title; 12 | this.typeLowerCase = li.title.toLowerCase(); 13 | } 14 | 15 | /** 16 | * @return boolean 17 | */ 18 | Item.prototype.contains = function (searchText) { 19 | return this.typeLowerCase.indexOf(searchText) >= 0; 20 | } 21 | 22 | /** 23 | * @return boolean 24 | */ 25 | Item.prototype.isHide = function () { 26 | this.li.classList.contains(HIDE_CLASS); 27 | } 28 | 29 | /** 30 | * @return void 31 | */ 32 | Item.prototype.hide = function () { 33 | if (!this.isHide()) 34 | this.li.classList.add(HIDE_CLASS); 35 | } 36 | 37 | /** 38 | * @return void 39 | */ 40 | Item.prototype.show = function () { 41 | this.li.classList.remove(HIDE_CLASS); 42 | } 43 | 44 | /** 45 | * @class ItemList 46 | * @param {Item[]} items 47 | */ 48 | function ItemList(items) { 49 | this.items = items; 50 | } 51 | 52 | /** 53 | * @function ItemsList.fromSelector 54 | * @param {string} selector 55 | * @return ItemList 56 | */ 57 | ItemList.fromSelector = function (selector) { 58 | 59 | var lis = document.querySelectorAll(selector); 60 | var items = Array.prototype.map.call(lis, function (li) { 61 | return new Item(li); 62 | }) 63 | 64 | return new ItemList(items); 65 | } 66 | 67 | /** 68 | * @return void 69 | */ 70 | ItemList.prototype.showIfmatch = function (match) { 71 | 72 | match = match.toLowerCase(match); 73 | 74 | this 75 | .items 76 | .forEach(function (item) { 77 | item.contains(match) ? 78 | item.show(): 79 | item.hide(); 80 | }) 81 | } 82 | 83 | /** 84 | * @var {ItemList} items 85 | * @var {HTMLInputElement} input 86 | */ 87 | var items = ItemList.fromSelector('nav .slds-navigation-list--vertical li'); 88 | var input = document.getElementById('type-search'); 89 | var lastMatch = ''; 90 | 91 | function onChange() { 92 | if (input.value === lastMatch) 93 | return; 94 | 95 | lastMatch = input.value; 96 | items.showIfmatch(lastMatch); 97 | } 98 | 99 | input.addEventListener('change', onChange); 100 | input.addEventListener('keyup', onChange); 101 | input.addEventListener('mouseup', onChange); 102 | })() -------------------------------------------------------------------------------- /docs/graphql/types/assets/code.css: -------------------------------------------------------------------------------- 1 | .code { 2 | background-color: #fff; 3 | color: #4D4D4C; 4 | border: 1px solid #4D4D4C; 5 | font-size: 14px; 6 | font-family: 'Ubuntu Mono'; 7 | list-style-type: decimal; 8 | border-radius: 0.25rem; 9 | } 10 | 11 | .code .gutter { 12 | background: #f6f6f6; 13 | color: #4D4D4C; 14 | } 15 | 16 | .code .print-margin { 17 | width: 1px; 18 | background: #f6f6f6 19 | } 20 | 21 | .code .row:hover { 22 | background: #EFEFEF; 23 | } 24 | 25 | .code .td-index { 26 | color: rgba(27, 31, 35, .3); 27 | padding: 1px 8px 1px 16px; 28 | text-align: right; 29 | width: 1%; 30 | } 31 | 32 | .code .td-index:hover { 33 | cursor: pointer; 34 | color: rgba(27, 31, 35, .6); 35 | } 36 | 37 | .code .td-code { 38 | padding: 1px 8px; 39 | } 40 | 41 | .code .td-code.highlighted { 42 | background-color: #fffbdd; 43 | } 44 | 45 | .code .tab { 46 | padding-left: 2em; 47 | } 48 | 49 | .code .cursor { 50 | color: #AEAFAD 51 | } 52 | 53 | .code .marker-layer .selection { 54 | background: #D6D6D6 55 | } 56 | 57 | .code.multiselect .selection.start { 58 | box-shadow: 0 0 3px 0px #FFFFFF; 59 | } 60 | 61 | .code .marker-layer .step { 62 | background: rgb(255, 255, 0) 63 | } 64 | 65 | .code .marker-layer .bracket { 66 | margin: -1px 0 0 -1px; 67 | border: 1px solid #D1D1D1 68 | } 69 | 70 | .code .marker-layer .active-line { 71 | background: #EFEFEF 72 | } 73 | 74 | .code .gutter-active-line { 75 | background-color: #dcdcdc 76 | } 77 | 78 | .code .marker-layer .selected-word { 79 | border: 1px solid #D6D6D6 80 | } 81 | 82 | .code .invisible { 83 | color: #D1D1D1 84 | } 85 | 86 | .code .keyword, 87 | .code .meta, 88 | .code .storage, 89 | .code .storage.type, 90 | .code .support.type { 91 | color: #8959A8 92 | } 93 | 94 | .code .keyword.operator { 95 | color: #3E999F 96 | } 97 | 98 | .code .constant.character, 99 | .code .constant.language, 100 | .code .constant.numeric, 101 | .code .keyword.other.unit, 102 | .code .support.constant { 103 | color: #F5871F 104 | } 105 | 106 | .code .constant.other { 107 | color: #666969 108 | } 109 | 110 | .code .invalid { 111 | color: #FFFFFF; 112 | background-color: #C82829 113 | } 114 | 115 | .code .invalid.deprecated { 116 | color: #FFFFFF; 117 | background-color: #8959A8 118 | } 119 | 120 | .code .fold { 121 | background-color: #4271AE; 122 | border-color: #4D4D4C 123 | } 124 | 125 | .code .entity.name.function, 126 | .code .support.function, 127 | .code .variable.parameter, 128 | .code .variable { 129 | color: #4271AE 130 | } 131 | 132 | .code .support.class, 133 | .code .support.type { 134 | color: #C99E00 135 | } 136 | 137 | .code .heading, 138 | .code .markup.heading, 139 | .code .string { 140 | color: #718C00 141 | } 142 | 143 | .code .entity.name.tag, 144 | .code .entity.other.attribute-name, 145 | .code .meta.tag, 146 | .code .string.regexp, 147 | .code .variable { 148 | color: #C82829 149 | } 150 | 151 | .code .comment { 152 | color: #8E908C 153 | } 154 | 155 | .code .indent-guide { 156 | background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bdu3f/BwAlfgctduB85QAAAABJRU5ErkJggg==) right repeat-y 157 | } -------------------------------------------------------------------------------- /docs/graphql/types/styles/_custom.scss: -------------------------------------------------------------------------------- 1 | html { 2 | height: 100%; 3 | } 4 | 5 | body { 6 | min-height: 100%; 7 | display: block; 8 | padding: 0; 9 | margin: 0; 10 | } 11 | 12 | nav { 13 | left: $spacing-none; 14 | top: $spacing-none; 15 | width: 30%; 16 | max-width: $size-medium; 17 | padding: $spacing-none; 18 | background: white; 19 | z-index: $z-index-sticky; 20 | position: fixed; 21 | height: 100%; 22 | overflow: auto; 23 | box-sizing: border-box; 24 | box-shadow: $shadow-drop-down; 25 | transform: translateX(0); 26 | transition: #{$duration-promptly} transform ease; 27 | @media (max-width: #{$mq-medium}) { 28 | transform: translateX(-100%); 29 | width: $size-medium; 30 | &.is-active { 31 | transform: translateX(0); 32 | } 33 | } 34 | } 35 | 36 | nav sup { 37 | font-style: italic; 38 | opacity: .7; 39 | } 40 | 41 | header a { 42 | text-decoration: none !important; 43 | } 44 | 45 | main section, 46 | main footer { 47 | width: 100%; 48 | padding: 0 0 0 30%; 49 | position: relative; 50 | @media (max-width: #{$mq-medium}) { 51 | padding-left: 0; 52 | } 53 | @media (min-width: 70rem) { 54 | padding-left: 21rem; 55 | } 56 | } 57 | 58 | main .title, 59 | main footer { 60 | padding-bottom: $spacing-xx-large; 61 | } 62 | 63 | main .title { 64 | background: $color-brand-darker; 65 | } 66 | 67 | main .title .slds-text-title--caps, 68 | main .title .slds-button { 69 | color: inherit 70 | } 71 | 72 | main .container { 73 | box-sizing: border-box; 74 | padding: $spacing-small $spacing-large; 75 | max-width: $size-xx-large; 76 | @media (max-width: #{$mq-medium}) { 77 | overflow: auto; 78 | } 79 | } 80 | 81 | main code.highlight { 82 | display: block; 83 | background: #4D4D4C; 84 | position: relative; 85 | box-shadow: $elevation-shadow-4; 86 | padding: $spacing-xxx-small; 87 | padding-top: $spacing-large; 88 | border-radius: $border-radius-medium; 89 | min-width: 50rem; 90 | } 91 | 92 | main code.highlight::after, 93 | main code.highlight::before { 94 | content: ""; 95 | display: block; 96 | height: $spacing-small; 97 | width: $spacing-small; 98 | position: absolute; 99 | top: $spacing-x-small; //border: 1px solid darken($color: #4D4D4C, $amount: 10%); 100 | border-radius: 100%; 101 | cursor: pointer; 102 | } 103 | 104 | main code.highlight::before { 105 | background: $color-background-destructive; 106 | left: $spacing-x-small; 107 | } 108 | 109 | main code.highlight::after { 110 | background: lighten($color: #4D4D4C, $amount: 10%); 111 | left: $spacing-x-small + $square-icon-utility-small + $spacing-xx-small; 112 | } 113 | 114 | .less-than-medium { 115 | @media (min-width: #{$mq-medium}) { 116 | display: none; 117 | } 118 | } 119 | 120 | .less-than-small { 121 | @media (min-width: #{$mq-small}) { 122 | display: none; 123 | } 124 | } 125 | 126 | .graphdoc-section__title { 127 | border-bottom: #{$border-width-thin} solid #{$color-border}; 128 | margin-bottom: $spacing-large; 129 | position: relative; 130 | } 131 | 132 | .graphdoc-section__title a { 133 | position: absolute; 134 | right: 100%; 135 | display: block; 136 | opacity: 0; 137 | width: 2rem; 138 | padding: 0 0.4rem; 139 | } 140 | 141 | .graphdoc-section__title:hover a { 142 | opacity: 1; 143 | } 144 | 145 | .graphdoc-section__title a .material-icons { 146 | font-size: 1.2rem; 147 | } -------------------------------------------------------------------------------- /docs/images/auditor-events.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 |
CodeSignal Verification Flow
CodeSignal Verification Flow
preScreenResultVerified
preScreenResultVerified
Not verified
Not verified
* available only for proctored Pre-Screens
* available only for proctored Pre-Screens
Proctoring verification?
Proctoring verif...
Codesignal Auditor
Codes...
preScreenResultNotVerfiied
preScreenResultNotVerfiied
Verified
Verified
Text is not SVG - cannot display
-------------------------------------------------------------------------------- /docs/graphql/types/styles/graphdoc.scss: -------------------------------------------------------------------------------- 1 | @import 2 | '../../../node_modules/@salesforce-ux/design-system/scss/init', 3 | '../../../node_modules/@salesforce-ux/design-system/scss/vendor/normalize'; 4 | 5 | @include core($scoped: false, $globals: true); 6 | 7 | @import 8 | // Activity Timeline 9 | // '../../../node_modules/@salesforce-ux/design-system/scss/components/activity-timeline/index', 10 | 11 | // // Badges 12 | // '../../../node_modules/@salesforce-ux/design-system/scss/components/badges/index', 13 | 14 | // // Breadcrumbs 15 | // '../../../node_modules/@salesforce-ux/design-system/scss/components/breadcrumbs/index', 16 | 17 | // // Button Groups 18 | // '../../../node_modules/@salesforce-ux/design-system/scss/components/button-groups/index', 19 | 20 | // // Button 21 | '../../../node_modules/@salesforce-ux/design-system/scss/components/buttons/flavors/base/index', 22 | '../../../node_modules/@salesforce-ux/design-system/scss/components/buttons/flavors/stateful/index', 23 | 24 | // // Button Icon 25 | '../../../node_modules/@salesforce-ux/design-system/scss/components/button-icons/flavors/base/index', 26 | 27 | // // Icons 28 | // '../../../node_modules/@salesforce-ux/design-system/scss/components/icons/index', 29 | // '../../../node_modules/@salesforce-ux/design-system/scss/components/icons/flavors/icon-colors/index', 30 | // '../../../node_modules/@salesforce-ux/design-system/scss/components/icons/flavors/sizes/index', 31 | 32 | // // Card 33 | // '../../../node_modules/@salesforce-ux/design-system/scss/components/cards/index', 34 | 35 | // // Forms 36 | '../../../node_modules/@salesforce-ux/design-system/scss/components/forms/index', 37 | '../../../node_modules/@salesforce-ux/design-system/scss/components/forms/flavors/input/index', 38 | // '../../../node_modules/@salesforce-ux/design-system/scss/components/forms/flavors/textarea/index', 39 | // '../../../node_modules/@salesforce-ux/design-system/scss/components/forms/flavors/radio/index', 40 | // '../../../node_modules/@salesforce-ux/design-system/scss/components/forms/flavors/radio-group-alternate/index', 41 | // '../../../node_modules/@salesforce-ux/design-system/scss/components/forms/flavors/checkbox/index', 42 | // '../../../node_modules/@salesforce-ux/design-system/scss/components/forms/flavors/checkbox-toggle/index', 43 | // '../../../node_modules/@salesforce-ux/design-system/scss/components/forms/flavors/select/index', 44 | // '../../../node_modules/@salesforce-ux/design-system/scss/components/forms/flavors/checkbox-alternate/index', 45 | // '../../../node_modules/@salesforce-ux/design-system/scss/components/forms/flavors/checkbox-add-button/index', 46 | // '../../../node_modules/@salesforce-ux/design-system/scss/components/forms/flavors/multi-select/index', 47 | // '../../../node_modules/@salesforce-ux/design-system/scss/components/forms/flavors/horizontal-form/index', 48 | // '../../../node_modules/@salesforce-ux/design-system/scss/components/forms/flavors/stacked-form/index', 49 | // '../../../node_modules/@salesforce-ux/design-system/scss/components/forms/flavors/inline-form/index', 50 | // '../../../node_modules/@salesforce-ux/design-system/scss/components/forms/flavors/compound-form/index', 51 | // '../../../node_modules/@salesforce-ux/design-system/scss/components/forms/flavors/docked-form-footer/index', 52 | 53 | // // File selector 54 | // '../../../node_modules/@salesforce-ux/design-system/scss/components/file-selector/index', 55 | 56 | // // Page Headers 57 | // '../../../node_modules/@salesforce-ux/design-system/scss/components/page-headers/index', 58 | // '../../../node_modules/@salesforce-ux/design-system/scss/components/page-headers/flavors/record-home/index', 59 | // '../../../node_modules/@salesforce-ux/design-system/scss/components/page-headers/flavors/record-home-vertical/index', 60 | // '../../../node_modules/@salesforce-ux/design-system/scss/components/page-headers/flavors/object-home/index', 61 | 62 | // // Panels 63 | // '../../../node_modules/@salesforce-ux/design-system/scss/components/panels/index', 64 | // '../../../node_modules/@salesforce-ux/design-system/scss/components/panels/flavors/filtering/index', 65 | 66 | // // Popovers 67 | // '../../../node_modules/@salesforce-ux/design-system/scss/components/popovers/index', 68 | // '../../../node_modules/@salesforce-ux/design-system/scss/components/popovers/flavors/panels/index', 69 | // '../../../node_modules/@salesforce-ux/design-system/scss/components/popovers/flavors/nubbins/index', 70 | 71 | // // Walkthrough 72 | // '../../../node_modules/@salesforce-ux/design-system/scss/components/walkthrough/flavors/popovers/index', 73 | 74 | // // Tooltips 75 | // '../../../node_modules/@salesforce-ux/design-system/scss/components/tooltips/index', 76 | 77 | // // Menus 78 | // '../../../node_modules/@salesforce-ux/design-system/scss/components/menus/index', 79 | // '../../../node_modules/@salesforce-ux/design-system/scss/components/menus/flavors/action-overflow/index', 80 | 81 | // // Picklist 82 | // '../../../node_modules/@salesforce-ux/design-system/scss/components/picklist/index', 83 | 84 | // // Datepicker 85 | // '../../../node_modules/@salesforce-ux/design-system/scss/components/datepickers/index', 86 | // '../../../node_modules/@salesforce-ux/design-system/scss/components/datepickers/flavors/time/index', 87 | 88 | // // Docked Composer 89 | // '../../../node_modules/@salesforce-ux/design-system/scss/components/docked-composer/index', 90 | // '../../../node_modules/@salesforce-ux/design-system/scss/components/docked-composer/flavors/email/index', 91 | 92 | // // Docked Utility Bar 93 | // '../../../node_modules/@salesforce-ux/design-system/scss/components/docked-utility-bar/flavors/utility-bar/index', 94 | // '../../../node_modules/@salesforce-ux/design-system/scss/components/docked-utility-bar/flavors/utility-panel/index', 95 | 96 | // // Global Header 97 | // '../../../node_modules/@salesforce-ux/design-system/scss/components/global-header/flavors/base/index', 98 | // '../../../node_modules/@salesforce-ux/design-system/scss/components/global-header/flavors/notifications/index', 99 | 100 | // // Global Navigation 101 | // '../../../node_modules/@salesforce-ux/design-system/scss/components/global-navigation/index', 102 | 103 | // // Publishers 104 | // '../../../node_modules/@salesforce-ux/design-system/scss/components/publishers/index', 105 | // '../../../node_modules/@salesforce-ux/design-system/scss/components/publishers/flavors/discussion-feed/index', 106 | // '../../../node_modules/@salesforce-ux/design-system/scss/components/publishers/flavors/comment/index', 107 | 108 | // // Discussion Feed 109 | // '../../../node_modules/@salesforce-ux/design-system/scss/components/feeds/flavors/feed-list/index', 110 | // '../../../node_modules/@salesforce-ux/design-system/scss/components/feeds/flavors/comment/index', 111 | // '../../../node_modules/@salesforce-ux/design-system/scss/components/feeds/flavors/post/index', 112 | // '../../../node_modules/@salesforce-ux/design-system/scss/components/feeds/flavors/post-with-attachments/index', 113 | 114 | // // Modal 115 | // '../../../node_modules/@salesforce-ux/design-system/scss/components/modals/index', 116 | 117 | // // App Launcher 118 | // '../../../node_modules/@salesforce-ux/design-system/scss/components/app-launcher/index', 119 | 120 | // // Pills 121 | // '../../../node_modules/@salesforce-ux/design-system/scss/components/pills/index', 122 | 123 | // // Process 124 | // '../../../node_modules/@salesforce-ux/design-system/scss/components/process/flavors/wizard/index', 125 | // '../../../node_modules/@salesforce-ux/design-system/scss/components/process/flavors/sales-path-coach/index', 126 | 127 | // // Progress Indicator 128 | // '../../../node_modules/@salesforce-ux/design-system/scss/components/progress-indicator/index', 129 | 130 | // // Rich Text Editor 131 | // '../../../node_modules/@salesforce-ux/design-system/scss/components/rich-text-editor/index', 132 | 133 | // // Spinners 134 | // '../../../node_modules/@salesforce-ux/design-system/scss/components/spinners/index', 135 | // '../../../node_modules/@salesforce-ux/design-system/scss/components/spinners/flavors/sizes/index', 136 | // '../../../node_modules/@salesforce-ux/design-system/scss/components/spinners/flavors/colors/index', 137 | 138 | // // Split view list 139 | // '../../../node_modules/@salesforce-ux/design-system/scss/components/split-view/index', 140 | 141 | // // Title 142 | // '../../../node_modules/@salesforce-ux/design-system/scss/components/tiles/index', 143 | // '../../../node_modules/@salesforce-ux/design-system/scss/components/tiles/flavors/board/index', 144 | 145 | // // Tabs 146 | // '../../../node_modules/@salesforce-ux/design-system/scss/components/tabs/flavors/default/index', 147 | // '../../../node_modules/@salesforce-ux/design-system/scss/components/tabs/flavors/scoped/index', 148 | // '../../../node_modules/@salesforce-ux/design-system/scss/components/tabs/flavors/scrolling/index', 149 | 150 | // // Navigation 151 | '../../../node_modules/@salesforce-ux/design-system/scss/components/navigation/flavors/vertical/index', 152 | 153 | // // Notifications -- Toasts & Alerts 154 | // '../../../node_modules/@salesforce-ux/design-system/scss/components/notifications/index', 155 | // '../../../node_modules/@salesforce-ux/design-system/scss/components/notifications/flavors/alert/index', 156 | // '../../../node_modules/@salesforce-ux/design-system/scss/components/notifications/flavors/prompt/index', 157 | // '../../../node_modules/@salesforce-ux/design-system/scss/components/notifications/flavors/modal-toast/index', 158 | // '../../../node_modules/@salesforce-ux/design-system/scss/components/walkthrough/flavors/header/index', 159 | 160 | // // Lookup 161 | // '../../../node_modules/@salesforce-ux/design-system/scss/components/lookups/index', 162 | 163 | // // Images 164 | // '../../../node_modules/@salesforce-ux/design-system/scss/components/images/flavors/avatar/index', 165 | // '../../../node_modules/@salesforce-ux/design-system/scss/components/images/flavors/figure/index', 166 | 167 | // // Tables 168 | // '../../../node_modules/@salesforce-ux/design-system/scss/components/data-tables/index', 169 | // '../../../node_modules/@salesforce-ux/design-system/scss/components/data-tables/flavors/responsive/index', 170 | // '../../../node_modules/@salesforce-ux/design-system/scss/components/data-tables/flavors/inline-edit/index', 171 | // '../../../node_modules/@salesforce-ux/design-system/scss/components/data-tables/flavors/fixed-header/index', 172 | 173 | // // Tree (Order matters) 174 | // '../../../node_modules/@salesforce-ux/design-system/scss/components/trees/flavors/base/index', 175 | // '../../../node_modules/@salesforce-ux/design-system/scss/components/trees/flavors/grid/index', 176 | 177 | '../../../node_modules/@salesforce-ux/design-system/scss/utilities/index', 178 | 179 | './override', 180 | './custom'; -------------------------------------------------------------------------------- /docs/graphql/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | CodeSignal GraphQL API 10 | 11 | 12 | 13 | 14 | 15 |
16 |
17 |
18 | 19 | CodeSignal home 20 | 21 |
22 |
23 |

GraphQL API

24 | Explore the schema 25 |
26 |

Introduction

27 |
28 |

What is GraphQL?

29 |

30 | GraphQL is an API query language, originally created by Facebook as an alternative to REST. 31 | If you're new to GraphQL, the best place to start is the official documentation. 32 |

33 |
34 |
35 |

How do I make a query?

36 |

37 | It depends on what kind of environment you are making the query from. 38 | Check out this list of GraphQL client libraries to see some tools already available in multiple languages, 39 | including C#/.NET, Go, Java, JavaScript, and Python. These client libraries can make writing queries easier and may provide built-in support for features like caching. 40 |

41 |

42 | However, GraphQL is just a query language served over HTTP, so you can also make a request without using any GraphQL-specific libraries or packages. 43 | Here's an example using cURL (you'd need to replace the API key and test ID to try it yourself): 44 |

45 |
curl 'https://app.codesignal.com/graphql' -H 'Content-Type: application/json' -H 'Accept: application/json' -H 'Authorization: Bearer MY_API_KEY' --data-binary '{"query":"{ companyTest(id: \"MY_TEST_ID\") { title } }"}'
46 |

This returns data that looks like this:

47 |
{"data":{"companyTest":{"title":"My Company Test"}}}
48 |
49 |
50 |

How can I test my queries during development?

51 |

52 | Although you'll likely want to consume our API programmatically using a library in your language of choice, 53 | as you work on your integration, you may find it helpful to have a readily available UI for writing and running queries. 54 | For that, try out our GraphQL Playground, which is connected to our real API 55 | and provides a helpful interface that will make it easier for you to quickly spot and resolve syntax or schema issues in your queries. 56 |

57 |

58 | To use the GraphQL Playground, you need to first generate an API key (see below) and then provide that in the HTTP Headers section in the bottom-left: 59 |

60 |
{ "Authorization": "Bearer YOUR_API_KEY" }
61 |

62 | As long as you provide a valid API key, you can write and execute queries here and see the result immediately. If there are errors in your query syntax, 63 | red highlighting will appear on the left side of lines with errors, and you can hover over the query to learn more about what is wrong. 64 |

65 |

66 | You can also explore the GraphQL schema and documentation live from the GraphQL Playground, as well as copy your query to a cURL command like the one from the previous section. 67 |

68 |
69 |
70 |

What kinds of queries can I make?

71 |

72 | Take a look at our schema. All read-only queries can be found under RootQuery, and all mutations can be found under RootMutation. 73 |

74 |

75 | Here's an example of a query that you could run to fetch the answers from a company test session: 76 |

77 |
query AnswerQuery {
 78 |   companyTestSession(id: "MY_TEST_SESSION_ID") {
 79 |     id
 80 |     result {
 81 |       taskResults {
 82 |         solution {
 83 |           id
 84 |           ... on CodingSolution {
 85 |             sources {
 86 |               source
 87 |               language
 88 |               path
 89 |             }
 90 |           }
 91 |           ... on FreeFormSolution {
 92 |             freeTextAnswer: answer
 93 |           }
 94 |           ... on QuizSolution {
 95 |             quizAnswer: answer
 96 |           }
 97 |         }
 98 |       }
 99 |     }
100 |   }
101 | }
102 |

103 | In this case, we're using the graph-based nature of the API to make the following request: 104 | Look up a given company test session. For that session, return the ID and the result. 105 | For the result, return the result for each task, including the solution. For each solution, 106 | return the ID of the solution and more information depending on what 107 | kind of solution it is (using inline fragment syntax 108 | to query different fields based on type, and aliases 109 | to make sure the "answer" field does not conflict, since it has different types for free-text and quiz answers. 110 |

111 |

112 | That might return something that looks like this: 113 |

114 |
{
115 |   "data": {
116 |     "companyTestSession": {
117 |       "id": "MY_TEST_SESSION_ID",
118 |       "result": {
119 |         "taskResults": [
120 |           {
121 |             "solution": {
122 |               "id": "MY_CODING_SOLUTION_ID",
123 |               "sources": [
124 |                 {
125 |                   "source": "console.log('hello world');",
126 |                   "language": "js",
127 |                   "path": "main.js"
128 |                 }
129 |               ]
130 |             },
131 |           },
132 |           {
133 |             "solution": {
134 |               "id": "MY_FREE_TEXT_SOLUTION_ID",
135 |               "freeTextAnswer": "Hello, world!",
136 |             },
137 |           },
138 |           {
139 |             "solution": {
140 |               "id": "MY_QUIZ_SOLUTION_ID",
141 |               "quizAnswer": [
142 |                 "All of the above"
143 |               ]
144 |             },
145 |           }
146 |         ]
147 |       }
148 |     }
149 |   }
150 | }
151 |
152 |
153 |
154 |

Authentication

155 |
156 |

How do I get an API key?

157 |

158 | If you're not already using CodeSignal, start a conversation with us by requesting a demo. 159 |

160 |

161 | If you're an existing customer, reach out to support@codesignal.com to learn more. 162 |

163 |
164 |
165 |

How do I make an authenticated request?

166 |

167 | When making a GraphQL request, pass an "Authorization" header with a value of "Bearer YOUR_API_KEY" with the HTTP request. 168 | You can see a simple example of this in the cURL command above. 169 |

170 |

171 | Some queries or mutations may require specific permissions to be assigned to your API key. 172 | If you receive Access Denied errors that you believe to be in error, please contact support. 173 |

174 |
175 |
176 |
177 |

Rate Limits and Maximum Cost

178 |
179 |

What are rate limits and cost complexity, anyway?

180 |

181 | Let's start with an analogy: Say you (the API consumer) are at home, ordering groceries (data) through a service like Instacart (the API). 182 |

183 |

184 | A REST API is like a shopper who can only buy one item from the grocery store at a time. 185 | They can get any item in the store, but only one; if you want a second item, they have to make another full round-trip. 186 | For this kind of API, the main limit is a "rate limit." In other words, how frequently can you ask the shopper to go to the store? 187 |

188 |

189 | On the other hand, GraphQL APIs are like shoppers who can buy a whole cart's worth of goods. Convenient! 190 | Like REST API shoppers, they may also have a limit on how frequently they can go to the store (a rate limit), 191 | but they can bring back a lot more groceries per trip. However, if you order too many things at once, 192 | they won't all fit in the shopping cart. The size of the shopping cart is the "maximum cost" allowed per trip. 193 |

194 |
195 |
196 |

What are CodeSignal's rate and cost limits?

197 |

198 | Our rate limits vary based on the query or mutation; specific limits can be found in the schema documentation. Common values are 10 requests per second, 199 | or 5 requests per second. 200 |

201 |

202 | Our maximum cost for a single query is 10000, and additionally we also don't allow queries with a depth greater than 10. 203 |

204 |

205 | The cost of each resource can be found in the schema documentation, either as a scalar number or a multiplier based on the input. 206 | The total cost of a query will be determined by the cumulative cost of each queried resource. 207 |

208 |
209 |
210 |
211 | GraphQL Schema 212 | Webhook API 213 | Developer Home 214 |
215 |
216 |
217 |
218 | 219 | -------------------------------------------------------------------------------- /docs/images/client-events.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 |
Customer Flow
Customer Flow
A test session is created
A test session...
companyTestSessionCreated
companyTestSessionCreated
assessmentCreated
assessmentCreated
Assessment updated
Assessment upda...
assessmentUpdated
assessmentUpdated
An assessment  is created
An assessment...
-------------------------------------------------------------------------------- /docs/images/live-interview-events.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |
Live Interview Flow
Live Interview Flow
liveInterviewFinished
liveInterviewFinished
Interview created
Interview created
liveInterviewFeedbackUpdated
liveInterviewFeedbackUpdated
Interview started
Interview started
Interview finished
Interview finished
Interview feedback created/updated 
Interview feedback c...
-------------------------------------------------------------------------------- /docs/webhooks/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | CodeSignal Webhook API 9 | 13 | 14 | 15 | 16 | 17 |
18 |
19 |
20 | 21 | CodeSignal home 22 | 23 |
24 |
25 |

Webhook API

26 |
27 |
28 |

Table of Contents

29 | 88 |
89 |
90 |
91 |

Introduction

92 |
93 |

What is a webhook?

94 |

95 | A webhook is a way to receive an event notification from a server. When certain 96 | events occur in CodeSignal, a JSON payload containing information about the event 97 | will be sent via an HTTP POST request to a specified endpoint URL. 98 |

99 |
100 |
101 |

What information is needed to create a webhook?

102 |
103 | Each webhook needs the following information: 104 |
    105 |
  • 106 | Endpoint URL: The URL that will receive POST payloads. This 107 | must be a valid URL that returns a 200 HTTP status after receiving each POST. 108 | When the webhook is created or updated, the URL will be POSTed with an empty 109 | payload, which must return a 200 status code within 10 seconds in order to 110 | successfully complete creating or updating the webhook. 111 |
  • 112 |
  • 113 | Event types: The list of events the webhook will be notified 114 | about. 115 |
  • 116 |
  • 117 | Secret key: (optional) A string used to generate a signature 118 | header that you can use to verify that the webhook data came from CodeSignal. 119 | The secret key is used in conjunction with the webhook's payload to generate a 120 | digital signature. Although it is not strictly required, we strongly encourage 121 | use of the secret key to verify that webhooks are actually coming from our 122 | platform. 123 |
  • 124 |
  • 125 | Owner emails: (optional) If the webhook cannot deliver its 126 | payload to the endpoint URL successfully, we will send a notification email to 127 | every provided email address. Read more about the retry policy below. 128 |
  • 129 |
  • 130 | Custom headers: (optional) Custom HTTP request headers that we 131 | will send to your endpoint in addition to the signature header. 132 |
  • 133 |
134 |
135 |
136 |
137 |

How do I create a webhook?

138 |

139 | If you're not already using CodeSignal, 140 | start a conversation with us by 141 | requesting a demo. 142 |

143 |
144 | If you're an existing customer, you can create, edit and view status of your 145 | webhooks from the 146 | Manage Webhooks 149 | page. 150 |
    151 |
  • 152 | Go to the 153 | Manage Webhooks 156 | page to create a webhook, and hit the "add a webhook" button. 157 | Manage Webhooks page 162 |
  • 163 |
  • 164 | Fill out all of the required fields, as well as optional ones if you need them. 165 | We will generate a Secret key automatically, but you can 166 | overwrite it with a custom one. 167 | Create webhook modal 172 |
  • 173 |
  • 174 | All newly created webhooks are initially active. 175 | Healthy webhook 180 |
  • 181 |
  • 182 | A webhook that fails 25 times becomes "disabled". 183 | Disabled webhook 188 |
  • 189 |
  • You can re-enable a webhook by updating its endpoint with a valid one.
  • 190 |
191 |
192 |
193 |
194 |
195 |

Usage

196 |
197 |

Authentication

198 |

199 | For webhooks with a secret key, CodeSignal will sign every request with a 200 | X-CodeSignal-Signature HTTP header, generated using the 201 | following algorithm: 202 |

203 |
getSignature(secretKey, endpointUrl, { eventType = '', triggeredOn = '' }) {
204 |   const plainText = `${endpointUrl}${eventType}${triggeredOn}`;
205 |   const hash = crypto.createHmac('sha256', secretKey);
206 |   hash.update(plainText);
207 |   return hash.digest('hex');
208 | }
209 |

210 | Here, triggeredOn is the timestamp present in every event 211 | payload. 212 |

213 |
214 |
215 |

Event handling

216 |

217 | For each webhook, we store a list of events the hook should be notified about. When 218 | events have been triggered, CodeSignal sends webhooks one event at a time, at a rate 219 | of about one per second. If a web hook needs to be notified about multiple events, 220 | events are guaranteed to be sent in the order they were triggered. 221 |

222 |
223 |
224 |

Errors and retry policy

225 |
226 |

227 | If CodeSignal receives any response other than a 200 OK from the endpoint, 228 | the endpoint will be marked unhealthy, and CodeSignal will attempt to resend the 229 | event after a delay (up to 25 attempts total). 230 |

231 |

232 | CodeSignal is looking for a 200 OK response from the endpoint URL in order to continue processing 233 | further events. Do not return 400 errors; they will not be respected and the webhook 234 | will be flagged as unhealthy. Instead, keep error-handling logic internal to your endpoint. 235 |

236 |

237 | The delay is calculated using an exponential backoff strategy. In other words, 238 | the retry window will be short at first but will increase if the endpoint keeps failing. 239 | The delay between each failure and the next attempt is calculated with the formula below. 240 |

241 |
secondsToWait = (failCount - 1)^4 + 15 + (random(30) * failCount)
242 |
243 |

244 | Assuming that random(30) always returns its average of 15, 245 | that would lead to the following retry attempts. (Not all retries are listed in the 246 | table, since this is just meant to give a sense of the retry backoff timeline.) 247 |

248 | 249 | 250 | 251 | 252 | 253 | 254 | 255 | 256 | 257 | 258 | 259 | 260 | 261 | 262 | 263 | 264 | 265 | 266 | 267 | 268 | 269 | 270 | 271 | 272 | 273 | 274 | 275 | 276 | 277 | 278 | 279 | 280 | 281 | 282 | 283 | 284 | 285 | 286 | 287 | 288 | 289 | 290 | 291 | 292 | 293 | 294 | 295 | 296 | 297 | 298 | 299 | 300 | 301 | 302 | 303 | 304 | 305 | 306 | 307 | 308 |
Total failed attemptsTime until next attemptTime until next attempt, from first failure
130 seconds30 seconds
246 seconds1.3 minutes
31.2 minutes2.5 minutes
42.6 minutes5.1 minutes
612.2 minutes23 minutes
112.8 hours7.4 hours
148 hours1 day
1614 hours2.1 days
243.2 days16.6 days
25n/an/a
309 |

310 | After the first few retries CodeSignal will also send an email notification to the 311 | owner emails associated with the webhook, if any. To make sure we don't spam you, 312 | CodeSignal will only send emails for each webhook after the 5th failure, the 14th failure, 313 | and every failure starting from the 16th. 314 |

315 |

316 | When a webhook is unhealthy, events will be queued in the order they were triggered, 317 | and the queue will not be flushed until the first event in the queue can be 318 | processed successfully (by receiving a 200 OK response from the endpoint URL). If 319 | you are able to identify and resolve the issue with the endpoint URL, you can open 320 | the webhook settings modal, then test and save the fixed webhook in order to mark it 321 | as healthy again. Once it is marked as healthy, the webhook will immediately flush 322 | its queue of pending events. 323 |

324 |

325 | After 25 consecutive failed delivery attempts, the webhook will be disabled and the 326 | events queue will be cleared. You can re-enable the webhook after updating the endpoint 327 | to return a valid 200 OK response. 328 |

329 |
330 |
331 |

Webhook payloads

332 |
333 | All webhooks include the following fields in their payloads: 334 |
    335 |
  • event: [string] The type of event
  • 336 |
  • 337 | triggeredOn: [number] The timestamp of when the event was 338 | triggered, represented as number of milliseconds since the Unix epoch. 339 |
  • 340 |
  • 341 | payload: [object] The list of events the webhook will be 342 | notified about. 343 |
  • 344 |
345 |
346 |
347 |
348 |
349 |

Events for CodeSignal Assessments

350 |
351 |

352 | Here is an overview of the end to end workflow of events for CodeSignal Assessments. 353 |

354 |
355 | Diagram of webhooks end to end flow 360 |
361 |
362 |

Customer workflow

363 |
364 | Diagram of webhooks triggered on customer flow 369 |
370 |
371 |

assessmentCreated

372 |

Fired when a new assessment is created.

373 |
Request format:
374 |
{
375 |    event: 'assessmentCreated',
376 |    triggeredOn: number,
377 |    payload: {
378 |      assessmentId: string,
379 |      assessmentTitle: string,
380 |      assessmentStatus: 'active' | 'archived' | 'deleted'
381 |    }
382 |  };
383 |
Sample request:
384 |
{
385 |    event: 'assessmentCreated',
386 |    triggeredOn: 1553720789347,
387 |    payload: {
388 |      assessmentId: 'lehu382hdleh29',
389 |      assessmentTitle: 'General Coding Assessment',
390 |      assessmentStatus: 'active'
391 |    }
392 |  };
393 |
394 |
395 |

assessmentUpdated

396 |

Fired when an assessment is updated.

397 |
Request format:
398 |
{
399 |    event: 'assessmentUpdated',
400 |    triggeredOn: number,
401 |    payload: {
402 |      assessmentId: string,
403 |      assessmentTitle: string,
404 |      assessmentStatus: 'active' | 'archived' | 'deleted'
405 |    }
406 |  };
407 |
Sample request:
408 |
{
409 |    event: 'assessmentUpdated',
410 |    triggeredOn: 1553720789347,
411 |    payload: {
412 |      assessmentId: 'lehu382hdleh29',
413 |      assessmentTitle: 'General Coding Assessment',
414 |      assessmentStatus: 'archived'
415 |    }
416 |  };
417 |
418 |
419 |

companyTestSessionCreated

420 |

Fired when a test session is created.

421 |
Request format:
422 |
{
423 |    event: 'companyTestSessionCreated',
424 |    triggeredOn: number,
425 |    payload: {
426 |      testSessionId: string,
427 |      testId: string,
428 |      testTitle: string,
429 |      candidateEmail: string,
430 |      candidateName: string
431 |    }
432 |  };
433 |
Sample request:
434 |
{
435 |    event: 'companyTestSessionCreated',
436 |    triggeredOn: 1553720789347,
437 |    payload: {
438 |      testSessionId: 'lehu382hdleh29',
439 |      testId: 'dhey29hcl28hl28',
440 |      testTitle: 'Software Engineer intern',
441 |      candidateEmail: 'jane.doe@gmail.com',
442 |      candidateName: 'Jane Doe'
443 |    }
444 |  };
445 |
446 |
447 |

Candidate workflow

448 |
449 | Diagram of webhooks triggered by the CodeSignal Assessments product 454 |
455 |
456 |

preScreenCandidateDeclined

457 |

Fired when a candidate declines a test session invitation.

458 |
Request format:
459 |
{
460 |   event: 'preScreenCandidateDeclined',
461 |   triggeredOn: number,
462 |   payload: {
463 |     testSessionId: string,
464 |     testId: string,
465 |     testTitle: string,
466 |     candidateEmail: string,
467 |     candidateName: string,
468 |     externalId?: string
469 |   }
470 | };
471 |
Sample request:
472 |
{
473 |   event: 'preScreenCandidateDeclined',
474 |   triggeredOn: 1553720789347,
475 |   payload: {
476 |     testSessionId: 'lehu382hdleh29',
477 |     testId: 'dhey29hcl28hl28',
478 |     testTitle: 'Software Engineer intern',
479 |     candidateEmail: 'jane.doe@gmail.com',
480 |     candidateName: 'Jane Doe'
481 |   }
482 | };
483 |
484 |
485 |

preScreenResultShared

486 |

487 | Fired when a candidate shares their existing result with a test session invitation. 488 |

489 |
Request format:
490 |
{
491 |   event: 'preScreenResultShared',
492 |   triggeredOn: number,
493 |   payload: {
494 |     testSessionId: string,
495 |     testId: string,
496 |     testTitle: string,
497 |     candidateEmail: string,
498 |     candidateName: string,
499 |     duration: number,
500 |     score: number,
501 |     maxScore: number | null | undefined,
502 |     plagiarismLevel: number, // deprecated
503 |     plagiarismLabel: 'none' | 'low' | 'medium' | 'high' | '-', // deprecated
504 |     url: string,
505 |     codingScore?: number | null, // deprecated; use versionedCodingScore instead
506 |     versionedCodingScore?: {
507 |       version: 'original' | 'codingScore2023',
508 |       value: number,
509 |     },
510 |     externalId?: string
511 |   }
512 | };
513 |
Sample request:
514 |
{
515 |   event: 'preScreenResultShared',
516 |   triggeredOn: 1553720789347,
517 |   payload: {
518 |     testSessionId: 'lehu382hdleh29',
519 |     testId: 'dhey29hcl28hl28',
520 |     testTitle: 'Software Engineer intern',
521 |     candidateEmail: 'jane.doe@gmail.com',
522 |     candidateName: 'Jane Doe',
523 |     duration: 3480000, // 58 minutes
524 |     score: 900,
525 |     maxScore: 1000,
526 |     codingScore: 820,
527 |     versionedCodingScore: {
528 |       version: 'codingScore2023',
529 |       value: 575
530 |     },
531 |     plagiarismLevel: 0,
532 |     plagiarismLabel: '-',
533 |     url: https://app.codesignal.com/test-result/oH3qeBC38oFsf7qB4?accessToken=A7HnBpab4aD7xm7Kp-iPhk2se5Wnxeg7x9GruANLzn
534 |   }
535 | };
536 |
537 |
538 |

preScreenExpired

539 |

540 | Fired when a test session invitation cannot be fulfilled within the expiration 541 | window. The expiredReason field indicates whether the expiration is 542 | due to the test not being taken at all, or whether the test could not be certified 543 | by CodeSignal due to possibility/suspicion of cheating. If the latter, a 544 | rejectedReasons field will also be provided. 545 |

546 |
Request format:
547 |
{
548 |   event: 'preScreenExpired',
549 |   triggeredOn: number,
550 |   payload: {
551 |     testSessionId: string,
552 |     testId: string,
553 |     testTitle: string,
554 |     candidateEmail: string,
555 |     candidateName: string,
556 |     externalId?: string,
557 |     expiredReason: 'testNotTaken' | 'notCertified',
558 |     rejectedReasons?: Array<string>,
559 |   }
560 | };
561 |
Sample request:
562 |
{
563 |   event: 'preScreenExpired',
564 |   triggeredOn: 1553720789347,
565 |   payload: {
566 |     testSessionId: 'lehu382hdleh29',
567 |     testId: 'dhey29hcl28hl28',
568 |     testTitle: 'Software Engineer intern',
569 |     candidateEmail: 'jane.doe@gmail.com',
570 |     candidateName: 'Jane Doe',
571 |     expiredReason: 'notCertified',
572 |     rejectedReasons: ['Unauthorized resource', 'Presence of others'],
573 |   }
574 | };
575 |
576 |
577 |

companyTestSessionStarted

578 |

Fired when a candidate starts a test session.

579 |
Request format:
580 |
{
581 |   event: 'companyTestSessionStarted',
582 |   triggeredOn: number,
583 |   payload: {
584 |     testSessionId: string,
585 |     testId: string,
586 |     testTitle: string,
587 |     candidateEmail: string,
588 |     candidateName: string
589 |   }
590 | };
591 |
Sample request:
592 |
{
593 |   event: 'companyTestSessionStarted',
594 |   triggeredOn: 1553720789347,
595 |   payload: {
596 |     testSessionId: 'lehu382hdleh29',
597 |     testId: 'dhey29hcl28hl28',
598 |     testTitle: 'Software Engineer intern',
599 |     candidateEmail: 'jane.doe@gmail.com',
600 |     candidateName: 'Jane Doe'
601 |   }
602 | };
603 |
604 |
605 |

preScreenResultVerificationPending

606 |

Fired when a candidate finishes a proctored test session.

607 |
Request format:
608 |
{
609 |   event: 'preScreenResultVerificationPending',
610 |   triggeredOn: number,
611 |   payload: {
612 |     testSessionId: string,
613 |     testId: string,
614 |     testTitle: string,
615 |     candidateEmail: string,
616 |     candidateName: string,
617 |     duration: number,
618 |     score: number,
619 |     maxScore: number | null | undefined,
620 |     codingScore?: number | null, // deprecated; use versionedCodingScore instead
621 |     versionedCodingScore?: {
622 |       version: 'original' | 'codingScore2023',
623 |       value: number,
624 |     },
625 |     externalId?: string
626 |   }
627 | };
628 |
Sample request:
629 |
{
630 |   event: 'preScreenResultVerificationPending',
631 |   triggeredOn: 1553720789347,
632 |   payload: {
633 |     testSessionId: 'lehu382hdleh29',
634 |     testId: 'dhey29hcl28hl28',
635 |     testTitle: 'Software Engineer intern',
636 |     candidateEmail: 'jane.doe@gmail.com',
637 |     candidateName: 'Jane Doe',
638 |     duration: 3480000, // 58 minutes
639 |     score: 900,
640 |     maxScore: 1000,
641 |     codingScore: 820,
642 |     versionedCodingScore: {
643 |       version: 'codingScore2023',
644 |       value: 575
645 |     },
646 |   }
647 | };
648 |
649 |
650 |

companyTestSessionFinished

651 |

Fired when a non-proctored test session is finished.

652 |
Request format:
653 |
{
654 |   event: 'companyTestSessionFinished',
655 |   triggeredOn: number,
656 |   payload: {
657 |     testSessionId: string,
658 |     testId: string,
659 |     testTitle: string,
660 |     candidateEmail: string,
661 |     candidateName: string,
662 |     duration: number, // milliseconds
663 |     score: number,
664 |     maxScore: number,
665 |     codingScore?: number | null, // deprecated; use versionedCodingScore instead
666 |     versionedCodingScore?: {
667 |       version: 'original' | 'codingScore2023',
668 |       value: number,
669 |     },
670 |     plagiarismLevel: number, // deprecated
671 |     plagiarismLabel: 'none' | 'low' | 'medium' | 'high' | '-', // deprecated
672 |     url: string,
673 |   }
674 | };
675 |
Sample request:
676 |
{
677 |   event: 'companyTestSessionFinished',
678 |   triggeredOn: 1553720789347,
679 |   payload: {
680 |     testSessionId: 'lehu382hdleh29',
681 |     testId: 'dhey29hcl28hl28',
682 |     testTitle: 'Software Engineer intern',
683 |     candidateEmail: 'jane.doe@gmail.com',
684 |     candidateName: 'Jane Doe',
685 |     duration: 3480000, // 58 minutes
686 |     score: 900,
687 |     maxScore: 1000,
688 |     codingScore: 820,
689 |     versionedCodingScore: {
690 |       version: 'codingScore2023',
691 |       value: 575
692 |     },
693 |     plagiarismLevel: 0,
694 |     plagiarismLabel: '-',
695 |     url: https://app.codesignal.com/test-result/oH3qeBC38oFsf7qB4?accessToken=A7HnBpab4aD7xm7Kp-iPhk2se5Wnxeg7x9GruANLzn
696 |   }
697 | };
698 |
699 |
700 |

preScreenIntegrityReviewUpdated

701 |

Fired when a non-proctored test session's integrity review status is updated.

702 |
Request format:
703 |
{
704 |   event: 'preScreenIntegrityReviewUpdated',
705 |   triggeredOn: number,
706 |   payload: {
707 |     testSessionId: string,
708 |     testId: string,
709 |     testTitle: string,
710 |     candidateEmail: string,
711 |     candidateName: string,
712 |     integrityReviewSuggested: boolean,
713 |   }
714 | };
715 |
Sample request:
716 |
{
717 |   event: 'preScreenIntegrityReviewUpdated',
718 |   triggeredOn: 1553720789347,
719 |   payload: {
720 |     testSessionId: 'lehu382hdleh29',
721 |     testId: 'dhey29hcl28hl28',
722 |     testTitle: 'Software Engineer intern',
723 |     candidateEmail: 'jane.doe@gmail.com',
724 |     candidateName: 'Jane Doe',
725 |     integrityReviewSuggested: true
726 |   }
727 | };
728 |
729 |
730 |

CodeSignal Auditor workflow

731 |
732 | Diagram of webhooks triggered on CodeSignal auditor flow 737 |
738 | 739 |
740 |

preScreenResultNotVerified

741 |

742 | Fired when a test session is marked as not verified by CodeSignal. This means that 743 | either the session has been flagged for suspicious behavior, or a technical issue 744 | has been identified during the session (in which case the candidate will be 745 | automatically granted a retake). 746 |

747 |
Request format:
748 |
{
749 |   event: 'preScreenResultNotVerified',
750 |   triggeredOn: number,
751 |   payload: {
752 |     testSessionId: string,
753 |     testId: string,
754 |     testTitle: string,
755 |     candidateEmail: string,
756 |     candidateName: string,
757 |     rejectedReasons?: Array<string>,
758 |   }
759 | };
760 |
Sample request:
761 |
{
762 |   event: 'preScreenResultNotVerified',
763 |   triggeredOn: 1553720789347,
764 |   payload: {
765 |     testSessionId: 'lehu382hdleh29',
766 |     testId: 'dhey29hcl28hl28',
767 |     testTitle: 'Software Engineer intern',
768 |     candidateEmail: 'jane.doe@gmail.com',
769 |     candidateName: 'Jane Doe',
770 |     rejectedReasons: ['Incomplete recording', 'Screen not visible],
771 |   }
772 | };
773 |
774 | 775 |
776 |

preScreenResultVerified

777 |

Fired when a proctored test session is verified by CodeSignal.

778 |
Request format:
779 |
{
780 |   event: 'preScreenResultVerified',
781 |   triggeredOn: number,
782 |   payload: {
783 |     testSessionId: string,
784 |     testId: string,
785 |     testTitle: string,
786 |     candidateEmail: string,
787 |     candidateName: string,
788 |     duration: number, // milliseconds
789 |     score: number,
790 |     maxScore: number,
791 |     codingScore?: number | null, // deprecated; use versionedCodingScore instead
792 |     versionedCodingScore?: {
793 |       version: 'original' | 'codingScore2023',
794 |       value: number,
795 |     },
796 |     plagiarismLevel: number, // deprecated
797 |     plagiarismLabel: 'none' | 'low' | 'medium' | 'high' | '-', // deprecated
798 |     url: string,
799 |   }
800 | };
801 |
Sample request:
802 |
{
803 |   event: 'preScreenResultVerified',
804 |   triggeredOn: 1553720789347,
805 |   payload: {
806 |     testSessionId: 'lehu382hdleh29',
807 |     testId: 'dhey29hcl28hl28',
808 |     testTitle: 'Software Engineer intern',
809 |     candidateEmail: 'jane.doe@gmail.com',
810 |     candidateName: 'Jane Doe',
811 |     duration: 3480000, // 58 minutes
812 |     score: 900,
813 |     maxScore: 1000,
814 |     codingScore: 820,
815 |     versionedCodingScore: {
816 |       version: 'codingScore2023',
817 |       value: 575
818 |     },
819 |     plagiarismLevel: 0,
820 |     plagiarismLabel: '-',
821 |     url: https://app.codesignal.com/test-result/oH3qeBC38oFsf7qB4?accessToken=A7HnBpab4aD7xm7Kp-iPhk2se5Wnxeg7x9GruANLzn
822 |   }
823 | };
824 |
825 |

Events for CodeSignal Live Interviews

826 |
827 |

Live Interview webhooks process flow

828 | Diagram of webhooks process flow for CodeSignal Live Interview 833 |
834 |
835 |

liveInterviewFinished

836 |

837 | Fired when an interviewer finishes a live interview or when a live interview times 838 | out. 839 |

840 |
Request format:
841 |
{
842 |   event: 'liveInterviewFinished',
843 |   triggeredOn: number,
844 |   payload: {
845 |     interviewId: string,
846 |     candidateName: string,
847 |     candidateEmail: string,
848 |     startDate: number,
849 |     endDate: number,
850 |     questionsSolved: number,
851 |     questionsAttempted: number,
852 |     url: string,
853 |   }
854 | };
855 |
Sample request:
856 |
{
857 |   event: 'liveInterviewFinished',
858 |   triggeredOn: 1553720789347,
859 |   payload: {
860 |     interviewId: 'zWve8sgiLJit6isiM',
861 |     candidateName: 'Jane Doe',
862 |     candidateEmail: 'jane.doe@gmail.com',
863 |     startDate: 1727896812565,
864 |     endDate: 1727896849868,
865 |     questionsSolved: 1,
866 |     questionsAttempted: 2,
867 |     url: https://app.codesignal.com/client-dashboard/interviews?status=over&liveInterviewId=zWve8sgiLJit6isiM
868 |   }
869 | };
870 |
871 |
872 |

liveInterviewFeedbackUpdated

873 |

Fired when an interviewer adds or updates interview feedback.

874 |
Request format:
875 |
{
876 |   event: 'liveInterviewFeedbackUpdated',
877 |   triggeredOn: number,
878 |   payload: {
879 |     interviewId: string,
880 |     interviewerId: string,
881 |     feedback: {
882 |       generalNotes: string,
883 |       categories?: Array<{
884 |         name: string,
885 |         attributes: Array<{
886 |           name: string,
887 |           score?: number,
888 |           notes?: string,
889 |         }>,
890 |       }>,
891 |       recommendedLevel?: string,
892 |       overallEvaluation?: string,
893 |     }
894 |   }
895 | };
896 |
Sample request:
897 |
{
898 |   event: 'liveInterviewFeedbackUpdated',
899 |   triggeredOn: 1553720789347,
900 |   payload: {
901 |     interviewId: 'zWve8sgiLJit6isiM',
902 |     interviewerId: 'qcmbuCuxpHELGYEJw',
903 |     feedback: {
904 |       generalNotes: 'Great candidate, very knowledgeable',
905 |       categories: [
906 |         {
907 |           name: 'Problem Solving',
908 |           attributes: [
909 |             {
910 |               name: 'Problem Solving',
911 |               score: 4,
912 |               notes: 'Great problem solving skills',
913 |             },
914 |             {
915 |               name: 'Code Quality',
916 |               score: 3,
917 |             },
918 |           ],
919 |         },
920 |         {
921 |           name: 'Communication',
922 |           attributes: [
923 |             {
924 |               name: 'Communication',
925 |               score: 5,
926 |               notes: 'Excellent communication skills',
927 |             },
928 |           ],
929 |         },
930 |       ],
931 |       recommendedLevel: 'Senior',
932 |       overallEvaluation: 'Strong Yes',
933 |     }
934 |   }
935 | };
936 |
937 |
938 |
939 | 944 |
945 |
946 | 947 | 948 | -------------------------------------------------------------------------------- /docs/diagrams/webhooks-flow.drawio: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 | 252 | 253 | 254 | 255 | 256 | 257 | 258 | 259 | 260 | 261 | 262 | 263 | 264 | 265 | 266 | 267 | 268 | 269 | 270 | 271 | 272 | 273 | 274 | 275 | 276 | 277 | 278 | 279 | 280 | 281 | 282 | 283 | 284 | 285 | 286 | 287 | 288 | 289 | 290 | 291 | 292 | 293 | 294 | 295 | 296 | 297 | 298 | 299 | 300 | 301 | 302 | 303 | 304 | 305 | 306 | 307 | 308 | 309 | 310 | 311 | 312 | 313 | 314 | 315 | 316 | 317 | 318 | 319 | 320 | 321 | 322 | 323 | 324 | 325 | 326 | 327 | 328 | 329 | 330 | 331 | 332 | 333 | 334 | 335 | 336 | 337 | 338 | 339 | 340 | 341 | 342 | 343 | 344 | 345 | 346 | 347 | 348 | 349 | 350 | 351 | 352 | 353 | 354 | 355 | 356 | 357 | 358 | 359 | 360 | 361 | 362 | 363 | 364 | 365 | 366 | 367 | 368 | 369 | 370 | 371 | 372 | 373 | 374 | 375 | 376 | 377 | 378 | 379 | 380 | 381 | 382 | 383 | 384 | 385 | 386 | 387 | 388 | 389 | 390 | 391 | 392 | 393 | 394 | 395 | 396 | 397 | 398 | 399 | 400 | 401 | 402 | 403 | 404 | 405 | 406 | 407 | 408 | 409 | 410 | 411 | 412 | 413 | 414 | 415 | 416 | 417 | 418 | 419 | 420 | 421 | 422 | 423 | 424 | 425 | 426 | 427 | 428 | 429 | 430 | 431 | 432 | 433 | 434 | 435 | 436 | 437 | 438 | 439 | 440 | 441 | 442 | 443 | 444 | 445 | 446 | 447 | 448 | 449 | 450 | 451 | 452 | 453 | 454 | 455 | 456 | 457 | 458 | 459 | 460 | 461 | 462 | 463 | 464 | 465 | 466 | 467 | 468 | 469 | 470 | 471 | 472 | 473 | 474 | 475 | 476 | 477 | 478 | 479 | 480 | 481 | 482 | 483 | 484 | 485 | 486 | 487 | 488 | 489 | 490 | 491 | 492 | 493 | 494 | 495 | 496 | 497 | 498 | 499 | 500 | 501 | 502 | 503 | 504 | 505 | 506 | 507 | 508 | 509 | 510 | 511 | 512 | 513 | 514 | 515 | 516 | 517 | 518 | 519 | 520 | 521 | 522 | 523 | 524 | 525 | 526 | 527 | 528 | 529 | 530 | 531 | 532 | 533 | 534 | 535 | 536 | 537 | 538 | 539 | 540 | 541 | 542 | 543 | 544 | --------------------------------------------------------------------------------