diff --git a/Cargo.lock b/Cargo.lock index 8e7e17678..527306bfa 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -801,7 +801,7 @@ checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" [[package]] name = "bencher_adapter" -version = "0.4.3" +version = "0.4.4" dependencies = [ "bencher_json", "criterion", @@ -818,7 +818,7 @@ dependencies = [ [[package]] name = "bencher_api" -version = "0.4.3" +version = "0.4.4" dependencies = [ "async-compression", "async-trait", @@ -869,7 +869,7 @@ dependencies = [ [[package]] name = "bencher_billing" -version = "0.4.3" +version = "0.4.4" dependencies = [ "async-stripe", "bencher_json", @@ -884,7 +884,7 @@ dependencies = [ [[package]] name = "bencher_bing_index" -version = "0.4.3" +version = "0.4.4" dependencies = [ "reqwest", "serde", @@ -895,7 +895,7 @@ dependencies = [ [[package]] name = "bencher_boundary" -version = "0.4.3" +version = "0.4.4" dependencies = [ "bencher_json", "bencher_logger", @@ -909,7 +909,7 @@ dependencies = [ [[package]] name = "bencher_cli" -version = "0.4.3" +version = "0.4.4" dependencies = [ "bencher_adapter", "bencher_client", @@ -937,7 +937,7 @@ dependencies = [ [[package]] name = "bencher_client" -version = "0.4.3" +version = "0.4.4" dependencies = [ "bencher_json", "bytes", @@ -957,7 +957,7 @@ dependencies = [ [[package]] name = "bencher_comment" -version = "0.4.3" +version = "0.4.4" dependencies = [ "bencher_json", "url", @@ -965,7 +965,7 @@ dependencies = [ [[package]] name = "bencher_github" -version = "0.4.3" +version = "0.4.4" dependencies = [ "bencher_valid", "oauth2", @@ -978,7 +978,7 @@ dependencies = [ [[package]] name = "bencher_google_index" -version = "0.4.3" +version = "0.4.4" dependencies = [ "http 0.2.11", "reqwest", @@ -992,7 +992,7 @@ dependencies = [ [[package]] name = "bencher_json" -version = "0.4.3" +version = "0.4.4" dependencies = [ "bencher_valid", "chrono", @@ -1017,7 +1017,7 @@ dependencies = [ [[package]] name = "bencher_license" -version = "0.4.3" +version = "0.4.4" dependencies = [ "bencher_json", "chrono", @@ -1031,7 +1031,7 @@ dependencies = [ [[package]] name = "bencher_logger" -version = "0.4.3" +version = "0.4.4" dependencies = [ "slog", "slog-term", @@ -1039,7 +1039,7 @@ dependencies = [ [[package]] name = "bencher_plot" -version = "0.4.3" +version = "0.4.4" dependencies = [ "bencher_json", "chrono", @@ -1054,7 +1054,7 @@ dependencies = [ [[package]] name = "bencher_rbac" -version = "0.4.3" +version = "0.4.4" dependencies = [ "bencher_json", "literally", @@ -1065,7 +1065,7 @@ dependencies = [ [[package]] name = "bencher_token" -version = "0.4.3" +version = "0.4.4" dependencies = [ "bencher_json", "chrono", @@ -1078,7 +1078,7 @@ dependencies = [ [[package]] name = "bencher_valid" -version = "0.4.3" +version = "0.4.4" dependencies = [ "base64 0.21.7", "chrono", @@ -8144,7 +8144,7 @@ checksum = "66fee0b777b0f5ac1c69bb06d361268faafa61cd4682ae064a171c16c433e9e4" [[package]] name = "xtask" -version = "0.4.3" +version = "0.4.4" dependencies = [ "anyhow", "assert_cmd", diff --git a/Cargo.toml b/Cargo.toml index 7646a876d..833dcb093 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,7 +3,7 @@ members = ["services/api", "services/cli", "lib/*", "plus/*", "xtask"] resolver = "2" [workspace.package] -version = "0.4.3" +version = "0.4.4" authors = ["Everett Pompeii "] edition = "2021" diff --git a/services/action/dist/index.js b/services/action/dist/index.js index c6347f34b..c2152267e 100644 --- a/services/action/dist/index.js +++ b/services/action/dist/index.js @@ -6033,6 +6033,7 @@ const MockAgent = __nccwpck_require__(6771) const MockPool = __nccwpck_require__(6193) const mockErrors = __nccwpck_require__(888) const ProxyAgent = __nccwpck_require__(7858) +const RetryHandler = __nccwpck_require__(2286) const { getGlobalDispatcher, setGlobalDispatcher } = __nccwpck_require__(1892) const DecoratorHandler = __nccwpck_require__(6930) const RedirectHandler = __nccwpck_require__(2860) @@ -6054,6 +6055,7 @@ module.exports.Pool = Pool module.exports.BalancedPool = BalancedPool module.exports.Agent = Agent module.exports.ProxyAgent = ProxyAgent +module.exports.RetryHandler = RetryHandler module.exports.DecoratorHandler = DecoratorHandler module.exports.RedirectHandler = RedirectHandler @@ -6954,6 +6956,7 @@ function request (opts, callback) { } module.exports = request +module.exports.RequestHandler = RequestHandler /***/ }), @@ -7336,6 +7339,8 @@ const kBody = Symbol('kBody') const kAbort = Symbol('abort') const kContentType = Symbol('kContentType') +const noop = () => {} + module.exports = class BodyReadable extends Readable { constructor ({ resume, @@ -7469,37 +7474,50 @@ module.exports = class BodyReadable extends Readable { return this[kBody] } - async dump (opts) { + dump (opts) { let limit = opts && Number.isFinite(opts.limit) ? opts.limit : 262144 const signal = opts && opts.signal - const abortFn = () => { - this.destroy() - } - let signalListenerCleanup + if (signal) { - if (typeof signal !== 'object' || !('aborted' in signal)) { - throw new InvalidArgumentError('signal must be an AbortSignal') - } - util.throwIfAborted(signal) - signalListenerCleanup = util.addAbortListener(signal, abortFn) - } - try { - for await (const chunk of this) { - util.throwIfAborted(signal) - limit -= Buffer.byteLength(chunk) - if (limit < 0) { - return + try { + if (typeof signal !== 'object' || !('aborted' in signal)) { + throw new InvalidArgumentError('signal must be an AbortSignal') } + util.throwIfAborted(signal) + } catch (err) { + return Promise.reject(err) } - } catch { - util.throwIfAborted(signal) - } finally { - if (typeof signalListenerCleanup === 'function') { - signalListenerCleanup() - } else if (signalListenerCleanup) { - signalListenerCleanup[Symbol.dispose]() - } } + + if (this.closed) { + return Promise.resolve(null) + } + + return new Promise((resolve, reject) => { + const signalListenerCleanup = signal + ? util.addAbortListener(signal, () => { + this.destroy() + }) + : noop + + this + .on('close', function () { + signalListenerCleanup() + if (signal && signal.aborted) { + reject(signal.reason || Object.assign(new Error('The operation was aborted'), { name: 'AbortError' })) + } else { + resolve(null) + } + }) + .on('error', noop) + .on('data', function (chunk) { + limit -= chunk.length + if (limit <= 0) { + this.destroy() + } + }) + .resume() + }) } } @@ -8879,13 +8897,13 @@ module.exports = { /***/ }), /***/ 9174: -/***/ ((module) => { +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; module.exports = { - kConstruct: Symbol('constructable') + kConstruct: (__nccwpck_require__(2785).kConstruct) } @@ -9871,11 +9889,9 @@ class Parser { socket[kReset] = true } - let pause - try { - pause = request.onHeaders(statusCode, headers, this.resume, statusText) === false - } catch (err) { - util.destroy(socket, err) + const pause = request.onHeaders(statusCode, headers, this.resume, statusText) === false + + if (request.aborted) { return -1 } @@ -9922,13 +9938,8 @@ class Parser { this.bytesRead += buf.length - try { - if (request.onData(buf) === false) { - return constants.ERROR.PAUSED - } - } catch (err) { - util.destroy(socket, err) - return -1 + if (request.onData(buf) === false) { + return constants.ERROR.PAUSED } } @@ -9969,11 +9980,7 @@ class Parser { return -1 } - try { - request.onComplete(headers) - } catch (err) { - errorRequest(client, request, err) - } + request.onComplete(headers) client[kQueue][client[kRunningIdx]++] = null @@ -10137,7 +10144,7 @@ async function connect (client) { const idx = hostname.indexOf(']') assert(idx !== -1) - const ip = hostname.substr(1, idx - 1) + const ip = hostname.substring(1, idx) assert(net.isIP(ip)) hostname = ip @@ -10636,6 +10643,7 @@ function writeH2 (client, session, request) { return false } + /** @type {import('node:http2').ClientHttp2Stream} */ let stream const h2State = client[kHTTP2SessionState] @@ -10731,14 +10739,10 @@ function writeH2 (client, session, request) { const shouldEndStream = method === 'GET' || method === 'HEAD' if (expectContinue) { headers[HTTP2_HEADER_EXPECT] = '100-continue' - /** - * @type {import('node:http2').ClientHttp2Stream} - */ stream = session.request(headers, { endStream: shouldEndStream, signal }) stream.once('continue', writeBodyH2) } else { - /** @type {import('node:http2').ClientHttp2Stream} */ stream = session.request(headers, { endStream: shouldEndStream, signal @@ -10750,7 +10754,9 @@ function writeH2 (client, session, request) { ++h2State.openStreams stream.once('response', headers => { - if (request.onHeaders(Number(headers[HTTP2_HEADER_STATUS]), headers, stream.resume.bind(stream), '') === false) { + const { [HTTP2_HEADER_STATUS]: statusCode, ...realHeaders } = headers + + if (request.onHeaders(Number(statusCode), realHeaders, stream.resume.bind(stream), '') === false) { stream.pause() } }) @@ -10760,13 +10766,17 @@ function writeH2 (client, session, request) { }) stream.on('data', (chunk) => { - if (request.onData(chunk) === false) stream.pause() + if (request.onData(chunk) === false) { + stream.pause() + } }) stream.once('close', () => { h2State.openStreams -= 1 // TODO(HTTP/2): unref only if current streams count is 0 - if (h2State.openStreams === 0) session.unref() + if (h2State.openStreams === 0) { + session.unref() + } }) stream.once('error', function (err) { @@ -10926,7 +10936,11 @@ function writeStream ({ h2stream, body, client, request, socket, contentLength, } } const onAbort = function () { - onFinished(new RequestAbortedError()) + if (finished) { + return + } + const err = new RequestAbortedError() + queueMicrotask(() => onFinished(err)) } const onFinished = function (err) { if (finished) { @@ -12531,6 +12545,19 @@ class ResponseExceededMaxSizeError extends UndiciError { } } +class RequestRetryError extends UndiciError { + constructor (message, code, { headers, data }) { + super(message) + Error.captureStackTrace(this, RequestRetryError) + this.name = 'RequestRetryError' + this.message = message || 'Request retry error' + this.code = 'UND_ERR_REQ_RETRY' + this.statusCode = code + this.data = data + this.headers = headers + } +} + module.exports = { HTTPParserError, UndiciError, @@ -12550,7 +12577,8 @@ module.exports = { NotSupportedError, ResponseContentLengthMismatchError, BalancedPoolMissingUpstreamError, - ResponseExceededMaxSizeError + ResponseExceededMaxSizeError, + RequestRetryError } @@ -12792,9 +12820,9 @@ class Request { onBodySent (chunk) { if (this[kHandler].onBodySent) { try { - this[kHandler].onBodySent(chunk) + return this[kHandler].onBodySent(chunk) } catch (err) { - this.onError(err) + this.abort(err) } } } @@ -12806,9 +12834,9 @@ class Request { if (this[kHandler].onRequestSent) { try { - this[kHandler].onRequestSent() + return this[kHandler].onRequestSent() } catch (err) { - this.onError(err) + this.abort(err) } } } @@ -12833,14 +12861,23 @@ class Request { channels.headers.publish({ request: this, response: { statusCode, headers, statusText } }) } - return this[kHandler].onHeaders(statusCode, headers, resume, statusText) + try { + return this[kHandler].onHeaders(statusCode, headers, resume, statusText) + } catch (err) { + this.abort(err) + } } onData (chunk) { assert(!this.aborted) assert(!this.completed) - return this[kHandler].onData(chunk) + try { + return this[kHandler].onData(chunk) + } catch (err) { + this.abort(err) + return false + } } onUpgrade (statusCode, headers, socket) { @@ -12859,7 +12896,13 @@ class Request { if (channels.trailers.hasSubscribers) { channels.trailers.publish({ request: this, trailers }) } - return this[kHandler].onComplete(trailers) + + try { + return this[kHandler].onComplete(trailers) + } catch (err) { + // TODO (fix): This might be a bad idea? + this.onError(err) + } } onError (error) { @@ -12873,6 +12916,7 @@ class Request { return } this.aborted = true + return this[kHandler].onError(error) } @@ -13109,7 +13153,9 @@ module.exports = { kHTTP2BuildRequest: Symbol('http2 build request'), kHTTP1BuildRequest: Symbol('http1 build request'), kHTTP2CopyHeaders: Symbol('http2 copy headers'), - kHTTPConnVersion: Symbol('http connection version') + kHTTPConnVersion: Symbol('http connection version'), + kRetryHandlerDefaultRetry: Symbol('retry agent default retry'), + kConstruct: Symbol('constructable') } @@ -13246,13 +13292,13 @@ function getHostname (host) { const idx = host.indexOf(']') assert(idx !== -1) - return host.substr(1, idx - 1) + return host.substring(1, idx) } const idx = host.indexOf(':') if (idx === -1) return host - return host.substr(0, idx) + return host.substring(0, idx) } // IP addresses are not valid server names per RFC6066 @@ -13349,7 +13395,7 @@ function parseHeaders (headers, obj = {}) { if (!val) { if (Array.isArray(headers[i + 1])) { - obj[key] = headers[i + 1] + obj[key] = headers[i + 1].map(x => x.toString('utf8')) } else { obj[key] = headers[i + 1].toString('utf8') } @@ -13552,16 +13598,7 @@ function throwIfAborted (signal) { } } -let events function addAbortListener (signal, listener) { - if (typeof Symbol.dispose === 'symbol') { - if (!events) { - events = __nccwpck_require__(2361) - } - if (typeof events.addAbortListener === 'function' && 'aborted' in signal) { - return events.addAbortListener(signal, listener) - } - } if ('addEventListener' in signal) { signal.addEventListener('abort', listener, { once: true }) return () => signal.removeEventListener('abort', listener) @@ -13585,6 +13622,21 @@ function toUSVString (val) { return `${val}` } +// Parsed accordingly to RFC 9110 +// https://www.rfc-editor.org/rfc/rfc9110#field.content-range +function parseRangeHeader (range) { + if (range == null || range === '') return { start: 0, end: null, size: null } + + const m = range ? range.match(/^bytes (\d+)-(\d+)\/(\d+)?$/) : null + return m + ? { + start: parseInt(m[1]), + end: m[2] ? parseInt(m[2]) : null, + size: m[3] ? parseInt(m[3]) : null + } + : null +} + const kEnumerableProperty = Object.create(null) kEnumerableProperty.enumerable = true @@ -13618,9 +13670,11 @@ module.exports = { buildURL, throwIfAborted, addAbortListener, + parseRangeHeader, nodeMajor, nodeMinor, - nodeHasAutoSelectFamily: nodeMajor > 18 || (nodeMajor === 18 && nodeMinor >= 13) + nodeHasAutoSelectFamily: nodeMajor > 18 || (nodeMajor === 18 && nodeMinor >= 13), + safeHTTPMethods: ['GET', 'HEAD', 'OPTIONS', 'TRACE'] } @@ -14749,17 +14803,14 @@ function dataURLProcessor (dataURL) { * @param {boolean} excludeFragment */ function URLSerializer (url, excludeFragment = false) { - const href = url.href - if (!excludeFragment) { - return href + return url.href } - const hash = href.lastIndexOf('#') - if (hash === -1) { - return href - } - return href.slice(0, hash) + const href = url.href + const hashLength = url.hash.length + + return hashLength === 0 ? href : href.substring(0, href.length - hashLength) } // https://infra.spec.whatwg.org/#collect-a-sequence-of-code-points @@ -15943,7 +15994,7 @@ module.exports = { -const { kHeadersList } = __nccwpck_require__(2785) +const { kHeadersList, kConstruct } = __nccwpck_require__(2785) const { kGuard } = __nccwpck_require__(5861) const { kEnumerableProperty } = __nccwpck_require__(3983) const { @@ -15957,6 +16008,13 @@ const assert = __nccwpck_require__(9491) const kHeadersMap = Symbol('headers map') const kHeadersSortedMap = Symbol('headers map sorted') +/** + * @param {number} code + */ +function isHTTPWhiteSpaceCharCode (code) { + return code === 0x00a || code === 0x00d || code === 0x009 || code === 0x020 +} + /** * @see https://fetch.spec.whatwg.org/#concept-header-value-normalize * @param {string} potentialValue @@ -15965,12 +16023,12 @@ function headerValueNormalize (potentialValue) { // To normalize a byte sequence potentialValue, remove // any leading and trailing HTTP whitespace bytes from // potentialValue. + let i = 0; let j = potentialValue.length + + while (j > i && isHTTPWhiteSpaceCharCode(potentialValue.charCodeAt(j - 1))) --j + while (j > i && isHTTPWhiteSpaceCharCode(potentialValue.charCodeAt(i))) ++i - // Trimming the end with `.replace()` and a RegExp is typically subject to - // ReDoS. This is safer and faster. - let i = potentialValue.length - while (/[\r\n\t ]/.test(potentialValue.charAt(--i))); - return potentialValue.slice(0, i + 1).replace(/^[\r\n\t ]+/, '') + return i === 0 && j === potentialValue.length ? potentialValue : potentialValue.substring(i, j) } function fill (headers, object) { @@ -15979,7 +16037,8 @@ function fill (headers, object) { // 1. If object is a sequence, then for each header in object: // Note: webidl conversion to array has already been done. if (Array.isArray(object)) { - for (const header of object) { + for (let i = 0; i < object.length; ++i) { + const header = object[i] // 1. If header does not contain exactly two items, then throw a TypeError. if (header.length !== 2) { throw webidl.errors.exception({ @@ -15989,15 +16048,16 @@ function fill (headers, object) { } // 2. Append (header’s first item, header’s second item) to headers. - headers.append(header[0], header[1]) + appendHeader(headers, header[0], header[1]) } } else if (typeof object === 'object' && object !== null) { // Note: null should throw // 2. Otherwise, object is a record, then for each key → value in object, // append (key, value) to headers - for (const [key, value] of Object.entries(object)) { - headers.append(key, value) + const keys = Object.keys(object) + for (let i = 0; i < keys.length; ++i) { + appendHeader(headers, keys[i], object[keys[i]]) } } else { throw webidl.errors.conversionFailed({ @@ -16008,6 +16068,50 @@ function fill (headers, object) { } } +/** + * @see https://fetch.spec.whatwg.org/#concept-headers-append + */ +function appendHeader (headers, name, value) { + // 1. Normalize value. + value = headerValueNormalize(value) + + // 2. If name is not a header name or value is not a + // header value, then throw a TypeError. + if (!isValidHeaderName(name)) { + throw webidl.errors.invalidArgument({ + prefix: 'Headers.append', + value: name, + type: 'header name' + }) + } else if (!isValidHeaderValue(value)) { + throw webidl.errors.invalidArgument({ + prefix: 'Headers.append', + value, + type: 'header value' + }) + } + + // 3. If headers’s guard is "immutable", then throw a TypeError. + // 4. Otherwise, if headers’s guard is "request" and name is a + // forbidden header name, return. + // Note: undici does not implement forbidden header names + if (headers[kGuard] === 'immutable') { + throw new TypeError('immutable') + } else if (headers[kGuard] === 'request-no-cors') { + // 5. Otherwise, if headers’s guard is "request-no-cors": + // TODO + } + + // 6. Otherwise, if headers’s guard is "response" and name is a + // forbidden response-header name, return. + + // 7. Append (name, value) to headers’s header list. + return headers[kHeadersList].append(name, value) + + // 8. If headers’s guard is "request-no-cors", then remove + // privileged no-CORS request headers from headers +} + class HeadersList { /** @type {[string, string][]|null} */ cookies = null @@ -16016,7 +16120,7 @@ class HeadersList { if (init instanceof HeadersList) { this[kHeadersMap] = new Map(init[kHeadersMap]) this[kHeadersSortedMap] = init[kHeadersSortedMap] - this.cookies = init.cookies + this.cookies = init.cookies === null ? null : [...init.cookies] } else { this[kHeadersMap] = new Map(init) this[kHeadersSortedMap] = null @@ -16078,7 +16182,7 @@ class HeadersList { // the first such header to value and remove the // others. // 2. Otherwise, append header (name, value) to list. - return this[kHeadersMap].set(lowercaseName, { name, value }) + this[kHeadersMap].set(lowercaseName, { name, value }) } // https://fetch.spec.whatwg.org/#concept-header-list-delete @@ -16091,20 +16195,18 @@ class HeadersList { this.cookies = null } - return this[kHeadersMap].delete(name) + this[kHeadersMap].delete(name) } // https://fetch.spec.whatwg.org/#concept-header-list-get get (name) { - // 1. If list does not contain name, then return null. - if (!this.contains(name)) { - return null - } + const value = this[kHeadersMap].get(name.toLowerCase()) + // 1. If list does not contain name, then return null. // 2. Return the values of all headers in list whose name // is a byte-case-insensitive match for name, // separated from each other by 0x2C 0x20, in order. - return this[kHeadersMap].get(name.toLowerCase())?.value ?? null + return value === undefined ? null : value.value } * [Symbol.iterator] () { @@ -16130,6 +16232,9 @@ class HeadersList { // https://fetch.spec.whatwg.org/#headers-class class Headers { constructor (init = undefined) { + if (init === kConstruct) { + return + } this[kHeadersList] = new HeadersList() // The new Headers(init) constructor steps are: @@ -16153,43 +16258,7 @@ class Headers { name = webidl.converters.ByteString(name) value = webidl.converters.ByteString(value) - // 1. Normalize value. - value = headerValueNormalize(value) - - // 2. If name is not a header name or value is not a - // header value, then throw a TypeError. - if (!isValidHeaderName(name)) { - throw webidl.errors.invalidArgument({ - prefix: 'Headers.append', - value: name, - type: 'header name' - }) - } else if (!isValidHeaderValue(value)) { - throw webidl.errors.invalidArgument({ - prefix: 'Headers.append', - value, - type: 'header value' - }) - } - - // 3. If headers’s guard is "immutable", then throw a TypeError. - // 4. Otherwise, if headers’s guard is "request" and name is a - // forbidden header name, return. - // Note: undici does not implement forbidden header names - if (this[kGuard] === 'immutable') { - throw new TypeError('immutable') - } else if (this[kGuard] === 'request-no-cors') { - // 5. Otherwise, if headers’s guard is "request-no-cors": - // TODO - } - - // 6. Otherwise, if headers’s guard is "response" and name is a - // forbidden response-header name, return. - - // 7. Append (name, value) to headers’s header list. - // 8. If headers’s guard is "request-no-cors", then remove - // privileged no-CORS request headers from headers - return this[kHeadersList].append(name, value) + return appendHeader(this, name, value) } // https://fetch.spec.whatwg.org/#dom-headers-delete @@ -16234,7 +16303,7 @@ class Headers { // 7. Delete name from this’s header list. // 8. If this’s guard is "request-no-cors", then remove // privileged no-CORS request headers from this. - return this[kHeadersList].delete(name) + this[kHeadersList].delete(name) } // https://fetch.spec.whatwg.org/#dom-headers-get @@ -16327,7 +16396,7 @@ class Headers { // 7. Set (name, value) in this’s header list. // 8. If this’s guard is "request-no-cors", then remove // privileged no-CORS request headers from this - return this[kHeadersList].set(name, value) + this[kHeadersList].set(name, value) } // https://fetch.spec.whatwg.org/#dom-headers-getsetcookie @@ -16363,7 +16432,8 @@ class Headers { const cookies = this[kHeadersList].cookies // 3. For each name of names: - for (const [name, value] of names) { + for (let i = 0; i < names.length; ++i) { + const [name, value] = names[i] // 1. If name is `set-cookie`, then: if (name === 'set-cookie') { // 1. Let values be a list of all values of headers in list whose name @@ -16371,8 +16441,8 @@ class Headers { // 2. For each value of values: // 1. Append (name, value) to headers. - for (const value of cookies) { - headers.push([name, value]) + for (let j = 0; j < cookies.length; ++j) { + headers.push([name, cookies[j]]) } } else { // 2. Otherwise: @@ -16396,6 +16466,12 @@ class Headers { keys () { webidl.brandCheck(this, Headers) + if (this[kGuard] === 'immutable') { + const value = this[kHeadersSortedMap] + return makeIterator(() => value, 'Headers', + 'key') + } + return makeIterator( () => [...this[kHeadersSortedMap].values()], 'Headers', @@ -16406,6 +16482,12 @@ class Headers { values () { webidl.brandCheck(this, Headers) + if (this[kGuard] === 'immutable') { + const value = this[kHeadersSortedMap] + return makeIterator(() => value, 'Headers', + 'value') + } + return makeIterator( () => [...this[kHeadersSortedMap].values()], 'Headers', @@ -16416,6 +16498,12 @@ class Headers { entries () { webidl.brandCheck(this, Headers) + if (this[kGuard] === 'immutable') { + const value = this[kHeadersSortedMap] + return makeIterator(() => value, 'Headers', + 'key+value') + } + return makeIterator( () => [...this[kHeadersSortedMap].values()], 'Headers', @@ -16787,7 +16875,7 @@ function finalizeAndReportTiming (response, initiatorType = 'other') { } // 8. If response’s timing allow passed flag is not set, then: - if (!timingInfo.timingAllowPassed) { + if (!response.timingAllowPassed) { // 1. Set timingInfo to a the result of creating an opaque timing info for timingInfo. timingInfo = createOpaqueTimingInfo({ startTime: timingInfo.startTime @@ -17704,6 +17792,9 @@ function httpRedirectFetch (fetchParams, response) { // https://fetch.spec.whatwg.org/#cors-non-wildcard-request-header-name request.headersList.delete('authorization') + // https://fetch.spec.whatwg.org/#authentication-entries + request.headersList.delete('proxy-authorization', true) + // "Cookie" and "Host" are forbidden request-headers, which undici doesn't implement. request.headersList.delete('cookie') request.headersList.delete('host') @@ -18458,7 +18549,7 @@ async function httpNetworkFetch ( path: url.pathname + url.search, origin: url.origin, method: request.method, - body: fetchParams.controller.dispatcher.isMockActive ? request.body && request.body.source : body, + body: fetchParams.controller.dispatcher.isMockActive ? request.body && (request.body.source || request.body.stream) : body, headers: request.headersList.entries, maxRedirections: 0, upgrade: request.mode === 'websocket' ? 'websocket' : undefined @@ -18503,7 +18594,7 @@ async function httpNetworkFetch ( location = val } - headers.append(key, val) + headers[kHeadersList].append(key, val) } } else { const keys = Object.keys(headersList) @@ -18517,7 +18608,7 @@ async function httpNetworkFetch ( location = val } - headers.append(key, val) + headers[kHeadersList].append(key, val) } } @@ -18621,7 +18712,7 @@ async function httpNetworkFetch ( const key = headersList[n + 0].toString('latin1') const val = headersList[n + 1].toString('latin1') - headers.append(key, val) + headers[kHeadersList].append(key, val) } resolve({ @@ -18664,7 +18755,8 @@ const { isValidHTTPToken, sameOrigin, normalizeMethod, - makePolicyContainer + makePolicyContainer, + normalizeMethodRecord } = __nccwpck_require__(2538) const { forbiddenMethodsSet, @@ -18681,13 +18773,12 @@ const { kHeaders, kSignal, kState, kGuard, kRealm } = __nccwpck_require__(5861) const { webidl } = __nccwpck_require__(1744) const { getGlobalOrigin } = __nccwpck_require__(1246) const { URLSerializer } = __nccwpck_require__(685) -const { kHeadersList } = __nccwpck_require__(2785) +const { kHeadersList, kConstruct } = __nccwpck_require__(2785) const assert = __nccwpck_require__(9491) const { getMaxListeners, setMaxListeners, getEventListeners, defaultMaxListeners } = __nccwpck_require__(2361) let TransformStream = globalThis.TransformStream -const kInit = Symbol('init') const kAbortController = Symbol('abortController') const requestFinalizer = new FinalizationRegistry(({ signal, abort }) => { @@ -18698,7 +18789,7 @@ const requestFinalizer = new FinalizationRegistry(({ signal, abort }) => { class Request { // https://fetch.spec.whatwg.org/#dom-request constructor (input, init = {}) { - if (input === kInit) { + if (input === kConstruct) { return } @@ -18837,8 +18928,10 @@ class Request { urlList: [...request.urlList] }) + const initHasKey = Object.keys(init).length !== 0 + // 13. If init is not empty, then: - if (Object.keys(init).length > 0) { + if (initHasKey) { // 1. If request’s mode is "navigate", then set it to "same-origin". if (request.mode === 'navigate') { request.mode = 'same-origin' @@ -18953,7 +19046,7 @@ class Request { } // 23. If init["integrity"] exists, then set request’s integrity metadata to it. - if (init.integrity !== undefined && init.integrity != null) { + if (init.integrity != null) { request.integrity = String(init.integrity) } @@ -18969,16 +19062,16 @@ class Request { // 2. If method is not a method or method is a forbidden method, then // throw a TypeError. - if (!isValidHTTPToken(init.method)) { - throw TypeError(`'${init.method}' is not a valid HTTP method.`) + if (!isValidHTTPToken(method)) { + throw new TypeError(`'${method}' is not a valid HTTP method.`) } if (forbiddenMethodsSet.has(method.toUpperCase())) { - throw TypeError(`'${init.method}' HTTP method is unsupported.`) + throw new TypeError(`'${method}' HTTP method is unsupported.`) } // 3. Normalize method. - method = normalizeMethod(init.method) + method = normalizeMethodRecord[method] ?? normalizeMethod(method) // 4. Set request’s method to method. request.method = method @@ -19049,7 +19142,7 @@ class Request { // 30. Set this’s headers to a new Headers object with this’s relevant // Realm, whose header list is request’s header list and guard is // "request". - this[kHeaders] = new Headers() + this[kHeaders] = new Headers(kConstruct) this[kHeaders][kHeadersList] = request.headersList this[kHeaders][kGuard] = 'request' this[kHeaders][kRealm] = this[kRealm] @@ -19069,25 +19162,25 @@ class Request { } // 32. If init is not empty, then: - if (Object.keys(init).length !== 0) { + if (initHasKey) { + /** @type {HeadersList} */ + const headersList = this[kHeaders][kHeadersList] // 1. Let headers be a copy of this’s headers and its associated header // list. - let headers = new Headers(this[kHeaders]) - // 2. If init["headers"] exists, then set headers to init["headers"]. - if (init.headers !== undefined) { - headers = init.headers - } + const headers = init.headers !== undefined ? init.headers : new HeadersList(headersList) // 3. Empty this’s headers’s header list. - this[kHeaders][kHeadersList].clear() + headersList.clear() // 4. If headers is a Headers object, then for each header in its header // list, append header’s name/header’s value to this’s headers. - if (headers.constructor.name === 'Headers') { + if (headers instanceof HeadersList) { for (const [key, val] of headers) { - this[kHeaders].append(key, val) + headersList.append(key, val) } + // Note: Copy the `set-cookie` meta-data. + headersList.cookies = headers.cookies } else { // 5. Otherwise, fill this’s headers with headers. fillHeaders(this[kHeaders], headers) @@ -19376,10 +19469,10 @@ class Request { // 3. Let clonedRequestObject be the result of creating a Request object, // given clonedRequest, this’s headers’s guard, and this’s relevant Realm. - const clonedRequestObject = new Request(kInit) + const clonedRequestObject = new Request(kConstruct) clonedRequestObject[kState] = clonedRequest clonedRequestObject[kRealm] = this[kRealm] - clonedRequestObject[kHeaders] = new Headers() + clonedRequestObject[kHeaders] = new Headers(kConstruct) clonedRequestObject[kHeaders][kHeadersList] = clonedRequest.headersList clonedRequestObject[kHeaders][kGuard] = this[kHeaders][kGuard] clonedRequestObject[kHeaders][kRealm] = this[kHeaders][kRealm] @@ -19629,7 +19722,7 @@ const { webidl } = __nccwpck_require__(1744) const { FormData } = __nccwpck_require__(2015) const { getGlobalOrigin } = __nccwpck_require__(1246) const { URLSerializer } = __nccwpck_require__(685) -const { kHeadersList } = __nccwpck_require__(2785) +const { kHeadersList, kConstruct } = __nccwpck_require__(2785) const assert = __nccwpck_require__(9491) const { types } = __nccwpck_require__(3837) @@ -19750,7 +19843,7 @@ class Response { // 2. Set this’s headers to a new Headers object with this’s relevant // Realm, whose header list is this’s response’s header list and guard // is "response". - this[kHeaders] = new Headers() + this[kHeaders] = new Headers(kConstruct) this[kHeaders][kGuard] = 'response' this[kHeaders][kHeadersList] = this[kState].headersList this[kHeaders][kRealm] = this[kRealm] @@ -20120,11 +20213,7 @@ webidl.converters.XMLHttpRequestBodyInit = function (V) { return webidl.converters.Blob(V, { strict: false }) } - if ( - types.isAnyArrayBuffer(V) || - types.isTypedArray(V) || - types.isDataView(V) - ) { + if (types.isArrayBuffer(V) || types.isTypedArray(V) || types.isDataView(V)) { return webidl.converters.BufferSource(V) } @@ -20310,52 +20399,57 @@ function isValidReasonPhrase (statusText) { return true } -function isTokenChar (c) { - return !( - c >= 0x7f || - c <= 0x20 || - c === '(' || - c === ')' || - c === '<' || - c === '>' || - c === '@' || - c === ',' || - c === ';' || - c === ':' || - c === '\\' || - c === '"' || - c === '/' || - c === '[' || - c === ']' || - c === '?' || - c === '=' || - c === '{' || - c === '}' - ) +/** + * @see https://tools.ietf.org/html/rfc7230#section-3.2.6 + * @param {number} c + */ +function isTokenCharCode (c) { + switch (c) { + case 0x22: + case 0x28: + case 0x29: + case 0x2c: + case 0x2f: + case 0x3a: + case 0x3b: + case 0x3c: + case 0x3d: + case 0x3e: + case 0x3f: + case 0x40: + case 0x5b: + case 0x5c: + case 0x5d: + case 0x7b: + case 0x7d: + // DQUOTE and "(),/:;<=>?@[\]{}" + return false + default: + // VCHAR %x21-7E + return c >= 0x21 && c <= 0x7e + } } -// See RFC 7230, Section 3.2.6. -// https://github.com/chromium/chromium/blob/d7da0240cae77824d1eda25745c4022757499131/third_party/blink/renderer/platform/network/http_parsers.cc#L321 +/** + * @param {string} characters + */ function isValidHTTPToken (characters) { - if (!characters || typeof characters !== 'string') { + if (characters.length === 0) { return false } for (let i = 0; i < characters.length; ++i) { - const c = characters.charCodeAt(i) - if (c > 0x7f || !isTokenChar(c)) { + if (!isTokenCharCode(characters.charCodeAt(i))) { return false } } return true } -// https://fetch.spec.whatwg.org/#header-name -// https://github.com/chromium/chromium/blob/b3d37e6f94f87d59e44662d6078f6a12de845d17/net/http/http_util.cc#L342 +/** + * @see https://fetch.spec.whatwg.org/#header-name + * @param {string} potentialValue + */ function isValidHeaderName (potentialValue) { - if (potentialValue.length === 0) { - return false - } - return isValidHTTPToken(potentialValue) } @@ -20900,11 +20994,30 @@ function isCancelled (fetchParams) { fetchParams.controller.state === 'terminated' } -// https://fetch.spec.whatwg.org/#concept-method-normalize +const normalizeMethodRecord = { + delete: 'DELETE', + DELETE: 'DELETE', + get: 'GET', + GET: 'GET', + head: 'HEAD', + HEAD: 'HEAD', + options: 'OPTIONS', + OPTIONS: 'OPTIONS', + post: 'POST', + POST: 'POST', + put: 'PUT', + PUT: 'PUT' +} + +// Note: object prototypes should not be able to be referenced. e.g. `Object#hasOwnProperty`. +Object.setPrototypeOf(normalizeMethodRecord, null) + +/** + * @see https://fetch.spec.whatwg.org/#concept-method-normalize + * @param {string} method + */ function normalizeMethod (method) { - return /^(DELETE|GET|HEAD|OPTIONS|POST|PUT)$/i.test(method) - ? method.toUpperCase() - : method + return normalizeMethodRecord[method.toLowerCase()] ?? method } // https://infra.spec.whatwg.org/#serialize-a-javascript-value-to-a-json-string @@ -21249,7 +21362,8 @@ module.exports = { urlIsLocal, urlHasHttpsScheme, urlIsHttpHttpsScheme, - readAllBytes + readAllBytes, + normalizeMethodRecord } @@ -21688,12 +21802,10 @@ webidl.converters.ByteString = function (V) { // 2. If the value of any element of x is greater than // 255, then throw a TypeError. for (let index = 0; index < x.length; index++) { - const charCode = x.charCodeAt(index) - - if (charCode > 255) { + if (x.charCodeAt(index) > 255) { throw new TypeError( 'Cannot convert argument to a ByteString because the character at ' + - `index ${index} has a value of ${charCode} which is greater than 255.` + `index ${index} has a value of ${x.charCodeAt(index)} which is greater than 255.` ) } } @@ -23370,6 +23482,349 @@ function cleanRequestHeaders (headers, removeContent, unknownOrigin) { module.exports = RedirectHandler +/***/ }), + +/***/ 2286: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +const assert = __nccwpck_require__(9491) + +const { kRetryHandlerDefaultRetry } = __nccwpck_require__(2785) +const { RequestRetryError } = __nccwpck_require__(8045) +const { isDisturbed, parseHeaders, parseRangeHeader } = __nccwpck_require__(3983) + +function calculateRetryAfterHeader (retryAfter) { + const current = Date.now() + const diff = new Date(retryAfter).getTime() - current + + return diff +} + +class RetryHandler { + constructor (opts, handlers) { + const { retryOptions, ...dispatchOpts } = opts + const { + // Retry scoped + retry: retryFn, + maxRetries, + maxTimeout, + minTimeout, + timeoutFactor, + // Response scoped + methods, + errorCodes, + retryAfter, + statusCodes + } = retryOptions ?? {} + + this.dispatch = handlers.dispatch + this.handler = handlers.handler + this.opts = dispatchOpts + this.abort = null + this.aborted = false + this.retryOpts = { + retry: retryFn ?? RetryHandler[kRetryHandlerDefaultRetry], + retryAfter: retryAfter ?? true, + maxTimeout: maxTimeout ?? 30 * 1000, // 30s, + timeout: minTimeout ?? 500, // .5s + timeoutFactor: timeoutFactor ?? 2, + maxRetries: maxRetries ?? 5, + // What errors we should retry + methods: methods ?? ['GET', 'HEAD', 'OPTIONS', 'PUT', 'DELETE', 'TRACE'], + // Indicates which errors to retry + statusCodes: statusCodes ?? [500, 502, 503, 504, 429], + // List of errors to retry + errorCodes: errorCodes ?? [ + 'ECONNRESET', + 'ECONNREFUSED', + 'ENOTFOUND', + 'ENETDOWN', + 'ENETUNREACH', + 'EHOSTDOWN', + 'EHOSTUNREACH', + 'EPIPE' + ] + } + + this.retryCount = 0 + this.start = 0 + this.end = null + this.etag = null + this.resume = null + + // Handle possible onConnect duplication + this.handler.onConnect(reason => { + this.aborted = true + if (this.abort) { + this.abort(reason) + } else { + this.reason = reason + } + }) + } + + onRequestSent () { + if (this.handler.onRequestSent) { + this.handler.onRequestSent() + } + } + + onUpgrade (statusCode, headers, socket) { + if (this.handler.onUpgrade) { + this.handler.onUpgrade(statusCode, headers, socket) + } + } + + onConnect (abort) { + if (this.aborted) { + abort(this.reason) + } else { + this.abort = abort + } + } + + onBodySent (chunk) { + if (this.handler.onBodySent) return this.handler.onBodySent(chunk) + } + + static [kRetryHandlerDefaultRetry] (err, { state, opts }, cb) { + const { statusCode, code, headers } = err + const { method, retryOptions } = opts + const { + maxRetries, + timeout, + maxTimeout, + timeoutFactor, + statusCodes, + errorCodes, + methods + } = retryOptions + let { counter, currentTimeout } = state + + currentTimeout = + currentTimeout != null && currentTimeout > 0 ? currentTimeout : timeout + + // Any code that is not a Undici's originated and allowed to retry + if ( + code && + code !== 'UND_ERR_REQ_RETRY' && + code !== 'UND_ERR_SOCKET' && + !errorCodes.includes(code) + ) { + cb(err) + return + } + + // If a set of method are provided and the current method is not in the list + if (Array.isArray(methods) && !methods.includes(method)) { + cb(err) + return + } + + // If a set of status code are provided and the current status code is not in the list + if ( + statusCode != null && + Array.isArray(statusCodes) && + !statusCodes.includes(statusCode) + ) { + cb(err) + return + } + + // If we reached the max number of retries + if (counter > maxRetries) { + cb(err) + return + } + + let retryAfterHeader = headers != null && headers['retry-after'] + if (retryAfterHeader) { + retryAfterHeader = Number(retryAfterHeader) + retryAfterHeader = isNaN(retryAfterHeader) + ? calculateRetryAfterHeader(retryAfterHeader) + : retryAfterHeader * 1e3 // Retry-After is in seconds + } + + const retryTimeout = + retryAfterHeader > 0 + ? Math.min(retryAfterHeader, maxTimeout) + : Math.min(currentTimeout * timeoutFactor ** counter, maxTimeout) + + state.currentTimeout = retryTimeout + + setTimeout(() => cb(null), retryTimeout) + } + + onHeaders (statusCode, rawHeaders, resume, statusMessage) { + const headers = parseHeaders(rawHeaders) + + this.retryCount += 1 + + if (statusCode >= 300) { + this.abort( + new RequestRetryError('Request failed', statusCode, { + headers, + count: this.retryCount + }) + ) + return false + } + + // Checkpoint for resume from where we left it + if (this.resume != null) { + this.resume = null + + if (statusCode !== 206) { + return true + } + + const contentRange = parseRangeHeader(headers['content-range']) + // If no content range + if (!contentRange) { + this.abort( + new RequestRetryError('Content-Range mismatch', statusCode, { + headers, + count: this.retryCount + }) + ) + return false + } + + // Let's start with a weak etag check + if (this.etag != null && this.etag !== headers.etag) { + this.abort( + new RequestRetryError('ETag mismatch', statusCode, { + headers, + count: this.retryCount + }) + ) + return false + } + + const { start, size, end = size } = contentRange + + assert(this.start === start, 'content-range mismatch') + assert(this.end == null || this.end === end, 'content-range mismatch') + + this.resume = resume + return true + } + + if (this.end == null) { + if (statusCode === 206) { + // First time we receive 206 + const range = parseRangeHeader(headers['content-range']) + + if (range == null) { + return this.handler.onHeaders( + statusCode, + rawHeaders, + resume, + statusMessage + ) + } + + const { start, size, end = size } = range + + assert( + start != null && Number.isFinite(start) && this.start !== start, + 'content-range mismatch' + ) + assert(Number.isFinite(start)) + assert( + end != null && Number.isFinite(end) && this.end !== end, + 'invalid content-length' + ) + + this.start = start + this.end = end + } + + // We make our best to checkpoint the body for further range headers + if (this.end == null) { + const contentLength = headers['content-length'] + this.end = contentLength != null ? Number(contentLength) : null + } + + assert(Number.isFinite(this.start)) + assert( + this.end == null || Number.isFinite(this.end), + 'invalid content-length' + ) + + this.resume = resume + this.etag = headers.etag != null ? headers.etag : null + + return this.handler.onHeaders( + statusCode, + rawHeaders, + resume, + statusMessage + ) + } + + const err = new RequestRetryError('Request failed', statusCode, { + headers, + count: this.retryCount + }) + + this.abort(err) + + return false + } + + onData (chunk) { + this.start += chunk.length + + return this.handler.onData(chunk) + } + + onComplete (rawTrailers) { + this.retryCount = 0 + return this.handler.onComplete(rawTrailers) + } + + onError (err) { + if (this.aborted || isDisturbed(this.opts.body)) { + return this.handler.onError(err) + } + + this.retryOpts.retry( + err, + { + state: { counter: this.retryCount++, currentTimeout: this.retryAfter }, + opts: { retryOptions: this.retryOpts, ...this.opts } + }, + onRetry.bind(this) + ) + + function onRetry (err) { + if (err != null || this.aborted || isDisturbed(this.opts.body)) { + return this.handler.onError(err) + } + + if (this.start !== 0) { + this.opts = { + ...this.opts, + headers: { + ...this.opts.headers, + range: `bytes=${this.start}-${this.end ?? ''}` + } + } + } + + try { + this.dispatch(this.opts, this) + } catch (err) { + this.handler.onError(err) + } + } + } +} + +module.exports = RetryHandler + + /***/ }), /***/ 8861: @@ -25292,6 +25747,9 @@ class ProxyAgent extends DispatcherBase { this[kProxyTls] = opts.proxyTls this[kProxyHeaders] = opts.headers || {} + const resolvedUrl = new URL(opts.uri) + const { origin, port, host, username, password } = resolvedUrl + if (opts.auth && opts.token) { throw new InvalidArgumentError('opts.auth cannot be used in combination with opts.token') } else if (opts.auth) { @@ -25299,11 +25757,10 @@ class ProxyAgent extends DispatcherBase { this[kProxyHeaders]['proxy-authorization'] = `Basic ${opts.auth}` } else if (opts.token) { this[kProxyHeaders]['proxy-authorization'] = opts.token + } else if (username && password) { + this[kProxyHeaders]['proxy-authorization'] = `Basic ${Buffer.from(`${decodeURIComponent(username)}:${decodeURIComponent(password)}`).toString('base64')}` } - const resolvedUrl = new URL(opts.uri) - const { origin, port, host } = resolvedUrl - const connect = buildConnector({ ...opts.proxyTls }) this[kConnectEndpoint] = buildConnector({ ...opts.requestTls }) this[kClient] = clientFactory(resolvedUrl, { connect }) @@ -25327,7 +25784,7 @@ class ProxyAgent extends DispatcherBase { }) if (statusCode !== 200) { socket.on('error', () => {}).destroy() - callback(new RequestAbortedError('Proxy response !== 200 when HTTP Tunneling')) + callback(new RequestAbortedError(`Proxy response (${statusCode}) !== 200 when HTTP Tunneling`)) } if (opts.protocol !== 'https:') { callback(null, socket) @@ -30129,7 +30586,7 @@ module.exports = parseParams /***/ ((module) => { "use strict"; -module.exports = JSON.parse('{"openapi":"3.0.3","info":{"title":"Bencher API","version":"0.4.3"},"paths":{"/":{"get":{"tags":["server"],"operationId":"server_root_get","responses":{"200":{"description":"successful operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"title":"Null","type":"string","enum":[null]}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}}},"/v0/auth/accept":{"post":{"tags":["auth","organizations"],"operationId":"auth_accept_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonAccept"}}},"required":true},"responses":{"202":{"description":"successfully enqueued operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonAuthAck"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}}},"/v0/auth/confirm":{"post":{"tags":["auth"],"operationId":"auth_confirm_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonConfirm"}}},"required":true},"responses":{"200":{"description":"successful operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonAuthUser"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}}},"/v0/auth/github":{"post":{"tags":["auth"],"operationId":"auth_github_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonOAuth"}}},"required":true},"responses":{"202":{"description":"successfully enqueued operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonAuthUser"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}}},"/v0/auth/login":{"post":{"tags":["auth"],"operationId":"auth_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonLogin"}}},"required":true},"responses":{"202":{"description":"successfully enqueued operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonAuthAck"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}}},"/v0/auth/signup":{"post":{"tags":["auth"],"summary":"When a user signs up, a new personal organization is automatically created.","description":"Except when a user signs up with an invitation, then the user is just added to the inviting organization.","operationId":"auth_signup_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonSignup"}}},"required":true},"responses":{"202":{"description":"successfully enqueued operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonAuthAck"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}}},"/v0/checkout":{"post":{"tags":["checkout"],"operationId":"checkouts_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonNewCheckout"}}},"required":true},"responses":{"201":{"description":"successful creation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonCheckout"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}}},"/v0/organizations":{"get":{"tags":["organizations"],"summary":"List organizations","description":"List all organizations where the user is a member. The user must have `view` permissions for each organization.","operationId":"organizations_get","parameters":[{"in":"query","name":"direction","description":"The direction to sort by. If not specified, the default sort direction is used.","schema":{"$ref":"#/components/schemas/JsonDirection"}},{"in":"query","name":"page","description":"The page number to return. If not specified, the first page is returned.","schema":{"nullable":true,"type":"integer","format":"uint32","minimum":0}},{"in":"query","name":"per_page","description":"The number of items to return per page. If not specified, the default number of items per page (8) is used.","schema":{"nullable":true,"type":"integer","format":"uint8","minimum":0}},{"in":"query","name":"sort","description":"The field to sort by. If not specified, the default sort field is used.","schema":{"$ref":"#/components/schemas/OrganizationsSort"}},{"in":"query","name":"name","description":"Filter by name, exact match. If not specified, all organizations are returned.","schema":{"$ref":"#/components/schemas/ResourceName"}},{"in":"query","name":"search","description":"Search by name, slug, or UUID. If not specified, all organizations are returned.","schema":{"$ref":"#/components/schemas/Search"}}],"responses":{"200":{"description":"successful operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonOrganizations"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}},"post":{"tags":["organizations"],"summary":"Create an organization","description":"Create a new organization. The user must be an admin on the server to use this route.","operationId":"organization_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonNewOrganization"}}},"required":true},"responses":{"201":{"description":"successful creation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonOrganization"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}}},"/v0/organizations/{organization}":{"get":{"tags":["organizations"],"summary":"View an organization","description":"View an organization where the user is a member. The user must have `view` permissions for the organization.","operationId":"organization_get","parameters":[{"in":"path","name":"organization","description":"The slug or UUID for the organization.","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}}],"responses":{"200":{"description":"successful operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonOrganization"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}},"patch":{"tags":["organizations"],"summary":"Update an organization","description":"Update an organization where the user is a member. The user must have `edit` permissions for the organization. If updating the license, the user must have `manage` permissions for the organization.","operationId":"organization_patch","parameters":[{"in":"path","name":"organization","description":"The slug or UUID for the organization.","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonUpdateOrganization"}}},"required":true},"responses":{"200":{"description":"successful operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonOrganization"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}}},"/v0/organizations/{organization}/allowed/{permission}":{"get":{"tags":["organizations","allowed"],"operationId":"org_allowed_get","parameters":[{"in":"path","name":"organization","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}},{"in":"path","name":"permission","required":true,"schema":{"$ref":"#/components/schemas/OrganizationPermission"}}],"responses":{"200":{"description":"successful operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonAllowed"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}}},"/v0/organizations/{organization}/members":{"get":{"tags":["organizations","members"],"operationId":"org_members_get","parameters":[{"in":"path","name":"organization","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}},{"in":"query","name":"direction","description":"The direction to sort by. If not specified, the default sort direction is used.","schema":{"$ref":"#/components/schemas/JsonDirection"}},{"in":"query","name":"page","description":"The page number to return. If not specified, the first page is returned.","schema":{"nullable":true,"type":"integer","format":"uint32","minimum":0}},{"in":"query","name":"per_page","description":"The number of items to return per page. If not specified, the default number of items per page (8) is used.","schema":{"nullable":true,"type":"integer","format":"uint8","minimum":0}},{"in":"query","name":"sort","description":"The field to sort by. If not specified, the default sort field is used.","schema":{"$ref":"#/components/schemas/OrgMembersSort"}},{"in":"query","name":"name","schema":{"$ref":"#/components/schemas/UserName"}},{"in":"query","name":"search","schema":{"$ref":"#/components/schemas/Search"}}],"responses":{"200":{"description":"successful operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonMembers"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}},"post":{"tags":["organizations","members"],"operationId":"org_member_post","parameters":[{"in":"path","name":"organization","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonNewMember"}}},"required":true},"responses":{"202":{"description":"successfully enqueued operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonAuthAck"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}}},"/v0/organizations/{organization}/members/{user}":{"get":{"tags":["organizations","members"],"operationId":"org_member_get","parameters":[{"in":"path","name":"organization","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}},{"in":"path","name":"user","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}}],"responses":{"200":{"description":"successful operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonMember"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}},"delete":{"tags":["organizations","members"],"operationId":"org_member_delete","parameters":[{"in":"path","name":"organization","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}},{"in":"path","name":"user","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}}],"responses":{"204":{"description":"successful deletion","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}},"patch":{"tags":["organizations","members"],"operationId":"org_member_patch","parameters":[{"in":"path","name":"organization","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}},{"in":"path","name":"user","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonUpdateMember"}}},"required":true},"responses":{"200":{"description":"successful operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonMember"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}}},"/v0/organizations/{organization}/plan":{"get":{"tags":["organizations","plan"],"operationId":"org_plan_get","parameters":[{"in":"path","name":"organization","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}}],"responses":{"200":{"description":"successful operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonPlan"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}},"post":{"tags":["organizations","plan"],"operationId":"org_plan_post","parameters":[{"in":"path","name":"organization","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonNewPlan"}}},"required":true},"responses":{"201":{"description":"successful creation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonPlan"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}},"delete":{"tags":["organizations","plan"],"operationId":"org_plan_delete","parameters":[{"in":"path","name":"organization","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}},{"in":"query","name":"remote","schema":{"nullable":true,"type":"boolean"}}],"responses":{"204":{"description":"successful deletion","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}}},"/v0/organizations/{organization}/projects":{"get":{"tags":["organizations","projects"],"summary":"List organization projects","description":"List projects for the organization. The user must have `view` permissions for the organization.","operationId":"org_projects_get","parameters":[{"in":"path","name":"organization","description":"The slug or UUID for the organization.","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}},{"in":"query","name":"direction","description":"The direction to sort by. If not specified, the default sort direction is used.","schema":{"$ref":"#/components/schemas/JsonDirection"}},{"in":"query","name":"page","description":"The page number to return. If not specified, the first page is returned.","schema":{"nullable":true,"type":"integer","format":"uint32","minimum":0}},{"in":"query","name":"per_page","description":"The number of items to return per page. If not specified, the default number of items per page (8) is used.","schema":{"nullable":true,"type":"integer","format":"uint8","minimum":0}},{"in":"query","name":"sort","description":"The field to sort by. If not specified, the default sort field is used.","schema":{"$ref":"#/components/schemas/OrgProjectsSort"}},{"in":"query","name":"name","description":"Filter by name, exact match. If not specified, all projects for the organization are returned.","schema":{"$ref":"#/components/schemas/ResourceName"}},{"in":"query","name":"search","description":"Search by name, slug, or UUID. If not specified, all projects for the organization are returned.","schema":{"$ref":"#/components/schemas/Search"}}],"responses":{"200":{"description":"successful operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonProjects"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}},"post":{"tags":["organizations","projects"],"summary":"Create a project for an organization","description":"Create a new project for an organization. The user must have `create` permissions for the organization.","operationId":"org_project_post","parameters":[{"in":"path","name":"organization","description":"The slug or UUID for the organization.","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonNewProject"}}},"required":true},"responses":{"201":{"description":"successful creation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonProject"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}}},"/v0/organizations/{organization}/usage":{"get":{"tags":["organizations","usage"],"operationId":"org_usage_get","parameters":[{"in":"path","name":"organization","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}}],"responses":{"200":{"description":"successful operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonUsage"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}}},"/v0/projects":{"get":{"tags":["projects"],"operationId":"projects_get","parameters":[{"in":"query","name":"direction","description":"The direction to sort by. If not specified, the default sort direction is used.","schema":{"$ref":"#/components/schemas/JsonDirection"}},{"in":"query","name":"page","description":"The page number to return. If not specified, the first page is returned.","schema":{"nullable":true,"type":"integer","format":"uint32","minimum":0}},{"in":"query","name":"per_page","description":"The number of items to return per page. If not specified, the default number of items per page (8) is used.","schema":{"nullable":true,"type":"integer","format":"uint8","minimum":0}},{"in":"query","name":"sort","description":"The field to sort by. If not specified, the default sort field is used.","schema":{"$ref":"#/components/schemas/ProjectsSort"}},{"in":"query","name":"name","schema":{"$ref":"#/components/schemas/ResourceName"}},{"in":"query","name":"public","schema":{"nullable":true,"type":"boolean"}},{"in":"query","name":"search","schema":{"$ref":"#/components/schemas/Search"}}],"responses":{"200":{"description":"successful operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonProjects"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}}},"/v0/projects/{project}":{"get":{"tags":["projects"],"operationId":"project_get","parameters":[{"in":"path","name":"project","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}}],"responses":{"200":{"description":"successful operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonProject"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}},"delete":{"tags":["projects"],"operationId":"project_delete","parameters":[{"in":"path","name":"project","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}}],"responses":{"204":{"description":"successful deletion","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}},"patch":{"tags":["projects"],"operationId":"project_patch","parameters":[{"in":"path","name":"project","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonUpdateProject"}}},"required":true},"responses":{"200":{"description":"successful operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonProject"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}}},"/v0/projects/{project}/alerts":{"get":{"tags":["projects","alerts"],"operationId":"proj_alerts_get","parameters":[{"in":"path","name":"project","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}},{"in":"query","name":"direction","description":"The direction to sort by. If not specified, the default sort direction is used.","schema":{"$ref":"#/components/schemas/JsonDirection"}},{"in":"query","name":"page","description":"The page number to return. If not specified, the first page is returned.","schema":{"nullable":true,"type":"integer","format":"uint32","minimum":0}},{"in":"query","name":"per_page","description":"The number of items to return per page. If not specified, the default number of items per page (8) is used.","schema":{"nullable":true,"type":"integer","format":"uint8","minimum":0}},{"in":"query","name":"sort","description":"The field to sort by. If not specified, the default sort field is used.","schema":{"$ref":"#/components/schemas/ProjAlertsSort"}}],"responses":{"200":{"description":"successful operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonAlerts"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}}},"/v0/projects/{project}/alerts/{alert}":{"get":{"tags":["projects","alerts"],"operationId":"proj_alert_get","parameters":[{"in":"path","name":"alert","required":true,"schema":{"$ref":"#/components/schemas/AlertUuid"}},{"in":"path","name":"project","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}}],"responses":{"200":{"description":"successful operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonAlert"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}},"patch":{"tags":["projects","alerts"],"operationId":"proj_alert_patch","parameters":[{"in":"path","name":"alert","required":true,"schema":{"$ref":"#/components/schemas/AlertUuid"}},{"in":"path","name":"project","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonUpdateAlert"}}},"required":true},"responses":{"200":{"description":"successful operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonAlert"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}}},"/v0/projects/{project}/allowed/{permission}":{"get":{"tags":["projects","allowed"],"operationId":"proj_allowed_get","parameters":[{"in":"path","name":"permission","required":true,"schema":{"$ref":"#/components/schemas/ProjectPermission"}},{"in":"path","name":"project","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}}],"responses":{"200":{"description":"successful operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonAllowed"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}}},"/v0/projects/{project}/benchmarks":{"get":{"tags":["projects","benchmarks"],"operationId":"proj_benchmarks_get","parameters":[{"in":"path","name":"project","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}},{"in":"query","name":"direction","description":"The direction to sort by. If not specified, the default sort direction is used.","schema":{"$ref":"#/components/schemas/JsonDirection"}},{"in":"query","name":"page","description":"The page number to return. If not specified, the first page is returned.","schema":{"nullable":true,"type":"integer","format":"uint32","minimum":0}},{"in":"query","name":"per_page","description":"The number of items to return per page. If not specified, the default number of items per page (8) is used.","schema":{"nullable":true,"type":"integer","format":"uint8","minimum":0}},{"in":"query","name":"sort","description":"The field to sort by. If not specified, the default sort field is used.","schema":{"$ref":"#/components/schemas/ProjBenchmarksSort"}},{"in":"query","name":"name","schema":{"$ref":"#/components/schemas/BenchmarkName"}},{"in":"query","name":"search","schema":{"$ref":"#/components/schemas/Search"}}],"responses":{"200":{"description":"successful operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonBenchmarks"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}},"post":{"tags":["projects","benchmarks"],"operationId":"proj_benchmark_post","parameters":[{"in":"path","name":"project","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonNewBenchmark"}}},"required":true},"responses":{"201":{"description":"successful creation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonBenchmark"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}}},"/v0/projects/{project}/benchmarks/{benchmark}":{"get":{"tags":["projects","benchmarks"],"operationId":"proj_benchmark_get","parameters":[{"in":"path","name":"benchmark","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}},{"in":"path","name":"project","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}}],"responses":{"200":{"description":"successful operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonBenchmark"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}},"delete":{"tags":["projects","benchmarks"],"operationId":"proj_benchmark_delete","parameters":[{"in":"path","name":"benchmark","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}},{"in":"path","name":"project","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}}],"responses":{"204":{"description":"successful deletion","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}},"patch":{"tags":["projects","benchmarks"],"operationId":"proj_benchmark_patch","parameters":[{"in":"path","name":"benchmark","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}},{"in":"path","name":"project","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonUpdateBenchmark"}}},"required":true},"responses":{"200":{"description":"successful operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonBenchmark"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}}},"/v0/projects/{project}/branches":{"get":{"tags":["projects","branches"],"operationId":"proj_branches_get","parameters":[{"in":"path","name":"project","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}},{"in":"query","name":"direction","description":"The direction to sort by. If not specified, the default sort direction is used.","schema":{"$ref":"#/components/schemas/JsonDirection"}},{"in":"query","name":"page","description":"The page number to return. If not specified, the first page is returned.","schema":{"nullable":true,"type":"integer","format":"uint32","minimum":0}},{"in":"query","name":"per_page","description":"The number of items to return per page. If not specified, the default number of items per page (8) is used.","schema":{"nullable":true,"type":"integer","format":"uint8","minimum":0}},{"in":"query","name":"sort","description":"The field to sort by. If not specified, the default sort field is used.","schema":{"$ref":"#/components/schemas/ProjBranchesSort"}},{"in":"query","name":"name","schema":{"$ref":"#/components/schemas/BranchName"}},{"in":"query","name":"search","schema":{"$ref":"#/components/schemas/Search"}}],"responses":{"200":{"description":"successful operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonBranches"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}},"post":{"tags":["projects","branches"],"operationId":"proj_branch_post","parameters":[{"in":"path","name":"project","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonNewBranch"}}},"required":true},"responses":{"201":{"description":"successful creation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonBranch"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}}},"/v0/projects/{project}/branches/{branch}":{"get":{"tags":["projects","branches"],"operationId":"proj_branch_get","parameters":[{"in":"path","name":"branch","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}},{"in":"path","name":"project","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}}],"responses":{"200":{"description":"successful operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonBranch"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}},"delete":{"tags":["projects","branches"],"operationId":"proj_branch_delete","parameters":[{"in":"path","name":"branch","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}},{"in":"path","name":"project","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}}],"responses":{"204":{"description":"successful deletion","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}},"patch":{"tags":["projects","branches"],"operationId":"proj_branch_patch","parameters":[{"in":"path","name":"branch","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}},{"in":"path","name":"project","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonUpdateBranch"}}},"required":true},"responses":{"200":{"description":"successful operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonBranch"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}}},"/v0/projects/{project}/measures":{"get":{"tags":["projects","measures"],"operationId":"proj_measures_get","parameters":[{"in":"path","name":"project","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}},{"in":"query","name":"direction","description":"The direction to sort by. If not specified, the default sort direction is used.","schema":{"$ref":"#/components/schemas/JsonDirection"}},{"in":"query","name":"page","description":"The page number to return. If not specified, the first page is returned.","schema":{"nullable":true,"type":"integer","format":"uint32","minimum":0}},{"in":"query","name":"per_page","description":"The number of items to return per page. If not specified, the default number of items per page (8) is used.","schema":{"nullable":true,"type":"integer","format":"uint8","minimum":0}},{"in":"query","name":"sort","description":"The field to sort by. If not specified, the default sort field is used.","schema":{"$ref":"#/components/schemas/ProjMeasuresSort"}},{"in":"query","name":"name","schema":{"$ref":"#/components/schemas/ResourceName"}},{"in":"query","name":"search","schema":{"$ref":"#/components/schemas/Search"}}],"responses":{"200":{"description":"successful operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonMeasures"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}},"post":{"tags":["projects","measures"],"operationId":"proj_measure_post","parameters":[{"in":"path","name":"project","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonNewMeasure"}}},"required":true},"responses":{"201":{"description":"successful creation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonMeasure"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}}},"/v0/projects/{project}/measures/{measure}":{"get":{"tags":["projects","measures"],"operationId":"proj_measure_get","parameters":[{"in":"path","name":"measure","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}},{"in":"path","name":"project","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}}],"responses":{"200":{"description":"successful operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonMeasure"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}},"delete":{"tags":["projects","measures"],"operationId":"proj_measure_delete","parameters":[{"in":"path","name":"measure","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}},{"in":"path","name":"project","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}}],"responses":{"204":{"description":"successful deletion","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}},"patch":{"tags":["projects","measures"],"operationId":"proj_measure_patch","parameters":[{"in":"path","name":"measure","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}},{"in":"path","name":"project","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonUpdateMeasure"}}},"required":true},"responses":{"200":{"description":"successful operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonMeasure"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}}},"/v0/projects/{project}/perf":{"get":{"tags":["projects","perf"],"operationId":"proj_perf_get","parameters":[{"in":"path","name":"project","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}},{"in":"query","name":"benchmarks","required":true,"schema":{"type":"string"}},{"in":"query","name":"branches","required":true,"schema":{"type":"string"}},{"in":"query","name":"end_time","schema":{"$ref":"#/components/schemas/DateTimeMillis"}},{"in":"query","name":"measures","required":true,"schema":{"type":"string"}},{"in":"query","name":"start_time","schema":{"$ref":"#/components/schemas/DateTimeMillis"}},{"in":"query","name":"testbeds","required":true,"schema":{"type":"string"}},{"in":"query","name":"title","schema":{"nullable":true,"type":"string"}}],"responses":{"200":{"description":"successful operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonPerf"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}}},"/v0/projects/{project}/perf/img":{"get":{"tags":["projects","perf"],"operationId":"proj_perf_img_get","parameters":[{"in":"path","name":"project","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}},{"in":"query","name":"benchmarks","required":true,"schema":{"type":"string"}},{"in":"query","name":"branches","required":true,"schema":{"type":"string"}},{"in":"query","name":"end_time","schema":{"$ref":"#/components/schemas/DateTimeMillis"}},{"in":"query","name":"measures","required":true,"schema":{"type":"string"}},{"in":"query","name":"start_time","schema":{"$ref":"#/components/schemas/DateTimeMillis"}},{"in":"query","name":"testbeds","required":true,"schema":{"type":"string"}},{"in":"query","name":"title","schema":{"nullable":true,"type":"string"}}],"responses":{"default":{"description":"","content":{"*/*":{"schema":{}}}}}}},"/v0/projects/{project}/reports":{"get":{"tags":["projects","reports"],"operationId":"proj_reports_get","parameters":[{"in":"path","name":"project","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}},{"in":"query","name":"direction","description":"The direction to sort by. If not specified, the default sort direction is used.","schema":{"$ref":"#/components/schemas/JsonDirection"}},{"in":"query","name":"page","description":"The page number to return. If not specified, the first page is returned.","schema":{"nullable":true,"type":"integer","format":"uint32","minimum":0}},{"in":"query","name":"per_page","description":"The number of items to return per page. If not specified, the default number of items per page (8) is used.","schema":{"nullable":true,"type":"integer","format":"uint8","minimum":0}},{"in":"query","name":"sort","description":"The field to sort by. If not specified, the default sort field is used.","schema":{"$ref":"#/components/schemas/ProjReportsSort"}},{"in":"query","name":"branch","schema":{"nullable":true,"type":"string"}},{"in":"query","name":"end_time","schema":{"$ref":"#/components/schemas/DateTimeMillis"}},{"in":"query","name":"start_time","schema":{"$ref":"#/components/schemas/DateTimeMillis"}},{"in":"query","name":"testbed","schema":{"nullable":true,"type":"string"}}],"responses":{"200":{"description":"successful operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonReports"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}},"post":{"tags":["projects","reports"],"operationId":"proj_report_post","parameters":[{"in":"path","name":"project","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonNewReport"}}},"required":true},"responses":{"201":{"description":"successful creation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonReport"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}}},"/v0/projects/{project}/reports/{report}":{"get":{"tags":["projects","reports"],"operationId":"proj_report_get","parameters":[{"in":"path","name":"project","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}},{"in":"path","name":"report","required":true,"schema":{"$ref":"#/components/schemas/ReportUuid"}}],"responses":{"200":{"description":"successful operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonReport"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}},"delete":{"tags":["projects","reports"],"operationId":"proj_report_delete","parameters":[{"in":"path","name":"project","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}},{"in":"path","name":"report","required":true,"schema":{"$ref":"#/components/schemas/ReportUuid"}}],"responses":{"204":{"description":"successful deletion","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}}},"/v0/projects/{project}/statistics/{statistic}":{"get":{"tags":["projects","statistics"],"operationId":"proj_statistic_get","parameters":[{"in":"path","name":"project","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}},{"in":"path","name":"statistic","required":true,"schema":{"$ref":"#/components/schemas/StatisticUuid"}}],"responses":{"200":{"description":"successful operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonStatistic"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}}},"/v0/projects/{project}/stats/alerts":{"get":{"tags":["projects","alerts"],"operationId":"proj_alert_stats_get","parameters":[{"in":"path","name":"project","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}}],"responses":{"200":{"description":"successful operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonAlertStats"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}}},"/v0/projects/{project}/testbeds":{"get":{"tags":["projects","testbeds"],"operationId":"proj_testbeds_get","parameters":[{"in":"path","name":"project","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}},{"in":"query","name":"direction","description":"The direction to sort by. If not specified, the default sort direction is used.","schema":{"$ref":"#/components/schemas/JsonDirection"}},{"in":"query","name":"page","description":"The page number to return. If not specified, the first page is returned.","schema":{"nullable":true,"type":"integer","format":"uint32","minimum":0}},{"in":"query","name":"per_page","description":"The number of items to return per page. If not specified, the default number of items per page (8) is used.","schema":{"nullable":true,"type":"integer","format":"uint8","minimum":0}},{"in":"query","name":"sort","description":"The field to sort by. If not specified, the default sort field is used.","schema":{"$ref":"#/components/schemas/ProjTestbedsSort"}},{"in":"query","name":"name","schema":{"$ref":"#/components/schemas/ResourceName"}},{"in":"query","name":"search","schema":{"$ref":"#/components/schemas/Search"}}],"responses":{"200":{"description":"successful operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonTestbeds"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}},"post":{"tags":["projects","testbeds"],"operationId":"proj_testbed_post","parameters":[{"in":"path","name":"project","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonNewTestbed"}}},"required":true},"responses":{"201":{"description":"successful creation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonTestbed"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}}},"/v0/projects/{project}/testbeds/{testbed}":{"get":{"tags":["projects","testbeds"],"operationId":"proj_testbed_get","parameters":[{"in":"path","name":"project","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}},{"in":"path","name":"testbed","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}}],"responses":{"200":{"description":"successful operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonTestbed"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}},"delete":{"tags":["projects","testbeds"],"operationId":"proj_testbed_delete","parameters":[{"in":"path","name":"project","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}},{"in":"path","name":"testbed","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}}],"responses":{"204":{"description":"successful deletion","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}},"patch":{"tags":["projects","testbeds"],"operationId":"proj_testbed_patch","parameters":[{"in":"path","name":"project","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}},{"in":"path","name":"testbed","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonUpdateTestbed"}}},"required":true},"responses":{"200":{"description":"successful operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonTestbed"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}}},"/v0/projects/{project}/thresholds":{"get":{"tags":["projects","thresholds"],"operationId":"proj_thresholds_get","parameters":[{"in":"path","name":"project","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}},{"in":"query","name":"direction","description":"The direction to sort by. If not specified, the default sort direction is used.","schema":{"$ref":"#/components/schemas/JsonDirection"}},{"in":"query","name":"page","description":"The page number to return. If not specified, the first page is returned.","schema":{"nullable":true,"type":"integer","format":"uint32","minimum":0}},{"in":"query","name":"per_page","description":"The number of items to return per page. If not specified, the default number of items per page (8) is used.","schema":{"nullable":true,"type":"integer","format":"uint8","minimum":0}},{"in":"query","name":"sort","description":"The field to sort by. If not specified, the default sort field is used.","schema":{"$ref":"#/components/schemas/ProjThresholdsSort"}},{"in":"query","name":"branch","schema":{"nullable":true,"type":"string"}},{"in":"query","name":"measure","schema":{"nullable":true,"type":"string"}},{"in":"query","name":"testbed","schema":{"nullable":true,"type":"string"}}],"responses":{"200":{"description":"successful operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonThresholds"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}},"post":{"tags":["projects","thresholds"],"operationId":"proj_threshold_post","parameters":[{"in":"path","name":"project","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonNewThreshold"}}},"required":true},"responses":{"201":{"description":"successful creation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonThreshold"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}}},"/v0/projects/{project}/thresholds/{threshold}":{"get":{"tags":["projects","thresholds"],"operationId":"proj_threshold_get","parameters":[{"in":"path","name":"project","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}},{"in":"path","name":"threshold","required":true,"schema":{"$ref":"#/components/schemas/ThresholdUuid"}}],"responses":{"200":{"description":"successful operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonThreshold"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}},"put":{"tags":["projects","thresholds"],"operationId":"proj_threshold_put","parameters":[{"in":"path","name":"project","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}},{"in":"path","name":"threshold","required":true,"schema":{"$ref":"#/components/schemas/ThresholdUuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonUpdateThreshold"}}},"required":true},"responses":{"200":{"description":"successful operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonThreshold"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}},"delete":{"tags":["projects","thresholds"],"operationId":"proj_threshold_delete","parameters":[{"in":"path","name":"project","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}},{"in":"path","name":"threshold","required":true,"schema":{"$ref":"#/components/schemas/ThresholdUuid"}}],"responses":{"204":{"description":"successful deletion","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}}},"/v0/server/backup":{"post":{"tags":["server"],"operationId":"server_backup_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonBackup"}}},"required":true},"responses":{"201":{"description":"successful creation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonBackupCreated"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}}},"/v0/server/config":{"get":{"tags":["server","config"],"operationId":"server_config_get","responses":{"200":{"description":"successful operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonConfig"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}},"put":{"tags":["server","config"],"operationId":"server_config_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonUpdateConfig"}}},"required":true},"responses":{"202":{"description":"successfully enqueued operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonConfig"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}}},"/v0/server/endpoint":{"get":{"tags":["server","endpoint"],"operationId":"server_endpoint_get","responses":{"200":{"description":"successful operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonEndpoint"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}}},"/v0/server/ping":{"get":{"tags":["server","ping"],"operationId":"server_ping_get","responses":{"200":{"description":"successful operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonPing"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}}},"/v0/server/restart":{"post":{"tags":["server"],"operationId":"server_restart_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonRestart"}}},"required":true},"responses":{"202":{"description":"successfully enqueued operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"title":"Null","type":"string","enum":[null]}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}}},"/v0/server/spec":{"get":{"tags":["server","spec"],"operationId":"server_spec_get","responses":{"200":{"description":"successful operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonSpec"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}}},"/v0/server/stats":{"get":{"tags":["server","stats"],"operationId":"server_stats_get","responses":{"200":{"description":"successful operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonServerStats"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}},"post":{"tags":["server","stats"],"operationId":"server_stats_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonServerStats"}}},"required":true},"responses":{"202":{"description":"successfully enqueued operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"title":"Null","type":"string","enum":[null]}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}}},"/v0/server/version":{"get":{"tags":["server","version"],"operationId":"server_version_get","responses":{"200":{"description":"successful operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonApiVersion"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}}},"/v0/users/{user}":{"get":{"tags":["users"],"operationId":"user_get","parameters":[{"in":"path","name":"user","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}}],"responses":{"200":{"description":"successful operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonUser"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}}},"/v0/users/{user}/tokens":{"get":{"tags":["users","tokens"],"operationId":"user_tokens_get","parameters":[{"in":"path","name":"user","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}},{"in":"query","name":"direction","description":"The direction to sort by. If not specified, the default sort direction is used.","schema":{"$ref":"#/components/schemas/JsonDirection"}},{"in":"query","name":"page","description":"The page number to return. If not specified, the first page is returned.","schema":{"nullable":true,"type":"integer","format":"uint32","minimum":0}},{"in":"query","name":"per_page","description":"The number of items to return per page. If not specified, the default number of items per page (8) is used.","schema":{"nullable":true,"type":"integer","format":"uint8","minimum":0}},{"in":"query","name":"sort","description":"The field to sort by. If not specified, the default sort field is used.","schema":{"$ref":"#/components/schemas/UserTokensSort"}},{"in":"query","name":"name","schema":{"$ref":"#/components/schemas/ResourceName"}},{"in":"query","name":"search","schema":{"$ref":"#/components/schemas/Search"}}],"responses":{"200":{"description":"successful operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonTokens"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}},"post":{"tags":["users","tokens"],"operationId":"user_token_post","parameters":[{"in":"path","name":"user","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonNewToken"}}},"required":true},"responses":{"201":{"description":"successful creation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonToken"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}}},"/v0/users/{user}/tokens/{token}":{"get":{"tags":["users","tokens"],"operationId":"user_token_get","parameters":[{"in":"path","name":"token","required":true,"schema":{"type":"string","format":"uuid"}},{"in":"path","name":"user","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}}],"responses":{"200":{"description":"successful operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonToken"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}},"patch":{"tags":["users","tokens"],"operationId":"user_token_patch","parameters":[{"in":"path","name":"token","required":true,"schema":{"type":"string","format":"uuid"}},{"in":"path","name":"user","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonUpdateToken"}}},"required":true},"responses":{"200":{"description":"successful operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonToken"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}}}},"components":{"schemas":{"Adapter":{"type":"string","enum":["magic","json","rust","rust_bench","rust_criterion","rust_iai","rust_iai_callgrind","cpp","cpp_google","cpp_catch2","go","go_bench","java","java_jmh","c_sharp","c_sharp_dot_net","js","js_benchmark","js_time","python","python_asv","python_pytest","ruby","ruby_benchmark","shell","shell_hyperfine"]},"AlertStatus":{"type":"string","enum":["active","dismissed"]},"AlertUuid":{"type":"string","format":"uuid"},"BenchmarkName":{"type":"string"},"BenchmarkUuid":{"type":"string","format":"uuid"},"BigInt":{"type":"integer","format":"uint64","minimum":0},"Boundary":{"type":"number","format":"double"},"BoundaryLimit":{"type":"string","enum":["lower","upper"]},"BranchName":{"type":"string"},"BranchUuid":{"type":"string","format":"uuid"},"CardBrand":{"type":"string","enum":["amex","diners","discover","jcb","mastercard","unionpay","visa","unknown"]},"DataStore":{"oneOf":[{"type":"object","properties":{"access_key_id":{"type":"string"},"access_point":{"type":"string"},"secret_access_key":{"$ref":"#/components/schemas/Secret"},"service":{"type":"string","enum":["aws_s3"]}},"required":["access_key_id","access_point","secret_access_key","service"]}]},"DateTime":{"type":"string","format":"date-time"},"Email":{"type":"string"},"Entitlements":{"type":"integer","format":"uint32","minimum":0},"Error":{"description":"Error information from a response.","type":"object","properties":{"error_code":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}},"required":["message","request_id"]},"ExpirationMonth":{"type":"integer","format":"int32"},"ExpirationYear":{"type":"integer","format":"int32"},"GitHash":{"type":"string"},"IfExists":{"type":"string","enum":["fail","truncate","append"]},"Iteration":{"type":"integer","format":"uint32","minimum":0},"JsonAccept":{"type":"object","properties":{"invite":{"$ref":"#/components/schemas/Jwt"}},"required":["invite"]},"JsonAlert":{"type":"object","properties":{"benchmark":{"$ref":"#/components/schemas/JsonBenchmarkMetric"},"created":{"$ref":"#/components/schemas/DateTime"},"iteration":{"$ref":"#/components/schemas/Iteration"},"limit":{"$ref":"#/components/schemas/BoundaryLimit"},"modified":{"$ref":"#/components/schemas/DateTime"},"report":{"$ref":"#/components/schemas/ReportUuid"},"status":{"$ref":"#/components/schemas/AlertStatus"},"threshold":{"$ref":"#/components/schemas/JsonThreshold"},"uuid":{"$ref":"#/components/schemas/AlertUuid"}},"required":["benchmark","created","iteration","limit","modified","report","status","threshold","uuid"]},"JsonAlertStats":{"type":"object","properties":{"active":{"$ref":"#/components/schemas/BigInt"}},"required":["active"]},"JsonAlerts":{"type":"array","items":{"$ref":"#/components/schemas/JsonAlert"}},"JsonAllowed":{"type":"object","properties":{"allowed":{"type":"boolean"}},"required":["allowed"]},"JsonApiVersion":{"type":"object","properties":{"version":{"type":"string"}},"required":["version"]},"JsonAuthAck":{"type":"object","properties":{"email":{"$ref":"#/components/schemas/Email"}},"required":["email"]},"JsonAuthUser":{"type":"object","properties":{"token":{"$ref":"#/components/schemas/Jwt"},"user":{"$ref":"#/components/schemas/JsonUser"}},"required":["token","user"]},"JsonAverage":{"type":"string","enum":["mean","median"]},"JsonBackup":{"type":"object","properties":{"compress":{"nullable":true,"type":"boolean"},"data_store":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/JsonDataStore"}]},"rm":{"nullable":true,"type":"boolean"}}},"JsonBackupCreated":{"type":"object","properties":{"created":{"$ref":"#/components/schemas/DateTime"}},"required":["created"]},"JsonBenchmark":{"type":"object","properties":{"created":{"$ref":"#/components/schemas/DateTime"},"modified":{"$ref":"#/components/schemas/DateTime"},"name":{"$ref":"#/components/schemas/BenchmarkName"},"project":{"$ref":"#/components/schemas/ProjectUuid"},"slug":{"$ref":"#/components/schemas/Slug"},"uuid":{"$ref":"#/components/schemas/BenchmarkUuid"}},"required":["created","modified","name","project","slug","uuid"]},"JsonBenchmarkMetric":{"type":"object","properties":{"boundary":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/JsonBoundary"}]},"created":{"$ref":"#/components/schemas/DateTime"},"metric":{"$ref":"#/components/schemas/JsonMetric"},"modified":{"$ref":"#/components/schemas/DateTime"},"name":{"$ref":"#/components/schemas/BenchmarkName"},"project":{"$ref":"#/components/schemas/ProjectUuid"},"slug":{"$ref":"#/components/schemas/Slug"},"uuid":{"$ref":"#/components/schemas/BenchmarkUuid"}},"required":["created","metric","modified","name","project","slug","uuid"]},"JsonBenchmarks":{"type":"array","items":{"$ref":"#/components/schemas/JsonBenchmark"}},"JsonBilling":{"type":"object","properties":{"products":{"$ref":"#/components/schemas/JsonProducts"},"secret_key":{"$ref":"#/components/schemas/Secret"}},"required":["products","secret_key"]},"JsonBingIndex":{"type":"object","properties":{"key":{"$ref":"#/components/schemas/NonEmpty"},"key_location":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/Url"}]}},"required":["key"]},"JsonBoundary":{"type":"object","properties":{"baseline":{"nullable":true,"type":"number","format":"double"},"lower_limit":{"nullable":true,"type":"number","format":"double"},"upper_limit":{"nullable":true,"type":"number","format":"double"}}},"JsonBranch":{"type":"object","properties":{"created":{"$ref":"#/components/schemas/DateTime"},"modified":{"$ref":"#/components/schemas/DateTime"},"name":{"$ref":"#/components/schemas/BranchName"},"project":{"$ref":"#/components/schemas/ProjectUuid"},"slug":{"$ref":"#/components/schemas/Slug"},"uuid":{"$ref":"#/components/schemas/BranchUuid"}},"required":["created","modified","name","project","slug","uuid"]},"JsonBranchVersion":{"type":"object","properties":{"created":{"$ref":"#/components/schemas/DateTime"},"modified":{"$ref":"#/components/schemas/DateTime"},"name":{"$ref":"#/components/schemas/BranchName"},"project":{"$ref":"#/components/schemas/ProjectUuid"},"slug":{"$ref":"#/components/schemas/Slug"},"uuid":{"$ref":"#/components/schemas/BranchUuid"},"version":{"$ref":"#/components/schemas/JsonVersion"}},"required":["created","modified","name","project","slug","uuid","version"]},"JsonBranches":{"type":"array","items":{"$ref":"#/components/schemas/JsonBranch"}},"JsonCardDetails":{"type":"object","properties":{"brand":{"$ref":"#/components/schemas/CardBrand"},"exp_month":{"$ref":"#/components/schemas/ExpirationMonth"},"exp_year":{"$ref":"#/components/schemas/ExpirationYear"},"last_four":{"$ref":"#/components/schemas/LastFour"}},"required":["brand","exp_month","exp_year","last_four"]},"JsonCheckout":{"type":"object","properties":{"session":{"type":"string"},"url":{"type":"string"}},"required":["session","url"]},"JsonCloud":{"type":"object","properties":{"billing":{"$ref":"#/components/schemas/JsonBilling"},"index":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/JsonIndex"}]},"license_pem":{"$ref":"#/components/schemas/Secret"},"sentry":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/Secret"}]}},"required":["billing","license_pem"]},"JsonCohort":{"type":"object","properties":{"month":{"type":"integer","format":"uint64","minimum":0},"total":{"type":"integer","format":"uint64","minimum":0},"week":{"type":"integer","format":"uint64","minimum":0}},"required":["month","total","week"]},"JsonCohortAvg":{"type":"object","properties":{"month":{"type":"number","format":"double"},"total":{"type":"number","format":"double"},"week":{"type":"number","format":"double"}},"required":["month","total","week"]},"JsonConfig":{"type":"object","properties":{"console":{"$ref":"#/components/schemas/JsonConsole"},"database":{"$ref":"#/components/schemas/JsonDatabase"},"logging":{"$ref":"#/components/schemas/JsonLogging"},"plus":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/JsonPlus"}]},"security":{"$ref":"#/components/schemas/JsonSecurity"},"server":{"$ref":"#/components/schemas/JsonServer"},"smtp":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/JsonSmtp"}]}},"required":["console","database","logging","security","server"]},"JsonConfirm":{"type":"object","properties":{"token":{"$ref":"#/components/schemas/Jwt"}},"required":["token"]},"JsonConsole":{"type":"object","properties":{"url":{"$ref":"#/components/schemas/Url"}},"required":["url"]},"JsonCustomer":{"type":"object","properties":{"email":{"$ref":"#/components/schemas/Email"},"name":{"$ref":"#/components/schemas/NonEmpty"},"uuid":{"$ref":"#/components/schemas/UserUuid"}},"required":["email","name","uuid"]},"JsonDataStore":{"type":"string","enum":["aws_s3"]},"JsonDatabase":{"type":"object","properties":{"data_store":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/DataStore"}]},"file":{"type":"string"}},"required":["file"]},"JsonEndpoint":{"type":"object","properties":{"endpoint":{"$ref":"#/components/schemas/Url"}},"required":["endpoint"]},"JsonFold":{"type":"string","enum":["min","max","mean","median"]},"JsonGitHub":{"type":"object","properties":{"client_id":{"$ref":"#/components/schemas/NonEmpty"},"client_secret":{"$ref":"#/components/schemas/Secret"}},"required":["client_id","client_secret"]},"JsonGoogleIndex":{"type":"object","properties":{"client_email":{"$ref":"#/components/schemas/NonEmpty"},"private_key":{"$ref":"#/components/schemas/Secret"},"token_uri":{"$ref":"#/components/schemas/NonEmpty"}},"required":["client_email","private_key","token_uri"]},"JsonIndex":{"type":"object","properties":{"bing":{"$ref":"#/components/schemas/JsonBingIndex"},"google":{"$ref":"#/components/schemas/JsonGoogleIndex"}},"required":["bing","google"]},"JsonLicense":{"type":"object","properties":{"entitlements":{"$ref":"#/components/schemas/Entitlements"},"expiration":{"$ref":"#/components/schemas/DateTime"},"issued_at":{"$ref":"#/components/schemas/DateTime"},"key":{"$ref":"#/components/schemas/Jwt"},"level":{"$ref":"#/components/schemas/PlanLevel"},"organization":{"$ref":"#/components/schemas/OrganizationUuid"},"self_hosted":{"type":"boolean"}},"required":["entitlements","expiration","issued_at","key","level","organization","self_hosted"]},"JsonLitestream":{"type":"object","properties":{"replicas":{"type":"array","items":{"$ref":"#/components/schemas/JsonReplica"}}},"required":["replicas"]},"JsonLogging":{"type":"object","properties":{"log":{"$ref":"#/components/schemas/ServerLog"},"name":{"type":"string"}},"required":["log","name"]},"JsonLogin":{"type":"object","properties":{"email":{"$ref":"#/components/schemas/Email"},"invite":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/Jwt"}]},"plan":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/PlanLevel"}]}},"required":["email"]},"JsonMeasure":{"type":"object","properties":{"created":{"$ref":"#/components/schemas/DateTime"},"modified":{"$ref":"#/components/schemas/DateTime"},"name":{"$ref":"#/components/schemas/ResourceName"},"project":{"$ref":"#/components/schemas/ProjectUuid"},"slug":{"$ref":"#/components/schemas/Slug"},"units":{"$ref":"#/components/schemas/ResourceName"},"uuid":{"$ref":"#/components/schemas/MeasureUuid"}},"required":["created","modified","name","project","slug","units","uuid"]},"JsonMeasures":{"type":"array","items":{"$ref":"#/components/schemas/JsonMeasure"}},"JsonMember":{"type":"object","properties":{"created":{"$ref":"#/components/schemas/DateTime"},"email":{"$ref":"#/components/schemas/Email"},"modified":{"$ref":"#/components/schemas/DateTime"},"name":{"$ref":"#/components/schemas/UserName"},"role":{"$ref":"#/components/schemas/OrganizationRole"},"slug":{"$ref":"#/components/schemas/Slug"},"uuid":{"$ref":"#/components/schemas/UserUuid"}},"required":["created","email","modified","name","role","slug","uuid"]},"JsonMembers":{"type":"array","items":{"$ref":"#/components/schemas/JsonMember"}},"JsonMetric":{"type":"object","properties":{"lower_value":{"nullable":true,"type":"number","format":"double"},"upper_value":{"nullable":true,"type":"number","format":"double"},"value":{"type":"number","format":"double"}},"required":["value"]},"JsonNewBenchmark":{"type":"object","properties":{"name":{"$ref":"#/components/schemas/BenchmarkName"},"slug":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/Slug"}]}},"required":["name"]},"JsonNewBranch":{"type":"object","properties":{"name":{"$ref":"#/components/schemas/BranchName"},"slug":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/Slug"}]},"soft":{"nullable":true,"type":"boolean"},"start_point":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/JsonStartPoint"}]}},"required":["name"]},"JsonNewCheckout":{"type":"object","properties":{"entitlements":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/Entitlements"}]},"level":{"$ref":"#/components/schemas/PlanLevel"},"organization":{"$ref":"#/components/schemas/ResourceId"},"self_hosted":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/OrganizationUuid"}]}},"required":["level","organization"]},"JsonNewMeasure":{"type":"object","properties":{"name":{"$ref":"#/components/schemas/ResourceName"},"slug":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/Slug"}]},"units":{"$ref":"#/components/schemas/ResourceName"}},"required":["name","units"]},"JsonNewMember":{"type":"object","properties":{"email":{"$ref":"#/components/schemas/Email"},"name":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/UserName"}]},"role":{"$ref":"#/components/schemas/OrganizationRole"}},"required":["email","role"]},"JsonNewOrganization":{"type":"object","properties":{"name":{"description":"The name of the organization. Maximum length is 64 characters.","allOf":[{"$ref":"#/components/schemas/ResourceName"}]},"slug":{"nullable":true,"description":"The preferred slug for the organization. If not provided, the slug will be generated from the name. If the provided or generated slug is already in use, a unique slug will be generated. Maximum length is 64 characters.","allOf":[{"$ref":"#/components/schemas/Slug"}]}},"required":["name"]},"JsonNewPlan":{"type":"object","properties":{"checkout":{"$ref":"#/components/schemas/NonEmpty"},"entitlements":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/Entitlements"}]},"level":{"$ref":"#/components/schemas/PlanLevel"},"remote":{"nullable":true,"type":"boolean"},"self_hosted":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/OrganizationUuid"}]}},"required":["checkout","level"]},"JsonNewProject":{"type":"object","properties":{"name":{"description":"The name of the project. Maximum length is 64 characters.","allOf":[{"$ref":"#/components/schemas/ResourceName"}]},"slug":{"nullable":true,"description":"The preferred slug for the project. If not provided, the slug will be generated from the name. If the provided or generated slug is already in use, a unique slug will be generated. Maximum length is 64 characters.","allOf":[{"$ref":"#/components/schemas/Slug"}]},"url":{"nullable":true,"description":"The URL for the project. If the project is public, the URL will be accessible listed on its Perf Page.","allOf":[{"$ref":"#/components/schemas/Url"}]},"visibility":{"nullable":true,"description":"➕ Bencher Plus: Set the visibility of the project. Creating a `private` project requires a valid Bencher Plus subscription.","allOf":[{"$ref":"#/components/schemas/Visibility"}]}},"required":["name"]},"JsonNewReport":{"type":"object","properties":{"branch":{"$ref":"#/components/schemas/NameId"},"end_time":{"$ref":"#/components/schemas/DateTime"},"hash":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/GitHash"}]},"results":{"type":"array","items":{"type":"string"}},"settings":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/JsonReportSettings"}]},"start_time":{"$ref":"#/components/schemas/DateTime"},"testbed":{"$ref":"#/components/schemas/NameId"}},"required":["branch","end_time","results","start_time","testbed"]},"JsonNewTestbed":{"type":"object","properties":{"name":{"$ref":"#/components/schemas/ResourceName"},"slug":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/Slug"}]},"soft":{"nullable":true,"type":"boolean"}},"required":["name"]},"JsonNewThreshold":{"type":"object","properties":{"branch":{"$ref":"#/components/schemas/NameId"},"lower_boundary":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/Boundary"}]},"max_sample_size":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/SampleSize"}]},"measure":{"$ref":"#/components/schemas/NameId"},"min_sample_size":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/SampleSize"}]},"test":{"$ref":"#/components/schemas/StatisticKind"},"testbed":{"$ref":"#/components/schemas/NameId"},"upper_boundary":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/Boundary"}]},"window":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/Window"}]}},"required":["branch","measure","test","testbed"]},"JsonNewToken":{"type":"object","properties":{"name":{"$ref":"#/components/schemas/ResourceName"},"ttl":{"nullable":true,"type":"integer","format":"uint32","minimum":0}},"required":["name"]},"JsonOAuth":{"type":"object","properties":{"code":{"$ref":"#/components/schemas/Secret"},"invite":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/Jwt"}]},"plan":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/PlanLevel"}]}},"required":["code"]},"JsonOrganization":{"type":"object","properties":{"created":{"$ref":"#/components/schemas/DateTime"},"license":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/Jwt"}]},"modified":{"$ref":"#/components/schemas/DateTime"},"name":{"$ref":"#/components/schemas/ResourceName"},"slug":{"$ref":"#/components/schemas/Slug"},"uuid":{"$ref":"#/components/schemas/OrganizationUuid"}},"required":["created","modified","name","slug","uuid"]},"JsonOrganizationPatch":{"type":"object","properties":{"license":{"nullable":true,"description":"➕ Bencher Plus: The new license for the organization. Set to `null` to remove the current license.","allOf":[{"$ref":"#/components/schemas/Jwt"}]},"name":{"nullable":true,"description":"The new name of the organization. Maximum length is 64 characters.","allOf":[{"$ref":"#/components/schemas/ResourceName"}]},"slug":{"nullable":true,"description":"The preferred new slug for the organization. Maximum length is 64 characters.","allOf":[{"$ref":"#/components/schemas/Slug"}]}}},"JsonOrganizationPatchNull":{"type":"object","properties":{"license":{"type":"string","enum":[null]},"name":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/ResourceName"}]},"slug":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/Slug"}]}},"required":["license"]},"JsonOrganizations":{"type":"array","items":{"$ref":"#/components/schemas/JsonOrganization"}},"JsonPerf":{"type":"object","properties":{"end_time":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/DateTime"}]},"project":{"$ref":"#/components/schemas/JsonProject"},"results":{"type":"array","items":{"$ref":"#/components/schemas/JsonPerfMetrics"}},"start_time":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/DateTime"}]}},"required":["project","results"]},"JsonPerfAlert":{"type":"object","properties":{"limit":{"$ref":"#/components/schemas/BoundaryLimit"},"modified":{"$ref":"#/components/schemas/DateTime"},"status":{"$ref":"#/components/schemas/AlertStatus"},"uuid":{"$ref":"#/components/schemas/AlertUuid"}},"required":["limit","modified","status","uuid"]},"JsonPerfMetric":{"type":"object","properties":{"alert":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/JsonPerfAlert"}]},"boundary":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/JsonBoundary"}]},"end_time":{"$ref":"#/components/schemas/DateTime"},"iteration":{"$ref":"#/components/schemas/Iteration"},"metric":{"$ref":"#/components/schemas/JsonMetric"},"report":{"$ref":"#/components/schemas/ReportUuid"},"start_time":{"$ref":"#/components/schemas/DateTime"},"threshold":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/JsonThresholdStatistic"}]},"version":{"$ref":"#/components/schemas/JsonVersion"}},"required":["end_time","iteration","metric","report","start_time","version"]},"JsonPerfMetrics":{"type":"object","properties":{"benchmark":{"$ref":"#/components/schemas/JsonBenchmark"},"branch":{"$ref":"#/components/schemas/JsonBranch"},"measure":{"$ref":"#/components/schemas/JsonMeasure"},"metrics":{"type":"array","items":{"$ref":"#/components/schemas/JsonPerfMetric"}},"testbed":{"$ref":"#/components/schemas/JsonTestbed"}},"required":["benchmark","branch","measure","metrics","testbed"]},"JsonPing":{"type":"string","enum":["pong"]},"JsonPlan":{"type":"object","properties":{"card":{"$ref":"#/components/schemas/JsonCardDetails"},"current_period_end":{"$ref":"#/components/schemas/DateTime"},"current_period_start":{"$ref":"#/components/schemas/DateTime"},"customer":{"$ref":"#/components/schemas/JsonCustomer"},"level":{"$ref":"#/components/schemas/PlanLevel"},"license":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/JsonLicense"}]},"organization":{"$ref":"#/components/schemas/OrganizationUuid"},"status":{"$ref":"#/components/schemas/PlanStatus"},"unit_amount":{"$ref":"#/components/schemas/BigInt"}},"required":["card","current_period_end","current_period_start","customer","level","organization","status","unit_amount"]},"JsonPlus":{"type":"object","properties":{"cloud":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/JsonCloud"}]},"github":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/JsonGitHub"}]},"litestream":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/JsonLitestream"}]},"stats":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/JsonStats"}]}}},"JsonProduct":{"type":"object","properties":{"id":{"type":"string"},"licensed":{"type":"object","additionalProperties":{"type":"string"}},"metered":{"type":"object","additionalProperties":{"type":"string"}}},"required":["id","licensed","metered"]},"JsonProducts":{"type":"object","properties":{"enterprise":{"$ref":"#/components/schemas/JsonProduct"},"team":{"$ref":"#/components/schemas/JsonProduct"}},"required":["enterprise","team"]},"JsonProject":{"type":"object","properties":{"created":{"$ref":"#/components/schemas/DateTime"},"modified":{"$ref":"#/components/schemas/DateTime"},"name":{"$ref":"#/components/schemas/ResourceName"},"organization":{"$ref":"#/components/schemas/OrganizationUuid"},"slug":{"$ref":"#/components/schemas/Slug"},"url":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/Url"}]},"uuid":{"$ref":"#/components/schemas/ProjectUuid"},"visibility":{"$ref":"#/components/schemas/Visibility"}},"required":["created","modified","name","organization","slug","uuid","visibility"]},"JsonProjectPatch":{"type":"object","properties":{"name":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/ResourceName"}]},"slug":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/Slug"}]},"url":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/Url"}]},"visibility":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/Visibility"}]}}},"JsonProjectPatchNull":{"type":"object","properties":{"name":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/ResourceName"}]},"slug":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/Slug"}]},"url":{"type":"string","enum":[null]},"visibility":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/Visibility"}]}},"required":["url"]},"JsonProjects":{"type":"array","items":{"$ref":"#/components/schemas/JsonProject"}},"JsonReplica":{"oneOf":[{"type":"object","properties":{"path":{"type":"string"},"scheme":{"type":"string","enum":["file"]}},"required":["path","scheme"]},{"type":"object","properties":{"host":{"type":"string"},"key_path":{"nullable":true,"type":"string"},"password":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/Secret"}]},"path":{"nullable":true,"type":"string"},"port":{"type":"integer","format":"uint16","minimum":0},"scheme":{"type":"string","enum":["sftp"]},"user":{"type":"string"}},"required":["host","port","scheme","user"]},{"type":"object","properties":{"access_key_id":{"type":"string"},"bucket":{"type":"string"},"endpoint":{"nullable":true,"type":"string"},"path":{"nullable":true,"type":"string"},"region":{"nullable":true,"type":"string"},"scheme":{"type":"string","enum":["s3"]},"secret_access_key":{"$ref":"#/components/schemas/Secret"}},"required":["access_key_id","bucket","scheme","secret_access_key"]},{"type":"object","properties":{"account_key":{"$ref":"#/components/schemas/Secret"},"account_name":{"type":"string"},"bucket":{"type":"string"},"path":{"type":"string"},"scheme":{"type":"string","enum":["abs"]}},"required":["account_key","account_name","bucket","path","scheme"]},{"type":"object","properties":{"bucket":{"type":"string"},"path":{"nullable":true,"type":"string"},"scheme":{"type":"string","enum":["gcs"]}},"required":["bucket","scheme"]}]},"JsonReport":{"type":"object","properties":{"adapter":{"$ref":"#/components/schemas/Adapter"},"alerts":{"type":"array","items":{"$ref":"#/components/schemas/JsonAlert"}},"branch":{"$ref":"#/components/schemas/JsonBranchVersion"},"created":{"$ref":"#/components/schemas/DateTime"},"end_time":{"$ref":"#/components/schemas/DateTime"},"project":{"$ref":"#/components/schemas/JsonProject"},"results":{"type":"array","items":{"type":"array","items":{"$ref":"#/components/schemas/JsonReportResult"}}},"start_time":{"$ref":"#/components/schemas/DateTime"},"testbed":{"$ref":"#/components/schemas/JsonTestbed"},"user":{"$ref":"#/components/schemas/JsonUser"},"uuid":{"$ref":"#/components/schemas/ReportUuid"}},"required":["adapter","alerts","branch","created","end_time","project","results","start_time","testbed","user","uuid"]},"JsonReportResult":{"type":"object","properties":{"benchmarks":{"type":"array","items":{"$ref":"#/components/schemas/JsonBenchmarkMetric"}},"iteration":{"$ref":"#/components/schemas/Iteration"},"measure":{"$ref":"#/components/schemas/JsonMeasure"},"threshold":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/JsonThresholdStatistic"}]}},"required":["benchmarks","iteration","measure"]},"JsonReportSettings":{"type":"object","properties":{"adapter":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/Adapter"}]},"average":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/JsonAverage"}]},"fold":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/JsonFold"}]}}},"JsonReports":{"type":"array","items":{"$ref":"#/components/schemas/JsonReport"}},"JsonRestart":{"type":"object","properties":{"delay":{"nullable":true,"type":"integer","format":"uint64","minimum":0}}},"JsonSecurity":{"type":"object","properties":{"issuer":{"nullable":true,"type":"string"},"secret_key":{"$ref":"#/components/schemas/Secret"}},"required":["secret_key"]},"JsonServer":{"type":"object","properties":{"bind_address":{"type":"string"},"request_body_max_bytes":{"type":"integer","format":"uint","minimum":0},"tls":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/JsonTls"}]}},"required":["bind_address","request_body_max_bytes"]},"JsonServer2":{"type":"object","properties":{"created":{"$ref":"#/components/schemas/DateTime"},"uuid":{"$ref":"#/components/schemas/ServerUuid"}},"required":["created","uuid"]},"JsonServerStats":{"type":"object","properties":{"active_projects":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/JsonCohort"}]},"metrics":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/JsonCohort"}]},"metrics_per_report":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/JsonCohortAvg"}]},"organizations":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/JsonOrganizations"}]},"projects":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/JsonCohort"}]},"reports":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/JsonCohort"}]},"reports_per_project":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/JsonCohortAvg"}]},"server":{"$ref":"#/components/schemas/JsonServer2"},"timestamp":{"$ref":"#/components/schemas/DateTime"},"top_projects":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/JsonTopCohort"}]},"users":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/JsonCohort"}]}},"required":["server","timestamp"]},"JsonSignup":{"type":"object","properties":{"email":{"$ref":"#/components/schemas/Email"},"i_agree":{"description":"I agree to the Bencher Terms of Use (https://bencher.dev/legal/terms-of-use), Privacy Policy (https://bencher.dev/legal/privacy), and License Agreement (https://bencher.dev/legal/license)","type":"boolean"},"invite":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/Jwt"}]},"name":{"$ref":"#/components/schemas/UserName"},"plan":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/PlanLevel"}]},"slug":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/Slug"}]}},"required":["email","i_agree","name"]},"JsonSmtp":{"type":"object","properties":{"from_email":{"$ref":"#/components/schemas/Email"},"from_name":{"$ref":"#/components/schemas/ResourceName"},"hostname":{"$ref":"#/components/schemas/ResourceName"},"port":{"nullable":true,"type":"integer","format":"uint16","minimum":0},"secret":{"$ref":"#/components/schemas/Secret"},"starttls":{"nullable":true,"type":"boolean"},"username":{"$ref":"#/components/schemas/ResourceName"}},"required":["from_email","from_name","hostname","secret","username"]},"JsonSpec":{},"JsonStartPoint":{"type":"object","properties":{"branch":{"$ref":"#/components/schemas/NameId"},"thresholds":{"nullable":true,"type":"boolean"}},"required":["branch"]},"JsonStatistic":{"type":"object","properties":{"created":{"$ref":"#/components/schemas/DateTime"},"lower_boundary":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/Boundary"}]},"max_sample_size":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/SampleSize"}]},"min_sample_size":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/SampleSize"}]},"test":{"$ref":"#/components/schemas/StatisticKind"},"threshold":{"$ref":"#/components/schemas/ThresholdUuid"},"upper_boundary":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/Boundary"}]},"uuid":{"$ref":"#/components/schemas/StatisticUuid"},"window":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/Window"}]}},"required":["created","test","threshold","uuid"]},"JsonStats":{"type":"object","properties":{"enabled":{"nullable":true,"type":"boolean"},"offset":{"nullable":true,"type":"integer","format":"uint32","minimum":0}}},"JsonTestbed":{"type":"object","properties":{"created":{"$ref":"#/components/schemas/DateTime"},"modified":{"$ref":"#/components/schemas/DateTime"},"name":{"$ref":"#/components/schemas/ResourceName"},"project":{"$ref":"#/components/schemas/ProjectUuid"},"slug":{"$ref":"#/components/schemas/Slug"},"uuid":{"$ref":"#/components/schemas/TestbedUuid"}},"required":["created","modified","name","project","slug","uuid"]},"JsonTestbeds":{"type":"array","items":{"$ref":"#/components/schemas/JsonTestbed"}},"JsonThreshold":{"type":"object","properties":{"branch":{"$ref":"#/components/schemas/JsonBranch"},"created":{"$ref":"#/components/schemas/DateTime"},"measure":{"$ref":"#/components/schemas/JsonMeasure"},"modified":{"$ref":"#/components/schemas/DateTime"},"project":{"$ref":"#/components/schemas/ProjectUuid"},"statistic":{"$ref":"#/components/schemas/JsonStatistic"},"testbed":{"$ref":"#/components/schemas/JsonTestbed"},"uuid":{"$ref":"#/components/schemas/ThresholdUuid"}},"required":["branch","created","measure","modified","project","statistic","testbed","uuid"]},"JsonThresholdStatistic":{"type":"object","properties":{"created":{"$ref":"#/components/schemas/DateTime"},"project":{"$ref":"#/components/schemas/ProjectUuid"},"statistic":{"$ref":"#/components/schemas/JsonStatistic"},"uuid":{"$ref":"#/components/schemas/ThresholdUuid"}},"required":["created","project","statistic","uuid"]},"JsonThresholds":{"type":"array","items":{"$ref":"#/components/schemas/JsonThreshold"}},"JsonTls":{"oneOf":[{"type":"object","properties":{"cert_file":{"type":"string"},"key_file":{"type":"string"},"type":{"type":"string","enum":["as_file"]}},"required":["cert_file","key_file","type"]},{"type":"object","properties":{"certs":{"type":"array","items":{"type":"integer","format":"uint8","minimum":0}},"key":{"type":"array","items":{"type":"integer","format":"uint8","minimum":0}},"type":{"type":"string","enum":["as_bytes"]}},"required":["certs","key","type"]}]},"JsonToken":{"type":"object","properties":{"creation":{"$ref":"#/components/schemas/DateTime"},"expiration":{"$ref":"#/components/schemas/DateTime"},"name":{"$ref":"#/components/schemas/ResourceName"},"token":{"$ref":"#/components/schemas/Jwt"},"user":{"$ref":"#/components/schemas/UserUuid"},"uuid":{"$ref":"#/components/schemas/TokenUuid"}},"required":["creation","expiration","name","token","user","uuid"]},"JsonTokens":{"type":"array","items":{"$ref":"#/components/schemas/JsonToken"}},"JsonTopCohort":{"type":"object","properties":{"month":{"type":"array","items":{"$ref":"#/components/schemas/JsonTopProject"}},"total":{"type":"array","items":{"$ref":"#/components/schemas/JsonTopProject"}},"week":{"type":"array","items":{"$ref":"#/components/schemas/JsonTopProject"}}},"required":["month","total","week"]},"JsonTopProject":{"type":"object","properties":{"metrics":{"type":"integer","format":"uint64","minimum":0},"name":{"$ref":"#/components/schemas/ResourceName"},"percentage":{"type":"number","format":"double"},"uuid":{"$ref":"#/components/schemas/ProjectUuid"}},"required":["metrics","name","percentage","uuid"]},"JsonUpdateAlert":{"type":"object","properties":{"status":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/AlertStatus"}]}}},"JsonUpdateBenchmark":{"type":"object","properties":{"name":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/BenchmarkName"}]},"slug":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/Slug"}]}}},"JsonUpdateBranch":{"type":"object","properties":{"name":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/BranchName"}]},"slug":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/Slug"}]}}},"JsonUpdateConfig":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/JsonConfig"},"delay":{"nullable":true,"type":"integer","format":"uint64","minimum":0}},"required":["config"]},"JsonUpdateMeasure":{"type":"object","properties":{"name":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/ResourceName"}]},"slug":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/Slug"}]},"units":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/ResourceName"}]}}},"JsonUpdateMember":{"type":"object","properties":{"role":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/OrganizationRole"}]}}},"JsonUpdateOrganization":{"anyOf":[{"$ref":"#/components/schemas/JsonOrganizationPatch"},{"$ref":"#/components/schemas/JsonOrganizationPatchNull"}]},"JsonUpdateProject":{"anyOf":[{"$ref":"#/components/schemas/JsonProjectPatch"},{"$ref":"#/components/schemas/JsonProjectPatchNull"}]},"JsonUpdateTestbed":{"type":"object","properties":{"name":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/ResourceName"}]},"slug":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/Slug"}]}}},"JsonUpdateThreshold":{"type":"object","properties":{"lower_boundary":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/Boundary"}]},"max_sample_size":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/SampleSize"}]},"min_sample_size":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/SampleSize"}]},"test":{"$ref":"#/components/schemas/StatisticKind"},"upper_boundary":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/Boundary"}]},"window":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/Window"}]}},"required":["test"]},"JsonUpdateToken":{"type":"object","properties":{"name":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/ResourceName"}]}}},"JsonUsage":{"type":"object","properties":{"end_time":{"$ref":"#/components/schemas/DateTime"},"kind":{"$ref":"#/components/schemas/UsageKind"},"license":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/JsonLicense"}]},"organization":{"$ref":"#/components/schemas/OrganizationUuid"},"plan":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/JsonPlan"}]},"start_time":{"$ref":"#/components/schemas/DateTime"},"usage":{"nullable":true,"type":"integer","format":"uint32","minimum":0}},"required":["end_time","kind","organization","start_time"]},"JsonUser":{"type":"object","properties":{"admin":{"type":"boolean"},"email":{"$ref":"#/components/schemas/Email"},"locked":{"type":"boolean"},"name":{"$ref":"#/components/schemas/UserName"},"slug":{"$ref":"#/components/schemas/Slug"},"uuid":{"$ref":"#/components/schemas/UserUuid"}},"required":["admin","email","locked","name","slug","uuid"]},"JsonVersion":{"type":"object","properties":{"hash":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/GitHash"}]},"number":{"$ref":"#/components/schemas/VersionNumber"}},"required":["number"]},"Jwt":{"type":"string"},"LastFour":{"type":"string"},"LogLevel":{"type":"string","enum":["trace","debug","info","warn","error","critical"]},"MeasureUuid":{"type":"string","format":"uuid"},"NameId":{"type":"string"},"NonEmpty":{"type":"string"},"OrganizationRole":{"type":"string","enum":["leader"]},"OrganizationUuid":{"type":"string","format":"uuid"},"PlanLevel":{"type":"string","enum":["free","team","enterprise"]},"PlanStatus":{"type":"string","enum":["active","canceled","incomplete","incomplete_expired","past_due","paused","trialing","unpaid"]},"ProjectUuid":{"type":"string","format":"uuid"},"ReportUuid":{"type":"string","format":"uuid"},"ResourceId":{"type":"string"},"ResourceName":{"type":"string"},"SampleSize":{"type":"integer","format":"uint32","minimum":0},"Secret":{"type":"string"},"ServerLog":{"oneOf":[{"type":"object","properties":{"stderr_terminal":{"type":"object","properties":{"level":{"$ref":"#/components/schemas/LogLevel"}},"required":["level"]}},"required":["stderr_terminal"],"additionalProperties":false},{"type":"object","properties":{"file":{"type":"object","properties":{"if_exists":{"$ref":"#/components/schemas/IfExists"},"level":{"$ref":"#/components/schemas/LogLevel"},"path":{"type":"string"}},"required":["if_exists","level","path"]}},"required":["file"],"additionalProperties":false}]},"ServerUuid":{"type":"string","format":"uuid"},"Slug":{"type":"string"},"StatisticKind":{"type":"string","enum":["static","percentage","z_score","t_test","log_normal","iqr","delta_iqr"]},"StatisticUuid":{"type":"string","format":"uuid"},"TestbedUuid":{"type":"string","format":"uuid"},"ThresholdUuid":{"type":"string","format":"uuid"},"TokenUuid":{"type":"string","format":"uuid"},"Url":{"type":"string"},"UsageKind":{"type":"string","enum":["cloud_free","cloud_metered","cloud_licensed","cloud_self_hosted_licensed","self_hosted_free","self_hosted_licensed"]},"UserName":{"type":"string"},"UserUuid":{"type":"string","format":"uuid"},"VersionNumber":{"type":"integer","format":"uint32","minimum":0},"Visibility":{"type":"string","enum":["public","private"]},"Window":{"type":"integer","format":"uint32","minimum":0},"JsonDirection":{"type":"string","enum":["asc","desc"]},"OrganizationsSort":{"oneOf":[{"description":"Sort by name","type":"string","enum":["name"]}]},"Search":{"type":"string"},"OrganizationPermission":{"type":"string","enum":["view","create","edit","delete","manage","view_role","create_role","edit_role","delete_role"]},"OrgMembersSort":{"type":"string","enum":["name"]},"OrgProjectsSort":{"oneOf":[{"description":"Sort by name","type":"string","enum":["name"]}]},"ProjectsSort":{"type":"string","enum":["name"]},"ProjAlertsSort":{"type":"string","enum":["created","modified"]},"ProjectPermission":{"type":"string","enum":["view","create","edit","delete","manage","view_role","create_role","edit_role","delete_role"]},"ProjBenchmarksSort":{"type":"string","enum":["name"]},"ProjBranchesSort":{"type":"string","enum":["name"]},"ProjMeasuresSort":{"type":"string","enum":["name"]},"DateTimeMillis":{"$ref":"#/components/schemas/TimestampMillis"},"TimestampMillis":{"type":"integer","format":"int64"},"ProjReportsSort":{"type":"string","enum":["date_time"]},"ProjTestbedsSort":{"type":"string","enum":["name"]},"ProjThresholdsSort":{"type":"string","enum":["created","modified"]},"UserTokensSort":{"type":"string","enum":["name"]}},"responses":{"Error":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"tags":[{"name":"alerts","description":"Alerts"},{"name":"allowed"},{"name":"auth","description":"Auth"},{"name":"benchmarks","description":"Benchmarks"},{"name":"branches","description":"Branches"},{"name":"checkout"},{"name":"config"},{"name":"endpoint"},{"name":"measures","description":"Measures"},{"name":"members"},{"name":"organizations","description":"Organizations"},{"name":"perf","description":"Perf Metrics"},{"name":"ping"},{"name":"plan"},{"name":"projects","description":"Projects"},{"name":"reports","description":"Reports"},{"name":"server","description":"Server"},{"name":"spec","description":"OpenAPI Spec"},{"name":"statistics","description":"Statistics"},{"name":"stats"},{"name":"testbeds","description":"Testbeds"},{"name":"thresholds","description":"Thresholds"},{"name":"tokens","description":"API Tokens"},{"name":"usage"},{"name":"users","description":"Users"},{"name":"version"}]}'); +module.exports = JSON.parse('{"openapi":"3.0.3","info":{"title":"Bencher API","version":"0.4.4"},"paths":{"/":{"get":{"tags":["server"],"operationId":"server_root_get","responses":{"200":{"description":"successful operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"title":"Null","type":"string","enum":[null]}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}}},"/v0/auth/accept":{"post":{"tags":["auth","organizations"],"operationId":"auth_accept_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonAccept"}}},"required":true},"responses":{"202":{"description":"successfully enqueued operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonAuthAck"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}}},"/v0/auth/confirm":{"post":{"tags":["auth"],"operationId":"auth_confirm_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonConfirm"}}},"required":true},"responses":{"200":{"description":"successful operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonAuthUser"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}}},"/v0/auth/github":{"post":{"tags":["auth"],"operationId":"auth_github_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonOAuth"}}},"required":true},"responses":{"202":{"description":"successfully enqueued operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonAuthUser"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}}},"/v0/auth/login":{"post":{"tags":["auth"],"operationId":"auth_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonLogin"}}},"required":true},"responses":{"202":{"description":"successfully enqueued operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonAuthAck"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}}},"/v0/auth/signup":{"post":{"tags":["auth"],"summary":"When a user signs up, a new personal organization is automatically created.","description":"Except when a user signs up with an invitation, then the user is just added to the inviting organization.","operationId":"auth_signup_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonSignup"}}},"required":true},"responses":{"202":{"description":"successfully enqueued operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonAuthAck"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}}},"/v0/checkout":{"post":{"tags":["checkout"],"operationId":"checkouts_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonNewCheckout"}}},"required":true},"responses":{"201":{"description":"successful creation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonCheckout"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}}},"/v0/organizations":{"get":{"tags":["organizations"],"summary":"List organizations","description":"List all organizations where the user is a member. The user must have `view` permissions for each organization. By default, the organizations are sorted in alphabetical order by name.","operationId":"organizations_get","parameters":[{"in":"query","name":"direction","description":"The direction to sort by. If not specified, the default sort direction is used.","schema":{"$ref":"#/components/schemas/JsonDirection"}},{"in":"query","name":"page","description":"The page number to return. If not specified, the first page is returned.","schema":{"nullable":true,"type":"integer","format":"uint32","minimum":0}},{"in":"query","name":"per_page","description":"The number of items to return per page. If not specified, the default number of items per page (8) is used.","schema":{"nullable":true,"type":"integer","format":"uint8","minimum":0}},{"in":"query","name":"sort","description":"The field to sort by. If not specified, the default sort field is used.","schema":{"$ref":"#/components/schemas/OrganizationsSort"}},{"in":"query","name":"name","description":"Filter by organization name, exact match.","schema":{"$ref":"#/components/schemas/ResourceName"}},{"in":"query","name":"search","description":"Search by organization name, slug, or UUID.","schema":{"$ref":"#/components/schemas/Search"}}],"responses":{"200":{"description":"successful operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonOrganizations"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}},"post":{"tags":["organizations"],"summary":"Create an organization","description":"Create a new organization. The user must be an admin on the server to use this route.","operationId":"organization_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonNewOrganization"}}},"required":true},"responses":{"201":{"description":"successful creation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonOrganization"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}}},"/v0/organizations/{organization}":{"get":{"tags":["organizations"],"summary":"View an organization","description":"View an organization where the user is a member. The user must have `view` permissions for the organization.","operationId":"organization_get","parameters":[{"in":"path","name":"organization","description":"The slug or UUID for an organization.","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}}],"responses":{"200":{"description":"successful operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonOrganization"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}},"patch":{"tags":["organizations"],"summary":"Update an organization","description":"Update an organization where the user is a member. The user must have `edit` permissions for the organization. If updating the license, the user must have `manage` permissions for the organization.","operationId":"organization_patch","parameters":[{"in":"path","name":"organization","description":"The slug or UUID for an organization.","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonUpdateOrganization"}}},"required":true},"responses":{"200":{"description":"successful operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonOrganization"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}}},"/v0/organizations/{organization}/allowed/{permission}":{"get":{"tags":["organizations","allowed"],"operationId":"org_allowed_get","parameters":[{"in":"path","name":"organization","description":"The slug or UUID for an organization.","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}},{"in":"path","name":"permission","description":"The permission to check.","required":true,"schema":{"$ref":"#/components/schemas/OrganizationPermission"}}],"responses":{"200":{"description":"successful operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonAllowed"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}}},"/v0/organizations/{organization}/members":{"get":{"tags":["organizations","members"],"summary":"List organization members","description":"List members for an organization. The user must have `view_role` permissions for the organization. By default, the members are sorted in alphabetical order by name.","operationId":"org_members_get","parameters":[{"in":"path","name":"organization","description":"The slug or UUID for an organization.","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}},{"in":"query","name":"direction","description":"The direction to sort by. If not specified, the default sort direction is used.","schema":{"$ref":"#/components/schemas/JsonDirection"}},{"in":"query","name":"page","description":"The page number to return. If not specified, the first page is returned.","schema":{"nullable":true,"type":"integer","format":"uint32","minimum":0}},{"in":"query","name":"per_page","description":"The number of items to return per page. If not specified, the default number of items per page (8) is used.","schema":{"nullable":true,"type":"integer","format":"uint8","minimum":0}},{"in":"query","name":"sort","description":"The field to sort by. If not specified, the default sort field is used.","schema":{"$ref":"#/components/schemas/OrgMembersSort"}},{"in":"query","name":"name","description":"Filter by user name, exact match.","schema":{"$ref":"#/components/schemas/UserName"}},{"in":"query","name":"search","description":"Search by user name, slug, or UUID.","schema":{"$ref":"#/components/schemas/Search"}}],"responses":{"200":{"description":"successful operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonMembers"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}},"post":{"tags":["organizations","members"],"summary":"Invite a user to an organization","description":"Invite another user to become a member of an organization. The user must have `create_role` permissions for the organization. The invitee is sent an email with a link to accept the invitation, and they are not added to the organization until they accept the invitation.","operationId":"org_member_post","parameters":[{"in":"path","name":"organization","description":"The slug or UUID for an organization.","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonNewMember"}}},"required":true},"responses":{"202":{"description":"successfully enqueued operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonAuthAck"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}}},"/v0/organizations/{organization}/members/{user}":{"get":{"tags":["organizations","members"],"summary":"View an organization member","description":"View a member of an organization. The user must have `view_role` permissions for the organization.","operationId":"org_member_get","parameters":[{"in":"path","name":"organization","description":"The slug or UUID for an organization.","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}},{"in":"path","name":"user","description":"The slug or UUID for an organization member.","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}}],"responses":{"200":{"description":"successful operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonMember"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}},"delete":{"tags":["organizations","members"],"summary":"Remove an organization member","description":"Remove a member member of an organization. The user must have `delete_role` permissions for the organization.","operationId":"org_member_delete","parameters":[{"in":"path","name":"organization","description":"The slug or UUID for an organization.","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}},{"in":"path","name":"user","description":"The slug or UUID for an organization member.","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}}],"responses":{"204":{"description":"successful deletion","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}},"patch":{"tags":["organizations","members"],"summary":"Update an organization member","description":"Update the role for a member of an organization. The user must have `edit_role` permissions for the organization.","operationId":"org_member_patch","parameters":[{"in":"path","name":"organization","description":"The slug or UUID for an organization.","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}},{"in":"path","name":"user","description":"The slug or UUID for an organization member.","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonUpdateMember"}}},"required":true},"responses":{"200":{"description":"successful operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonMember"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}}},"/v0/organizations/{organization}/plan":{"get":{"tags":["organizations","plan"],"operationId":"org_plan_get","parameters":[{"in":"path","name":"organization","description":"The slug or UUID for an organization.","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}}],"responses":{"200":{"description":"successful operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonPlan"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}},"post":{"tags":["organizations","plan"],"operationId":"org_plan_post","parameters":[{"in":"path","name":"organization","description":"The slug or UUID for an organization.","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonNewPlan"}}},"required":true},"responses":{"201":{"description":"successful creation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonPlan"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}},"delete":{"tags":["organizations","plan"],"operationId":"org_plan_delete","parameters":[{"in":"path","name":"organization","description":"The slug or UUID for an organization.","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}},{"in":"query","name":"remote","schema":{"nullable":true,"type":"boolean"}}],"responses":{"204":{"description":"successful deletion","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}}},"/v0/organizations/{organization}/projects":{"get":{"tags":["organizations","projects"],"summary":"List organization projects","description":"List projects for an organization. The user must have `view` permissions for the organization. By default, the projects are sorted in alphabetical order by name.","operationId":"org_projects_get","parameters":[{"in":"path","name":"organization","description":"The slug or UUID for an organization.","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}},{"in":"query","name":"direction","description":"The direction to sort by. If not specified, the default sort direction is used.","schema":{"$ref":"#/components/schemas/JsonDirection"}},{"in":"query","name":"page","description":"The page number to return. If not specified, the first page is returned.","schema":{"nullable":true,"type":"integer","format":"uint32","minimum":0}},{"in":"query","name":"per_page","description":"The number of items to return per page. If not specified, the default number of items per page (8) is used.","schema":{"nullable":true,"type":"integer","format":"uint8","minimum":0}},{"in":"query","name":"sort","description":"The field to sort by. If not specified, the default sort field is used.","schema":{"$ref":"#/components/schemas/OrgProjectsSort"}},{"in":"query","name":"name","description":"Filter by project name, exact match.","schema":{"$ref":"#/components/schemas/ResourceName"}},{"in":"query","name":"search","description":"Search by project name, slug, or UUID.","schema":{"$ref":"#/components/schemas/Search"}}],"responses":{"200":{"description":"successful operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonProjects"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}},"post":{"tags":["organizations","projects"],"summary":"Create a project for an organization","description":"Create a new project for an organization. The user must have `create` permissions for the organization. The new project will have a `main` branch, a `localhost` testbed, `latency` and `throughput` measures, and a threshold for both measures. ➕ Bencher Plus: The project visibility must be `public` unless the organization has a valid Bencher Plus subscription.","operationId":"org_project_post","parameters":[{"in":"path","name":"organization","description":"The slug or UUID for an organization.","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonNewProject"}}},"required":true},"responses":{"201":{"description":"successful creation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonProject"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}}},"/v0/organizations/{organization}/usage":{"get":{"tags":["organizations","usage"],"summary":"View organization metrics usage","description":"View the metrics usage of an organization. The user must have `manage` permissions for the organization. ➕ Bencher Plus: This endpoint offers an estimate of metered usage and exact usage for licensed organizations, both on Bencher Cloud and Bencher Self-Hosted.","operationId":"org_usage_get","parameters":[{"in":"path","name":"organization","description":"The slug or UUID for an organization.","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}}],"responses":{"200":{"description":"successful operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonUsage"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}}},"/v0/projects":{"get":{"tags":["projects"],"summary":"List projects","description":"List all projects. If the user is not authenticated, then only public projects are returned. If the user is authenticated, then all public projects and any private project where the user has `view` permissions are returned. By default, the projects are sorted in alphabetical order by name.","operationId":"projects_get","parameters":[{"in":"query","name":"direction","description":"The direction to sort by. If not specified, the default sort direction is used.","schema":{"$ref":"#/components/schemas/JsonDirection"}},{"in":"query","name":"page","description":"The page number to return. If not specified, the first page is returned.","schema":{"nullable":true,"type":"integer","format":"uint32","minimum":0}},{"in":"query","name":"per_page","description":"The number of items to return per page. If not specified, the default number of items per page (8) is used.","schema":{"nullable":true,"type":"integer","format":"uint8","minimum":0}},{"in":"query","name":"sort","description":"The field to sort by. If not specified, the default sort field is used.","schema":{"$ref":"#/components/schemas/ProjectsSort"}},{"in":"query","name":"name","description":"Filter by project name, exact match.","schema":{"$ref":"#/components/schemas/ResourceName"}},{"in":"query","name":"search","description":"Search by project name, slug, or UUID.","schema":{"$ref":"#/components/schemas/Search"}}],"responses":{"200":{"description":"successful operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonProjects"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}}},"/v0/projects/{project}":{"get":{"tags":["projects"],"summary":"View a project","description":"View a project. If the user is not authenticated, then only a public project is available. If the user is authenticated, then any public project and any private project where the user has `view` permissions is available.","operationId":"project_get","parameters":[{"in":"path","name":"project","description":"The slug or UUID for a project.","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}}],"responses":{"200":{"description":"successful operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonProject"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}},"delete":{"tags":["projects"],"summary":"Delete a project","description":"Delete a project. The user must have `delete` permissions for the project.","operationId":"project_delete","parameters":[{"in":"path","name":"project","description":"The slug or UUID for a project.","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}}],"responses":{"204":{"description":"successful deletion","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}},"patch":{"tags":["projects"],"summary":"Update a project","description":"Update a project. The user must have `edit` permissions for the project.","operationId":"project_patch","parameters":[{"in":"path","name":"project","description":"The slug or UUID for a project.","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonUpdateProject"}}},"required":true},"responses":{"200":{"description":"successful operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonProject"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}}},"/v0/projects/{project}/alerts":{"get":{"tags":["projects","alerts"],"summary":"List alerts for a project","description":"List all alerts for a project. If the project is public, then the user does not need to be authenticated. If the project is private, then the user must be authenticated and have `view` permissions for the project. By default, the alerts are sorted by status (active then dismissed) and modification date time in reverse chronological order.","operationId":"proj_alerts_get","parameters":[{"in":"path","name":"project","description":"The slug or UUID for a project.","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}},{"in":"query","name":"direction","description":"The direction to sort by. If not specified, the default sort direction is used.","schema":{"$ref":"#/components/schemas/JsonDirection"}},{"in":"query","name":"page","description":"The page number to return. If not specified, the first page is returned.","schema":{"nullable":true,"type":"integer","format":"uint32","minimum":0}},{"in":"query","name":"per_page","description":"The number of items to return per page. If not specified, the default number of items per page (8) is used.","schema":{"nullable":true,"type":"integer","format":"uint8","minimum":0}},{"in":"query","name":"sort","description":"The field to sort by. If not specified, the default sort field is used.","schema":{"$ref":"#/components/schemas/ProjAlertsSort"}}],"responses":{"200":{"description":"successful operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonAlerts"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}}},"/v0/projects/{project}/alerts/{alert}":{"get":{"tags":["projects","alerts"],"summary":"View an alert","description":"View an alert for a project. If the project is public, then the user does not need to be authenticated. If the project is private, then the user must be authenticated and have `view` permissions for the project.","operationId":"proj_alert_get","parameters":[{"in":"path","name":"alert","description":"The UUID for an alert.","required":true,"schema":{"$ref":"#/components/schemas/AlertUuid"}},{"in":"path","name":"project","description":"The slug or UUID for a project.","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}}],"responses":{"200":{"description":"successful operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonAlert"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}},"patch":{"tags":["projects","alerts"],"summary":"Update an alert","description":"Update an alert for a project. The user must have `edit` permissions for the project. Use this endpoint to dismiss an alert.","operationId":"proj_alert_patch","parameters":[{"in":"path","name":"alert","description":"The UUID for an alert.","required":true,"schema":{"$ref":"#/components/schemas/AlertUuid"}},{"in":"path","name":"project","description":"The slug or UUID for a project.","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonUpdateAlert"}}},"required":true},"responses":{"200":{"description":"successful operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonAlert"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}}},"/v0/projects/{project}/allowed/{permission}":{"get":{"tags":["projects","allowed"],"operationId":"proj_allowed_get","parameters":[{"in":"path","name":"permission","description":"The permission to check.","required":true,"schema":{"$ref":"#/components/schemas/ProjectPermission"}},{"in":"path","name":"project","description":"The slug or UUID for a project.","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}}],"responses":{"200":{"description":"successful operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonAllowed"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}}},"/v0/projects/{project}/benchmarks":{"get":{"tags":["projects","benchmarks"],"summary":"List benchmarks for a project","description":"List all benchmarks for a project. If the project is public, then the user does not need to be authenticated. If the project is private, then the user must be authenticated and have `view` permissions for the project. By default, the benchmarks are sorted in alphabetical order by name.","operationId":"proj_benchmarks_get","parameters":[{"in":"path","name":"project","description":"The slug or UUID for a project.","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}},{"in":"query","name":"direction","description":"The direction to sort by. If not specified, the default sort direction is used.","schema":{"$ref":"#/components/schemas/JsonDirection"}},{"in":"query","name":"page","description":"The page number to return. If not specified, the first page is returned.","schema":{"nullable":true,"type":"integer","format":"uint32","minimum":0}},{"in":"query","name":"per_page","description":"The number of items to return per page. If not specified, the default number of items per page (8) is used.","schema":{"nullable":true,"type":"integer","format":"uint8","minimum":0}},{"in":"query","name":"sort","description":"The field to sort by. If not specified, the default sort field is used.","schema":{"$ref":"#/components/schemas/ProjBenchmarksSort"}},{"in":"query","name":"name","description":"Filter by benchmark name, exact match.","schema":{"$ref":"#/components/schemas/BenchmarkName"}},{"in":"query","name":"search","description":"Search by benchmark name, slug, or UUID.","schema":{"$ref":"#/components/schemas/Search"}}],"responses":{"200":{"description":"successful operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonBenchmarks"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}},"post":{"tags":["projects","benchmarks"],"summary":"Create a benchmark","description":"Create a benchmark for a project. The user must have `create` permissions for the project.","operationId":"proj_benchmark_post","parameters":[{"in":"path","name":"project","description":"The slug or UUID for a project.","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonNewBenchmark"}}},"required":true},"responses":{"201":{"description":"successful creation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonBenchmark"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}}},"/v0/projects/{project}/benchmarks/{benchmark}":{"get":{"tags":["projects","benchmarks"],"summary":"View a benchmark","description":"View a benchmark for a project. If the project is public, then the user does not need to be authenticated. If the project is private, then the user must be authenticated and have `view` permissions for the project.","operationId":"proj_benchmark_get","parameters":[{"in":"path","name":"benchmark","description":"The slug or UUID for a benchmark.","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}},{"in":"path","name":"project","description":"The slug or UUID for a project.","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}}],"responses":{"200":{"description":"successful operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonBenchmark"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}},"delete":{"tags":["projects","benchmarks"],"summary":"Delete a benchmark","description":"Delete a benchmark for a project. The user must have `delete` permissions for the project. All reports that use this benchmark must be deleted first!","operationId":"proj_benchmark_delete","parameters":[{"in":"path","name":"benchmark","description":"The slug or UUID for a benchmark.","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}},{"in":"path","name":"project","description":"The slug or UUID for a project.","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}}],"responses":{"204":{"description":"successful deletion","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}},"patch":{"tags":["projects","benchmarks"],"summary":"Update a benchmark","description":"Update a benchmark for a project. The user must have `edit` permissions for the project.","operationId":"proj_benchmark_patch","parameters":[{"in":"path","name":"benchmark","description":"The slug or UUID for a benchmark.","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}},{"in":"path","name":"project","description":"The slug or UUID for a project.","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonUpdateBenchmark"}}},"required":true},"responses":{"200":{"description":"successful operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonBenchmark"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}}},"/v0/projects/{project}/branches":{"get":{"tags":["projects","branches"],"summary":"List branches for a project","description":"List all branches for a project. If the project is public, then the user does not need to be authenticated. If the project is private, then the user must be authenticated and have `view` permissions for the project. By default, the branches are sorted in alphabetical order by name.","operationId":"proj_branches_get","parameters":[{"in":"path","name":"project","description":"The slug or UUID for a project.","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}},{"in":"query","name":"direction","description":"The direction to sort by. If not specified, the default sort direction is used.","schema":{"$ref":"#/components/schemas/JsonDirection"}},{"in":"query","name":"page","description":"The page number to return. If not specified, the first page is returned.","schema":{"nullable":true,"type":"integer","format":"uint32","minimum":0}},{"in":"query","name":"per_page","description":"The number of items to return per page. If not specified, the default number of items per page (8) is used.","schema":{"nullable":true,"type":"integer","format":"uint8","minimum":0}},{"in":"query","name":"sort","description":"The field to sort by. If not specified, the default sort field is used.","schema":{"$ref":"#/components/schemas/ProjBranchesSort"}},{"in":"query","name":"name","description":"Filter by branch name, exact match.","schema":{"$ref":"#/components/schemas/BranchName"}},{"in":"query","name":"search","description":"Search by branch name, slug, or UUID.","schema":{"$ref":"#/components/schemas/Search"}}],"responses":{"200":{"description":"successful operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonBranches"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}},"post":{"tags":["projects","branches"],"summary":"Create a branch","description":"Create a branch for a project. The user must have `create` permissions for the project.","operationId":"proj_branch_post","parameters":[{"in":"path","name":"project","description":"The slug or UUID for a project.","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonNewBranch"}}},"required":true},"responses":{"201":{"description":"successful creation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonBranch"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}}},"/v0/projects/{project}/branches/{branch}":{"get":{"tags":["projects","branches"],"summary":"View a branch","description":"View a branch for a project. If the project is public, then the user does not need to be authenticated. If the project is private, then the user must be authenticated and have `view` permissions for the project.","operationId":"proj_branch_get","parameters":[{"in":"path","name":"branch","description":"The slug or UUID for a branch.","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}},{"in":"path","name":"project","description":"The slug or UUID for a project.","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}}],"responses":{"200":{"description":"successful operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonBranch"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}},"delete":{"tags":["projects","branches"],"summary":"Delete a branch","description":"Delete a branch for a project. The user must have `delete` permissions for the project. All reports and thresholds that use this branch must be deleted first!","operationId":"proj_branch_delete","parameters":[{"in":"path","name":"branch","description":"The slug or UUID for a branch.","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}},{"in":"path","name":"project","description":"The slug or UUID for a project.","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}}],"responses":{"204":{"description":"successful deletion","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}},"patch":{"tags":["projects","branches"],"summary":"Update a branch","description":"Update a branch for a project. The user must have `edit` permissions for the project.","operationId":"proj_branch_patch","parameters":[{"in":"path","name":"branch","description":"The slug or UUID for a branch.","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}},{"in":"path","name":"project","description":"The slug or UUID for a project.","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonUpdateBranch"}}},"required":true},"responses":{"200":{"description":"successful operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonBranch"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}}},"/v0/projects/{project}/measures":{"get":{"tags":["projects","measures"],"summary":"List measures for a project","description":"List all measures for a project. If the project is public, then the user does not need to be authenticated. If the project is private, then the user must be authenticated and have `view` permissions for the project. By default, the measures are sorted in alphabetical order by name.","operationId":"proj_measures_get","parameters":[{"in":"path","name":"project","description":"The slug or UUID for a project.","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}},{"in":"query","name":"direction","description":"The direction to sort by. If not specified, the default sort direction is used.","schema":{"$ref":"#/components/schemas/JsonDirection"}},{"in":"query","name":"page","description":"The page number to return. If not specified, the first page is returned.","schema":{"nullable":true,"type":"integer","format":"uint32","minimum":0}},{"in":"query","name":"per_page","description":"The number of items to return per page. If not specified, the default number of items per page (8) is used.","schema":{"nullable":true,"type":"integer","format":"uint8","minimum":0}},{"in":"query","name":"sort","description":"The field to sort by. If not specified, the default sort field is used.","schema":{"$ref":"#/components/schemas/ProjMeasuresSort"}},{"in":"query","name":"name","description":"Filter by measure name, exact match.","schema":{"$ref":"#/components/schemas/ResourceName"}},{"in":"query","name":"search","description":"Search by measure name, slug, or UUID.","schema":{"$ref":"#/components/schemas/Search"}}],"responses":{"200":{"description":"successful operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonMeasures"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}},"post":{"tags":["projects","measures"],"summary":"Create a measure","description":"Create a measure for a project. The user must have `create` permissions for the project.","operationId":"proj_measure_post","parameters":[{"in":"path","name":"project","description":"The slug or UUID for a project.","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonNewMeasure"}}},"required":true},"responses":{"201":{"description":"successful creation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonMeasure"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}}},"/v0/projects/{project}/measures/{measure}":{"get":{"tags":["projects","measures"],"summary":"View a measure","description":"View a measure for a project. If the project is public, then the user does not need to be authenticated. If the project is private, then the user must be authenticated and have `view` permissions for the project.","operationId":"proj_measure_get","parameters":[{"in":"path","name":"measure","description":"The slug or UUID for a measure.","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}},{"in":"path","name":"project","description":"The slug or UUID for a project.","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}}],"responses":{"200":{"description":"successful operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonMeasure"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}},"delete":{"tags":["projects","measures"],"summary":"Delete a measure","description":"Delete a measure for a project. The user must have `delete` permissions for the project. All reports and thresholds that use this measure must be deleted first!","operationId":"proj_measure_delete","parameters":[{"in":"path","name":"measure","description":"The slug or UUID for a measure.","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}},{"in":"path","name":"project","description":"The slug or UUID for a project.","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}}],"responses":{"204":{"description":"successful deletion","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}},"patch":{"tags":["projects","measures"],"summary":"Update a measure","description":"Update a measure for a project. The user must have `edit` permissions for the project.","operationId":"proj_measure_patch","parameters":[{"in":"path","name":"measure","description":"The slug or UUID for a measure.","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}},{"in":"path","name":"project","description":"The slug or UUID for a project.","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonUpdateMeasure"}}},"required":true},"responses":{"200":{"description":"successful operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonMeasure"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}}},"/v0/projects/{project}/perf":{"get":{"tags":["projects","perf"],"summary":"Query project performance metrics","description":"Query the performance metrics for a project. The query results are every permutation of each branch, testbed, benchmark, and measure. There is a limit of 256 permutations for a single request. Therefore, only the first 256 permutations are returned. If the project is public, then the user does not need to be authenticated. If the project is private, then the user must be authenticated and have `view` permissions for the project.","operationId":"proj_perf_get","parameters":[{"in":"path","name":"project","description":"The slug or UUID for a project.","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}},{"in":"query","name":"benchmarks","description":"A comma separated list of benchmark UUIDs to query.","required":true,"schema":{"type":"string"}},{"in":"query","name":"branches","description":"A comma separated list of branch UUIDs to query.","required":true,"schema":{"type":"string"}},{"in":"query","name":"end_time","description":"Search for metrics before the given date time in milliseconds.","schema":{"$ref":"#/components/schemas/DateTimeMillis"}},{"in":"query","name":"measures","description":"A comma separated list of measure UUIDs to query.","required":true,"schema":{"type":"string"}},{"in":"query","name":"start_time","description":"Search for metrics after the given date time in milliseconds.","schema":{"$ref":"#/components/schemas/DateTimeMillis"}},{"in":"query","name":"testbeds","description":"A comma separated list of testbed UUIDs to query.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"successful operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonPerf"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}}},"/v0/projects/{project}/perf/img":{"get":{"tags":["projects","perf"],"summary":"Generate a dynamic image of project performance metrics","description":"Generate a dynamic image of performance metrics for a project. The query results are every permutation of each branch, testbed, benchmark, and measure. There is a limit of 8 permutations for a single image. Therefore, only the first 8 permutations are plotted. If the project is public, then the user does not need to be authenticated. If the project is private, then the user must be authenticated and have `view` permissions for the project.","operationId":"proj_perf_img_get","parameters":[{"in":"path","name":"project","description":"The slug or UUID for a project.","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}},{"in":"query","name":"benchmarks","description":"A comma separated list of benchmark UUIDs to query.","required":true,"schema":{"type":"string"}},{"in":"query","name":"branches","description":"A comma separated list of branch UUIDs to query.","required":true,"schema":{"type":"string"}},{"in":"query","name":"end_time","description":"Search for metrics before the given date time in milliseconds.","schema":{"$ref":"#/components/schemas/DateTimeMillis"}},{"in":"query","name":"measures","description":"A comma separated list of measure UUIDs to query.","required":true,"schema":{"type":"string"}},{"in":"query","name":"start_time","description":"Search for metrics after the given date time in milliseconds.","schema":{"$ref":"#/components/schemas/DateTimeMillis"}},{"in":"query","name":"testbeds","description":"A comma separated list of testbed UUIDs to query.","required":true,"schema":{"type":"string"}},{"in":"query","name":"title","description":"The title for the perf plot. If not provided, the project name will be used.","schema":{"nullable":true,"type":"string"}}],"responses":{"default":{"description":"","content":{"*/*":{"schema":{}}}}}}},"/v0/projects/{project}/reports":{"get":{"tags":["projects","reports"],"summary":"List reports for a project","description":"List all reports for a project. If the project is public, then the user does not need to be authenticated. If the project is private, then the user must be authenticated and have `view` permissions for the project. By default, the reports are sorted by date time in reverse chronological order.","operationId":"proj_reports_get","parameters":[{"in":"path","name":"project","description":"The slug or UUID for a project.","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}},{"in":"query","name":"direction","description":"The direction to sort by. If not specified, the default sort direction is used.","schema":{"$ref":"#/components/schemas/JsonDirection"}},{"in":"query","name":"page","description":"The page number to return. If not specified, the first page is returned.","schema":{"nullable":true,"type":"integer","format":"uint32","minimum":0}},{"in":"query","name":"per_page","description":"The number of items to return per page. If not specified, the default number of items per page (8) is used.","schema":{"nullable":true,"type":"integer","format":"uint8","minimum":0}},{"in":"query","name":"sort","description":"The field to sort by. If not specified, the default sort field is used.","schema":{"$ref":"#/components/schemas/ProjReportsSort"}},{"in":"query","name":"branch","description":"Filter by branch UUID, slug, or name exact match.","schema":{"nullable":true,"type":"string"}},{"in":"query","name":"end_time","description":"Filter for reports before the given date time in milliseconds.","schema":{"$ref":"#/components/schemas/DateTimeMillis"}},{"in":"query","name":"start_time","description":"Filter for reports after the given date time in milliseconds.","schema":{"$ref":"#/components/schemas/DateTimeMillis"}},{"in":"query","name":"testbed","description":"Filter by testbed UUID, slug, or name exact match.","schema":{"nullable":true,"type":"string"}}],"responses":{"200":{"description":"successful operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonReports"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}},"post":{"tags":["projects","reports"],"summary":"Create a report","description":"Create a report for a project. The user must have `create` permissions for the project. If using the Bencher CLI, it is recommended to use the `bencher run` subcommand instead of trying to create a report manually.","operationId":"proj_report_post","parameters":[{"in":"path","name":"project","description":"The slug or UUID for a project.","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonNewReport"}}},"required":true},"responses":{"201":{"description":"successful creation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonReport"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}}},"/v0/projects/{project}/reports/{report}":{"get":{"tags":["projects","reports"],"summary":"View a report","description":"View a report for a project. If the project is public, then the user does not need to be authenticated. If the project is private, then the user must be authenticated and have `view` permissions for the project.","operationId":"proj_report_get","parameters":[{"in":"path","name":"project","description":"The slug or UUID for a project.","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}},{"in":"path","name":"report","description":"The UUID for a report.","required":true,"schema":{"$ref":"#/components/schemas/ReportUuid"}}],"responses":{"200":{"description":"successful operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonReport"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}},"delete":{"tags":["projects","reports"],"summary":"Delete a report","description":"Delete a report for a project. The user must have `delete` permissions for the project. If there are no more reports for a branch version, then that version will be deleted. All later branch versions will have their version numbers decremented.","operationId":"proj_report_delete","parameters":[{"in":"path","name":"project","description":"The slug or UUID for a project.","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}},{"in":"path","name":"report","description":"The UUID for a report.","required":true,"schema":{"$ref":"#/components/schemas/ReportUuid"}}],"responses":{"204":{"description":"successful deletion","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}}},"/v0/projects/{project}/stats/alerts":{"get":{"tags":["projects","alerts"],"summary":"View the total number of active alerts for a project","description":"View the total number of active alerts for a project. If the project is public, then the user does not need to be authenticated. If the project is private, then the user must be authenticated and have `view` permissions for the project. Use this endpoint to monitor the number of active alerts for a project.","operationId":"proj_alert_stats_get","parameters":[{"in":"path","name":"project","description":"The slug or UUID for a project.","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}}],"responses":{"200":{"description":"successful operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonAlertStats"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}}},"/v0/projects/{project}/testbeds":{"get":{"tags":["projects","testbeds"],"summary":"List testbeds for a project","description":"List all testbeds for a project. If the project is public, then the user does not need to be authenticated. If the project is private, then the user must be authenticated and have `view` permissions for the project. By default, the testbeds are sorted in alphabetical order by name.","operationId":"proj_testbeds_get","parameters":[{"in":"path","name":"project","description":"The slug or UUID for a project.","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}},{"in":"query","name":"direction","description":"The direction to sort by. If not specified, the default sort direction is used.","schema":{"$ref":"#/components/schemas/JsonDirection"}},{"in":"query","name":"page","description":"The page number to return. If not specified, the first page is returned.","schema":{"nullable":true,"type":"integer","format":"uint32","minimum":0}},{"in":"query","name":"per_page","description":"The number of items to return per page. If not specified, the default number of items per page (8) is used.","schema":{"nullable":true,"type":"integer","format":"uint8","minimum":0}},{"in":"query","name":"sort","description":"The field to sort by. If not specified, the default sort field is used.","schema":{"$ref":"#/components/schemas/ProjTestbedsSort"}},{"in":"query","name":"name","description":"Filter by testbed name, exact match.","schema":{"$ref":"#/components/schemas/ResourceName"}},{"in":"query","name":"search","description":"Search by testbed name, slug, or UUID.","schema":{"$ref":"#/components/schemas/Search"}}],"responses":{"200":{"description":"successful operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonTestbeds"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}},"post":{"tags":["projects","testbeds"],"summary":"Create a testbed","description":"Create a testbed for a project. The user must have `create` permissions for the project.","operationId":"proj_testbed_post","parameters":[{"in":"path","name":"project","description":"The slug or UUID for a project.","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonNewTestbed"}}},"required":true},"responses":{"201":{"description":"successful creation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonTestbed"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}}},"/v0/projects/{project}/testbeds/{testbed}":{"get":{"tags":["projects","testbeds"],"summary":"View a testbed","description":"View a testbed for a project. If the project is public, then the user does not need to be authenticated. If the project is private, then the user must be authenticated and have `view` permissions for the project.","operationId":"proj_testbed_get","parameters":[{"in":"path","name":"project","description":"The slug or UUID for a project.","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}},{"in":"path","name":"testbed","description":"The slug or UUID for a testbed.","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}}],"responses":{"200":{"description":"successful operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonTestbed"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}},"delete":{"tags":["projects","testbeds"],"summary":"Delete a testbed","description":"Delete a testbed for a project. The user must have `delete` permissions for the project. All reports and thresholds that use this testbed must be deleted first!","operationId":"proj_testbed_delete","parameters":[{"in":"path","name":"project","description":"The slug or UUID for a project.","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}},{"in":"path","name":"testbed","description":"The slug or UUID for a testbed.","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}}],"responses":{"204":{"description":"successful deletion","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}},"patch":{"tags":["projects","testbeds"],"summary":"Update a testbed","description":"Update a testbed for a project. The user must have `edit` permissions for the project.","operationId":"proj_testbed_patch","parameters":[{"in":"path","name":"project","description":"The slug or UUID for a project.","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}},{"in":"path","name":"testbed","description":"The slug or UUID for a testbed.","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonUpdateTestbed"}}},"required":true},"responses":{"200":{"description":"successful operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonTestbed"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}}},"/v0/projects/{project}/thresholds":{"get":{"tags":["projects","thresholds"],"summary":"List thresholds for a project","description":"List all thresholds for a project. If the project is public, then the user does not need to be authenticated. If the project is private, then the user must be authenticated and have `view` permissions for the project. By default, the thresholds are sorted by creation date time in chronological order.","operationId":"proj_thresholds_get","parameters":[{"in":"path","name":"project","description":"The slug or UUID for a project.","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}},{"in":"query","name":"direction","description":"The direction to sort by. If not specified, the default sort direction is used.","schema":{"$ref":"#/components/schemas/JsonDirection"}},{"in":"query","name":"page","description":"The page number to return. If not specified, the first page is returned.","schema":{"nullable":true,"type":"integer","format":"uint32","minimum":0}},{"in":"query","name":"per_page","description":"The number of items to return per page. If not specified, the default number of items per page (8) is used.","schema":{"nullable":true,"type":"integer","format":"uint8","minimum":0}},{"in":"query","name":"sort","description":"The field to sort by. If not specified, the default sort field is used.","schema":{"$ref":"#/components/schemas/ProjThresholdsSort"}},{"in":"query","name":"branch","description":"Filter by branch name, exact match.","schema":{"nullable":true,"type":"string"}},{"in":"query","name":"measure","description":"Filter by measure name, exact match.","schema":{"nullable":true,"type":"string"}},{"in":"query","name":"testbed","description":"Filter by testbed name, exact match.","schema":{"nullable":true,"type":"string"}}],"responses":{"200":{"description":"successful operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonThresholds"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}},"post":{"tags":["projects","thresholds"],"summary":"Create a threshold","description":"Create a threshold for a project. The user must have `create` permissions for the project. There can only be one threshold for any unique combination of: branch, testbed, and measure.","operationId":"proj_threshold_post","parameters":[{"in":"path","name":"project","description":"The slug or UUID for a project.","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonNewThreshold"}}},"required":true},"responses":{"201":{"description":"successful creation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonThreshold"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}}},"/v0/projects/{project}/thresholds/{threshold}":{"get":{"tags":["projects","thresholds"],"summary":"View a threshold","description":"View a threshold for a project. If the project is public, then the user does not need to be authenticated. If the project is private, then the user must be authenticated and have `view` permissions for the project.","operationId":"proj_threshold_get","parameters":[{"in":"path","name":"project","description":"The slug or UUID for a project.","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}},{"in":"path","name":"threshold","description":"The UUID for a threshold.","required":true,"schema":{"$ref":"#/components/schemas/ThresholdUuid"}},{"in":"query","name":"model","description":"View the threshold with the specified model UUID. This can be useful for viewing thresholds with historical models that have since been replaced by a new model. If not specified, then the current model is used.","schema":{"$ref":"#/components/schemas/ModelUuid"}}],"responses":{"200":{"description":"successful operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonThreshold"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}},"put":{"tags":["projects","thresholds"],"summary":"Update a threshold","description":"Update a threshold for a project. The user must have `edit` permissions for the project. The new model will be added to the threshold and used going forward. The old model will be replaced but still show up in the report history and alerts created when it was active.","operationId":"proj_threshold_put","parameters":[{"in":"path","name":"project","description":"The slug or UUID for a project.","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}},{"in":"path","name":"threshold","description":"The UUID for a threshold.","required":true,"schema":{"$ref":"#/components/schemas/ThresholdUuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonUpdateThreshold"}}},"required":true},"responses":{"200":{"description":"successful operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonThreshold"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}},"delete":{"tags":["projects","thresholds"],"summary":"Delete a threshold","description":"Delete a threshold for a project. The user must have `delete` permissions for the project. A thresholds must be deleted before its branch, testbed, or measure can be deleted.","operationId":"proj_threshold_delete","parameters":[{"in":"path","name":"project","description":"The slug or UUID for a project.","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}},{"in":"path","name":"threshold","description":"The UUID for a threshold.","required":true,"schema":{"$ref":"#/components/schemas/ThresholdUuid"}}],"responses":{"204":{"description":"successful deletion","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}}},"/v0/server/backup":{"post":{"tags":["server"],"summary":"Backup server","description":"Backup the API server database to blob storage. The user must be an admin on the server to use this route.","operationId":"server_backup_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonBackup"}}},"required":true},"responses":{"201":{"description":"successful creation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonBackupCreated"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}}},"/v0/server/config":{"get":{"tags":["server"],"summary":"View server configuration","description":"View the API server configuration. The user must be an admin on the server to use this route.","operationId":"server_config_get","responses":{"200":{"description":"successful operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonConfig"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}},"put":{"tags":["server"],"summary":"Update server configuration","description":"Update the API server configuration. The user must be an admin on the server to use this route. Updating the configuration will cause the server to restart.","operationId":"server_config_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonUpdateConfig"}}},"required":true},"responses":{"202":{"description":"successfully enqueued operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonConfig"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}}},"/v0/server/config/console":{"get":{"tags":["server"],"summary":"View console configuration","description":"View the Bencher Console configuration managed by the API server. This is a public route and does not require authentication.","operationId":"server_config_console_get","responses":{"200":{"description":"successful operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonConsole"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}}},"/v0/server/endpoint":{"get":{"tags":["server"],"summary":"DEPRECATED: View server endpoint","operationId":"server_endpoint_get","responses":{"200":{"description":"successful operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonEndpoint"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}}},"/v0/server/restart":{"post":{"tags":["server"],"summary":"Restart server","description":"Restart the API server. The user must be an admin on the server to use this route.","operationId":"server_restart_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonRestart"}}},"required":true},"responses":{"202":{"description":"successfully enqueued operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"title":"Null","type":"string","enum":[null]}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}}},"/v0/server/spec":{"get":{"tags":["server"],"summary":"View server OpenAPI specification","description":"View the API server OpenAPI specification. The OpenAPI specification can be used to generate API client code.","operationId":"server_spec_get","responses":{"200":{"description":"successful operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonSpec"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}}},"/v0/server/stats":{"get":{"tags":["server","stats"],"summary":"View server stats","description":"➕ Bencher Plus: View the API server stats. The user must be an admin on the server to use this route.","operationId":"server_stats_get","responses":{"200":{"description":"successful operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonServerStats"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}},"post":{"tags":["server","stats"],"operationId":"server_stats_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonServerStats"}}},"required":true},"responses":{"202":{"description":"successfully enqueued operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"title":"Null","type":"string","enum":[null]}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}}},"/v0/server/version":{"get":{"tags":["server"],"summary":"View server version","description":"View the API server version. This is used to verify that the CLI and API server are compatible. It can also be used as a simple endpoint to verify that the server is running.","operationId":"server_version_get","responses":{"200":{"description":"successful operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonApiVersion"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}}},"/v0/users/{user}":{"get":{"tags":["users"],"summary":"View a user","description":"View a user. Only the authenticated user themselves and server admins have access to this endpoint. To view users within your organization, use the organization members endpoints.","operationId":"user_get","parameters":[{"in":"path","name":"user","description":"The slug or UUID for a user.","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}}],"responses":{"200":{"description":"successful operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonUser"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}},"patch":{"tags":["users"],"summary":"Update a user","description":"Update a user. Only the authenticated user themselves and server admins have access to this endpoint. Some fields can only be updated by an admin. To manage users within your organization, use the organization members endpoints.","operationId":"user_patch","parameters":[{"in":"path","name":"user","description":"The slug or UUID for a user.","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonUpdateUser"}}},"required":true},"responses":{"200":{"description":"successful operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonUser"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}}},"/v0/users/{user}/tokens":{"get":{"tags":["users","tokens"],"summary":"List tokens for a user","description":"List all API tokens for a user. Only the authenticated user themselves and server admins have access to this endpoint. By default, the tokens are sorted in alphabetical order by name.","operationId":"user_tokens_get","parameters":[{"in":"path","name":"user","description":"The slug or UUID for a user.","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}},{"in":"query","name":"direction","description":"The direction to sort by. If not specified, the default sort direction is used.","schema":{"$ref":"#/components/schemas/JsonDirection"}},{"in":"query","name":"page","description":"The page number to return. If not specified, the first page is returned.","schema":{"nullable":true,"type":"integer","format":"uint32","minimum":0}},{"in":"query","name":"per_page","description":"The number of items to return per page. If not specified, the default number of items per page (8) is used.","schema":{"nullable":true,"type":"integer","format":"uint8","minimum":0}},{"in":"query","name":"sort","description":"The field to sort by. If not specified, the default sort field is used.","schema":{"$ref":"#/components/schemas/UserTokensSort"}},{"in":"query","name":"name","description":"Filter by token name, exact match.","schema":{"$ref":"#/components/schemas/ResourceName"}},{"in":"query","name":"search","description":"Search by token name, slug, or UUID.","schema":{"$ref":"#/components/schemas/Search"}}],"responses":{"200":{"description":"successful operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonTokens"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}},"post":{"tags":["users","tokens"],"summary":"Create a token","description":"Create an API token for a user. Only the authenticated user themselves and server admins have access to this endpoint.","operationId":"user_token_post","parameters":[{"in":"path","name":"user","description":"The slug or UUID for a user.","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonNewToken"}}},"required":true},"responses":{"201":{"description":"successful creation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonToken"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}}},"/v0/users/{user}/tokens/{token}":{"get":{"tags":["users","tokens"],"summary":"View a token","description":"View an API token for a user. Only the authenticated user themselves and server admins have access to this endpoint.","operationId":"user_token_get","parameters":[{"in":"path","name":"token","description":"The UUID for a token.","required":true,"schema":{"type":"string","format":"uuid"}},{"in":"path","name":"user","description":"The slug or UUID for a user.","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}}],"responses":{"200":{"description":"successful operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonToken"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}},"patch":{"tags":["users","tokens"],"summary":"Update a token","description":"Update an API token for a user. Only the authenticated user themselves and server admins have access to this endpoint.","operationId":"user_token_patch","parameters":[{"in":"path","name":"token","description":"The UUID for a token.","required":true,"schema":{"type":"string","format":"uuid"}},{"in":"path","name":"user","description":"The slug or UUID for a user.","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonUpdateToken"}}},"required":true},"responses":{"200":{"description":"successful operation","headers":{"Access-Control-Allow-Credentials":{"style":"simple","schema":{"nullable":true,"type":"boolean"}},"Access-Control-Allow-Headers":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Methods":{"style":"simple","required":true,"schema":{"type":"string"}},"Access-Control-Allow-Origin":{"style":"simple","required":true,"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonToken"}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}}}},"components":{"schemas":{"Adapter":{"type":"string","enum":["magic","json","rust","rust_bench","rust_criterion","rust_iai","rust_iai_callgrind","cpp","cpp_google","cpp_catch2","go","go_bench","java","java_jmh","c_sharp","c_sharp_dot_net","js","js_benchmark","js_time","python","python_asv","python_pytest","ruby","ruby_benchmark","shell","shell_hyperfine"]},"AlertStatus":{"type":"string","enum":["active","dismissed"]},"AlertUuid":{"type":"string","format":"uuid"},"BenchmarkName":{"type":"string"},"BenchmarkUuid":{"type":"string","format":"uuid"},"BigInt":{"type":"integer","format":"uint64","minimum":0},"Boundary":{"type":"number","format":"double"},"BoundaryLimit":{"type":"string","enum":["lower","upper"]},"BranchName":{"type":"string"},"BranchUuid":{"type":"string","format":"uuid"},"CardBrand":{"type":"string","enum":["amex","diners","discover","jcb","mastercard","unionpay","visa","unknown"]},"DataStore":{"oneOf":[{"type":"object","properties":{"access_key_id":{"type":"string"},"access_point":{"type":"string"},"secret_access_key":{"$ref":"#/components/schemas/Secret"},"service":{"type":"string","enum":["aws_s3"]}},"required":["access_key_id","access_point","secret_access_key","service"]}]},"DateTime":{"type":"string","format":"date-time"},"Email":{"type":"string"},"Entitlements":{"type":"integer","format":"uint32","minimum":0},"Error":{"description":"Error information from a response.","type":"object","properties":{"error_code":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}},"required":["message","request_id"]},"ExpirationMonth":{"type":"integer","format":"int32"},"ExpirationYear":{"type":"integer","format":"int32"},"GitHash":{"type":"string"},"IfExists":{"type":"string","enum":["fail","truncate","append"]},"Iteration":{"type":"integer","format":"uint32","minimum":0},"JsonAccept":{"type":"object","properties":{"invite":{"$ref":"#/components/schemas/Jwt"}},"required":["invite"]},"JsonAlert":{"type":"object","properties":{"benchmark":{"$ref":"#/components/schemas/JsonBenchmarkMetric"},"created":{"$ref":"#/components/schemas/DateTime"},"iteration":{"$ref":"#/components/schemas/Iteration"},"limit":{"$ref":"#/components/schemas/BoundaryLimit"},"modified":{"$ref":"#/components/schemas/DateTime"},"report":{"$ref":"#/components/schemas/ReportUuid"},"status":{"$ref":"#/components/schemas/AlertStatus"},"threshold":{"$ref":"#/components/schemas/JsonThreshold"},"uuid":{"$ref":"#/components/schemas/AlertUuid"}},"required":["benchmark","created","iteration","limit","modified","report","status","threshold","uuid"]},"JsonAlertStats":{"type":"object","properties":{"active":{"$ref":"#/components/schemas/BigInt"}},"required":["active"]},"JsonAlerts":{"type":"array","items":{"$ref":"#/components/schemas/JsonAlert"}},"JsonAllowed":{"type":"object","properties":{"allowed":{"type":"boolean"}},"required":["allowed"]},"JsonApiVersion":{"type":"object","properties":{"version":{"type":"string"}},"required":["version"]},"JsonAuthAck":{"type":"object","properties":{"email":{"$ref":"#/components/schemas/Email"}},"required":["email"]},"JsonAuthUser":{"type":"object","properties":{"token":{"$ref":"#/components/schemas/Jwt"},"user":{"$ref":"#/components/schemas/JsonUser"}},"required":["token","user"]},"JsonAverage":{"type":"string","enum":["mean","median"]},"JsonBackup":{"type":"object","properties":{"compress":{"nullable":true,"type":"boolean"},"data_store":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/JsonDataStore"}]},"rm":{"nullable":true,"type":"boolean"}}},"JsonBackupCreated":{"type":"object","properties":{"created":{"$ref":"#/components/schemas/DateTime"}},"required":["created"]},"JsonBenchmark":{"type":"object","properties":{"created":{"$ref":"#/components/schemas/DateTime"},"modified":{"$ref":"#/components/schemas/DateTime"},"name":{"$ref":"#/components/schemas/BenchmarkName"},"project":{"$ref":"#/components/schemas/ProjectUuid"},"slug":{"$ref":"#/components/schemas/Slug"},"uuid":{"$ref":"#/components/schemas/BenchmarkUuid"}},"required":["created","modified","name","project","slug","uuid"]},"JsonBenchmarkMetric":{"type":"object","properties":{"boundary":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/JsonBoundary"}]},"created":{"$ref":"#/components/schemas/DateTime"},"metric":{"$ref":"#/components/schemas/JsonMetric"},"modified":{"$ref":"#/components/schemas/DateTime"},"name":{"$ref":"#/components/schemas/BenchmarkName"},"project":{"$ref":"#/components/schemas/ProjectUuid"},"slug":{"$ref":"#/components/schemas/Slug"},"uuid":{"$ref":"#/components/schemas/BenchmarkUuid"}},"required":["created","metric","modified","name","project","slug","uuid"]},"JsonBenchmarks":{"type":"array","items":{"$ref":"#/components/schemas/JsonBenchmark"}},"JsonBilling":{"type":"object","properties":{"products":{"$ref":"#/components/schemas/JsonProducts"},"secret_key":{"$ref":"#/components/schemas/Secret"}},"required":["products","secret_key"]},"JsonBingIndex":{"type":"object","properties":{"key":{"$ref":"#/components/schemas/NonEmpty"},"key_location":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/Url"}]}},"required":["key"]},"JsonBoundary":{"type":"object","properties":{"baseline":{"nullable":true,"type":"number","format":"double"},"lower_limit":{"nullable":true,"type":"number","format":"double"},"upper_limit":{"nullable":true,"type":"number","format":"double"}}},"JsonBranch":{"type":"object","properties":{"created":{"$ref":"#/components/schemas/DateTime"},"modified":{"$ref":"#/components/schemas/DateTime"},"name":{"$ref":"#/components/schemas/BranchName"},"project":{"$ref":"#/components/schemas/ProjectUuid"},"slug":{"$ref":"#/components/schemas/Slug"},"uuid":{"$ref":"#/components/schemas/BranchUuid"}},"required":["created","modified","name","project","slug","uuid"]},"JsonBranchVersion":{"type":"object","properties":{"created":{"$ref":"#/components/schemas/DateTime"},"modified":{"$ref":"#/components/schemas/DateTime"},"name":{"$ref":"#/components/schemas/BranchName"},"project":{"$ref":"#/components/schemas/ProjectUuid"},"slug":{"$ref":"#/components/schemas/Slug"},"uuid":{"$ref":"#/components/schemas/BranchUuid"},"version":{"$ref":"#/components/schemas/JsonVersion"}},"required":["created","modified","name","project","slug","uuid","version"]},"JsonBranches":{"type":"array","items":{"$ref":"#/components/schemas/JsonBranch"}},"JsonCardDetails":{"type":"object","properties":{"brand":{"$ref":"#/components/schemas/CardBrand"},"exp_month":{"$ref":"#/components/schemas/ExpirationMonth"},"exp_year":{"$ref":"#/components/schemas/ExpirationYear"},"last_four":{"$ref":"#/components/schemas/LastFour"}},"required":["brand","exp_month","exp_year","last_four"]},"JsonCheckout":{"type":"object","properties":{"session":{"type":"string"},"url":{"type":"string"}},"required":["session","url"]},"JsonCloud":{"type":"object","properties":{"billing":{"$ref":"#/components/schemas/JsonBilling"},"index":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/JsonIndex"}]},"license_pem":{"$ref":"#/components/schemas/Secret"},"sentry":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/Secret"}]}},"required":["billing","license_pem"]},"JsonCohort":{"type":"object","properties":{"month":{"type":"integer","format":"uint64","minimum":0},"total":{"type":"integer","format":"uint64","minimum":0},"week":{"type":"integer","format":"uint64","minimum":0}},"required":["month","total","week"]},"JsonCohortAvg":{"type":"object","properties":{"month":{"type":"number","format":"double"},"total":{"type":"number","format":"double"},"week":{"type":"number","format":"double"}},"required":["month","total","week"]},"JsonConfig":{"type":"object","properties":{"console":{"$ref":"#/components/schemas/JsonConsole"},"database":{"$ref":"#/components/schemas/JsonDatabase"},"logging":{"$ref":"#/components/schemas/JsonLogging"},"plus":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/JsonPlus"}]},"security":{"$ref":"#/components/schemas/JsonSecurity"},"server":{"$ref":"#/components/schemas/JsonServer"},"smtp":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/JsonSmtp"}]}},"required":["console","database","logging","security","server"]},"JsonConfirm":{"type":"object","properties":{"token":{"$ref":"#/components/schemas/Jwt"}},"required":["token"]},"JsonConsole":{"type":"object","properties":{"url":{"description":"The URL for the Bencher Console UI.","allOf":[{"$ref":"#/components/schemas/Url"}]}},"required":["url"]},"JsonCustomer":{"type":"object","properties":{"email":{"$ref":"#/components/schemas/Email"},"name":{"$ref":"#/components/schemas/NonEmpty"},"uuid":{"$ref":"#/components/schemas/UserUuid"}},"required":["email","name","uuid"]},"JsonDataStore":{"type":"string","enum":["aws_s3"]},"JsonDatabase":{"type":"object","properties":{"data_store":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/DataStore"}]},"file":{"type":"string"}},"required":["file"]},"JsonEndpoint":{"type":"object","properties":{"endpoint":{"$ref":"#/components/schemas/Url"}},"required":["endpoint"]},"JsonFold":{"type":"string","enum":["min","max","mean","median"]},"JsonGitHub":{"type":"object","properties":{"client_id":{"$ref":"#/components/schemas/NonEmpty"},"client_secret":{"$ref":"#/components/schemas/Secret"}},"required":["client_id","client_secret"]},"JsonGoogleIndex":{"type":"object","properties":{"client_email":{"$ref":"#/components/schemas/NonEmpty"},"private_key":{"$ref":"#/components/schemas/Secret"},"token_uri":{"$ref":"#/components/schemas/NonEmpty"}},"required":["client_email","private_key","token_uri"]},"JsonIndex":{"type":"object","properties":{"bing":{"$ref":"#/components/schemas/JsonBingIndex"},"google":{"$ref":"#/components/schemas/JsonGoogleIndex"}},"required":["bing","google"]},"JsonLicense":{"type":"object","properties":{"entitlements":{"$ref":"#/components/schemas/Entitlements"},"expiration":{"$ref":"#/components/schemas/DateTime"},"issued_at":{"$ref":"#/components/schemas/DateTime"},"key":{"$ref":"#/components/schemas/Jwt"},"level":{"$ref":"#/components/schemas/PlanLevel"},"organization":{"$ref":"#/components/schemas/OrganizationUuid"},"self_hosted":{"type":"boolean"}},"required":["entitlements","expiration","issued_at","key","level","organization","self_hosted"]},"JsonLitestream":{"type":"object","properties":{"replicas":{"type":"array","items":{"$ref":"#/components/schemas/JsonReplica"}}},"required":["replicas"]},"JsonLogging":{"type":"object","properties":{"log":{"$ref":"#/components/schemas/ServerLog"},"name":{"type":"string"}},"required":["log","name"]},"JsonLogin":{"type":"object","properties":{"email":{"$ref":"#/components/schemas/Email"},"invite":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/Jwt"}]},"plan":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/PlanLevel"}]}},"required":["email"]},"JsonMeasure":{"type":"object","properties":{"created":{"$ref":"#/components/schemas/DateTime"},"modified":{"$ref":"#/components/schemas/DateTime"},"name":{"$ref":"#/components/schemas/ResourceName"},"project":{"$ref":"#/components/schemas/ProjectUuid"},"slug":{"$ref":"#/components/schemas/Slug"},"units":{"$ref":"#/components/schemas/ResourceName"},"uuid":{"$ref":"#/components/schemas/MeasureUuid"}},"required":["created","modified","name","project","slug","units","uuid"]},"JsonMeasures":{"type":"array","items":{"$ref":"#/components/schemas/JsonMeasure"}},"JsonMember":{"type":"object","properties":{"created":{"description":"The date time the member was created.","allOf":[{"$ref":"#/components/schemas/DateTime"}]},"email":{"description":"The member email.","allOf":[{"$ref":"#/components/schemas/Email"}]},"modified":{"description":"The date time the member was last modified.","allOf":[{"$ref":"#/components/schemas/DateTime"}]},"name":{"description":"The member user name.","allOf":[{"$ref":"#/components/schemas/UserName"}]},"role":{"description":"The member organization role.","allOf":[{"$ref":"#/components/schemas/OrganizationRole"}]},"slug":{"description":"The member slug.","allOf":[{"$ref":"#/components/schemas/Slug"}]},"uuid":{"description":"The member UUID.","allOf":[{"$ref":"#/components/schemas/UserUuid"}]}},"required":["created","email","modified","name","role","slug","uuid"]},"JsonMembers":{"type":"array","items":{"$ref":"#/components/schemas/JsonMember"}},"JsonMetric":{"type":"object","properties":{"lower_value":{"nullable":true,"type":"number","format":"double"},"upper_value":{"nullable":true,"type":"number","format":"double"},"value":{"type":"number","format":"double"}},"required":["value"]},"JsonModel":{"type":"object","properties":{"created":{"$ref":"#/components/schemas/DateTime"},"lower_boundary":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/Boundary"}]},"max_sample_size":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/SampleSize"}]},"min_sample_size":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/SampleSize"}]},"replaced":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/DateTime"}]},"test":{"$ref":"#/components/schemas/ModelTest"},"threshold":{"$ref":"#/components/schemas/ThresholdUuid"},"upper_boundary":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/Boundary"}]},"uuid":{"$ref":"#/components/schemas/ModelUuid"},"window":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/Window"}]}},"required":["created","test","threshold","uuid"]},"JsonNewBenchmark":{"type":"object","properties":{"name":{"description":"The name of the benchmark. Maximum length is 1,024 characters.","allOf":[{"$ref":"#/components/schemas/BenchmarkName"}]},"slug":{"nullable":true,"description":"The preferred slug for the benchmark. If not provided, the slug will be generated from the name. If the provided or generated slug is already in use, a unique slug will be generated. Maximum length is 64 characters.","allOf":[{"$ref":"#/components/schemas/Slug"}]}},"required":["name"]},"JsonNewBranch":{"type":"object","properties":{"name":{"description":"The name of the branch. Maximum length is 256 characters.","allOf":[{"$ref":"#/components/schemas/BranchName"}]},"slug":{"nullable":true,"description":"The preferred slug for the branch. If not provided, the slug will be generated from the name. If the provided or generated slug is already in use, a unique slug will be generated. Maximum length is 64 characters.","allOf":[{"$ref":"#/components/schemas/Slug"}]},"soft":{"nullable":true,"description":"If set to `true` and a branch with the same name already exits, the existing branch will be returned without an error. This is useful in cases where there may be a race condition to create a new branch, such as multiple jobs in a CI/CD pipeline.","type":"boolean"},"start_point":{"nullable":true,"description":"The start point for the new branch. All branch versions from the start point branch will be shallow copied over to the new branch. That is, all historical metrics data for the start point branch will appear in queries for the new branch. For example, pull request branches often use their target branch as their start point branch. After the new branch is created, it is not kept in sync with the start point branch. If not provided, the new branch will have no historical data.","allOf":[{"$ref":"#/components/schemas/JsonStartPoint"}]}},"required":["name"]},"JsonNewCheckout":{"type":"object","properties":{"entitlements":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/Entitlements"}]},"level":{"$ref":"#/components/schemas/PlanLevel"},"organization":{"$ref":"#/components/schemas/ResourceId"},"self_hosted":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/OrganizationUuid"}]}},"required":["level","organization"]},"JsonNewMeasure":{"type":"object","properties":{"name":{"description":"The name of the measure. Maximum length is 64 characters.","allOf":[{"$ref":"#/components/schemas/ResourceName"}]},"slug":{"nullable":true,"description":"The preferred slug for the measure. If not provided, the slug will be generated from the name. If the provided or generated slug is already in use, a unique slug will be generated. Maximum length is 64 characters.","allOf":[{"$ref":"#/components/schemas/Slug"}]},"units":{"description":"The units of measure. Maximum length is 64 characters.","allOf":[{"$ref":"#/components/schemas/ResourceName"}]}},"required":["name","units"]},"JsonNewMember":{"type":"object","properties":{"email":{"description":"The email for the invitee. This will be used to both send the invite and to create the user account if they do not exist.","allOf":[{"$ref":"#/components/schemas/Email"}]},"name":{"nullable":true,"description":"The user name for the invitee.","allOf":[{"$ref":"#/components/schemas/UserName"}]},"role":{"description":"The organization role for the invitee.","allOf":[{"$ref":"#/components/schemas/OrganizationRole"}]}},"required":["email","role"]},"JsonNewOrganization":{"type":"object","properties":{"name":{"description":"The name of the organization. Maximum length is 64 characters.","allOf":[{"$ref":"#/components/schemas/ResourceName"}]},"slug":{"nullable":true,"description":"The preferred slug for the organization. If not provided, the slug will be generated from the name. If the provided or generated slug is already in use, a unique slug will be generated. Maximum length is 64 characters.","allOf":[{"$ref":"#/components/schemas/Slug"}]}},"required":["name"]},"JsonNewPlan":{"type":"object","properties":{"checkout":{"$ref":"#/components/schemas/NonEmpty"},"entitlements":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/Entitlements"}]},"level":{"$ref":"#/components/schemas/PlanLevel"},"remote":{"nullable":true,"type":"boolean"},"self_hosted":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/OrganizationUuid"}]}},"required":["checkout","level"]},"JsonNewProject":{"type":"object","properties":{"name":{"description":"The name of the project. Maximum length is 64 characters.","allOf":[{"$ref":"#/components/schemas/ResourceName"}]},"slug":{"nullable":true,"description":"The preferred slug for the project. If not provided, the slug will be generated from the name. If the provided or generated slug is already in use, a unique slug will be generated. Maximum length is 64 characters.","allOf":[{"$ref":"#/components/schemas/Slug"}]},"url":{"nullable":true,"description":"The URL for the project. If the project is public, the URL will be accessible listed on its Perf Page.","allOf":[{"$ref":"#/components/schemas/Url"}]},"visibility":{"nullable":true,"description":"➕ Bencher Plus: Set the visibility of the project. Creating a `private` project requires a valid Bencher Plus subscription.","allOf":[{"$ref":"#/components/schemas/Visibility"}]}},"required":["name"]},"JsonNewReport":{"type":"object","properties":{"branch":{"description":"Branch UUID, slug, or name.","allOf":[{"$ref":"#/components/schemas/NameId"}]},"end_time":{"description":"End time for the report. Must be an ISO 8601 formatted string.","allOf":[{"$ref":"#/components/schemas/DateTime"}]},"hash":{"nullable":true,"description":"Full Git commit hash. All reports with the same Git commit hash will be considered part of the same branch version. This can be useful for tracking the performance of a specific commit across multiple testbeds.","allOf":[{"$ref":"#/components/schemas/GitHash"}]},"results":{"description":"An array of benchmarks results.","type":"array","items":{"type":"string"}},"settings":{"nullable":true,"description":"Settings for how to handle the report.","allOf":[{"$ref":"#/components/schemas/JsonReportSettings"}]},"start_time":{"description":"Start time for the report. Must be an ISO 8601 formatted string.","allOf":[{"$ref":"#/components/schemas/DateTime"}]},"testbed":{"description":"Testbed UUID, slug, or name.","allOf":[{"$ref":"#/components/schemas/NameId"}]}},"required":["branch","end_time","results","start_time","testbed"]},"JsonNewTestbed":{"type":"object","properties":{"name":{"description":"The name of the testbed. Maximum length is 64 characters.","allOf":[{"$ref":"#/components/schemas/ResourceName"}]},"slug":{"nullable":true,"description":"The preferred slug for the testbed. If not provided, the slug will be generated from the name. If the provided or generated slug is already in use, a unique slug will be generated. Maximum length is 64 characters.","allOf":[{"$ref":"#/components/schemas/Slug"}]},"soft":{"nullable":true,"description":"If set to `true` and a testbed with the same name already exits, the existing testbed will be returned without an error. This is useful in cases where there may be a race condition to create a new testbed, such as multiple jobs in a CI/CD pipeline.","type":"boolean"}},"required":["name"]},"JsonNewThreshold":{"type":"object","properties":{"branch":{"description":"The UUID, slug, or name of the threshold branch.","allOf":[{"$ref":"#/components/schemas/NameId"}]},"lower_boundary":{"nullable":true,"description":"The lower boundary used to calculate the lower boundary limit. The requirements for this field depend on which `test` is selected.","allOf":[{"$ref":"#/components/schemas/Boundary"}]},"max_sample_size":{"nullable":true,"description":"The maximum number of samples used to perform the test. Only the most recent samples will be used if there are more.","allOf":[{"$ref":"#/components/schemas/SampleSize"}]},"measure":{"description":"The UUID, slug, or name of the threshold measure.","allOf":[{"$ref":"#/components/schemas/NameId"}]},"min_sample_size":{"nullable":true,"description":"The minimum number of samples required to perform the test. If there are fewer samples, the test will not be performed.","allOf":[{"$ref":"#/components/schemas/SampleSize"}]},"test":{"description":"The test used by the threshold model to calculate the baseline and boundary limits.","allOf":[{"$ref":"#/components/schemas/ModelTest"}]},"testbed":{"description":"The UUID, slug, or name of the threshold testbed.","allOf":[{"$ref":"#/components/schemas/NameId"}]},"upper_boundary":{"nullable":true,"description":"The upper boundary used to calculate the upper boundary limit. The requirements for this field depend on which `test` is selected.","allOf":[{"$ref":"#/components/schemas/Boundary"}]},"window":{"nullable":true,"description":"The window of time for samples used to perform the test, in seconds. Samples outside of this window will be omitted.","allOf":[{"$ref":"#/components/schemas/Window"}]}},"required":["branch","measure","test","testbed"]},"JsonNewToken":{"type":"object","properties":{"name":{"description":"The name of the token. Maximum length is 64 characters.","allOf":[{"$ref":"#/components/schemas/ResourceName"}]},"ttl":{"nullable":true,"description":"The time-to-live (TTL) for the token in seconds. If not provided, the token will not expire for over 128 years.","type":"integer","format":"uint32","minimum":0}},"required":["name"]},"JsonOAuth":{"type":"object","properties":{"code":{"$ref":"#/components/schemas/Secret"},"invite":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/Jwt"}]},"plan":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/PlanLevel"}]}},"required":["code"]},"JsonOrganization":{"type":"object","properties":{"created":{"$ref":"#/components/schemas/DateTime"},"license":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/Jwt"}]},"modified":{"$ref":"#/components/schemas/DateTime"},"name":{"$ref":"#/components/schemas/ResourceName"},"slug":{"$ref":"#/components/schemas/Slug"},"uuid":{"$ref":"#/components/schemas/OrganizationUuid"}},"required":["created","modified","name","slug","uuid"]},"JsonOrganizationPatch":{"type":"object","properties":{"license":{"nullable":true,"description":"➕ Bencher Plus: The new license for the organization. Set to `null` to remove the current license.","allOf":[{"$ref":"#/components/schemas/Jwt"}]},"name":{"nullable":true,"description":"The new name of the organization. Maximum length is 64 characters.","allOf":[{"$ref":"#/components/schemas/ResourceName"}]},"slug":{"nullable":true,"description":"The preferred new slug for the organization. Maximum length is 64 characters.","allOf":[{"$ref":"#/components/schemas/Slug"}]}}},"JsonOrganizationPatchNull":{"type":"object","properties":{"license":{"type":"string","enum":[null]},"name":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/ResourceName"}]},"slug":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/Slug"}]}},"required":["license"]},"JsonOrganizations":{"type":"array","items":{"$ref":"#/components/schemas/JsonOrganization"}},"JsonPerf":{"type":"object","properties":{"end_time":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/DateTime"}]},"project":{"$ref":"#/components/schemas/JsonProject"},"results":{"type":"array","items":{"$ref":"#/components/schemas/JsonPerfMetrics"}},"start_time":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/DateTime"}]}},"required":["project","results"]},"JsonPerfAlert":{"type":"object","properties":{"limit":{"$ref":"#/components/schemas/BoundaryLimit"},"modified":{"$ref":"#/components/schemas/DateTime"},"status":{"$ref":"#/components/schemas/AlertStatus"},"uuid":{"$ref":"#/components/schemas/AlertUuid"}},"required":["limit","modified","status","uuid"]},"JsonPerfMetric":{"type":"object","properties":{"alert":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/JsonPerfAlert"}]},"boundary":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/JsonBoundary"}]},"end_time":{"$ref":"#/components/schemas/DateTime"},"iteration":{"$ref":"#/components/schemas/Iteration"},"metric":{"$ref":"#/components/schemas/JsonMetric"},"report":{"$ref":"#/components/schemas/ReportUuid"},"start_time":{"$ref":"#/components/schemas/DateTime"},"threshold":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/JsonThresholdModel"}]},"version":{"$ref":"#/components/schemas/JsonVersion"}},"required":["end_time","iteration","metric","report","start_time","version"]},"JsonPerfMetrics":{"type":"object","properties":{"benchmark":{"$ref":"#/components/schemas/JsonBenchmark"},"branch":{"$ref":"#/components/schemas/JsonBranch"},"measure":{"$ref":"#/components/schemas/JsonMeasure"},"metrics":{"type":"array","items":{"$ref":"#/components/schemas/JsonPerfMetric"}},"testbed":{"$ref":"#/components/schemas/JsonTestbed"}},"required":["benchmark","branch","measure","metrics","testbed"]},"JsonPlan":{"type":"object","properties":{"card":{"$ref":"#/components/schemas/JsonCardDetails"},"current_period_end":{"$ref":"#/components/schemas/DateTime"},"current_period_start":{"$ref":"#/components/schemas/DateTime"},"customer":{"$ref":"#/components/schemas/JsonCustomer"},"level":{"$ref":"#/components/schemas/PlanLevel"},"license":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/JsonLicense"}]},"organization":{"$ref":"#/components/schemas/OrganizationUuid"},"status":{"$ref":"#/components/schemas/PlanStatus"},"unit_amount":{"$ref":"#/components/schemas/BigInt"}},"required":["card","current_period_end","current_period_start","customer","level","organization","status","unit_amount"]},"JsonPlus":{"type":"object","properties":{"cloud":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/JsonCloud"}]},"github":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/JsonGitHub"}]},"litestream":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/JsonLitestream"}]},"stats":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/JsonStats"}]}}},"JsonProduct":{"type":"object","properties":{"id":{"type":"string"},"licensed":{"type":"object","additionalProperties":{"type":"string"}},"metered":{"type":"object","additionalProperties":{"type":"string"}}},"required":["id","licensed","metered"]},"JsonProducts":{"type":"object","properties":{"enterprise":{"$ref":"#/components/schemas/JsonProduct"},"team":{"$ref":"#/components/schemas/JsonProduct"}},"required":["enterprise","team"]},"JsonProject":{"type":"object","properties":{"created":{"$ref":"#/components/schemas/DateTime"},"modified":{"$ref":"#/components/schemas/DateTime"},"name":{"$ref":"#/components/schemas/ResourceName"},"organization":{"$ref":"#/components/schemas/OrganizationUuid"},"slug":{"$ref":"#/components/schemas/Slug"},"url":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/Url"}]},"uuid":{"$ref":"#/components/schemas/ProjectUuid"},"visibility":{"$ref":"#/components/schemas/Visibility"}},"required":["created","modified","name","organization","slug","uuid","visibility"]},"JsonProjectPatch":{"type":"object","properties":{"name":{"nullable":true,"description":"The new name of the project. Maximum length is 64 characters.","allOf":[{"$ref":"#/components/schemas/ResourceName"}]},"slug":{"nullable":true,"description":"The preferred new slug for the project. Maximum length is 64 characters.","allOf":[{"$ref":"#/components/schemas/Slug"}]},"url":{"nullable":true,"description":"The new URL of the project. Set to `null` to remove the current URL.","allOf":[{"$ref":"#/components/schemas/Url"}]},"visibility":{"nullable":true,"description":"➕ Bencher Plus: Set the new visibility of the project. Moving to a `private` project requires a valid Bencher Plus subscription.","allOf":[{"$ref":"#/components/schemas/Visibility"}]}}},"JsonProjectPatchNull":{"type":"object","properties":{"name":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/ResourceName"}]},"slug":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/Slug"}]},"url":{"type":"string","enum":[null]},"visibility":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/Visibility"}]}},"required":["url"]},"JsonProjects":{"type":"array","items":{"$ref":"#/components/schemas/JsonProject"}},"JsonReplica":{"oneOf":[{"type":"object","properties":{"path":{"type":"string"},"scheme":{"type":"string","enum":["file"]}},"required":["path","scheme"]},{"type":"object","properties":{"host":{"type":"string"},"key_path":{"nullable":true,"type":"string"},"password":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/Secret"}]},"path":{"nullable":true,"type":"string"},"port":{"type":"integer","format":"uint16","minimum":0},"scheme":{"type":"string","enum":["sftp"]},"user":{"type":"string"}},"required":["host","port","scheme","user"]},{"type":"object","properties":{"access_key_id":{"type":"string"},"bucket":{"type":"string"},"endpoint":{"nullable":true,"type":"string"},"path":{"nullable":true,"type":"string"},"region":{"nullable":true,"type":"string"},"scheme":{"type":"string","enum":["s3"]},"secret_access_key":{"$ref":"#/components/schemas/Secret"}},"required":["access_key_id","bucket","scheme","secret_access_key"]},{"type":"object","properties":{"account_key":{"$ref":"#/components/schemas/Secret"},"account_name":{"type":"string"},"bucket":{"type":"string"},"path":{"type":"string"},"scheme":{"type":"string","enum":["abs"]}},"required":["account_key","account_name","bucket","path","scheme"]},{"type":"object","properties":{"bucket":{"type":"string"},"path":{"nullable":true,"type":"string"},"scheme":{"type":"string","enum":["gcs"]}},"required":["bucket","scheme"]}]},"JsonReport":{"type":"object","properties":{"adapter":{"$ref":"#/components/schemas/Adapter"},"alerts":{"type":"array","items":{"$ref":"#/components/schemas/JsonAlert"}},"branch":{"$ref":"#/components/schemas/JsonBranchVersion"},"created":{"$ref":"#/components/schemas/DateTime"},"end_time":{"$ref":"#/components/schemas/DateTime"},"project":{"$ref":"#/components/schemas/JsonProject"},"results":{"type":"array","items":{"type":"array","items":{"$ref":"#/components/schemas/JsonReportResult"}}},"start_time":{"$ref":"#/components/schemas/DateTime"},"testbed":{"$ref":"#/components/schemas/JsonTestbed"},"user":{"$ref":"#/components/schemas/JsonUser"},"uuid":{"$ref":"#/components/schemas/ReportUuid"}},"required":["adapter","alerts","branch","created","end_time","project","results","start_time","testbed","user","uuid"]},"JsonReportResult":{"type":"object","properties":{"benchmarks":{"type":"array","items":{"$ref":"#/components/schemas/JsonBenchmarkMetric"}},"iteration":{"$ref":"#/components/schemas/Iteration"},"measure":{"$ref":"#/components/schemas/JsonMeasure"},"threshold":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/JsonThresholdModel"}]}},"required":["benchmarks","iteration","measure"]},"JsonReportSettings":{"type":"object","properties":{"adapter":{"nullable":true,"description":"The benchmark harness adapter for parsing the benchmark results. If no adapter is specified, then the Magic adapter will be used.","allOf":[{"$ref":"#/components/schemas/Adapter"}]},"average":{"nullable":true,"description":"Benchmark harness suggested central tendency (ie average). Some benchmarking harnesses provide multiple averages, such as mean and median.","allOf":[{"$ref":"#/components/schemas/JsonAverage"}]},"fold":{"nullable":true,"description":"Fold multiple results into a single result using the selected operation. This can be useful for taking the min, max, mean, or median of the benchmark results.","allOf":[{"$ref":"#/components/schemas/JsonFold"}]}}},"JsonReports":{"type":"array","items":{"$ref":"#/components/schemas/JsonReport"}},"JsonRestart":{"type":"object","properties":{"delay":{"nullable":true,"description":"The delay in seconds before the server restarts. Defaults to 3 seconds, if not specified.","type":"integer","format":"uint64","minimum":0}}},"JsonSecurity":{"type":"object","properties":{"issuer":{"nullable":true,"type":"string"},"secret_key":{"$ref":"#/components/schemas/Secret"}},"required":["secret_key"]},"JsonServer":{"type":"object","properties":{"bind_address":{"type":"string"},"request_body_max_bytes":{"type":"integer","format":"uint","minimum":0},"tls":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/JsonTls"}]}},"required":["bind_address","request_body_max_bytes"]},"JsonServer2":{"type":"object","properties":{"created":{"$ref":"#/components/schemas/DateTime"},"uuid":{"$ref":"#/components/schemas/ServerUuid"}},"required":["created","uuid"]},"JsonServerStats":{"type":"object","properties":{"active_projects":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/JsonCohort"}]},"metrics":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/JsonCohort"}]},"metrics_per_report":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/JsonCohortAvg"}]},"organizations":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/JsonOrganizations"}]},"projects":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/JsonCohort"}]},"reports":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/JsonCohort"}]},"reports_per_project":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/JsonCohortAvg"}]},"server":{"$ref":"#/components/schemas/JsonServer2"},"timestamp":{"$ref":"#/components/schemas/DateTime"},"top_projects":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/JsonTopCohort"}]},"users":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/JsonCohort"}]}},"required":["server","timestamp"]},"JsonSignup":{"type":"object","properties":{"email":{"$ref":"#/components/schemas/Email"},"i_agree":{"description":"I agree to the Bencher Terms of Use (https://bencher.dev/legal/terms-of-use), Privacy Policy (https://bencher.dev/legal/privacy), and License Agreement (https://bencher.dev/legal/license)","type":"boolean"},"invite":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/Jwt"}]},"name":{"$ref":"#/components/schemas/UserName"},"plan":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/PlanLevel"}]},"slug":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/Slug"}]}},"required":["email","i_agree","name"]},"JsonSmtp":{"type":"object","properties":{"from_email":{"$ref":"#/components/schemas/Email"},"from_name":{"$ref":"#/components/schemas/ResourceName"},"hostname":{"$ref":"#/components/schemas/ResourceName"},"port":{"nullable":true,"type":"integer","format":"uint16","minimum":0},"secret":{"$ref":"#/components/schemas/Secret"},"starttls":{"nullable":true,"type":"boolean"},"username":{"$ref":"#/components/schemas/ResourceName"}},"required":["from_email","from_name","hostname","secret","username"]},"JsonSpec":{},"JsonStartPoint":{"type":"object","properties":{"branch":{"description":"The UUID, slug, or name of the branch to use as the start point.","allOf":[{"$ref":"#/components/schemas/NameId"}]},"thresholds":{"nullable":true,"description":"If set to `true`, the thresholds from the start point branch will be deep copied to the new branch. This can be useful for pull request branches that should have the same thresholds as their target branch.","type":"boolean"}},"required":["branch"]},"JsonStats":{"type":"object","properties":{"enabled":{"nullable":true,"type":"boolean"},"offset":{"nullable":true,"type":"integer","format":"uint32","minimum":0}}},"JsonTestbed":{"type":"object","properties":{"created":{"$ref":"#/components/schemas/DateTime"},"modified":{"$ref":"#/components/schemas/DateTime"},"name":{"$ref":"#/components/schemas/ResourceName"},"project":{"$ref":"#/components/schemas/ProjectUuid"},"slug":{"$ref":"#/components/schemas/Slug"},"uuid":{"$ref":"#/components/schemas/TestbedUuid"}},"required":["created","modified","name","project","slug","uuid"]},"JsonTestbeds":{"type":"array","items":{"$ref":"#/components/schemas/JsonTestbed"}},"JsonThreshold":{"type":"object","properties":{"branch":{"$ref":"#/components/schemas/JsonBranch"},"created":{"$ref":"#/components/schemas/DateTime"},"measure":{"$ref":"#/components/schemas/JsonMeasure"},"model":{"$ref":"#/components/schemas/JsonModel"},"modified":{"$ref":"#/components/schemas/DateTime"},"project":{"$ref":"#/components/schemas/ProjectUuid"},"statistic":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/JsonModel"}]},"testbed":{"$ref":"#/components/schemas/JsonTestbed"},"uuid":{"$ref":"#/components/schemas/ThresholdUuid"}},"required":["branch","created","measure","model","modified","project","testbed","uuid"]},"JsonThresholdModel":{"type":"object","properties":{"created":{"$ref":"#/components/schemas/DateTime"},"model":{"$ref":"#/components/schemas/JsonModel"},"project":{"$ref":"#/components/schemas/ProjectUuid"},"statistic":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/JsonModel"}]},"uuid":{"$ref":"#/components/schemas/ThresholdUuid"}},"required":["created","model","project","uuid"]},"JsonThresholds":{"type":"array","items":{"$ref":"#/components/schemas/JsonThreshold"}},"JsonTls":{"oneOf":[{"type":"object","properties":{"cert_file":{"type":"string"},"key_file":{"type":"string"},"type":{"type":"string","enum":["as_file"]}},"required":["cert_file","key_file","type"]},{"type":"object","properties":{"certs":{"type":"array","items":{"type":"integer","format":"uint8","minimum":0}},"key":{"type":"array","items":{"type":"integer","format":"uint8","minimum":0}},"type":{"type":"string","enum":["as_bytes"]}},"required":["certs","key","type"]}]},"JsonToken":{"type":"object","properties":{"creation":{"$ref":"#/components/schemas/DateTime"},"expiration":{"$ref":"#/components/schemas/DateTime"},"name":{"$ref":"#/components/schemas/ResourceName"},"token":{"$ref":"#/components/schemas/Jwt"},"user":{"$ref":"#/components/schemas/UserUuid"},"uuid":{"$ref":"#/components/schemas/TokenUuid"}},"required":["creation","expiration","name","token","user","uuid"]},"JsonTokens":{"type":"array","items":{"$ref":"#/components/schemas/JsonToken"}},"JsonTopCohort":{"type":"object","properties":{"month":{"type":"array","items":{"$ref":"#/components/schemas/JsonTopProject"}},"total":{"type":"array","items":{"$ref":"#/components/schemas/JsonTopProject"}},"week":{"type":"array","items":{"$ref":"#/components/schemas/JsonTopProject"}}},"required":["month","total","week"]},"JsonTopProject":{"type":"object","properties":{"metrics":{"type":"integer","format":"uint64","minimum":0},"name":{"$ref":"#/components/schemas/ResourceName"},"percentage":{"type":"number","format":"double"},"uuid":{"$ref":"#/components/schemas/ProjectUuid"}},"required":["metrics","name","percentage","uuid"]},"JsonUpdateAlert":{"type":"object","properties":{"status":{"nullable":true,"description":"The new status of the alert.","allOf":[{"$ref":"#/components/schemas/AlertStatus"}]}}},"JsonUpdateBenchmark":{"type":"object","properties":{"name":{"nullable":true,"description":"The new name of the benchmark. Maximum length is 1,024 characters.","allOf":[{"$ref":"#/components/schemas/BenchmarkName"}]},"slug":{"nullable":true,"description":"The preferred new slug for the benchmark. Maximum length is 64 characters.","allOf":[{"$ref":"#/components/schemas/Slug"}]}}},"JsonUpdateBranch":{"type":"object","properties":{"name":{"nullable":true,"description":"The new name of the branch. Maximum length is 256 characters.","allOf":[{"$ref":"#/components/schemas/BranchName"}]},"slug":{"nullable":true,"description":"The preferred new slug for the branch. Maximum length is 64 characters.","allOf":[{"$ref":"#/components/schemas/Slug"}]}}},"JsonUpdateConfig":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/JsonConfig"},"delay":{"nullable":true,"type":"integer","format":"uint64","minimum":0}},"required":["config"]},"JsonUpdateMeasure":{"type":"object","properties":{"name":{"nullable":true,"description":"The new name of the measure. Maximum length is 64 characters.","allOf":[{"$ref":"#/components/schemas/ResourceName"}]},"slug":{"nullable":true,"description":"The preferred new slug for the measure. Maximum length is 64 characters.","allOf":[{"$ref":"#/components/schemas/Slug"}]},"units":{"nullable":true,"description":"The new units of measure. Maximum length is 64 characters.","allOf":[{"$ref":"#/components/schemas/ResourceName"}]}}},"JsonUpdateMember":{"type":"object","properties":{"role":{"nullable":true,"description":"The new organization role for the member.","allOf":[{"$ref":"#/components/schemas/OrganizationRole"}]}}},"JsonUpdateOrganization":{"anyOf":[{"$ref":"#/components/schemas/JsonOrganizationPatch"},{"$ref":"#/components/schemas/JsonOrganizationPatchNull"}]},"JsonUpdateProject":{"anyOf":[{"$ref":"#/components/schemas/JsonProjectPatch"},{"$ref":"#/components/schemas/JsonProjectPatchNull"}]},"JsonUpdateTestbed":{"type":"object","properties":{"name":{"nullable":true,"description":"The new name of the testbed. Maximum length is 64 characters.","allOf":[{"$ref":"#/components/schemas/ResourceName"}]},"slug":{"nullable":true,"description":"The preferred new slug for the testbed. Maximum length is 64 characters.","allOf":[{"$ref":"#/components/schemas/Slug"}]}}},"JsonUpdateThreshold":{"type":"object","properties":{"lower_boundary":{"nullable":true,"description":"The lower boundary used to calculate the lower boundary limit. The requirements for this field depend on which `test` is selected.","allOf":[{"$ref":"#/components/schemas/Boundary"}]},"max_sample_size":{"nullable":true,"description":"The maximum number of samples used to perform the test. Only the most recent samples will be used if there are more.","allOf":[{"$ref":"#/components/schemas/SampleSize"}]},"min_sample_size":{"nullable":true,"description":"The minimum number of samples required to perform the test. If there are fewer samples, the test will not be performed.","allOf":[{"$ref":"#/components/schemas/SampleSize"}]},"test":{"description":"The test used by the threshold model to calculate the baseline and boundary limits.","allOf":[{"$ref":"#/components/schemas/ModelTest"}]},"upper_boundary":{"nullable":true,"description":"The upper boundary used to calculate the upper boundary limit. The requirements for this field depend on which `test` is selected.","allOf":[{"$ref":"#/components/schemas/Boundary"}]},"window":{"nullable":true,"description":"The window of time for samples used to perform the test, in seconds. Samples outside of this window will be omitted.","allOf":[{"$ref":"#/components/schemas/Window"}]}},"required":["test"]},"JsonUpdateToken":{"type":"object","properties":{"name":{"nullable":true,"description":"The new name of the token. Maximum length is 64 characters.","allOf":[{"$ref":"#/components/schemas/ResourceName"}]}}},"JsonUpdateUser":{"type":"object","properties":{"admin":{"nullable":true,"description":"Update whether the user is an admin. Must be an admin to update this field.","type":"boolean"},"email":{"nullable":true,"description":"The new email for the user.","allOf":[{"$ref":"#/components/schemas/Email"}]},"locked":{"nullable":true,"description":"Update whether the user is locked. Must be an admin to update this field.","type":"boolean"},"name":{"nullable":true,"description":"The new name of the user. Maximum length is 64 characters. May only contain alphanumeric characters, non-leading or trailing spaces, and the following characters: , . - \'","allOf":[{"$ref":"#/components/schemas/UserName"}]},"slug":{"nullable":true,"description":"The preferred new slug for the user. Maximum length is 64 characters.","allOf":[{"$ref":"#/components/schemas/Slug"}]}}},"JsonUsage":{"type":"object","properties":{"end_time":{"description":"The end time of the usage.","allOf":[{"$ref":"#/components/schemas/DateTime"}]},"kind":{"description":"The kind of usage.","allOf":[{"$ref":"#/components/schemas/UsageKind"}]},"license":{"nullable":true,"description":"The organization license.","allOf":[{"$ref":"#/components/schemas/JsonLicense"}]},"organization":{"description":"The organization UUID.","allOf":[{"$ref":"#/components/schemas/OrganizationUuid"}]},"plan":{"nullable":true,"description":"The organization plan.","allOf":[{"$ref":"#/components/schemas/JsonPlan"}]},"start_time":{"description":"The start time of the usage.","allOf":[{"$ref":"#/components/schemas/DateTime"}]},"usage":{"nullable":true,"description":"The metrics usage amount.","type":"integer","format":"uint32","minimum":0}},"required":["end_time","kind","organization","start_time"]},"JsonUser":{"type":"object","properties":{"admin":{"type":"boolean"},"email":{"$ref":"#/components/schemas/Email"},"locked":{"type":"boolean"},"name":{"$ref":"#/components/schemas/UserName"},"slug":{"$ref":"#/components/schemas/Slug"},"uuid":{"$ref":"#/components/schemas/UserUuid"}},"required":["admin","email","locked","name","slug","uuid"]},"JsonVersion":{"type":"object","properties":{"hash":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/GitHash"}]},"number":{"$ref":"#/components/schemas/VersionNumber"}},"required":["number"]},"Jwt":{"type":"string"},"LastFour":{"type":"string"},"LogLevel":{"type":"string","enum":["trace","debug","info","warn","error","critical"]},"MeasureUuid":{"type":"string","format":"uuid"},"ModelTest":{"type":"string","enum":["static","percentage","z_score","t_test","log_normal","iqr","delta_iqr"]},"ModelUuid":{"type":"string","format":"uuid"},"NameId":{"type":"string"},"NonEmpty":{"type":"string"},"OrganizationRole":{"oneOf":[{"description":"The organization leader role.","type":"string","enum":["leader"]}]},"OrganizationUuid":{"type":"string","format":"uuid"},"PlanLevel":{"type":"string","enum":["free","team","enterprise"]},"PlanStatus":{"type":"string","enum":["active","canceled","incomplete","incomplete_expired","past_due","paused","trialing","unpaid"]},"ProjectUuid":{"type":"string","format":"uuid"},"ReportUuid":{"type":"string","format":"uuid"},"ResourceId":{"type":"string"},"ResourceName":{"type":"string"},"SampleSize":{"type":"integer","format":"uint32","minimum":0},"Secret":{"type":"string"},"ServerLog":{"oneOf":[{"type":"object","properties":{"stderr_terminal":{"type":"object","properties":{"level":{"$ref":"#/components/schemas/LogLevel"}},"required":["level"]}},"required":["stderr_terminal"],"additionalProperties":false},{"type":"object","properties":{"file":{"type":"object","properties":{"if_exists":{"$ref":"#/components/schemas/IfExists"},"level":{"$ref":"#/components/schemas/LogLevel"},"path":{"type":"string"}},"required":["if_exists","level","path"]}},"required":["file"],"additionalProperties":false}]},"ServerUuid":{"type":"string","format":"uuid"},"Slug":{"type":"string"},"TestbedUuid":{"type":"string","format":"uuid"},"ThresholdUuid":{"type":"string","format":"uuid"},"TokenUuid":{"type":"string","format":"uuid"},"Url":{"type":"string"},"UsageKind":{"oneOf":[{"description":"Bencher Cloud (Free)","type":"string","enum":["cloud_free"]},{"description":"Bencher Cloud (Metered)","type":"string","enum":["cloud_metered"]},{"description":"Bencher Cloud (Licensed)","type":"string","enum":["cloud_licensed"]},{"description":"Bencher Self-Hosted (Licensed) via Bencher Cloud","type":"string","enum":["cloud_self_hosted_licensed"]},{"description":"Bencher Self-Hosted (Free)","type":"string","enum":["self_hosted_free"]},{"description":"Bencher Self-Hosted (Licensed)","type":"string","enum":["self_hosted_licensed"]}]},"UserName":{"type":"string"},"UserUuid":{"type":"string","format":"uuid"},"VersionNumber":{"type":"integer","format":"uint32","minimum":0},"Visibility":{"type":"string","enum":["public","private"]},"Window":{"type":"integer","format":"uint32","minimum":0},"JsonDirection":{"type":"string","enum":["asc","desc"]},"OrganizationsSort":{"oneOf":[{"description":"Sort by organization name.","type":"string","enum":["name"]}]},"Search":{"type":"string"},"OrganizationPermission":{"type":"string","enum":["view","create","edit","delete","manage","view_role","create_role","edit_role","delete_role"]},"OrgMembersSort":{"oneOf":[{"description":"Sort by user name.","type":"string","enum":["name"]}]},"OrgProjectsSort":{"oneOf":[{"description":"Sort by project name.","type":"string","enum":["name"]}]},"ProjectsSort":{"oneOf":[{"description":"Sort by project name.","type":"string","enum":["name"]}]},"ProjAlertsSort":{"oneOf":[{"description":"Sort by alert creation date time.","type":"string","enum":["created"]},{"description":"Sort by alert modified date time.","type":"string","enum":["modified"]}]},"ProjectPermission":{"type":"string","enum":["view","create","edit","delete","manage","view_role","create_role","edit_role","delete_role"]},"ProjBenchmarksSort":{"oneOf":[{"description":"Sort by benchmark name.","type":"string","enum":["name"]}]},"ProjBranchesSort":{"oneOf":[{"description":"Sort by branch name.","type":"string","enum":["name"]}]},"ProjMeasuresSort":{"oneOf":[{"description":"Sort by measure name.","type":"string","enum":["name"]}]},"DateTimeMillis":{"$ref":"#/components/schemas/TimestampMillis"},"TimestampMillis":{"type":"integer","format":"int64"},"ProjReportsSort":{"oneOf":[{"description":"Sort by date time.","type":"string","enum":["date_time"]}]},"ProjTestbedsSort":{"oneOf":[{"description":"Sort by testbed name.","type":"string","enum":["name"]}]},"ProjThresholdsSort":{"oneOf":[{"description":"Sort by threshold creation date time.","type":"string","enum":["created"]},{"description":"Sort by threshold modified date time.","type":"string","enum":["modified"]}]},"UserTokensSort":{"oneOf":[{"description":"Sort by token name.","type":"string","enum":["name"]}]}},"responses":{"Error":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"tags":[{"name":"alerts","description":"Alerts"},{"name":"allowed"},{"name":"auth","description":"Auth"},{"name":"benchmarks","description":"Benchmarks"},{"name":"branches","description":"Branches"},{"name":"checkout"},{"name":"measures","description":"Measures"},{"name":"members"},{"name":"models","description":"Models"},{"name":"organizations","description":"Organizations"},{"name":"perf","description":"Perf Metrics"},{"name":"plan"},{"name":"projects","description":"Projects"},{"name":"reports","description":"Reports"},{"name":"server","description":"Server"},{"name":"stats"},{"name":"testbeds","description":"Testbeds"},{"name":"thresholds","description":"Thresholds"},{"name":"tokens","description":"API Tokens"},{"name":"usage"},{"name":"users","description":"Users"}]}'); /***/ }) diff --git a/services/api/swagger.json b/services/api/swagger.json index a3aed7a77..27b469e32 100644 --- a/services/api/swagger.json +++ b/services/api/swagger.json @@ -2,7 +2,7 @@ "openapi": "3.0.3", "info": { "title": "Bencher API", - "version": "0.4.3" + "version": "0.4.4" }, "paths": { "/": { diff --git a/services/cli/templates/output/install-cli.ps1 b/services/cli/templates/output/install-cli.ps1 index 54731bafd..504200f2a 100755 --- a/services/cli/templates/output/install-cli.ps1 +++ b/services/cli/templates/output/install-cli.ps1 @@ -5,7 +5,7 @@ <# .SYNOPSIS -Bencher CLI v0.4.3 Installer +Bencher CLI v0.4.4 Installer .DESCRIPTION @@ -33,7 +33,7 @@ Print help param ( [Parameter(HelpMessage = "The URL of the directory where artifacts can be fetched from")] - [string]$ArtifactDownloadUrl = 'https://bencher.dev/download/0.4.3', + [string]$ArtifactDownloadUrl = 'https://bencher.dev/download/0.4.4', [Parameter(HelpMessage = "Don't add the install directory to PATH")] [switch]$NoModifyPath, [Parameter(HelpMessage = "Print Help")] @@ -41,7 +41,7 @@ param ( ) $app_name = 'bencher' -$app_version = '0.4.3' +$app_version = '0.4.4' function Install-Binary($install_args) { if ($Help) { @@ -53,13 +53,13 @@ function Install-Binary($install_args) { $platforms = @{ "x86_64-pc-windows-msvc" = @{ - "artifact_name" = "bencher-v0.4.3-windows-x86-64.exe" + "artifact_name" = "bencher-v0.4.4-windows-x86-64.exe" "zip_ext" = "" "bins" = "bencher" "bin" = "bencher" } "aarch64-pc-windows-msvc" = @{ - "artifact_name" = "bencher-v0.4.3-windows-arm-64.exe" + "artifact_name" = "bencher-v0.4.4-windows-arm-64.exe" "zip_ext" = "" "bins" = "bencher" "bin" = "bencher" diff --git a/services/cli/templates/output/install-cli.sh b/services/cli/templates/output/install-cli.sh index f98ca1392..f12ee5ab1 100755 --- a/services/cli/templates/output/install-cli.sh +++ b/services/cli/templates/output/install-cli.sh @@ -16,8 +16,8 @@ fi set -u APP_NAME=bencher -APP_VERSION="0.4.3" -ARTIFACT_DOWNLOAD_URL="${INSTALLER_DOWNLOAD_URL:-https://bencher.dev/download/0.4.3}" +APP_VERSION="0.4.4" +ARTIFACT_DOWNLOAD_URL="${INSTALLER_DOWNLOAD_URL:-https://bencher.dev/download/0.4.4}" PRINT_VERBOSE=${INSTALLER_PRINT_VERBOSE:-0} PRINT_QUIET=${INSTALLER_PRINT_QUIET:-0} NO_MODIFY_PATH=${INSTALLER_NO_MODIFY_PATH:-0} @@ -33,7 +33,7 @@ usage() { cat <