Skip to content

Look up a verdict

GET
/verdicts/{identifier}
curl --request GET \
--url 'https://api.doesitarm.com/v1/verdicts/slug%3Aadobe-photoshop?macosVersion=26&chip=apple_silicon'

Return the one current Verdict for a title on Apple Silicon. The identifier is polymorphic: pass slug:<slug>, steam:<appId>, bundle:<bundleId>, or a bare fuzzy name.

An unknown title is still 200 with status: "unknown" (“Needs more data”) plus alternatives — never an error, never a fabricated verdict. A stale answer is still 200 with stale: true. Only a genuinely ambiguous name (multiple strong matches) returns 409.

Mirrors the MCP tool lookup_verdict.

identifier
required
string

slug:<slug>, steam:<appId>, bundle:<bundleId>, or a bare name. Reserved deterministic test identifiers: slug:429-demo (trips the rate limit), slug:some-ancient-installer (returns unknown), slug:final-cut-pro (returns stale: true).

Example
slug:adobe-photoshop
macosVersion
string

Scope the verdict to a macOS major version (for example “26”, “27”). Defaults to the latest.

Example
26
chip
string
Allowed values: apple_silicon m1 m2 m3 m4

Scope the verdict to a chip family. Defaults to Apple Silicon generally.

Example
apple_silicon

The current verdict (possibly unknown or stale).

Media type application/json

The one current answer for a title on a (macosVersion, chip) scope.

object
slug
required

Canonical URL id on doesitarm.com.

string
title
required
string
kind
required
string
Allowed values: app game
status
required

unknown means “Needs more data” — a real verdict, not a failure.

string
Allowed values: native rosetta2 translation unsupported unknown
translationLayer

Set only when status is “translation”; otherwise null or absent.

string | null
Allowed values: gptk crossover whisky vm
confidence
required
string
Allowed values: high medium low
basis
required

How we know — one or more evidence kinds.

Array<string>
Allowed values: binary automated_test crowd vendor curator
macosVersion
required

MacOS major version this verdict is scoped to.

string
chip
required

Chip family this verdict is scoped to.

string
caveats
required

Human-readable qualifiers (“no online play”, “low FPS”).

Array<string>
breaksAtRosettaEol
required

True if the title relies on Rosetta 2 and will break when it is removed (macOS 28).

boolean
lastVerified
required

ISO date of the freshest contributing signal.

string format: date
stale
required

True when past the freshness threshold; a re-test is queued.

boolean
signals
required

Contributing reports/tests, newest first.

Array<object>

A single piece of evidence behind a verdict — a report, a test, or a known fact.

object
id
required
string
kind
required
string
Allowed values: report test source
status
required
string
Allowed values: native rosetta2 translation unsupported unknown
confidence
required
string
Allowed values: high medium low
macosVersion
required
string
chip
required
string
at
required
string format: date-time
ref
required

Link to the underlying report/test on doesitarm.com.

string format: uri
alternatives

Native equivalents, surfaced mainly when status is “unsupported” or “unknown”.

Array<object>

A native equivalent suggested when a title is unsupported or unknown.

object
forSlug
required

The title this alternative is for.

string
altSlug
required

The suggested native equivalent.

string
reason
required
string
Example
{
"slug": "adobe-photoshop",
"title": "Adobe Photoshop",
"kind": "app",
"status": "native",
"confidence": "high",
"basis": [
"binary",
"vendor",
"automated_test"
],
"macosVersion": "26",
"chip": "apple_silicon",
"caveats": [],
"breaksAtRosettaEol": false,
"lastVerified": "2026-06-21",
"stale": false,
"signals": [
{
"id": "sig_01",
"kind": "test",
"status": "native",
"confidence": "high",
"macosVersion": "26",
"chip": "m3",
"at": "2026-06-21T00:00:00Z",
"ref": "https://doesitarm.com/adobe-photoshop#test-01"
}
],
"alternatives": []
}
RateLimit-Limit
integer

Requests allowed in the current window.

RateLimit-Remaining
integer

Requests left in the current window.

RateLimit-Reset
integer

Seconds until the window resets (IETF ratelimit-headers, pre-08 three-header form).

ETag
string

Stable hash over (slug, macosVersion, chip, lastVerified). Use with If-None-Match for 304s.

Last-Modified
string

Mirrors the verdict’s lastVerified date.

X-DoesItARM-Stale
boolean

True when the verdict is past its freshness threshold and a re-test is queued.

Cache-Control
string

Caching policy. Verdicts: public, max-age=3600, stale-while-revalidate=86400. The paid change feed: private. Search: no-cache.

Multiple strong matches on a lookup — disambiguate and re-query. (HTTP 409, not a 3xx redirect.)

Media type application/json

The single error envelope used by every 4xx/5xx. Agents branch on code; humans read message. No 3xx ever carries this body.

object
error
required
object
type
required

Coarse family. (‘ambiguous’ is a code, carried under type invalid_request.)

string
Allowed values: invalid_request rate_limited auth server
code
required

Fine-grained branch value.

string
Allowed values: ambiguous invalid_param auth_required auth_invalid plan_required rate_limited internal
message
required

Human-readable explanation.

string
docsUrl
string format: uri
upgradeUrl
string format: uri
suggestions

Present on ambiguous — candidate titles to disambiguate with.

Array<object>
object
slug
required
string
title
required
string
score
number format: float
requestId
required

Quote this to support.

string
Example
{
"error": {
"type": "invalid_request",
"code": "ambiguous",
"message": "12 titles match \"office\". Pass a slug: or steam: identifier.",
"docsUrl": "https://docs.doesitarm.com/api/errors/#ambiguous",
"suggestions": [
{
"slug": "microsoft-office",
"title": "Microsoft Office",
"score": 0.82
}
],
"requestId": "req_01J5K6Q8Z9"
}
}

A parameter was invalid. (HTTP 422.)

Media type application/json

The single error envelope used by every 4xx/5xx. Agents branch on code; humans read message. No 3xx ever carries this body.

object
error
required
object
type
required

Coarse family. (‘ambiguous’ is a code, carried under type invalid_request.)

string
Allowed values: invalid_request rate_limited auth server
code
required

Fine-grained branch value.

string
Allowed values: ambiguous invalid_param auth_required auth_invalid plan_required rate_limited internal
message
required

Human-readable explanation.

string
docsUrl
string format: uri
upgradeUrl
string format: uri
suggestions

Present on ambiguous — candidate titles to disambiguate with.

Array<object>
object
slug
required
string
title
required
string
score
number format: float
requestId
required

Quote this to support.

string
Example
{
"error": {
"type": "invalid_request",
"code": "invalid_param",
"message": "Unknown chip 'm9'. Allowed: apple_silicon, m1, m2, m3, m4.",
"docsUrl": "https://docs.doesitarm.com/api/errors/",
"requestId": "req_01J5K6Q8ZA"
}
}

Rate limit exceeded. (HTTP 429.)

Media type application/json

The single error envelope used by every 4xx/5xx. Agents branch on code; humans read message. No 3xx ever carries this body.

object
error
required
object
type
required

Coarse family. (‘ambiguous’ is a code, carried under type invalid_request.)

string
Allowed values: invalid_request rate_limited auth server
code
required

Fine-grained branch value.

string
Allowed values: ambiguous invalid_param auth_required auth_invalid plan_required rate_limited internal
message
required

Human-readable explanation.

string
docsUrl
string format: uri
upgradeUrl
string format: uri
suggestions

Present on ambiguous — candidate titles to disambiguate with.

Array<object>
object
slug
required
string
title
required
string
score
number format: float
requestId
required

Quote this to support.

string
Example
{
"error": {
"type": "rate_limited",
"code": "rate_limited",
"message": "Free tier allows 60 requests/min. Retry in 30s or upgrade.",
"docsUrl": "https://docs.doesitarm.com/api/rate-limits/",
"upgradeUrl": "https://doesitarm.com/early-access",
"requestId": "req_01J5K6Q8ZD"
}
}
Retry-After
integer

Seconds to wait before retrying. Sent on 429.

RateLimit-Limit
integer

Requests allowed in the current window.

RateLimit-Remaining
integer

Requests left in the current window.

RateLimit-Reset
integer

Seconds until the window resets (IETF ratelimit-headers, pre-08 three-header form).