コンテンツにスキップ

Compare build performance

GET
/v1/projects/{id}/builds/compare

Compares two builds by lower-is-better performance metrics. The response contains P50/P95 values and signed percentage differences for frame time, memory, GPU time, disk-read metrics (io.read_bytes, io.read_time_ms, io.read_ops; SDK-fed, may be null), and map load time (load_time_ms, from SDK map-load timing; may be null). CI can use the same data as framedash perf-diff to gate a merge on build-over-build regressions.

id
required
string format: uuid

Project UUID.

baseline
required
string
>= 1 characters <= 256 characters

Known-good build_id to compare against.

candidate
required
string
>= 1 characters <= 256 characters

New build_id under test. Must differ from baseline.

days
integer
default: 30
Allowed values: 7 14 30 90

Time period in days.

mapId
string
>= 1 characters <= 256 characters

Restrict the comparison to one map identifier.

platform
string
>= 1 characters <= 256 characters

Restrict the comparison to one platform.

fresh
string

Set to 1 to bypass the ~60s aggregation cache (used by run-profile-test).

Build comparison result.

object
success
boolean
data

Build-over-build performance comparison.

object
baseline
required

Aggregated performance statistics for one build.

object
build_id
required
string
sample_count
required
integer
session_count
required
integer
avg_frame_time
required

Average frame time in milliseconds.

number
p50_frame_time
required

Median frame time in milliseconds.

number
p95_frame_time
required

P95 frame time in milliseconds.

number
avg_memory
required

Average memory usage.

number
p50_memory
required

Median memory usage.

number
p95_memory
required

P95 memory usage.

number
avg_gpu_time
required

Average GPU time in milliseconds, or null if unavailable.

number | null
p50_gpu_time
required

Median GPU time in milliseconds, or null if unavailable.

number | null
p95_gpu_time
required

P95 GPU time in milliseconds, or null if unavailable.

number | null
avg_io_read_bytes
required

Average disk-read bytes per heartbeat window, or null if the SDK reported no io.* samples.

number | null
p50_io_read_bytes
required

Median disk-read bytes per heartbeat window, or null if unavailable.

number | null
p95_io_read_bytes
required

P95 disk-read bytes per heartbeat window, or null if unavailable.

number | null
avg_io_read_time_ms
required

Average disk-read time in milliseconds per heartbeat window, or null if unavailable.

number | null
p50_io_read_time_ms
required

Median disk-read time in milliseconds per heartbeat window, or null if unavailable.

number | null
p95_io_read_time_ms
required

P95 disk-read time in milliseconds per heartbeat window, or null if unavailable.

number | null
avg_io_read_ops
required

Average disk-read operations per heartbeat window, or null if unavailable.

number | null
p50_io_read_ops
required

Median disk-read operations per heartbeat window, or null if unavailable.

number | null
p95_io_read_ops
required

P95 disk-read operations per heartbeat window, or null if unavailable.

number | null
avg_load_time_ms
required

Average map load time in milliseconds (map_load events), or null if the build reported none.

number | null
p50_load_time_ms
required

Median map load time in milliseconds, or null if unavailable.

number | null
p95_load_time_ms
required

P95 map load time in milliseconds, or null if unavailable.

number | null
candidate
required

Aggregated performance statistics for one build.

object
build_id
required
string
sample_count
required
integer
session_count
required
integer
avg_frame_time
required

Average frame time in milliseconds.

number
p50_frame_time
required

Median frame time in milliseconds.

number
p95_frame_time
required

P95 frame time in milliseconds.

number
avg_memory
required

Average memory usage.

number
p50_memory
required

Median memory usage.

number
p95_memory
required

P95 memory usage.

number
avg_gpu_time
required

Average GPU time in milliseconds, or null if unavailable.

number | null
p50_gpu_time
required

Median GPU time in milliseconds, or null if unavailable.

number | null
p95_gpu_time
required

P95 GPU time in milliseconds, or null if unavailable.

number | null
avg_io_read_bytes
required

Average disk-read bytes per heartbeat window, or null if the SDK reported no io.* samples.

number | null
p50_io_read_bytes
required

Median disk-read bytes per heartbeat window, or null if unavailable.

number | null
p95_io_read_bytes
required

P95 disk-read bytes per heartbeat window, or null if unavailable.

number | null
avg_io_read_time_ms
required

Average disk-read time in milliseconds per heartbeat window, or null if unavailable.

number | null
p50_io_read_time_ms
required

Median disk-read time in milliseconds per heartbeat window, or null if unavailable.

number | null
p95_io_read_time_ms
required

P95 disk-read time in milliseconds per heartbeat window, or null if unavailable.

number | null
avg_io_read_ops
required

Average disk-read operations per heartbeat window, or null if unavailable.

number | null
p50_io_read_ops
required

Median disk-read operations per heartbeat window, or null if unavailable.

number | null
p95_io_read_ops
required

P95 disk-read operations per heartbeat window, or null if unavailable.

number | null
avg_load_time_ms
required

Average map load time in milliseconds (map_load events), or null if the build reported none.

number | null
p50_load_time_ms
required

Median map load time in milliseconds, or null if unavailable.

number | null
p95_load_time_ms
required

P95 map load time in milliseconds, or null if unavailable.

number | null
diffs
required
Array<object>

Signed comparison for one lower-is-better performance metric.

object
metric
required
string
Allowed values: frame_time memory gpu_time io.read_bytes io.read_time_ms io.read_ops load_time_ms
baselineP50
required
number | null
candidateP50
required
number | null
diffPct
required

Signed P50 percent change of candidate vs baseline; positive means worse.

number | null
isRegression
required

True when diffPct is positive for the lower-is-better metric.

boolean
baselineTail
required

Baseline P95 value for the metric.

number | null
candidateTail
required

Candidate P95 value for the metric.

number | null
X-RateLimit-Limit
integer

Maximum number of requests allowed per hour.

X-RateLimit-Remaining
integer

Number of requests remaining in the current window.

X-RateLimit-Reset
integer

Unix timestamp when the rate limit window resets.

Invalid request parameters or body.

RFC 9457 Problem Details. Served with the application/problem+json media type. error_category, retryable, and retry_after are Framedash extension members. type always defaults to about:blank, so it is always present; detail and the extension members are present only when applicable.

object
type
required

Problem type URI; about:blank when no specific type applies.

string format: uri
default: about:blank
title
required

Short, human-readable summary of the problem type.

string
status
required

HTTP status code.

integer
detail

Human-readable explanation specific to this occurrence.

string
error_category

Extension member categorizing the error.

string
Allowed values: authentication authorization validation rate_limit not_found conflict payload internal
retryable

Extension member; true when retrying may succeed (e.g. 429, 503).

boolean
retry_after

Extension member; suggested retry delay in seconds, when applicable.

integer

Missing or invalid API key.

RFC 9457 Problem Details. Served with the application/problem+json media type. error_category, retryable, and retry_after are Framedash extension members. type always defaults to about:blank, so it is always present; detail and the extension members are present only when applicable.

object
type
required

Problem type URI; about:blank when no specific type applies.

string format: uri
default: about:blank
title
required

Short, human-readable summary of the problem type.

string
status
required

HTTP status code.

integer
detail

Human-readable explanation specific to this occurrence.

string
error_category

Extension member categorizing the error.

string
Allowed values: authentication authorization validation rate_limit not_found conflict payload internal
retryable

Extension member; true when retrying may succeed (e.g. 429, 503).

boolean
retry_after

Extension member; suggested retry delay in seconds, when applicable.

integer

Resource not found.

RFC 9457 Problem Details. Served with the application/problem+json media type. error_category, retryable, and retry_after are Framedash extension members. type always defaults to about:blank, so it is always present; detail and the extension members are present only when applicable.

object
type
required

Problem type URI; about:blank when no specific type applies.

string format: uri
default: about:blank
title
required

Short, human-readable summary of the problem type.

string
status
required

HTTP status code.

integer
detail

Human-readable explanation specific to this occurrence.

string
error_category

Extension member categorizing the error.

string
Allowed values: authentication authorization validation rate_limit not_found conflict payload internal
retryable

Extension member; true when retrying may succeed (e.g. 429, 503).

boolean
retry_after

Extension member; suggested retry delay in seconds, when applicable.

integer

Rate limit exceeded.

RFC 9457 Problem Details. Served with the application/problem+json media type. error_category, retryable, and retry_after are Framedash extension members. type always defaults to about:blank, so it is always present; detail and the extension members are present only when applicable.

object
type
required

Problem type URI; about:blank when no specific type applies.

string format: uri
default: about:blank
title
required

Short, human-readable summary of the problem type.

string
status
required

HTTP status code.

integer
detail

Human-readable explanation specific to this occurrence.

string
error_category

Extension member categorizing the error.

string
Allowed values: authentication authorization validation rate_limit not_found conflict payload internal
retryable

Extension member; true when retrying may succeed (e.g. 429, 503).

boolean
retry_after

Extension member; suggested retry delay in seconds, when applicable.

integer
X-RateLimit-Limit
integer

Maximum number of requests allowed per hour.

X-RateLimit-Remaining
integer

Number of requests remaining in the current window.

X-RateLimit-Reset
integer

Unix timestamp when the rate limit window resets.

Retry-After
integer

Number of seconds to wait before retrying. Present only on 429 responses. Because the limit uses a sliding window, honor this value per response rather than scheduling a retry for the reset time.