Anysphere Cursor.com · Schema
PullRequestMergeability
Whether a pull request can be merged, and why not when it cannot.
AI CodingDevelopment ToolsCloud AgentsCLIEnterprise Software
Properties
| Name | Type | Description |
|---|---|---|
| pullRequest | object | The pull request the verdict is about. |
| verdict | string | Overall answer for every pull request in `evaluated_pull_requests`: `mergeable` means merging `pull_request` lands all of them (for a stacked pull request, the whole stack below it as well). Unrecogni |
| blockers | array | Everything preventing the merge, ordered by the pull request they belong to (stack root first) and then by kind. Empty when `verdict` is `mergeable`. At most one blocker per pull request per kind, exc |
| evaluatedPullRequests | array | Pull requests a merge of `pull_request` would land, stack root first and ending with `pull_request`. Ancestors that already merged are not listed: they are history, not part of the evaluation. Exactly |
| headSha | string | Head commit of `pull_request` that was evaluated. |
| baseRef | string | Branch the evaluated pull requests merge into: the stack root's base, not this pull request's own base when it is stacked. |
| baseSha | string | Tip commit of `base_ref` at `evaluated_at`. A later push to `base_ref` may change the verdict. Empty when the base branch could not be determined (for example, an invalid stack). |
| evaluatedAt | string | When this result was evaluated. Changes after this time are not reflected; re-query to pick them up. |
JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://raw.githubusercontent.com/api-evangelist/anysphere-cursor.com/main/json-schema/anysphere-cursor.com-pull-request-mergeability-schema.json",
"title": "PullRequestMergeability",
"description": "Whether a pull request can be merged, and why not when it cannot.",
"x-generated": "2026-09-25",
"x-method": "derived",
"x-generator": "derive-json-schema.py",
"x-source": "openapi/anysphere-cursor.com-openapi.yaml#/components/schemas/PullRequestMergeability",
"type": "object",
"properties": {
"pullRequest": {
"allOf": [
{
"$ref": "#/$defs/PullRequestReference"
}
],
"description": "The pull request the verdict is about.",
"x-cursor-visibility": "PREVIEW"
},
"verdict": {
"enum": [
"mergeable",
"blocked"
],
"type": "string",
"description": "Overall answer for every pull request in `evaluated_pull_requests`:\n `mergeable` means merging `pull_request` lands all of them (for a stacked\n pull request, the whole stack below it as well). Unrecognized values must\n be treated as `blocked`.",
"x-cursor-visibility": "PREVIEW"
},
"blockers": {
"type": "array",
"items": {
"$ref": "#/$defs/PullRequestMergeabilityBlocker"
},
"description": "Everything preventing the merge, ordered by the pull request they belong\n to (stack root first) and then by kind. Empty when `verdict` is\n `mergeable`. At most one blocker per pull request per kind, except\n `required_checks` (one per state) and `rule_failure` / `ruleset_error`\n (one per distinct message); the same kind can appear for different pull\n requests in the stack. Every blocker's `pull_request` is one of\n `evaluated_pull_requests`.\n\n New kinds are added over time. Decode with unknown values tolerated\n (`ignoreUnknownFields` in protobuf-es, `DiscardUnknown` in Go protojson):\n a blocker whose `kind` postdates your client then decodes with `kind`\n unset and `message` intact, and is still blocking. Strict decoders reject\n the whole response instead.",
"x-cursor-visibility": "PREVIEW"
},
"evaluatedPullRequests": {
"type": "array",
"items": {
"$ref": "#/$defs/PullRequestReference"
},
"description": "Pull requests a merge of `pull_request` would land, stack root first and\n ending with `pull_request`. Ancestors that already merged are not listed:\n they are history, not part of the evaluation. Exactly one element for an\n unstacked pull request.",
"x-cursor-visibility": "PREVIEW"
},
"headSha": {
"type": "string",
"description": "Head commit of `pull_request` that was evaluated.",
"x-cursor-visibility": "PREVIEW"
},
"baseRef": {
"type": "string",
"description": "Branch the evaluated pull requests merge into: the stack root's base, not\n this pull request's own base when it is stacked.",
"x-cursor-visibility": "PREVIEW"
},
"baseSha": {
"type": "string",
"description": "Tip commit of `base_ref` at `evaluated_at`. A later push to `base_ref`\n may change the verdict. Empty when the base branch could not be\n determined (for example, an invalid stack).",
"x-cursor-visibility": "PREVIEW"
},
"evaluatedAt": {
"type": "string",
"description": "When this result was evaluated. Changes after this time are not\n reflected; re-query to pick them up.",
"format": "date-time",
"x-cursor-visibility": "PREVIEW"
}
},
"x-cursor-visibility": "PREVIEW",
"$defs": {
"CheckRunReference": {
"type": "object",
"properties": {
"id": {
"type": "string",
"x-cursor-visibility": "PREVIEW"
},
"name": {
"type": "string",
"x-cursor-visibility": "PREVIEW"
},
"checkSuite": {
"allOf": [
{
"$ref": "#/$defs/CheckSuiteReference"
}
],
"description": "Suite the check run belongs to.",
"x-cursor-visibility": "PREVIEW"
}
},
"description": "Identity and display coordinates of a check run, for embedding in resources\n that a `repository:checks` read does not gate. Everything else about the run\n (status, conclusion, output, details URL) is `GetCheckRun`.",
"x-cursor-visibility": "PREVIEW"
},
"CheckSuiteReference": {
"type": "object",
"properties": {
"id": {
"type": "string"
}
}
},
"CodeownerApprovalBlocker": {
"type": "object",
"properties": {
"requirements": {
"type": "array",
"items": {
"$ref": "#/$defs/CodeownerRequirement"
},
"x-cursor-visibility": "PREVIEW"
}
},
"x-cursor-visibility": "PREVIEW"
},
"CodeownerRequirement": {
"type": "object",
"properties": {
"owners": {
"type": "array",
"items": {
"type": "string"
},
"description": "Code owners, any one of whom can satisfy the requirement.",
"x-cursor-visibility": "PREVIEW"
},
"paths": {
"type": "array",
"items": {
"type": "string"
},
"description": "Changed paths this owner set covers.",
"x-cursor-visibility": "PREVIEW"
}
},
"description": "One owner set that still needs an approval.",
"x-cursor-visibility": "PREVIEW"
},
"MergeConflictBlocker": {
"type": "object",
"properties": {
"conflictedPaths": {
"type": "array",
"items": {
"type": "string"
},
"description": "Paths that conflict with the base branch. At most 100 are listed.",
"x-cursor-visibility": "PREVIEW"
},
"truncated": {
"type": "boolean",
"description": "Whether more paths conflict than are listed.",
"x-cursor-visibility": "PREVIEW"
},
"inheritedFromDownstack": {
"type": "boolean",
"description": "The conflict comes from a pull request below this one in the stack, so\n this pull request is waiting on that one rather than conflicted itself.",
"x-cursor-visibility": "PREVIEW"
}
},
"x-cursor-visibility": "PREVIEW"
},
"OriginActor": {
"type": "object",
"properties": {
"user": {
"$ref": "#/$defs/OriginUserActor"
},
"app": {
"$ref": "#/$defs/OriginAppActor"
},
"serviceAccount": {
"$ref": "#/$defs/OriginServiceAccountActor"
}
},
"description": "A user, app, or service account that performed an externally visible action."
},
"OriginAppActor": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"displayName": {
"type": "string",
"description": "The app's registered display name, never empty when present. Omitted on\n payloads whose app could not be resolved and on the first-party Cursor\n facade actor."
}
}
},
"OriginServiceAccountActor": {
"type": "object",
"properties": {
"id": {
"type": "string"
}
}
},
"OriginUserActor": {
"required": [
"email"
],
"type": "object",
"properties": {
"id": {
"type": "string"
},
"email": {
"type": "string"
},
"displayName": {
"type": "string",
"description": "Human-readable display name: the account's first and last name, each\n trimmed, joined with a space — exactly the name the product UI renders.\n Omitted when the account has no name; never synthesized from the email,\n the id, or any other field. May also be absent on webhook payloads whose\n actor could not be resolved."
},
"handle": {
"type": "string",
"description": "The user's claimed profile handle (the identity behind cursor.com\n /@handle), without the @ prefix. Present only while the user's profile\n is publicly visible; omitted for users without a claimed handle and for\n non-public profiles."
}
}
},
"Owner": {
"type": "object",
"properties": {
"slug": {
"type": "string",
"description": "Unique URL-friendly name of the owner."
},
"id": {
"type": "string",
"description": "Unique ID of the owner namespace."
},
"type": {
"readOnly": true,
"enum": [
"team",
"user"
],
"type": "string",
"description": "`team` or `user`. Output-only; unset when unknown."
}
},
"description": "The owner of a repo."
},
"PullRequestMergeabilityBlocker": {
"type": "object",
"properties": {
"pullRequest": {
"allOf": [
{
"$ref": "#/$defs/PullRequestReference"
}
],
"description": "Pull request in `evaluated_pull_requests` this blocker belongs to.",
"x-cursor-visibility": "PREVIEW"
},
"kind": {
"enum": [
"draft",
"closed",
"merged",
"merge_conflict",
"required_checks",
"required_approvals",
"codeowner_approval",
"behind_base",
"needs_restack",
"restack_pending",
"conflict_check_pending",
"invalid_stack",
"ruleset_error",
"rule_failure"
],
"type": "string",
"description": "Category of the blocker. Never unset on the wire; a client that decodes\n it unset received a kind newer than itself (see `blockers`).",
"x-cursor-visibility": "PREVIEW"
},
"message": {
"type": "string",
"description": "Human-readable statement of the blocker and how to clear it. Never empty:\n what to render when `kind` is unrecognized.",
"x-cursor-visibility": "PREVIEW"
},
"requiredChecks": {
"allOf": [
{
"$ref": "#/$defs/RequiredChecksBlocker"
}
],
"x-cursor-visibility": "PREVIEW"
},
"requiredApprovals": {
"allOf": [
{
"$ref": "#/$defs/RequiredApprovalsBlocker"
}
],
"x-cursor-visibility": "PREVIEW"
},
"codeownerApproval": {
"allOf": [
{
"$ref": "#/$defs/CodeownerApprovalBlocker"
}
],
"x-cursor-visibility": "PREVIEW"
},
"mergeConflict": {
"allOf": [
{
"$ref": "#/$defs/MergeConflictBlocker"
}
],
"x-cursor-visibility": "PREVIEW"
},
"stackShape": {
"allOf": [
{
"$ref": "#/$defs/StackShapeBlocker"
}
],
"x-cursor-visibility": "PREVIEW"
}
},
"description": "One condition preventing a merge.",
"x-cursor-visibility": "PREVIEW"
},
"PullRequestReference": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Immutable Origin change id."
},
"number": {
"type": "string"
},
"repository": {
"allOf": [
{
"$ref": "#/$defs/RepositoryReference"
}
],
"description": "Repository reference for this pull request."
}
},
"description": "Stable identity and display coordinates for an Origin pull request."
},
"RepositoryReference": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
},
"owner": {
"$ref": "#/$defs/Owner"
}
},
"description": "Stable identity and display coordinates for a repository."
},
"RequiredApprovalsBlocker": {
"type": "object",
"properties": {
"requiredCount": {
"type": "integer",
"description": "Approving reviews the repository rules require.",
"format": "int32",
"x-cursor-visibility": "PREVIEW"
},
"approvedCount": {
"type": "integer",
"description": "Approving reviews currently counted toward the requirement.",
"format": "int32",
"x-cursor-visibility": "PREVIEW"
}
},
"x-cursor-visibility": "PREVIEW"
},
"RequiredCheck": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Name the repository rule requires.",
"x-cursor-visibility": "PREVIEW"
},
"owner": {
"allOf": [
{
"$ref": "#/$defs/OriginActor"
}
],
"description": "Principal expected to report the check.",
"x-cursor-visibility": "PREVIEW"
},
"checkRun": {
"allOf": [
{
"$ref": "#/$defs/CheckRunReference"
}
],
"description": "The check run on `head_sha` matching this requirement, by reference.\n Unset when none has been reported (state `missing`). A reference rather\n than the full `CheckRun`: this resource is readable with\n `repository:pull_requests` read alone, while a run's status, conclusion,\n output and details URL are gated by `repository:checks` read\n (`GetCheckRun`); the requirement's state is `RequiredChecksBlocker.state`.",
"x-cursor-visibility": "PREVIEW"
}
},
"description": "A check a repository rule requires on the evaluated head.",
"x-cursor-visibility": "PREVIEW"
},
"RequiredChecksBlocker": {
"type": "object",
"properties": {
"state": {
"enum": [
"missing",
"pending",
"failing",
"action_required"
],
"type": "string",
"description": "State shared by every check in this blocker.",
"x-cursor-visibility": "PREVIEW"
},
"checks": {
"type": "array",
"items": {
"$ref": "#/$defs/RequiredCheck"
},
"description": "Required checks in that state.",
"x-cursor-visibility": "PREVIEW"
}
},
"x-cursor-visibility": "PREVIEW"
},
"StackShapeBlocker": {
"type": "object",
"properties": {
"reason": {
"enum": [
"partially_merged",
"cycle",
"missing_parent",
"cross_repository_parent",
"base_branch_missing"
],
"type": "string",
"x-cursor-visibility": "PREVIEW"
},
"relatedPullRequests": {
"type": "array",
"items": {
"$ref": "#/$defs/PullRequestReference"
},
"description": "Other pull requests involved, when the reason names any.",
"x-cursor-visibility": "PREVIEW"
}
},
"x-cursor-visibility": "PREVIEW"
}
}
}
Work with this as data
Every JSON Schema here is available over the APIs.io API and to AI agents over MCP.
MCP server
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
Tools for schemas
4 MCP tools reach this
find_json_schemasBrowse and filter every JSON Schema in the catalog.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.
Call it yourself
curl for this page
This JSON Schema
curl "https://apis.io/api/v1/json-schemas/anysphere-cursor.com-pull-request-mergeability"
All schemas
curl "https://apis.io/api/v1/json-schemas?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
Get an API key
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.