curl --request GET \
--url https://api.hebbianrobotics.com/api/v1beta/quality/video-characteristics \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.hebbianrobotics.com/api/v1beta/quality/video-characteristics"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.hebbianrobotics.com/api/v1beta/quality/video-characteristics', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));false{
"analysis": "<string>",
"analyzed_clip_count": 1,
"assessed_hours": 1,
"black": {
"assessed_hours": 1,
"percent": 50,
"distribution": {
"histogram": {
"affected_percent_bin_width": 10,
"bins": [
{
"clip_count": 1,
"footage_percent": 50,
"minimum_affected_percent": 45
}
]
},
"observation_unit": "clip",
"percentiles": [
{
"affected_percent": 50,
"percentile": 50
}
],
"weighted_by": "assessed_duration"
}
},
"blurry": {
"assessed_hours": 1,
"percent": 50,
"distribution": {
"histogram": {
"affected_percent_bin_width": 10,
"bins": [
{
"clip_count": 1,
"footage_percent": 50,
"minimum_affected_percent": 45
}
]
},
"observation_unit": "clip",
"percentiles": [
{
"affected_percent": 50,
"percentile": 50
}
],
"weighted_by": "assessed_duration"
}
},
"clipped_highlights": {
"assessed_hours": 1,
"percent": 50,
"distribution": {
"histogram": {
"affected_percent_bin_width": 10,
"bins": [
{
"clip_count": 1,
"footage_percent": 50,
"minimum_affected_percent": 45
}
]
},
"observation_unit": "clip",
"percentiles": [
{
"affected_percent": 50,
"percentile": 50
}
],
"weighted_by": "assessed_duration"
}
},
"coverage_percent": 50,
"crushed_shadows": {
"assessed_hours": 1,
"percent": 50,
"distribution": {
"histogram": {
"affected_percent_bin_width": 10,
"bins": [
{
"clip_count": 1,
"footage_percent": 50,
"minimum_affected_percent": 45
}
]
},
"observation_unit": "clip",
"percentiles": [
{
"affected_percent": 50,
"percentile": 50
}
],
"weighted_by": "assessed_duration"
}
},
"dataset": "<string>",
"frozen": {
"assessed_hours": 1,
"percent": 50,
"distribution": {
"histogram": {
"affected_percent_bin_width": 10,
"bins": [
{
"clip_count": 1,
"footage_percent": 50,
"minimum_affected_percent": 45
}
]
},
"observation_unit": "clip",
"percentiles": [
{
"affected_percent": 50,
"percentile": 50
}
],
"weighted_by": "assessed_duration"
}
},
"unreadable": {
"assessed_clips": 1,
"percent": 50
},
"unstable": {
"assessed_hours": 1,
"percent": 50,
"distribution": {
"histogram": {
"affected_percent_bin_width": 10,
"bins": [
{
"clip_count": 1,
"footage_percent": 50,
"minimum_affected_percent": 45
}
]
},
"observation_unit": "clip",
"percentiles": [
{
"affected_percent": 50,
"percentile": 50
}
],
"weighted_by": "assessed_duration"
}
},
"video_characteristics": "<string>"
}{
"code": "<string>",
"message": "<string>"
}{
"code": "<string>",
"message": "<string>"
}{
"code": "<string>",
"message": "<string>"
}{
"code": "<string>",
"message": "<string>"
}{
"code": "<string>",
"message": "<string>"
}{
"code": "<string>",
"message": "<string>"
}{
"code": "<string>",
"message": "<string>"
}Get dataset video characteristics
Returns duration-weighted black, frozen, endpoint-saturation, blur, and
camera-instability measurements plus the share of planned clips with no
usable deterministic measurement. Pass include=distribution for per-clip
histograms and duration-weighted percentiles.
Metric-definition boundaries are applied to turn instrument readings into shares. No customer accept/reject bar is applied; comparing these shares with a trusted delivery is the intended use.
For what each measurement means, see Video characteristics.
curl --request GET \
--url https://api.hebbianrobotics.com/api/v1beta/quality/video-characteristics \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.hebbianrobotics.com/api/v1beta/quality/video-characteristics"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.hebbianrobotics.com/api/v1beta/quality/video-characteristics', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));false{
"analysis": "<string>",
"analyzed_clip_count": 1,
"assessed_hours": 1,
"black": {
"assessed_hours": 1,
"percent": 50,
"distribution": {
"histogram": {
"affected_percent_bin_width": 10,
"bins": [
{
"clip_count": 1,
"footage_percent": 50,
"minimum_affected_percent": 45
}
]
},
"observation_unit": "clip",
"percentiles": [
{
"affected_percent": 50,
"percentile": 50
}
],
"weighted_by": "assessed_duration"
}
},
"blurry": {
"assessed_hours": 1,
"percent": 50,
"distribution": {
"histogram": {
"affected_percent_bin_width": 10,
"bins": [
{
"clip_count": 1,
"footage_percent": 50,
"minimum_affected_percent": 45
}
]
},
"observation_unit": "clip",
"percentiles": [
{
"affected_percent": 50,
"percentile": 50
}
],
"weighted_by": "assessed_duration"
}
},
"clipped_highlights": {
"assessed_hours": 1,
"percent": 50,
"distribution": {
"histogram": {
"affected_percent_bin_width": 10,
"bins": [
{
"clip_count": 1,
"footage_percent": 50,
"minimum_affected_percent": 45
}
]
},
"observation_unit": "clip",
"percentiles": [
{
"affected_percent": 50,
"percentile": 50
}
],
"weighted_by": "assessed_duration"
}
},
"coverage_percent": 50,
"crushed_shadows": {
"assessed_hours": 1,
"percent": 50,
"distribution": {
"histogram": {
"affected_percent_bin_width": 10,
"bins": [
{
"clip_count": 1,
"footage_percent": 50,
"minimum_affected_percent": 45
}
]
},
"observation_unit": "clip",
"percentiles": [
{
"affected_percent": 50,
"percentile": 50
}
],
"weighted_by": "assessed_duration"
}
},
"dataset": "<string>",
"frozen": {
"assessed_hours": 1,
"percent": 50,
"distribution": {
"histogram": {
"affected_percent_bin_width": 10,
"bins": [
{
"clip_count": 1,
"footage_percent": 50,
"minimum_affected_percent": 45
}
]
},
"observation_unit": "clip",
"percentiles": [
{
"affected_percent": 50,
"percentile": 50
}
],
"weighted_by": "assessed_duration"
}
},
"unreadable": {
"assessed_clips": 1,
"percent": 50
},
"unstable": {
"assessed_hours": 1,
"percent": 50,
"distribution": {
"histogram": {
"affected_percent_bin_width": 10,
"bins": [
{
"clip_count": 1,
"footage_percent": 50,
"minimum_affected_percent": 45
}
]
},
"observation_unit": "clip",
"percentiles": [
{
"affected_percent": 50,
"percentile": 50
}
],
"weighted_by": "assessed_duration"
}
},
"video_characteristics": "<string>"
}{
"code": "<string>",
"message": "<string>"
}{
"code": "<string>",
"message": "<string>"
}{
"code": "<string>",
"message": "<string>"
}{
"code": "<string>",
"message": "<string>"
}{
"code": "<string>",
"message": "<string>"
}{
"code": "<string>",
"message": "<string>"
}{
"code": "<string>",
"message": "<string>"
}Authorizations
Bearer access token issued through OAuth 2.0 client credentials.
Query Parameters
Dataset ID from GET /api/v1beta/quality/datasets.
Opaque analysis token from an earlier response. Omit to use the latest
measurement.
Opaque video_characteristics token from an earlier response. Omit to
use the latest measurement.
Adds chart-ready per-clip histograms and duration-weighted percentiles to
every available duration-weighted defect. The only supported value is
distribution.
Optional response expansion for scored video characteristics.
distribution Response
Defect percentages, optional clip distributions, and coverage
Dataset-level defect scores and measurement completeness.
Duration-weighted defects are shares of footage, not pass/fail verdicts;
unreadable is instead a share of planned clips. The service supplies no
customer acceptance bar: derive one from footage you already consider good.
Opaque token identifying the QualityInventory analysis that defines the
clip selection used for this response.
Clips the analysis planned, which is what unreadable is taken over.
x >= 0Footage decoded and measured, in hours.
Orientation rather than a denominator: each measurement reports the
footage it was taken over in its own assessed_hours, and those differ.
This is not the duration of the dataset either — footage that could not
be measured is not counted here, which is what unreadable reports.
x >= 0Footage carrying no usable picture. null when no clip could be
assessed for it.
Defect measurements can overlap, so they answer "how much footage is like this" one at a time and must not be added into a damage total.
Show child attributes
Show child attributes
Footage too soft to make out what is being handled from defocus, obscuration, haze, lens smear, upscaling, or heavy denoising. Blur caused only by the camera moving, turning, or shaking is excluded.
Assessed rather than measured directly, so it is null until the
dataset has been assessed for it — which is not the same as clean.
Show child attributes
Show child attributes
Footage whose robust luma percentile crosses the fixed bright-end gate. This is an endpoint-saturation indicator, not proof of where clipping occurred in the capture pipeline.
Show child attributes
Show child attributes
Percentage of the planned analysis that produced deterministic
video-characteristics values, in [0, 100]. This does not describe the
separate blur or stability observers; each duration-weighted metric's
assessed_hours states its actual denominator. null when the planned
result count cannot be determined reliably. Non-null values are rounded
to two decimal places.
0 <= x <= 100Footage whose robust luma percentile crosses the fixed dark-end gate. This is an endpoint-saturation indicator, not proof of where crushing occurred in the capture pipeline.
Show child attributes
Show child attributes
Dataset ID used in the request.
Footage whose picture has stopped changing between frames.
Show child attributes
Show child attributes
Planned clips that produced no usable deterministic video-characteristics measurement — unreadable files, truncated recordings, unsupported streams, or clips that yielded too little to measure.
It is weighted by clips rather than by duration, because a failed direct
measurement has no duration to weight it by, so it reports
assessed_clips. Independent blur or camera-motion observations may
still cover such a clip. Unlike duration-weighted defects it has no clip
distribution. null when the analysis planned no clips.
Show child attributes
Show child attributes
Footage carrying high-frequency camera jitter after smooth, low-frequency camera motion is removed. Rapid reversals or vibration can count even when they come from an intentional mount movement.
Camera motion supplies the primary measurement. A complete per-clip
model assessment covers spans that measurement could not classify; the
model also covers selected clips with no camera-motion result. The value
is null only when neither observer covered footage.
Show child attributes
Show child attributes
Opaque token identifying the video-characteristics measurement.
