Verified Handles
Server Details
Look up people, organisations and things, and their official social media accounts and identifiers.
- Status
- Healthy
- Uptime
- 99.8% over 26 days
- OAuth
- Works in Glama
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- jameshaworthcs/verifiedhandles-mcp
- GitHub Stars
- 0
TDQS
Scored across 47 tools
The set covers many domains, but several tools have closely overlapping purposes: propose_entry_change vs propose_entry_changes vs update_entries, propose_wikidata_correction vs propose_wikidata_changes, review_submission vs the application decision tools, and comment_on_application vs ask_applicant vs comment_on_my_submission. The long descriptions help distinguish them, but an agent must read carefully to avoid misselection.
Most names follow a readable snake_case verb_noun pattern (get_entry, update_entry_fields, set_entry_image, list_applications). There are minor inconsistencies such as get_reconcile, find_by_handle, and singular/plural pairs like propose_entry_change/propose_entry_changes and propose_wikidata_correction/propose_wikidata_changes.
47 tools is very heavy for a single server, even given the broad platform scope. Many tools are singular/plural or bulk/single variants that add surface area rather than distinct capabilities.
Core workflows for entries, applications, articles, media, and Wikidata proposals are broadly covered, but there are notable gaps: media_catalog is repeatedly referenced yet absent, dismiss_wikidata_correction is referenced but missing, and there is no direct delete-entry or article-publish tool. These create dead ends agents may not be able to work around.
Available Tools
47 toolsadd_entry_noteAdd an internal noteAInspect
Add a staff-only internal note to an entry (plain text; links are kept). Audited. Dry run by default.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | ||
| entry | Yes | The entry: its VHID (11 digits), its short name (as in verifiedhandles.org/<short>), or its Wikidata QID (Q42). | |
| dry_run | No | true (the default): write nothing — show the change and the exact request it would send. false: make the change. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | A dry run: what to do next to make the change, in words. |
| result | No | A real run: the route’s own answer, where the tool adds facts of its own beside it. |
| confirm | No | A dry run of a change that needs it: the exact target to send back as `confirm` with dry_run: false. |
| dry_run | No | true: a dry run, which wrote nothing. Absent from a real run. |
| replayed | No | A real run with an idempotency_key already used for this change: the first call’s answer, given back; nothing was written now. |
| would_send | No | A dry run: the exact request the real run would send (`method`, `path`, any `headers` such as an Idempotency-Key, and its `body`, `form` or `query`), or the requests, in order. |
| may_edit_live | No | A dry run of a live edit: whether this key’s account may edit this entry live. |
| refused_because | No | A dry run the real run would be refused for: why, in words. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds traits the annotations don't: 'staff-only' discloses visibility scope, 'Audited' discloses that the action is logged, and 'Dry run by default' warns that the call previews rather than writes unless overridden. This is meaningful context for a non-readOnly, non-idempotent mutation, though it omits who is authorized and whether repeated identical adds create duplicates.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three compact fragments, purpose front-loaded, no filler. Each clause ('staff-only', 'links are kept', 'Audited', 'Dry run by default') carries a distinct piece of information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be described, and the identifier semantics for entry are covered in-schema. The description covers visibility, audit, and the dry-run gate, leaving only minor gaps around authorization and duplicate-note behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67%: entry and dry_run are documented in-schema, while text is not. The description partially compensates by specifying that text is 'plain text' and that 'links are kept', which is real semantic value the schema lacks, but it says nothing about length limits or content restrictions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Add a ... note to an entry') and qualifies the note as 'staff-only internal', which sets it apart from public comments like comment_on_application. It doesn't explicitly differentiate from edit_entry_note or delete_entry_note, but the verb choice makes the distinction inferable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No statement of when to use this tool versus edit_entry_note, delete_entry_note, or list_entry_notes, and no prerequisites or exclusions. The only usage signal is the default dry_run behavior, which is implied rather than explained as a workflow step.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
approve_applicationApprove an applicationADestructiveInspect
Approve an open application: the entry is created live from its proposal, your assessment (as it stands, with any field given here changed) is recorded with it, and the applicant is emailed. The dry run warns when the assessment falls short of the policy or an entry already links its Wikidata item. Never your own application unless you could create that entry directly. Audited. Dry run by default.
| Name | Required | Description | Default |
|---|---|---|---|
| dry_run | No | true (the default): write nothing — show the change and the exact request it would send. false: make the change. | |
| wikipedia | No | An English Wikipedia article about the subject, undisputed and at least 10 days old, confirmed — eligible on its own. | |
| registered | No | Registrations confirmed (20 points each). | |
| press_points | No | Press coverage, 0–50 points. | |
| impersonation | No | A significant risk of impersonation, in your judgement — eligible on its own. | |
| application_id | Yes | The application’s id (list_applications). | |
| associated_entry | No | An associated eligible entry confirmed (100 points). | |
| verified_accounts | No | Verified TikTok/Snapchat accounts confirmed (50 points each). |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | A dry run: what to do next to make the change, in words. |
| result | No | A real run: the route’s own answer, where the tool adds facts of its own beside it. |
| confirm | No | A dry run of a change that needs it: the exact target to send back as `confirm` with dry_run: false. |
| dry_run | No | true: a dry run, which wrote nothing. Absent from a real run. |
| replayed | No | A real run with an idempotency_key already used for this change: the first call’s answer, given back; nothing was written now. |
| would_send | No | A dry run: the exact request the real run would send (`method`, `path`, any `headers` such as an Idempotency-Key, and its `body`, `form` or `query`), or the requests, in order. |
| may_edit_live | No | A dry run of a live edit: whether this key’s account may edit this entry live. |
| refused_because | No | A dry run the real run would be refused for: why, in words. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag this as destructive, non-idempotent and mutating, and the description goes well beyond them: it discloses that a live entry is created, the applicant is emailed, the assessment is overwritten with the given fields, the action is audited, and the dry run surfaces policy shortfalls and Wikidata-item conflicts.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and its effects, and every sentence carries information — side effects, warning behavior, the self-approval restriction, auditability, default mode. It is dense and slightly packed but has no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, multi-effect approval tool with an output schema and fully documented parameters, the description covers side effects, preconditions, the self-approval restriction, and the safe default. An agent has everything needed to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description adds real meaning on top, explaining that dry_run defaults to true and only warns, and that assessment fields are applied as changes to the current assessment rather than supplied wholesale.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (approve an application) and enumerates the concrete consequences: the entry goes live from its proposal, the assessment is recorded alongside it, and the applicant is emailed. This clearly separates it from siblings like reject_application or assess_application without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit exclusion — never approve your own application unless you could create that entry directly — plus the default dry-run posture and the conditions the dry run warns about. It stops short of naming an alternative tool, but the when/when-not conditions are clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ask_applicantAsk an applicant for moreAInspect
Ask the applicant a question: it goes on the application’s thread, they are emailed it, and the application waits on them (needs_info) until they reply. Only for an application waiting on a reviewer. Audited. Dry run by default.
| Name | Required | Description | Default |
|---|---|---|---|
| dry_run | No | true (the default): write nothing — show the change and the exact request it would send. false: make the change. | |
| message | Yes | Your question — the applicant sees it. | |
| application_id | Yes | The application’s id (list_applications). |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | A dry run: what to do next to make the change, in words. |
| result | No | A real run: the route’s own answer, where the tool adds facts of its own beside it. |
| confirm | No | A dry run of a change that needs it: the exact target to send back as `confirm` with dry_run: false. |
| dry_run | No | true: a dry run, which wrote nothing. Absent from a real run. |
| replayed | No | A real run with an idempotency_key already used for this change: the first call’s answer, given back; nothing was written now. |
| would_send | No | A dry run: the exact request the real run would send (`method`, `path`, any `headers` such as an Idempotency-Key, and its `body`, `form` or `query`), or the requests, in order. |
| may_edit_live | No | A dry run of a live edit: whether this key’s account may edit this entry live. |
| refused_because | No | A dry run the real run would be refused for: why, in words. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare non-readOnly, non-destructive, non-idempotent, but the description adds the real behavioral payload: the question is posted to the thread, the applicant is emailed, the application enters a waiting (needs_info) state until reply, and the action is audited. That is exactly the beyond-annotations context an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences with no filler; the core action and its consequences are front-loaded, with the precondition, audit note, and dry-run default following compactly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, a 100%-covered input schema, and full annotations, the description supplies everything else an agent needs — purpose, side effects, precondition, audit, and default dry-run behavior — leaving no critical gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so parameters are already documented, and dry_run's default and message's limit are fully covered. The description clarifies the effect of the message (thread + email) but adds little parameter-level detail beyond what the schema states, matching the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (ask), resource (applicant), and the concrete effects — thread post, email, and transition to needs_info. These side effects clearly distinguish it from a plain comment_on_application, letting an agent pick the right tool without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Only for an application waiting on a reviewer' is an explicit precondition that tells the agent when the tool applies. It stops short of naming alternatives (e.g., comment_on_application for non-blocking messages), so it lands just below the top band.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
assess_applicationAssess an applicationADestructiveInspect
Save your assessment of an open application against the eligibility policy, without deciding it: give only the fields that change; the rest stay as the application has them. The dry run shows the score it comes to. Audited. Dry run by default.
| Name | Required | Description | Default |
|---|---|---|---|
| dry_run | No | true (the default): write nothing — show the change and the exact request it would send. false: make the change. | |
| wikipedia | No | An English Wikipedia article about the subject, undisputed and at least 10 days old, confirmed — eligible on its own. | |
| registered | No | Registrations confirmed (20 points each). | |
| press_points | No | Press coverage, 0–50 points. | |
| impersonation | No | A significant risk of impersonation, in your judgement — eligible on its own. | |
| application_id | Yes | The application’s id (list_applications). | |
| associated_entry | No | An associated eligible entry confirmed (100 points). | |
| verified_accounts | No | Verified TikTok/Snapchat accounts confirmed (50 points each). |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | A dry run: what to do next to make the change, in words. |
| result | No | A real run: the route’s own answer, where the tool adds facts of its own beside it. |
| confirm | No | A dry run of a change that needs it: the exact target to send back as `confirm` with dry_run: false. |
| dry_run | No | true: a dry run, which wrote nothing. Absent from a real run. |
| replayed | No | A real run with an idempotency_key already used for this change: the first call’s answer, given back; nothing was written now. |
| would_send | No | A dry run: the exact request the real run would send (`method`, `path`, any `headers` such as an Idempotency-Key, and its `body`, `form` or `query`), or the requests, in order. |
| may_edit_live | No | A dry run of a live edit: whether this key’s account may edit this entry live. |
| refused_because | No | A dry run the real run would be refused for: why, in words. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the mutation profile (readOnly=false, destructive=true, idempotent=false), so the safety bar is partly covered. The description adds genuinely new behavior: partial-merge semantics ('give only the fields that change; the rest stay as the application has them'), auditing, and the score preview from dry run.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight clauses with no filler: partial-update rule, dry-run preview, audit note. Front-loaded with the core action and the critical 'without deciding it' qualifier.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter scoring mutation with an output schema, the description covers everything the agent needs: what it writes, the no-decision constraint, merge semantics, dry-run default, and auditability. Return values are legitimately covered by the output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% so the baseline is 3, but the description adds a semantic the schema does not: unspecified fields are preserved rather than cleared. That merge behavior materially affects how an agent should populate the 8 parameters, so it earns above baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — 'Save your assessment of an open application against the eligibility policy' — and immediately scopes it as 'without deciding it.' That clause cleanly separates it from the decision siblings (approve_application, reject_application, mark_application_spam) without needing to open either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear usage context: it applies to 'an open application' and is explicitly not the deciding action, and it notes the default dry-run posture. It never names an alternative tool explicitly (e.g. 'to decide, use approve_application'), so routing is inferred rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
comment_on_applicationComment on an applicationAInspect
Add a message to an application’s thread — the applicant sees it on their application (and is not emailed). To ask them something and wait for the answer, use ask_applicant. Audited. Dry run by default.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | The message — the applicant sees it. | |
| dry_run | No | true (the default): write nothing — show the change and the exact request it would send. false: make the change. | |
| application_id | Yes | The application’s id (list_applications). |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | A dry run: what to do next to make the change, in words. |
| result | No | A real run: the route’s own answer, where the tool adds facts of its own beside it. |
| confirm | No | A dry run of a change that needs it: the exact target to send back as `confirm` with dry_run: false. |
| dry_run | No | true: a dry run, which wrote nothing. Absent from a real run. |
| replayed | No | A real run with an idempotency_key already used for this change: the first call’s answer, given back; nothing was written now. |
| would_send | No | A dry run: the exact request the real run would send (`method`, `path`, any `headers` such as an Idempotency-Key, and its `body`, `form` or `query`), or the requests, in order. |
| may_edit_live | No | A dry run of a live edit: whether this key’s account may edit this entry live. |
| refused_because | No | A dry run the real run would be refused for: why, in words. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds traits beyond the annotations: the comment is visible to the applicant, does NOT trigger an email, the action is audited, and it runs as a dry run by default. These are concrete, consequential behaviors (safety-by-default, audit trail, notification semantics) not derivable from readOnlyHint/destructiveHint/idempotentHint alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the action and its visible effect, then the alternative, then the audit/dry-run notes. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With annotations, a 100%-covered schema, and an output schema present, the description supplies exactly the missing context (visibility, notification, audit, dry-run default) an agent needs to call it correctly. Nothing material is omitted.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so body, dry_run, and application_id are already fully documented (including the dry_run default and body length limits). The description only restates the 'applicant sees it' semantics already present in the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (add a message) and resource (an application's thread) and immediately defines the scope ('applicant sees it on their application'). It names the sibling ask_applicant and distinguishes itself from it, so an agent can route without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly gives the when-not/alternative: 'To ask them something and wait for the answer, use ask_applicant.' The condition that selects the alternative is stated, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
comment_on_my_submissionComment on my own submissionAInspect
Add a message to one of this key’s own account’s submissions (or, for a reviewer, any they may see): the reviewer reads it with the submission, and the submitter sees it on theirs. Answering a question a reviewer asked on your application sends it back to them. Audited. Dry run by default.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The submission’s id (list_my_submissions, or the tool that sent it). | |
| text | Yes | The message, in plain words; at most 2,000 characters. | |
| dry_run | No | true (the default): write nothing — show the change and the exact request it would send. false: make the change. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | A dry run: what to do next to make the change, in words. |
| result | No | A real run: the route’s own answer, where the tool adds facts of its own beside it. |
| confirm | No | A dry run of a change that needs it: the exact target to send back as `confirm` with dry_run: false. |
| dry_run | No | true: a dry run, which wrote nothing. Absent from a real run. |
| replayed | No | A real run with an idempotency_key already used for this change: the first call’s answer, given back; nothing was written now. |
| would_send | No | A dry run: the exact request the real run would send (`method`, `path`, any `headers` such as an Idempotency-Key, and its `body`, `form` or `query`), or the requests, in order. |
| may_edit_live | No | A dry run of a live edit: whether this key’s account may edit this entry live. |
| refused_because | No | A dry run the real run would be refused for: why, in words. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint=false, idempotent=false, dry-run not declared there), the description adds real behavioral context: the comment is 'Audited', it is 'Dry run by default', both reviewer and submitter see it, and answering a reviewer's question routes the application back to them — a non-obvious side effect an agent must know. This meaningfully exceeds what the structured fields convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The content is front-loaded: purpose first, then the reviewer/submitter visibility nuance, then the two terse operational flags ('Audited. Dry run by default.'). The parenthetical audience clause is dense but earns its place; nothing is padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation, and the description covers the important operational facts (auditing, dry-run default, visibility, workflow routing). The only remaining gap is that it doesn't explicitly contrast with the near-identical comment_on_application sibling, which an agent choosing between them would benefit from.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both required parameters (id, text) and dry_run are fully documented in the schema itself, including formats and limits. The description adds only the audience framing around 'id' and repeats the dry-run default, so it does not go meaningfully beyond the schema — baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource — adding a message to a submission — and immediately scopes it by audience ('this key's own account's submissions', or 'any they may see' for a reviewer). That audience split is what separates it from the sibling comment_on_application, so an agent can distinguish the two without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear context for when this tool applies (commenting on your own submission, or a reviewer commenting on something visible) and notes the concrete case of answering a reviewer's question. It stops short of naming the alternative sibling (comment_on_application) or stating explicit exclusions, so it is clear-but-not-routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_entry_noteDelete an internal noteADestructiveInspect
Delete an internal note on an entry (its author, or anyone who manages entries). The audit log keeps what it said. Dry run by default.
| Name | Required | Description | Default |
|---|---|---|---|
| entry | Yes | The entry: its VHID (11 digits), its short name (as in verifiedhandles.org/<short>), or its Wikidata QID (Q42). | |
| dry_run | No | true (the default): write nothing — show the change and the exact request it would send. false: make the change. | |
| note_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | A dry run: what to do next to make the change, in words. |
| result | No | A real run: the route’s own answer, where the tool adds facts of its own beside it. |
| confirm | No | A dry run of a change that needs it: the exact target to send back as `confirm` with dry_run: false. |
| dry_run | No | true: a dry run, which wrote nothing. Absent from a real run. |
| replayed | No | A real run with an idempotency_key already used for this change: the first call’s answer, given back; nothing was written now. |
| would_send | No | A dry run: the exact request the real run would send (`method`, `path`, any `headers` such as an Idempotency-Key, and its `body`, `form` or `query`), or the requests, in order. |
| may_edit_live | No | A dry run of a live edit: whether this key’s account may edit this entry live. |
| refused_because | No | A dry run the real run would be refused for: why, in words. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=false, so the safety profile is covered. The description adds genuinely new behavioral context beyond that: the note's content is retained in the audit log (so the deletion is discarding visibility, not history) and the operation is permission-gated to the author or entry managers.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three compact sentences, front-loaded with the action and followed by the constraint and the default. 'Dry run by default' mildly duplicates the schema default, but as a headline safety cue it earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value explanation is not needed. The description covers the key things an agent needs: permission scope, audit-log retention, and the dry-run default. It stops short of describing failure modes (e.g., invalid note_id) but nothing critical is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 67%: 'entry' is richly documented in the schema (VHID/short name/QID) and 'dry_run' explains both branches. The description adds no parameter detail of its own beyond restating the dry-run default, and note_id carries only a regex pattern with no prose anywhere. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('delete') and resource ('an internal note on an entry'), which cleanly separates it from add_entry_note, edit_entry_note, and list_entry_notes. It even adds scope qualifiers (author or entry managers), so an agent can identify the operation without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The permission parenthetical ('its author, or anyone who manages entries') tells the agent who is eligible, and 'dry run by default' hints at the safe call pattern. However, there is no explicit guidance on when to delete versus edit_entry_note, nor any stated precondition or when-not-to-use condition.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
draft_articleDraft an articleAInspect
Start a new article as a draft, as Console → Articles does: nothing is public until a publisher publishes it. The body comes in Markdown (the default) or HTML and is stored as cleaned HTML, through the site’s allowlist. The slug comes from the title when left out. Give what it is about and mentions (entries: their pages list it under “In the news”), the byline, a topic, and a hero image (an uploaded image’s media id) with its alt text. Audited with the key and the tool. Dry run by default: it shows the cleaned HTML exactly as it would be stored, the slug and the address it would have, the links the body makes (each entry’s title), and what the allowlist took out (dropped: each tag, and each attribute as tag@attribute, with how many), and checks what it can without writing.
| Name | Required | Description | Default |
|---|---|---|---|
| dek | No | The standfirst under the headline, also the page’s description in search results; at most 300 characters. | |
| body | No | The article’s text, in Markdown by default (body_format). A link to an entry is [Name](/<VHID>): it shows the entry’s current name while its text is that name. A heading “#” becomes a second-level heading (the title is the first). Raw HTML in Markdown is shown as text. | |
| kind | No | "news" (the default) or "guide". | news |
| slug | No | The address’s last part: lower-case letters and digits in words split by single hyphens (e.g. "x-drops-legacy-checkmarks"), at most 80, never 11 digits. | |
| about | No | The entries the article is about, in order (VHID, short name or QID). | |
| title | Yes | The headline, at most 200 characters. | |
| topic | No | A News article’s one topic: "verification" (Verification), "impersonation" (Impersonation and scams), "official-accounts" (Official accounts), "vh-data" (VH data), "vh-updates" (VH updates); or a guide’s group on the guides page: "check" (Check an account), "use" (Use Verified Handles), "contribute" (Get listed and help keep it right), "developers" (Developers and AI). null for none. | |
| authors | No | The byline, in order: each author is an entry (VHID, short name or QID), at most 10. Whoever publishes may pick it again then. | |
| dry_run | No | true (the default): write nothing — show the change and the exact request it would send. false: make the change. | |
| summary | No | Why, in a few plain words, kept with the revision in the article’s history. Never an internal tracking ID. | |
| hero_alt | No | The hero image’s alt text: what it shows, for a reader who cannot see it. Only with a hero image. | |
| mentions | No | The entries it names in passing, in order. | |
| body_format | No | "markdown" (the default) or "html": how `body` is written. Either is stored as cleaned HTML, through the site’s allowlist. | markdown |
| hero_media_id | No | The hero image: an uploaded image’s media id (upload_image, or media_catalog); null for none. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | A dry run: what to do next to make the change, in words. |
| result | No | A real run: the route’s own answer, where the tool adds facts of its own beside it. |
| confirm | No | A dry run of a change that needs it: the exact target to send back as `confirm` with dry_run: false. |
| dry_run | No | true: a dry run, which wrote nothing. Absent from a real run. |
| replayed | No | A real run with an idempotency_key already used for this change: the first call’s answer, given back; nothing was written now. |
| would_send | No | A dry run: the exact request the real run would send (`method`, `path`, any `headers` such as an Idempotency-Key, and its `body`, `form` or `query`), or the requests, in order. |
| may_edit_live | No | A dry run of a live edit: whether this key’s account may edit this entry live. |
| refused_because | No | A dry run the real run would be refused for: why, in words. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=false, but the description adds substantial context beyond them: dry run is the default and never writes, content passes through an allowlist sanitizer, nothing is public until published, and calls are audited. This is exactly the extra behavioral detail annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action and the dry-run default, and every sentence carries information. It is dense and reads as one long block, which makes scanning the parameter guidance harder than a short bulleted structure would, but there is little wasted text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description does not need to explain return values, yet it still usefully describes what a dry run surfaces (cleaned HTML, slug, address, links, dropped tags/attributes). For a 14-parameter mutation tool with a default dry run, this is close to complete; only failure/validation behavior is left vague.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: slug is derived from title when omitted, about vs mentions distinction (mentions appear under 'In the news'), hero_media_id refers to an uploaded image, and hero_alt accompanies it. It does not enumerate all 14 params, but the gaps are ones the schema already covers well.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — 'Start a new article as a draft' — plus how it relates to Console → Articles and the publish step. Combined with 'nothing is public until a publisher publishes it', an agent can distinguish this from update_article_draft or get_article without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implicitly scopes usage to creating new drafts and explains the dry-run-first workflow explicitly. It does not name update_article_draft as the alternative for editing an existing draft, so the create-vs-update boundary is left partly to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
edit_entry_noteChange an internal noteADestructiveInspect
Rewrite one of your own internal notes on an entry (only its author may). Audited. Dry run by default.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | ||
| entry | Yes | The entry: its VHID (11 digits), its short name (as in verifiedhandles.org/<short>), or its Wikidata QID (Q42). | |
| dry_run | No | true (the default): write nothing — show the change and the exact request it would send. false: make the change. | |
| note_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | A dry run: what to do next to make the change, in words. |
| result | No | A real run: the route’s own answer, where the tool adds facts of its own beside it. |
| confirm | No | A dry run of a change that needs it: the exact target to send back as `confirm` with dry_run: false. |
| dry_run | No | true: a dry run, which wrote nothing. Absent from a real run. |
| replayed | No | A real run with an idempotency_key already used for this change: the first call’s answer, given back; nothing was written now. |
| would_send | No | A dry run: the exact request the real run would send (`method`, `path`, any `headers` such as an Idempotency-Key, and its `body`, `form` or `query`), or the requests, in order. |
| may_edit_live | No | A dry run of a live edit: whether this key’s account may edit this entry live. |
| refused_because | No | A dry run the real run would be refused for: why, in words. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and idempotentHint=false, and the description adds real context beyond them: the author-only permission rule, an audit trail, and the dry-run-default behavior. It does not explain what happens to the prior note text or whether history is retained, which is the main residual gap for a destructive edit.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three terse clauses, front-loaded with the action and followed by the two facts an agent most needs before calling. No filler and nothing buried.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation, and the description covers auth, audit, and dry-run for this mutation. The missing pieces are note_id provenance and whether the overwritten text is recoverable, which matter for a destructive rewrite.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 50%: entry and dry_run are documented inline, while text and note_id have no descriptions anywhere. The description reinforces the dry-run default but does not explain note_id's format or where to obtain it (e.g., list_entry_notes), so it does not compensate for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Rewrite ... internal notes on an entry") and scopes it with "one of your own," which separates it from add_entry_note, delete_entry_note, and list_entry_notes without ambiguity. It stops short of naming a sibling explicitly, so it is clear but not maximally differentiated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"only its author may" gives a hard precondition and "Dry run by default" tells the agent the safe calling pattern. It never states when to pick this over add_entry_note or delete_entry_note, but the rewrite semantics imply the context well enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_by_handleFind entries by handleARead-onlyInspect
Which public entries list a handle: “is x.com/someone an official account, and whose?”. Give a profile’s address as url (https://x.com/someone), or platform (its catalog id: twitter, instagram, youtube, …) and value (someone or @someone). Answers each entry’s VHID, title and URL, the handle as the entry lists it, and whether that handle is verified; an empty list when no entry lists it. Case is ignored where the platform ignores it. Email addresses are not looked up.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | A profile’s address, such as https://x.com/someone. Instead of platform and value. | |
| value | No | The handle on that platform, such as someone or @someone. | |
| platform | No | The platform’s catalog id, such as twitter. With value. |
Output Schema
| Name | Required | Description |
|---|---|---|
| value | Yes | The handle looked up, as the site stores one: from `url`, what follows the platform’s address. |
| results | Yes | Verified handles first, then by VHID; at most 50. Empty when no public entry lists it. |
| platform | Yes | The platform looked on: the one asked, or the one whose address `url` is. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint and openWorldHint=false, but the description adds real behavioral context: an empty list is returned when nothing matches, case is ignored where the platform ignores it, and emails are excluded. This goes meaningfully beyond what the annotations convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded as the quoted question, followed by input forms then output behavior. It is a single dense block with no wasted sentences, though the packing of output fields, case rules and the email caveat into one paragraph makes it slightly heavy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description needn't restate return values, yet the tool is a simple read lookup whose annotations and schema cover safety and inputs well. The only meaningful gap is any statement of when this should be chosen over the other entry-retrieval siblings.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, so the baseline is 3. The description adds the mutual-exclusivity relationship the schema does not express ('url ... instead of platform and value') and gives concrete value formats (someone or @someone), which helps the agent pick a valid input shape.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (find entries by handle) and frames it as a reverse lookup, quoting the exact question it answers ('is x.com/someone an official account, and whose?'). This clearly separates it from siblings like get_entries and search_entries, which are not handle-keyed lookups.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains the two input ways ('Give a profile's address as url... or platform... and value') and gives an explicit exclusion ('Email addresses are not looked up'). It does not name a competing sibling tool or state when to prefer this over search_entries, so it stops short of full when/when-not routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_articleRead an articleARead-onlyInspect
One article: its fields (title, dek, slug, topic, hero image and alt text, a data story’s chart, status, dates), its byline and the entries it is about and mentions (each with its current title), and its body as stored (body_html, cleaned HTML) and as Markdown (body_markdown, the editor’s own conversion: an entry link reads Name). markdown_round_trips says whether that Markdown, sent back unchanged, stores the same HTML; where it is false, something (a table’s spans, an image’s size) would change, so edit in HTML. These are the words the article shows now: a save waiting for a publisher is pending_revision, seen in the console’s preview.
| Name | Required | Description | Default |
|---|---|---|---|
| article | Yes | The article: its id (list_articles), its address ("/news/<slug>", "/guides/<slug>" or the full URL), or its slug alone. |
Output Schema
| Name | Required | Description |
|---|---|---|
| article | Yes | |
| preview | Yes | The console’s preview of the newest words (signed in). |
| latest_revision | Yes | The newest revision that carries words. |
| pending_revision | Yes | A save waiting for a publisher, newer than what readers see. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint, the description discloses genuinely non-obvious traits: the two body representations, the exact form of entry links in Markdown, the meaning of markdown_round_trips as a fidelity guarantee with a concrete failure mode (table spans, image sizes), and that the returned content reflects pending revisions rather than published state. That is substantive context an agent could not get from annotations or schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The first sentence is an extremely long run-on that enumerates fields inside nested parentheticals, which makes it hard to parse despite containing useful facts. The content largely earns its place, but the structure delays the core action behind a wall of field enumeration rather than front-loading what the tool does.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and annotations covering the read-only profile, the description is more than complete enough for an agent to call this correctly. Minor gap: it never clarifies the relationship to get_article_history or get_entry, which matters in a namespace this crowded.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema already documents that the single `article` parameter accepts an id, an address, or a slug. The description adds nothing about that parameter — no format examples, no fallback behavior on ambiguity. Baseline 3 applies because the schema carries the full burden.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description makes clear this returns a single article with its fields, byline, related entries, and both HTML and Markdown bodies. That level of specificity on returned content distinguishes it from list-oriented siblings like list_articles, though it never states the verb explicitly or names adjacent readers like get_entry or get_article_history.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied — the reader must infer that this is the tool for fetching one article's current content. There is no explicit when-to-use, no exclusions, and no routing to alternatives such as get_article_history for past versions or list_articles for discovery. The one piece of actionable guidance ('edit in HTML' when markdown_round_trips is false) is about editing, not about selecting this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_article_historyAn article’s historyARead-onlyInspect
An article’s revisions, newest first (the last 50): each save, publication, schedule, slug change and taking down, with its action, the status it left, who made it, from where (surface) and their summary. current_revision is what readers see; pending_revision, a save waiting for a publisher.
| Name | Required | Description | Default |
|---|---|---|---|
| article | Yes | The article: its id (list_articles), its address ("/news/<slug>", "/guides/<slug>" or the full URL), or its slug alone. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| title | Yes | |
| status | Yes | |
| revisions | Yes | |
| latest_revision | Yes | |
| current_revision | Yes | |
| pending_revision | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint=true and openWorldHint=false, and the description adds substantial behavioral detail beyond that: newest-first ordering, a 50-item limit, exact event types included, the metadata returned for each event, and the distinction between current_revision and pending_revision. There is no contradiction with the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The definition is only two sentences and is front-loaded with the core return behavior. The dense first sentence earns its length by enumerating event types and returned metadata, while the second sentence cleanly explains current_revision and pending_revision.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool’s simplicity, full schema coverage, annotations, and an available output schema, the description is complete enough for correct invocation. It covers ordering, result limit, event scope, returned fields, and the special meaning of current_revision and pending_revision.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single article parameter has 100% schema description coverage, including accepted forms such as id, address, URL, or slug. The description does not add any parameter-specific meaning beyond the schema, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states exactly what the tool returns: an article’s revisions, newest first, limited to the last 50, with enumerated event types such as saves, publications, schedules, slug changes, and takedowns. This is specific enough to distinguish it from get_article and get_entry_history, which cover current article data and entry history respectively.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies this is the tool for viewing an article’s revision history and clarifies the meaning of current_revision versus pending_revision. However, it does not explicitly say when to use this tool instead of get_article or get_entry_history, nor does it name exclusions or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_entriesGet many entriesARead-onlyInspect
Up to 50 entries’ public records in one call, by VHID or short name (not a Wikidata QID: get_entry or search_entries finds an entry by its item), each answered as get_entry answers it signed out — the entry, or not_found — in the order given. A name given twice is answered once.
| Name | Required | Description | Default |
|---|---|---|---|
| entries | Yes | The entries: each a VHID (11 digits) or a short name. |
Output Schema
| Name | Required | Description |
|---|---|---|
| results | Yes | One element per key asked for, in the order asked, a repeated key once (where it first appears). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the read-only, closed-world safety profile, and the description still layers on useful behavior: results come back in the order given, each item resolves to an entry or not_found, and the view is the signed-out one. Partial-failure semantics (per-item not_found rather than a whole-call error) are exactly the kind of detail an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense sentence with the batch size and identifier constraint front-loaded and no filler. The nested parenthetical and em-dash clause make it slightly harder to parse than it needs to be, but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema exists so return values need no explanation, and annotations carry the safety profile. What remains — ordering, per-item failure mode, dedupe, QID exclusion — is all present, so an agent has everything needed to call this correctly on the first try.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Adds meaning beyond the 100%-covered schema: the acceptable identifier forms are VHID or short name but explicitly NOT a Wikidata QID, and duplicate names collapse to one answer. That QID exclusion and dedupe rule are not in the schema and materially affect how the argument should be built.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (returns public records), the resource (entries), and the batch bound (up to 50 in one call), then explicitly differentiates itself from get_entry and search_entries. An agent can tell exactly what this does versus its siblings without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly excludes Wikidata QIDs and routes to get_entry or search_entries for item-based lookup, which is real routing guidance. It lacks a positive 'use this when batching many lookups to avoid N calls' framing, but the batch/inline-alternative split is otherwise clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_entryGet an entryARead-onlyInspect
One entry, by VHID, short name or Wikidata QID: its public record (title, description, handles, image, URL) and, as editing, what the editor would load for this key — the current revision, the editable fields, every handle with who manages it (the Wikidata sync or the site), which fields the sync manages, and whether this key may edit it live. Without an API key, the public record alone.
| Name | Required | Description | Default |
|---|---|---|---|
| entry | Yes | The entry: its VHID (11 digits), its short name (as in verifiedhandles.org/<short>), or its Wikidata QID (Q42). | |
| include_platforms | No | Also list every platform a handle can be on (id, name, URL prefix). Needs an API key. |
Output Schema
| Name | Required | Description |
|---|---|---|
| vhid | Yes | The entry’s VHID: 11 digits, permanent. |
| entry | Yes | The entry’s public record, as GET /api/v1/entities/{vhid} answers it. Null for a VHID that is not public (a deleted entry): `editing` says more. |
| editing | No | With an API key: what the editor loads for this key (GET /api/editor/{vhid}): `baseRevisionId`, `capabilities` (whether it may edit live or propose), `editable`, `handles`, `provenance` (which fields the Wikidata sync manages), `qid`, and `platforms` with include_platforms. Where the key may not open the editor, the route’s `status` and `error`. Absent with no key. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds valuable behavioral context: the authentication gate ('Without an API key, the public record alone') and the exact contents of the editor payload, which go beyond what the annotations state.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single dense sentence that front-loads the core action and identifier formats, then explains the two response modes. Every clause carries information, though the nested 'as `editing` …' structure is slightly convoluted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the presence of an output schema, complete parameter schemas, and annotations, the description is largely complete for an agent to invoke it correctly. It covers authentication behavior and the dual public/editing response shape, though it omits potential error conditions for invalid keys.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are fully documented in the schema. The description restates the accepted identifier formats (VHID, short name, QID) and adds the API-key condition for platform data, but it does not add syntax or format details beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states what the tool retrieves: one entry identified by VHID, short name, or QID, along with its public record and the editing payload. It implicitly distinguishes itself from the list-oriented sibling get_entries by emphasizing 'One entry,' but it does not explicitly name or contrast with alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the singular 'One entry' and the note about what an editor would load, but there are no explicit when-to-use/when-not instructions or named alternatives such as get_entries or find_by_handle. The inclusion of the editing payload suggests an editing context, yet the description leaves the agent to infer selection criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_entry_historyEntry historyARead-onlyInspect
An entry’s public edit history, newest first (next_offset pages on). A merged entry’s key gives its own history.
| Name | Required | Description | Default |
|---|---|---|---|
| entry | Yes | The entry: its VHID (11 digits), its short name (as in verifiedhandles.org/<short>), or its Wikidata QID (Q42). | |
| limit | No | ||
| offset | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| vhid | Yes | The entry’s VHID: 11 digits, permanent. |
| limit | Yes | The page size used: the `limit` asked for, clamped to the endpoint’s range. |
| offset | Yes | The offset used: the `offset` asked for, clamped to 0–10,000. |
| history | Yes | Newest first. |
| merged_into | No | Present when the entry was merged into another: that entry’s VHID. The history is still the merged entry’s own. |
| next_offset | Yes | The `offset` of the next page, or null when this is the last one. Follow it rather than computing it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare this is a read-only, closed-world operation. The description adds useful behavioral context beyond annotations: the history is public, ordered newest first, paginated via next_offset, and merged entries expose their own history.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with no wasted text. The core behavior is front-loaded and the edge case for merged entries is appended efficiently.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given read-only annotations and an existing output schema, the description covers the key behavioral points an agent needs: public history, newest-first ordering, pagination, and merged-entry behavior. It is only slightly incomplete because it does not route the agent between this and related history/entry tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The entry parameter is well documented in the schema, but limit and offset have no schema descriptions and only 33% overall schema coverage. The description partially compensates by mentioning `next_offset` pagination, but it does not explain limit or offset semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the resource as an entry’s public edit history, with sorting and pagination behavior. It does not explicitly distinguish this from siblings like get_entry or get_article_history, so it is clear but lacks sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied: call this to retrieve an entry’s edit history. The description does not explicitly say when to use this instead of get_entry or get_article_history, nor does it state exclusions or alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_reconcileAn entry against its Wikidata item, value by valueARead-onlyInspect
Console → Wikidata, per entry, as JSON: the entry against its Wikidata item, value by value. fields: the title, subtitle, description and image, each with what VH shows, who keeps it on VH (owner: sync, the Wikidata sync; site, a person), what the item says now (the description: the English Wikipedia article it links) and state (same, differs, or unknown when Wikidata did not answer). handles: every handle the entry or the item holds, with on_vh, owner, what the item says of it as the sync last read it (wikidata: listed, deprecated, ended, outranked, gone, or null when the item never listed it; qualifier_only when it is a YouTube channel ID the item states only as its YouTube handle’s qualifier, “The channel ID is only a qualifier on Wikidata”, which the sync still counts as listed) and whether the two agree. propose, on a value that differs, is the change propose_wikidata_changes could carry for it (a statement to add, or a label or description to set; for a lead image that stands for the item’s logo, logo, the console’s “Replace the logo” with that file; for a handle the item deprecated, or one VH’s handle checker last found dead that the item does not count as current, remove_from_vh: take it off VH with update_entry_handles, never push it back onto Wikidata; for one the item states but no longer counts as current otherwise, set_rank preferred or remove_qualifier on that statement, with its GUID and its end time’s hash as the write wiki has them, write_wiki saying whether it answered; never remove_qualifier for one the sync keeps, which it takes off VH instead); it is null, with pending_id, while that change already waits in Review. remove_after: when the sync takes a handle it keeps off VH (the item deprecated, ended or no longer states it), not before; null otherwise. held_back: values a person took off the entry, which the sync does not add back. pending: what waits in Review for the item. sync: when it was last synced, and whether it waits in the priority queue (queue_entry_sync puts it there). Reads the item live through the sync’s rate limit. Read only.
| Name | Required | Description | Default |
|---|---|---|---|
| entry | Yes | The entry: its VHID (11 digits), its short name (as in verifiedhandles.org/<short>), or its Wikidata QID (Q42). |
Output Schema
| Name | Required | Description |
|---|---|---|
| vhid | Yes | The entry’s VHID. |
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only status, but the description adds genuinely new behavior: it 'Reads the item live through the sync's rate limit', explains `state: unknown` when Wikidata did not answer, and describes `propose: null` with `pending_id` while a change waits in Review. That is useful context beyond the annotations, though the write-side routing is buried in output prose.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded in the first clause, but the remainder is a single sprawling ~400-word block of nested parentheticals detailing return fields. Since an output schema already exists, this return-value exposition largely duplicates structured data and is not appropriately sized.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex reconciliation read with a simple input schema and a present output schema, the description covers read semantics, rate limits, and the meaning of null/pending states and follow-up tools. It falls short only on explicit when-to-use guidance relative to sibling readers.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single parameter and schema description coverage is 100%, with the schema fully explaining VHID/short-name/QID forms. The description adds nothing about the `entry` argument, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence gives a specific verb+resource ('Console → Wikidata, per entry, as JSON: the entry against its Wikidata item, value by value'), which separates it from plain entry readers like get_entry or handle_health. It is clear what the tool is, but the phrasing is idiosyncratic and never states its name's scope plainly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: it says the field `propose` is 'the change propose_wikidata_changes could carry' and that removing a handle is done 'with update_entry_handles', which routes follow-up actions. However it never states when to call get_reconcile rather than get_entry or handle_health, nor any prerequisite.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
link_article_entriesLink entries to an articleADestructiveIdempotentInspect
Set the entries an article is about and those it mentions (their pages list it under “In the news” once it is live), as a save does. By default the entries given are added (one already linked takes the role given) and those in remove taken off; with replace: true the two lists given are the whole of it. Audited with the key and the tool. Dry run by default: it shows the links before and after.
| Name | Required | Description | Default |
|---|---|---|---|
| about | No | Entries the article is about (VHID, short name or QID). | |
| remove | No | Entries to take off it. | |
| article | Yes | The article: its id (list_articles), its address ("/news/<slug>", "/guides/<slug>" or the full URL), or its slug alone. | |
| dry_run | No | true (the default): write nothing — show the change and the exact request it would send. false: make the change. | |
| replace | No | true: `about` and `mentions` are the whole list, and every other entry is taken off. | |
| summary | No | Why, in a few plain words, kept with the revision in the article’s history. Never an internal tracking ID. | |
| mentions | No | Entries it names in passing. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | A dry run: what to do next to make the change, in words. |
| result | No | A real run: the route’s own answer, where the tool adds facts of its own beside it. |
| confirm | No | A dry run of a change that needs it: the exact target to send back as `confirm` with dry_run: false. |
| dry_run | No | true: a dry run, which wrote nothing. Absent from a real run. |
| replayed | No | A real run with an idempotency_key already used for this change: the first call’s answer, given back; nothing was written now. |
| would_send | No | A dry run: the exact request the real run would send (`method`, `path`, any `headers` such as an Idempotency-Key, and its `body`, `form` or `query`), or the requests, in order. |
| may_edit_live | No | A dry run of a live edit: whether this key’s account may edit this entry live. |
| refused_because | No | A dry run the real run would be refused for: why, in words. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (destructive, idempotent, non-read-only), the description adds real context: links surface on entry pages under "In the news" once live, changes are audited with the key and tool, and the call is a dry run by default showing before and after. That is meaningful disclosure of side effects, though the mechanism of the dry-run preview output is only sketched.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four dense sentences, front-loaded with the core action and default semantics before the dry-run note. Nothing is wasted, though the parenthetical clauses make it slightly harder to scan than it could be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a full input schema and an output schema present, the description only needs to cover behavior, and it does: defaults, replace semantics, audit, and the dry-run preview. Only minor edge cases (e.g., an entry appearing in both `about` and `mentions`) go unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description earns above that by explaining cross-parameter behavior — how `about`/`mentions` combine with `remove`, and what `replace` overrides — which the per-field schema text does not convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: setting the entries an article is about and mentions. That scope makes it distinguishable from siblings such as update_entries or set_article_hero, though it never names an alternative explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear operating context: the default is additive with a `remove` list, and `replace: true` makes the given lists the whole truth. What's missing is an explicit statement of when to prefer this over sibling tools like update_entries.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_applicationsThe applications queueARead-onlyInspect
Applications for a new entry (Console → Applications), 30 a page: each with its proposal, the applicant’s case, the assessment (the reviewer’s saved one, else what the applicant claims) and its score against the eligibility policy, the entry already on its Wikidata item, and whether this account may approve it. tab: "open" (to review, oldest first), "needs_info" (awaiting the applicant), "approved", "rejected", "spam", "retracted" or "all"; or "proposals", the quick proposals — new entries proposed with no eligibility case (propose_new_entry, the console form), waiting ones oldest first, or with decided: true the decided ones — each with its proposal, the entry already on its item (duplicate) and whether this account may approve it; decide one with review_submission. With application_id, that one application and its comment thread.
| Name | Required | Description | Default |
|---|---|---|---|
| tab | No | open | |
| page | No | ||
| decided | No | With tab "proposals": the decided quick proposals, newest decision first. | |
| application_id | No | The application’s id (list_applications). |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| qid | No | |
| tab | No | |
| note | No | |
| open | No | It may still be decided. |
| page | No | |
| score | No | The score of that assessment. |
| title | No | The title it proposes, or `(untitled)`. |
| counts | No | |
| status | No | |
| decided | No | |
| assessed | No | A reviewer has saved an assessment. |
| comments | No | |
| criteria | No | |
| has_next | No | |
| proposal | No | What it asks for, in its kind’s shape: for `correction`, `new_entity` and `application`, an `EditPayload` (the fields to set, and for a revert or an approval the server’s own); for `report`, `{reason, note?, media_id?, link?}`; for `claim`, `{method}`. |
| reviewer | No | |
| duplicate | No | |
| proposals | No | |
| submitter | No | |
| assessment | No | The reviewer’s saved assessment, else what the applicant claims. |
| created_at | No | |
| decided_at | No | |
| entry_vhid | No | The entry it became, once approved. |
| application | No | |
| may_approve | No | This account may approve it. |
| applications | No | |
| relationship | No | The applicant’s to the subject. |
| review_notes | No | |
| decision_reason | No | |
| approve_refused_because | No | Why not, when it may not. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, but the description adds real behavior: 30 items per page, ordering (oldest first for review queues), the assessment fallback rule (reviewer's saved one, else what the applicant claims), and per-item flagging of whether this account may approve it. That permission-awareness and sort/fallback context go beyond the annotations, though pagination limits and total counts are not discussed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Core purpose is front-loaded, but the body is one sprawling compound sentence with nested parentheticals and semicolon-chained clauses, which is hard to parse. Much of the item-content enumeration duplicates what the output schema already provides.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers all four parameters' modes, explains the two tab families and the application_id variant, notes permission awareness, and cross-references the deciding tool. With an output schema present, return-shape detail need not be in the description, and the remaining parameter space is adequately addressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 50%, and the description fully compensates: it maps each `tab` enum value to a concrete meaning (open, needs_info, approved, rejected, spam, retracted, all, proposals) and explains the proposals/decided split. It also conveys page size ("30 a page") and the application_id single-record mode, adding meaning the bare enum and schema fields do not.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource: the applications queue for new entries (Console → Applications), and details exactly what each item contains (proposal, applicant's case, assessment, score, existing Wikidata entry, approval eligibility). It is clearly a listing tool for applications, distinguishable from entry-listing siblings such as get_entries or list_review_queue.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains when each `tab` mode applies ("open" to review, oldest first; "needs_info" awaiting the applicant; "proposals" for quick proposals with no eligibility case) and when to pass application_id. It also routes the agent to review_submission for deciding and names propose_new_entry as the source of proposals. It never explicitly excludes or contrasts with adjacent listing tools like list_review_queue or list_my_submissions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_articlesArticlesARead-onlyInspect
The site’s News articles and guides as Console → Articles has them, every one but a deleted one, newest change first: each with its id, kind, slug, title, status (draft, scheduled, published, unpublished), path, topic, and when it was scheduled, published, last updated for readers (modified_at) and changed. Filter by kind, status, topic or author (an entry: the articles whose byline names it).
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | "news" or "guide". | |
| topic | No | Only the articles on this topic. | |
| author | No | Only the articles whose byline names this entry (VHID, short name or QID). | |
| status | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | |
| articles | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint=false, so the safety profile is covered. The description adds genuine context beyond that: deleted articles are excluded, results are ordered by newest change, and modified_at is explicitly defined as reader-facing last update.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Content is front-loaded with the resource and scope, and every clause carries information. It is a single dense run-on sentence, though, which makes the field enumeration harder to scan than it needs to be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be explained, and the description covers scope, ordering, and filter semantics adequately. Minor gap: no explicit note on pagination or result volume for a list that could be large.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 75% and three of four params are enums the schema already documents. The description mainly restates the filterable fields; its only real addition is clarifying that an author entry matches articles whose byline names it, which is largely echoed in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (list the site's News articles and guides) and pins down scope: excludes deleted, ordered by newest change, and enumerates returned fields. It is clearly distinguishable from single-item siblings like get_article and get_article_history.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'every one but a deleted one' scoping and the filter list imply when to use it, but there is no explicit when-to-use guidance and no named alternative (e.g. get_article for a single article). The agent must infer the boundary from siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_entry_notesInternal notesARead-onlyInspect
The staff-only internal notes on an entry, oldest first, with what this key may do to each.
| Name | Required | Description | Default |
|---|---|---|---|
| entry | Yes | The entry: its VHID (11 digits), its short name (as in verifiedhandles.org/<short>), or its Wikidata QID (Q42). |
Output Schema
| Name | Required | Description |
|---|---|---|
| vhid | Yes | |
| notes | Yes | Every note on the entry, oldest first. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the description is not carrying the safety burden. It still usefully adds that results are staff-only (an auth requirement), returned oldest-first (ordering), and annotated with per-key permitted actions — none of which the annotations convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense sentence front-loads the resource and scope, then adds ordering and content detail with zero wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return shape need not be explained, and the description covers auth scope, ordering, and the per-note permission payload. It omits pagination/volume behavior for what could be a long note list, a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the single 'entry' parameter is fully documented in the schema (VHID, short name, or QID). The description adds no additional parameter meaning, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (list) and resource (staff-only internal notes on an entry), plus scope and ordering (oldest first). The 'list' framing clearly separates it from its write siblings add_entry_note, edit_entry_note, and delete_entry_note, though it never names them explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'staff-only' qualifier implies a precondition for use, but there is no explicit when-to-use/when-not statement and no reference to alternatives such as get_entry_admin or the note mutation siblings. Usage context is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_my_submissionsMy own submissionsARead-onlyInspect
This key’s own account’s submissions — proposed changes, new-entry proposals, claims, reports and applications — newest first, 25 a page: each with its status, its entry, when it was sent and decided, and the reviewer’s notes. status: open keeps the ones still waiting. With id, one submission (yours, or any a reviewer may see) with what it asks and its comment thread.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | One submission’s id, from this list or from the tool that sent it. | |
| page | No | ||
| status | No | all |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| qid | No | The Wikidata item it names, if any. |
| kind | No | What was asked: a new entry, a change, a claim, a report or an application. |
| mine | No | You sent it. |
| page | No | |
| entry | No | The entry it is about; null for a new entry or an application. |
| total | No | |
| status | Yes | |
| payload | No | What it asks for, in its kind’s shape: for `correction`, `new_entity` and `application`, an `EditPayload` (the fields to set, and for a revert or an approval the server’s own); for `report`, `{reason, note?, media_id?, link?}`; for `claim`, `{method}`. |
| comments | No | |
| has_next | No | |
| per_page | No | |
| created_at | No | |
| decided_at | No | |
| submissions | No | |
| review_notes | No | What the reviewer wrote when deciding it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds non-annotated behavior: newest-first ordering, a fixed page size of 25, the per-row fields returned, and that a single-id fetch can surface submissions a reviewer may also see. No destructive, auth, or rate-limit caveats beyond that.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but front-loaded: the list behavior and ordering come first, then the filter and the single-id mode. Every clause carries information, though the appositive-heavy style makes it one long breathless run rather than cleanly separated sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema exists, so return fields need not be spelled out, yet the description still names what each row carries. Pagination, ordering, and auth scope (this key's own account) are covered; only the exact semantics of the alternate `status: all` value and page-boundary behavior are left implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 33% (page and status are undocumented in the schema), but the description compensates: it explains `status: open` as the filter for pending items and states the 25-per-page size, effectively documenting page. It adds meaning to `id` as well (yours or any a reviewer may see, with comment thread).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (list this key's own submissions), enumerates the record types covered (proposed changes, new-entry proposals, claims, reports, applications), and scopes it to the key's own account, which cleanly separates it from list_review_queue and list_applications. An agent can identify it without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context for how to steer the tool — `status: open` for the still-waiting ones, `id` to fetch a single submission with its comment thread — but never explicitly names an alternative sibling (e.g. list_review_queue) or states when not to use this tool. Clear context, no exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_review_queueThe review queueARead-onlyInspect
Submissions waiting for a reviewer (or, with status, decided ones), oldest first, up to 100: proposed changes (correction), claims and reports, each with its entry and what it asks. New-entry proposals (new_entity) are not listed here: they wait beside the applications, in list_applications with tab "proposals", and are still decided with review_submission. Narrow to one entry or one kind. Decide one with review_submission.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | ||
| entry | No | The entry: its VHID (11 digits), its short name (as in verifiedhandles.org/<short>), or its Wikidata QID (Q42). | |
| status | No | pending |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | How many submissions it lists. |
| status | Yes | The status listed. |
| of_first | Yes | How many the route answered (up to 100), before new-entry proposals, the entry and the kind narrowed them. |
| submissions | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, and the description adds real context beyond that: a hard 100-item cap, oldest-first ordering, and the fact that status switches to decided items while defaulting to pending. It does not discuss whether listing is paginated past 100 or what happens to excluded types, leaving a small behavioral gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, ordering, and limit in the first clause, then routing guidance. The parenthetical about new_entity is long but earns its place as a disambiguation; a few clauses are dense enough to require rereading.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description needn't document return shapes, and it covers the main operational facts an agent needs: scope, ordering, cap, exclusion of new_entity, and the deciding tool. Only pagination behavior past the 100-item limit and the less common status values are left unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 33% (only `entry` is documented), but the description compensates by describing the `kind` values (correction/claim/report) in prose and explaining that `status` surfaces decided submissions versus the default pending queue. It doesn't spell out the full status enum semantics (merged, superseded, retracted), so it improves on but doesn't fully close the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (list submissions awaiting a reviewer) plus scope details: content types (correction, claim, report), ordering (oldest first), and cap (up to 100). It explicitly carves out new_entity proposals and points to list_applications instead, so the agent can distinguish it from siblings without reading schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use (reviewer queue, optionally with status for decided ones), when-not-to-use (new-entry proposals belong in list_applications with tab "proposals"), and names the follow-up action (decide with review_submission). Narrowing options are also stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mark_application_spamMark an application as spamADestructiveInspect
Mark an open application as spam: it is declined, and the applicant is not told. Cannot be undone. Audited. Dry run by default; the real run needs confirm set to the application’s id.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | Needed with dry_run: false: this change’s exact target, as the dry run gives it in `confirm`. | |
| dry_run | No | true (the default): write nothing — show the change and the exact request it would send. false: make the change. | |
| application_id | Yes | The application’s id (list_applications). |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | A dry run: what to do next to make the change, in words. |
| result | No | A real run: the route’s own answer, where the tool adds facts of its own beside it. |
| confirm | No | A dry run of a change that needs it: the exact target to send back as `confirm` with dry_run: false. |
| dry_run | No | true: a dry run, which wrote nothing. Absent from a real run. |
| replayed | No | A real run with an idempotency_key already used for this change: the first call’s answer, given back; nothing was written now. |
| would_send | No | A dry run: the exact request the real run would send (`method`, `path`, any `headers` such as an Idempotency-Key, and its `body`, `form` or `query`), or the requests, in order. |
| may_edit_live | No | A dry run of a live edit: whether this key’s account may edit this entry live. |
| refused_because | No | A dry run the real run would be refused for: why, in words. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: it states the side effect (declined), the absence of notification to the applicant, irreversibility ('Cannot be undone'), and audit logging, plus the dry-run/confirm safety protocol. These are the exact behaviors an agent must know before a destructive call and are not derivable from destructiveHint=true alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three compact sentences with no filler, and the highest-stakes facts (decline, no notification, irreversible) are front-loaded before the dry-run mechanics.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, idempotency-free mutation there is an output schema and full parameter coverage, so the description only had to cover consequences, reversibility, audit, and the confirm workflow — all of which are present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is already 100%, so the baseline is 3; the description earns an extra point by clarifying the default (dry run) and the exact expected value of confirm (the application's id), tightening what the schema expresses more abstractly as 'this change's exact target'.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('mark an application as spam') and immediately discloses the concrete effect ('it is declined, and the applicant is not told'), which an agent can distinguish from approve_application or reject_application. It stops short of naming the alternative sibling (reject_application) or the boundary condition that would pick one over the other, so differentiation is inferable rather than explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear precondition ('an open application') and the operational procedure (dry run by default; the real run needs confirm set to the application's id), which is exactly the context needed to invoke it. It does not say when not to use it or point to reject_application as the non-spam alternative, so it falls short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
propose_entry_changePropose a change to an entryAIdempotentInspect
Propose a change for a reviewer to decide — for any entry you may propose to, including ones you could edit live; nothing changes until a person approves it. Give only what changes; null clears a field. qid proposes linking the entry to a Wikidata item, or a different one (null: unlink it), with adopt naming the fields the item may manage (left out: the server’s default on a first link, unchanged on a re-point); only a reviewer with Manage entries may approve that. note tells the reviewer why. Audited. Dry run by default: it names the entries already on the item.
| Name | Required | Description | Default |
|---|---|---|---|
| qid | No | The Wikidata item to link the entry to, e.g. "Q42" (a different one re-points it); null unlinks it. | |
| note | No | Why you propose this, in plain words: posted as the proposal’s first comment, which the reviewer reads with it. At most 2,000 characters. Never an internal tracking ID (a backlog or ticket number); a VHID is fine. | |
| adopt | No | With qid: the fields the item may manage; the rest are taken back by the site. | |
| entry | Yes | The entry: its VHID (11 digits), its short name (as in verifiedhandles.org/<short>), or its Wikidata QID (Q42). | |
| short | No | ||
| title | No | ||
| dry_run | No | true (the default): write nothing — show the change and the exact request it would send. false: make the change. | |
| gallery | No | The images after the lead: the whole ordered list of media ids, replacing the gallery; [] empties it. At most 5, each once, never the lead. | |
| subtitle | No | ||
| add_handles | No | ||
| clear_image | No | true: take the lead image off. At most one of image_media_id, image_commons_token and clear_image. | |
| description | No | ||
| handle_order | No | Every handle, in the order the entry should show them: exactly the entry’s handles after add_handles and remove_handles, each once (a masked email by its ref). | |
| image_media_id | No | A new lead image already on the site (media_catalog, get_entry), or one you uploaded held for this proposal (upload_image or upload_image_from_url with hold: true): only its uploader may propose a held image, and the approval releases it. | |
| remove_handles | No | Handles to take off, each by its value — or, for an email this key may not see (value null in get_entry’s editing.handles), by {platform_id: "email", ref}. | |
| idempotency_key | No | Optional: a key you choose (1–255 printable ASCII, e.g. a UUID), sent as the write’s Idempotency-Key. Calling again with the same key and the same change within 24 hours answers the first call’s result (replayed: true) and writes nothing; the same key with another change is refused (422). | |
| takeover_fields | No | Fields to take back from the Wikidata sync, keeping their values. | |
| base_revision_id | No | The revision you read (get_entry → editing.baseRevisionId). If the entry has changed since, the edit is refused as a conflict. Left out, the current revision is used. | |
| takeover_handles | No | Handles to take back from the Wikidata sync. | |
| relinquish_fields | No | Fields to hand to the Wikidata sync. | |
| relinquish_handles | No | Handles to hand to the Wikidata sync; only while Wikidata lists the value. | |
| image_commons_token | No | A new lead image from Wikimedia Commons: a hit’s `token` from search_commons_images. The file is recorded on the site first, as the editor’s picker does. | |
| release_held_handles | No | Held-back handles the sync may add back. | |
| credit_wikipedia_page | No | Credit the description “from Wikipedia”: an English Wikipedia article or draft, by title ("Draft:Dominic McLaughlin") or address. The server reads the page (redirects followed) and refuses it unless at least half of the description’s three-word phrases are the page’s lead (credit_text_differs, with the share). | |
| remove_wikipedia_credit | No | true: remove the “from Wikipedia” credit from the description. | |
| credit_let_wikidata_manage | No | With a draft named in credit_wikipedia_page: false keeps the description site-authored. By default a draft’s credit hands the description to the Wikidata sync, which leaves it alone until the draft is an article linked from the entry’s Wikidata item. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | A dry run: what to do next to make the change, in words. |
| result | No | A real run: the route’s own answer, where the tool adds facts of its own beside it. |
| confirm | No | A dry run of a change that needs it: the exact target to send back as `confirm` with dry_run: false. |
| dry_run | No | true: a dry run, which wrote nothing. Absent from a real run. |
| replayed | No | A real run with an idempotency_key already used for this change: the first call’s answer, given back; nothing was written now. |
| would_send | No | A dry run: the exact request the real run would send (`method`, `path`, any `headers` such as an Idempotency-Key, and its `body`, `form` or `query`), or the requests, in order. |
| may_edit_live | No | A dry run of a live edit: whether this key’s account may edit this entry live. |
| refused_because | No | A dry run the real run would be refused for: why, in words. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (which only say non-readonly, idempotent, non-destructive): it discloses that nothing changes until a person approves, that a reviewer with Manage entries is required to approve a qid link, that the operation is audited, and critically that it is 'dry run by default' and what the dry run returns. These are high-value behavioral facts not derivable from structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core propose-for-approval framing and the dry-run default; sentences are dense but purposeful. It is on the longer side for a one-paragraph description, though for a 26-parameter tool the length is largely earned.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 26-parameter, 81%-covered mutation tool with an output schema, the description covers the highest-risk behaviors: approval gating, dry-run default, audit, and the qid/adopt interaction. It omits some parameters (gallery, idempotency, revision conflict) but those are documented in the schema, so the description is nearly complete for what an agent must understand before calling.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds real meaning beyond the 81%-covered schema: null clears a field, qid links/re-points/unlinks with adopt controlling managed fields and the server default on first link, and note is framed as the reviewer's rationale. Minor gaps: it doesn't mention idempotency_key, base_revision_id, gallery, or handle ordering, but the schema documents those and coverage is high.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource (propose a change for a reviewer to decide) and immediately distinguishes itself from live editing: 'for any entry you may propose to, including ones you could edit live.' Combined with the title and the 'nothing changes until a person approves it' framing, an agent can tell this apart from update_entry_fields/update_entries without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It establishes when to use it ('including ones you could edit live', propose vs. direct edit) and the key precondition that a reviewer must approve. It does not explicitly name the live-edit siblings or explain when to choose propose_entry_changes (bulk) versus this tool, so it stops short of full when/when-not routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
propose_entry_changesPropose changes to many entriesAIdempotentInspect
Proposals for up to 25 entries in one request, each as propose_entry_change files one (the text fields, handles added and removed) for a reviewer to decide; nothing changes until a person approves each. Audited, with one batch id. Proposing the same change again while it waits answers the same proposal. By default each proposal stands alone; with atomic: true, any refused one means none is filed. Dry run by default: it reads each entry and lists what would be proposed.
| Name | Required | Description | Default |
|---|---|---|---|
| edits | Yes | The proposals, each to a different entry. | |
| atomic | No | true: all or nothing — if any edit is refused, none is made (the route answers 422 naming each refused edit). false (the default): each edit on its own. | |
| dry_run | No | true (the default): write nothing — show the change and the exact request it would send. false: make the change. | |
| idempotency_key | No | Optional: a key you choose (1–255 printable ASCII, e.g. a UUID), sent as the write’s Idempotency-Key. Calling again with the same key and the same change within 24 hours answers the first call’s result (replayed: true) and writes nothing; the same key with another change is refused (422). |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | A dry run: what to do next to make the change, in words. |
| result | No | A real run: the route’s own answer, where the tool adds facts of its own beside it. |
| confirm | No | A dry run of a change that needs it: the exact target to send back as `confirm` with dry_run: false. |
| dry_run | No | true: a dry run, which wrote nothing. Absent from a real run. |
| replayed | No | A real run with an idempotency_key already used for this change: the first call’s answer, given back; nothing was written now. |
| would_send | No | A dry run: the exact request the real run would send (`method`, `path`, any `headers` such as an Idempotency-Key, and its `body`, `form` or `query`), or the requests, in order. |
| may_edit_live | No | A dry run of a live edit: whether this key’s account may edit this entry live. |
| refused_because | No | A dry run the real run would be refused for: why, in words. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: discloses that nothing changes until a person approves each proposal, that changes are audited under one batch id, that re-proposing an identical pending change answers the same proposal, the atomic all-or-nothing behavior, and that it is dry-run by default. These are the exact behavioral traits an agent needs and are not captured by the hint flags.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core purpose ('Proposals for up to 25 entries in one request') and each following clause carries distinct information (approval gate, batch id, idempotency, atomic, dry run). The opening sentence is long and dense, but there is little redundancy overall.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex batch, multi-parameter mutation tool with an existing output schema, the description covers the key facts an agent needs: the approval gate, per-entry vs atomic semantics, dry-run default, and idempotency. Return-value detail is correctly left to the output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3; the schema itself documents entry, short, handles, base_revision_id, atomic, dry_run, and idempotency_key in detail. The description restates the atomic and dry-run semantics but adds no syntax or format beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource with scope ('Proposals for up to 25 entries in one request') and explicitly distinguishes itself from the singular sibling by noting 'each as propose_entry_change files one.' An agent can immediately tell this is the bulk variant of propose_entry_change.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clearly frames the batch use case (up to 25 entries in one request) and names the singular alternative by reference, giving strong context for when to pick this tool. However, it never states an explicit 'use this instead when X' or an exclusion, leaving the routing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
propose_entry_revertPropose putting an entry back to an earlier revisionAInspect
Propose, for a reviewer to decide, putting an entry back as it was at one of its revisions (get_entry_history: a ref_id like "r123"; imported legacy revisions cannot be put back). The proposal holds only what differs from now — title, subtitle, description, short name, handles and their order, lead image, gallery — as propose_entry_change would send it; who manages each value (Wikidata or the site) is left as it is. An image withdrawn since is left out, and the answer names it. Refused (nothing_to_change) when the entry already matches that revision. note tells the reviewer why. Audited. Dry run by default.
| Name | Required | Description | Default |
|---|---|---|---|
| note | No | Why you propose this, in plain words: posted as the proposal’s first comment, which the reviewer reads with it. At most 2,000 characters. Never an internal tracking ID (a backlog or ticket number); a VHID is fine. | |
| entry | Yes | The entry: its VHID (11 digits), its short name (as in verifiedhandles.org/<short>), or its Wikidata QID (Q42). | |
| dry_run | No | true (the default): write nothing — show the change and the exact request it would send. false: make the change. | |
| revision | Yes | The revision’s ref_id, e.g. "r123". | |
| idempotency_key | No | Optional: a key you choose (1–255 printable ASCII, e.g. a UUID), sent as the write’s Idempotency-Key. Calling again with the same key and the same change within 24 hours answers the first call’s result (replayed: true) and writes nothing; the same key with another change is refused (422). |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | A dry run: what to do next to make the change, in words. |
| result | No | A real run: the route’s own answer, where the tool adds facts of its own beside it. |
| confirm | No | A dry run of a change that needs it: the exact target to send back as `confirm` with dry_run: false. |
| dry_run | No | true: a dry run, which wrote nothing. Absent from a real run. |
| replayed | No | A real run with an idempotency_key already used for this change: the first call’s answer, given back; nothing was written now. |
| would_send | No | A dry run: the exact request the real run would send (`method`, `path`, any `headers` such as an Idempotency-Key, and its `body`, `form` or `query`), or the requests, in order. |
| may_edit_live | No | A dry run of a live edit: whether this key’s account may edit this entry live. |
| refused_because | No | A dry run the real run would be refused for: why, in words. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial behavior beyond the annotations: the proposal carries only the diff, ownership (Wikidata vs site) is untouched, withdrawn images are omitted and named in the answer, an audit trail exists, and refusal semantics are spelled out. No contradiction with readOnlyHint=false / destructiveHint=false / idempotentHint=false.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core action and default dry-run are front-loaded, and nearly every clause carries information (ref_id format, refusal, audit, payload scope). It is dense to the point of being a wall of clauses, which slightly hurts scannability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a multi-step proposal tool with an output schema present, the description covers what the proposal contains, its refusal case, the note's purpose, and the dry-run default, so nothing critical is left for the agent to infer.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds a real constraint on the revision parameter (imported legacy revisions cannot be put back) and explains what the note is for and what dry_run does. That is meaningful semantics beyond the schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb+resource+scope: propose reverting an entry to an earlier revision for a reviewer to decide. It also differentiates from siblings by naming get_entry_history for obtaining the ref_id and characterizing the payload as what propose_entry_change would send, separating it from the direct restore_entry_revision path.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear triggering context (needs a reviewer, needs a ref_id from get_entry_history, refused with nothing_to_change when the entry already matches), and the dry-run-by-default note guides invocation. It stops short of an explicit when-not rule contrasting with the sibling restore_entry_revision, so it's strong but not fully exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
propose_from_wikidataPropose what a Wikidata item saysAInspect
Propose, for a reviewer to decide, what a Wikidata item says for an entry: its identifier handles, and when asked its label (as the title), its description (as the subtitle) and its image. qid defaults to the item the entry is linked to. For that item, unless the entry is protected or claimed, it proposes handing the values to the Wikidata sync instead of copying them (the sync then writes and keeps them up to date), and says so. For another item it copies the values, which become the site’s own: the sync will not keep them up to date. Handles the entry already has (by each platform’s own rule for letter case) are left out. The entry’s description comes from Wikipedia, not from the item, so it is only ever handed to the sync. Warns when the item is another entry’s. note tells the reviewer why. Audited. Dry run by default: it shows what the item has, what the entry has, and the proposal.
| Name | Required | Description | Default |
|---|---|---|---|
| qid | No | The Wikidata item, e.g. "Q42". Default: the item the entry is linked to. | |
| note | No | Why you propose this, in plain words: posted as the proposal’s first comment, which the reviewer reads with it. At most 2,000 characters. Never an internal tracking ID (a backlog or ticket number); a VHID is fine. | |
| take | No | What to take from the item: "handles" (the default), "title" (its label), "subtitle" (its description), "description" (only by handing it to the sync), "image". | |
| entry | Yes | The entry: its VHID (11 digits), its short name (as in verifiedhandles.org/<short>), or its Wikidata QID (Q42). | |
| dry_run | No | true (the default): write nothing — show the change and the exact request it would send. false: make the change. | |
| idempotency_key | No | Optional: a key you choose (1–255 printable ASCII, e.g. a UUID), sent as the write’s Idempotency-Key. Calling again with the same key and the same change within 24 hours answers the first call’s result (replayed: true) and writes nothing; the same key with another change is refused (422). |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | A dry run: what to do next to make the change, in words. |
| result | No | A real run: the route’s own answer, where the tool adds facts of its own beside it. |
| confirm | No | A dry run of a change that needs it: the exact target to send back as `confirm` with dry_run: false. |
| dry_run | No | true: a dry run, which wrote nothing. Absent from a real run. |
| replayed | No | A real run with an idempotency_key already used for this change: the first call’s answer, given back; nothing was written now. |
| would_send | No | A dry run: the exact request the real run would send (`method`, `path`, any `headers` such as an Idempotency-Key, and its `body`, `form` or `query`), or the requests, in order. |
| may_edit_live | No | A dry run of a live edit: whether this key’s account may edit this entry live. |
| refused_because | No | A dry run the real run would be refused for: why, in words. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial behavior beyond the annotations: dry run by default, audited, warns when the item belongs to another entry, skips handles the entry already has, sources the description from Wikipedia, and contrasts sync-backed vs copied values. This is well above the bar set by readOnlyHint=false / destructiveHint=false.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose, then facets in descending importance. Dense and clause-heavy, with a little repetition around sync upkeep, but nearly every sentence carries distinct information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a six-parameter, dry-run-by-default write path with an output schema, the description covers the decision model (reviewer decides), defaults, side effects, warnings, and audit behavior. Nothing essential to correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description reinforces qid's default and the note's reviewer-facing purpose and adds behavior for the 'take' handles option, but most of this duplicates the schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Propose ... what a Wikidata item says for an entry,' and enumerates the fields it can carry (handles, title, subtitle, description, image). An agent can distinguish it from generic propose_* siblings, though it never names them explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear conditional usage: qid defaults to the linked item and proposes handing values to the sync; for another item it copies them; default dry_run is true. It does not name alternative tools (propose_wikidata_changes, propose_wikidata_correction, create_entry_from_qid) so the agent must infer when to route elsewhere.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
propose_new_entryPropose a new entryAIdempotentInspect
Propose a new entry for a reviewer to decide: it waits in Console → Applications under Quick proposals (list_applications with tab "proposals") and becomes live when approved. Refused (not_accepting) while Settings pauses new-entry requests, unless this account may create entries itself. For someone or something with no Wikidata item, leave out qid. With qid, the entry is linked to that item, and after approval Wikidata keeps up to date whatever you did not write (and any field in let_wikidata_manage). Refused, naming the entry, when one is already on the item. A merged-away QID is refused (409 qid_merged), naming the item Wikidata kept in wikidata_item: propose on that one. Sending the same proposal again within 15 minutes answers with the first one. note tells the reviewer why. Audited. Dry run by default: it names the entries already on the item, a short name already taken or held by a site redirect (short_is_redirect), and handles already on another entry. Related entries link themselves: when it is approved, this entry and the other new entries this account proposed within a day link each other both ways on the first plain-text mention of each title, so write names as plain text and file no follow-up to add links; the dry run lists them (related_entries, links_on_approval).
| Name | Required | Description | Default |
|---|---|---|---|
| qid | No | The Wikidata item, e.g. "Q42". Leave it out for an entry with no item. | |
| note | No | Why you propose this, in plain words: posted as the proposal’s first comment, which the reviewer reads with it. At most 2,000 characters. Never an internal tracking ID (a backlog or ticket number); a VHID is fine. | |
| short | No | The short name, as in verifiedhandles.org/<short>. Whether it is free is checked when the proposal is approved. | |
| title | Yes | ||
| dry_run | No | true (the default): write nothing — show the change and the exact request it would send. false: make the change. | |
| handles | No | ||
| subtitle | No | ||
| description | No | HTML; it is sanitised when stored. | |
| idempotency_key | No | Optional: a key you choose (1–255 printable ASCII, e.g. a UUID), sent as the write’s Idempotency-Key. Calling again with the same key and the same change within 24 hours answers the first call’s result (replayed: true) and writes nothing; the same key with another change is refused (422). | |
| let_wikidata_manage | No | With qid: fields you give that Wikidata should keep up to date after approval, as the console form does for a title it prefilled and you left as it was. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | A dry run: what to do next to make the change, in words. |
| result | No | A real run: the route’s own answer, where the tool adds facts of its own beside it. |
| confirm | No | A dry run of a change that needs it: the exact target to send back as `confirm` with dry_run: false. |
| dry_run | No | true: a dry run, which wrote nothing. Absent from a real run. |
| replayed | No | A real run with an idempotency_key already used for this change: the first call’s answer, given back; nothing was written now. |
| would_send | No | A dry run: the exact request the real run would send (`method`, `path`, any `headers` such as an Idempotency-Key, and its `body`, `form` or `query`), or the requests, in order. |
| may_edit_live | No | A dry run of a live edit: whether this key’s account may edit this entry live. |
| refused_because | No | A dry run the real run would be refused for: why, in words. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: pause-state refusal (not_accepting), duplicate-on-item refusal, 409 qid_merged with the surviving QID in wikidata_item, 15-minute duplicate-suppression returning the first result, auditing, and dry-run-by-default behavior. It also discloses the non-obvious side effect that related entries auto-cross-link on approval, which no annotation conveys.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then refusal conditions, then dry-run semantics — a sensible ordering for a dense single paragraph. It is on the long side and sentences such as the related-entries linking clause require re-reading, but nearly every clause carries operational information an agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 10-parameter mutation with conditional refusals, this covers preconditions, failure modes, idempotency/dedup windows, dry-run preview contents, and post-approval side effects. Return-value description is unnecessary because an output schema exists.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 70%, so the schema carries most of the weight, but the description adds genuine meaning: what `note` is for (reviewer-facing rationale), the semantic effect of omitting `qid`, how `let_wikidata_manage` interacts with qid, and the instruction to write titles as plain text because of auto-linking. Parameters like `subtitle`, `description`, and `handles` get no description-level elaboration, which keeps it from a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first clause names the exact action and its destination: a proposal queued for a reviewer, visible in Console → Applications under Quick proposals, going live on approval. That is a specific verb+resource plus lifecycle, and it is clearly distinct from siblings like create_entry_from_qid or propose_from_wikidata, which are not described as reviewer-queued proposals.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit selection criteria for the qid parameter (omit for entities with no Wikidata item; include to link) and explains the account-permission condition ('unless this account may create entries itself'). What it lacks is a direct naming of the sibling alternative an agent should pick instead when it does have a Wikidata item and wants an import path, so it stops short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
propose_wikidata_changesPropose several changes to one Wikidata item, as one groupAIdempotentInspect
Propose several changes to one item (one no entry links included: its statements are then read live) as ONE proposal (Console → Wikidata → Review shows it as one card with every change ticked; an administrator may untick some, which are dismissed, and approves the rest, which are made in this order, one edit each; a change that does not go through stops the ones after it). Filed as curated by your account and this key, and only proposed: nothing is written to Wikidata here. Trusted editors and administrators may; each change counts toward a trusted editor’s 200 a day, and there is no limit on the changes in one proposal. qid the item, kind the kind of every change (superseded, duplicate or update), evidence the reason they share (why, and the summary you would like, never naming this site), and changes in order, each exactly as propose_wikidata_correction takes one change but without qid, kind or dry_run: a term (set_label, set_description, set_aliases), add_claim, add_reference, replace_reference, add_qualifier, change_qualifier, remove_qualifier, set_rank or supersede, or alone a move_to_item or copy_to_item (its steps are on two items); a change may give an evidence of its own. To move statements to a NEW item (administrators who may approve Wikidata edits): the first change a create_item, with the new item’s fields as propose_wikidata_item takes them (label, description, aliases, entry, its own statements with their references, an instance of among them, and notability), then a move_to_item of each statement of qid with other_qid "step:1": the item is made with each copy (its qualifiers and references as read) in its one edit, and each statement is removed from qid only once the item is made; an item that is not made removes nothing, and a removal that does not go through stops the ones after it. The dry run shows the item as it would be made (would_create). Never a deprecation or a merge, and never two changes to one term in one language, or one value added twice (duplicate_change). Two changes may be to one statement (two qualifiers on it, a qualifier and a reference), and a change may be to the statement an earlier change adds: give its statement_guid as step:N, N that change’s place in the list. Each change is checked as it would be alone, against the item as the changes before it will leave it, and the proposal is filed only if every one passes: a refusal names its step (from 1), and nothing is filed. Audited. Dry run by default: the site checks every change and shows each step it would file, in order (a preferred rank’s end times and the superseded bundle’s steps in their place). The owner’s Wikidata conventions are checked as for propose_wikidata_correction: a new channel ID statement (P2397) needs its title (P1810), and a YouTube handle’s channel must be on the item or added by an earlier change (refused, with step, message and suggestion), and so are a web archive’s copy as a reference’s url, an add_claim the item states already, and a Bluesky handle changed with no DID; the other slips come back as warnings, each naming its step (a second preferred count of one account in another open proposal included, and an account deprecated as not the subject’s while this proposal leaves follower counts of it current: account_counts_apart). An account and its counts deprecated in one call are one group, with no warning; any of them already open apart is taken into it. A change a person proposed before and is still open is taken into the group only when it writes the same thing (the whole value, its qualifiers and rank, and the same reference, the day retrieved aside): the dry run names it (adopts), and the answer (adopted); one written otherwise (another reference, qualifier or rank) refuses the proposal (409 already_proposed, naming its step and the open row’s id), dry run or not, and nothing is filed: leave that change out, or have the open row dismissed first. A proposal of one change gets the answer that change alone gets from propose_wikidata_correction: beside a person’s open change to something else on its statement it is joined to that one’s group as its next step (joins; the answer’s joined and group_id). A change a person dismissed before (the same kind, action, statement, value seen and new value, and the whole value written: a quantity’s range, a new statement’s qualifiers, and its reference, the day retrieved aside) refuses the proposal (409 dismissed, naming its step, with when it was dismissed), dry run or not, and nothing is filed; refile: true files it all the same. An official website (P856; test.wikidata.org’s P206) a proposal adds or changes, and each of the item’s other official websites with no language of work or name (P407; test.wikidata.org’s P77090), gets a step of its own after the proposal’s, adding the language its page declares (its , else its Content-Language header; en-US is English, Q1860), made as an edit of its own once the statement exists; a page that declares no language, several, or one with no item, or that does not load, gets no step, and nothing is guessed. The dry run and the answer name each (website_languages: the step, the language and what the page declared, or left_out with a message), and a reviewer may untick any. A statement the proposal gives a P407 itself is left as given.
| Name | Required | Description | Default |
|---|---|---|---|
| qid | Yes | ||
| kind | Yes | ||
| refile | No | File every change even where a person dismissed the same change before (refused 409 `dismissed` otherwise). | |
| changes | Yes | The changes, in the order they are to be made. | |
| dry_run | No | true (the default): write nothing — show the change and the exact request it would send. false: make the change. | |
| evidence | No | Why, shared by every change that gives none of its own. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | A dry run: what to do next to make the change, in words. |
| result | No | A real run: the route’s own answer, where the tool adds facts of its own beside it. |
| confirm | No | A dry run of a change that needs it: the exact target to send back as `confirm` with dry_run: false. |
| dry_run | No | true: a dry run, which wrote nothing. Absent from a real run. |
| replayed | No | A real run with an idempotency_key already used for this change: the first call’s answer, given back; nothing was written now. |
| would_send | No | A dry run: the exact request the real run would send (`method`, `path`, any `headers` such as an Idempotency-Key, and its `body`, `form` or `query`), or the requests, in order. |
| may_edit_live | No | A dry run of a live edit: whether this key’s account may edit this entry live. |
| refused_because | No | A dry run the real run would be refused for: why, in words. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes far beyond the annotations, disclosing that nothing is written to Wikidata (only a proposal filed), dry-run-by-default semantics, the review/untick workflow, per-change ordering and stop-on-failure behavior, adoption and dismissal rules with exact 409 codes (`already_proposed`, `dismissed`), and the automatic P856/P407 website-language steps. This is exceptional behavioral disclosure and is consistent with readOnlyHint=false and destructiveHint=false.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The content is a single uninterrupted wall of text of several hundred words with no paragraph breaks or headings, mixing purpose, permissions, error semantics, and dry-run output into one stream. While most information is relevant, the lack of structure makes it hard to scan, and some output-related detail duplicates what the output schema already covers.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex, high-stakes mutation tool with nested objects, the description leaves nothing an agent needs uncovered: permissions, ordering, failure semantics, adoption/dismissal, rate limits, and dry-run output fields are all addressed. It is complete, even arguably more thorough than required given the presence of an output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
At 67% schema coverage, the description compensates substantially, especially for the `changes` array whose items are essentially open (`additionalProperties: {}`, only `action` constrained): it names all valid actions, the fields each change carries, the `statement_guid`/`step:N` cross-reference, and per-change `evidence`. `qid`, `kind`, and `evidence.why` are all explained with meaning beyond the schema, though a few details are delegated to 'as propose_wikidata_correction takes them' rather than stated inline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening clause states a specific verb and resource: 'Propose several changes to one item ... as ONE proposal.' It also implicitly distinguishes from the sibling propose_wikidata_correction by noting each change is exactly what that tool takes minus qid/kind/dry_run. The purpose is clear but somewhat buried in a very long first sentence with nested parentheticals.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated: the multi-change grouping, the 'administrators who may approve Wikidata edits' precondition for create_item flows, and the 200/day trusted-editor limit. There is no crisp 'use this when X, use propose_wikidata_correction when Y' routing statement, so the agent must infer the boundary between this and the single-change sibling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
propose_wikidata_correctionPropose a Wikidata correctionAIdempotentInspect
Propose a correction to a Wikidata statement (Console → Wikidata → Review), for an administrator to approve and make. The item may be one no entry links (an event, say, which VH has no entry for): every statement on it is then read live, as one outside the catalog is, its card on Review says “Item not on VH”, and it takes any change but a deprecation or a merge (refused 422 qid_not_linked). It is filed as curated by your account and this key, and only proposes: nothing is written to Wikidata, and this server cannot approve or make an edit. Trusted editors and administrators may; a trusted editor’s account files at most 200 a day (UTC), all its keys together. set_value / remove / move one statement (its GUID, and the value you saw) on any property, P31 included — on one outside the catalog the site reads the statement live, the new value is as value below takes it, and a move is only between two properties of one datatype — or merge two items; evidence.why is required, and evidence.summary is the edit summary you would like (never naming this site). The kind says why: superseded (the subject renamed, or a newer value), duplicate (a duplicate statement), update (anything else you curate), or one of the format kinds. Or deprecate a value: the property and the value, a reason (an item id: one of the suggested reasons, else an instance of "reason for deprecated rank" on the write wiki) and an optional source page that says why, which the site loads itself (https, a public address); the site finds the statement and writes the evidence. Two kinds: suppressed, a value an editor took off VH that Wikidata still states (Console → Wikidata → To judge), whose evidence is that removal, so it takes none from you and is refused (not_suppressed) while VH still lists the value; or dead_account, an account the platform itself shows deleted, suspended or terminated, on a property of the platform catalog (property_not_allowed otherwise), whether or not VH still lists it, with evidence.why required (what the platform shows) and evidence.summary optional; or wrong_subject, a value two items state where they say they are two subjects (Console → Wikidata → To judge, “One account on two subjects”, which list_wikidata_wrong_subject_pairs reads), deprecated on qid, the item it does not belong to, with belongs_to the item it belongs to: filed whether or not VH still lists it, only while both items state it and the site’s identity check still says they are two subjects (both read live, and again just before it is made), on a property of the platform catalog, with the reason the site picks (reason may be left out: “refers to different person”, Q35773207, on a human, else “refers to different subject”, Q28091153; another is refused wrong_reason) and evidence it writes itself (refused pair_not_refused, value_not_shared or item_gone, each with a message, when that no longer holds). set_rank deprecated (below) is held to the same rules. When an entry linking the item still shows the value, both dry runs and the answer say so ("Still listed on VH entry (…): …", still_listed, each handle with kept_by). What VH then does with it: a handle the Wikidata sync keeps (kept_by "wikidata") is taken off the entry by the sync once Wikidata ranks the statement deprecated and the handle-removal grace is out (sync_state → settings.handles: its hours and consecutive fetches, and the blanking guard); a handle a person keeps the sync never takes off, so take it off with update_entry_handles if the account is gone. Or change the item’s terms in one language (a Wikimedia language code; mul for a label or aliases, never a description), kind superseded, duplicate or update: set_label / set_description with value_seen the term as you read it (null when the item has none in that language) and new_value the new text, at most 250 characters ("" removes it); set_aliases with value_seen the aliases as you read them ([] for none) and add and/or remove lists. It is made only while the term is still what you read. Or add a statement on any property (add_claim, kind superseded or update): property and value — a string (text, an identifier, a web address, an item id, a Commons file), {"text","language"} for a monolingual text, "YYYY-MM-DD", "YYYY-MM" or "YYYY" for a date, or an amount or {"amount","unit"} (unit an item id) for a quantity, either with "lowerBound" and "upperBound" for its range (both or neither, the amount between them; e.g. {"amount":"17000","lowerBound":"17000","upperBound":"17099"} for a count shown rounded down as "17K") — with optional qualifiers ([{"property","value"}], the same kinds of value, or {"unknown": true} for a time of unknown value, as add_qualifier takes one), and a REQUIRED reference (but on a Commons file, an image, a logo or a coat of arms, which is documented on Commons and goes without one; a Commons file page is never a reference): {"url" (https; the site loads it; never a Wikimedia project’s page, wikidata.org and its old revisions included, which is refused with why: wikimedia_reference; Verified Handles’ own page, this site’s or verifiedhandles.org’s, an archive copy’s included, is filed with the warning own_site_reference: keep it only where Verified Handles is genuinely the source, else cite the page the subject published), and/or "stated_in" (an item id, P248 “stated in”: the work or database the claim is made in, for a source with no stable page of its own, such as YouTube, Q866), and/or "identifier" ({"property", "value"}: an external identifier in that work, such as P244 no97057848 beside stated_in Q13219454, Library of Congress Authorities, for a record with no page the site can load; refused bad_reference when the property is not an external identifier, format_mismatch when the value fails its format), "retrieved" (YYYY-MM-DD, not after today; today if left out), "title" (optional; else the page’s own), "language" (optional, an item id: the language of the work), "archive_url" (optional: a web archive’s https copy of "url", P1065 archive URL, which the site loads instead of the original, so a page that is gone, http or https, can still be cited) and "archive_date" (optional, YYYY-MM-DD, P2960: the day it was archived, read from a web.archive.org or archive.today address when left out)}; the dry run shows the reference as the write wiki will get it (reference_snaks). The site reads each property’s datatype on the write wiki and refuses one it cannot write (datatype_unsupported); an identifier of digits alone may be sent as a JSON number and is filed as its digits, but only up to 9007199254740991: past it (a 64-bit id, such as a Discord server ID) JSON has already rounded it, so it is refused with a message saying to send it as a string; a text or identifier value (add_claim, supersede, set_value) that fails the property’s format constraint (P1793, read on the write wiki) is refused (format_mismatch, with pattern). Or add a reference to a statement (add_reference: property, statement_guid, optionally value_seen, and reference), or replace one of its references (replace_reference: also reference_hash, the hash of the one it replaces); each is made only while the statement, and the reference replaced, are still as you read them. Or change a statement’s qualifiers or rank (property, statement_guid, optionally value_seen): add_qualifier with qualifier {"property","value"} (any property, the same kinds of value: a dated start, end or point in time included, or {"unknown": true} for a time of unknown value — an end time no source dates, sent as Wikidata’s “unknown value”), change_qualifier with qualifier and qualifier_hash (the one it replaces), remove_qualifier with qualifier_hash; set_rank with rank preferred, normal or deprecated (deprecated needs a reason, checked as a deprecation’s is, and shows the same "Still listed" line). A preferred rank (set_rank, or add_claim with rank: "preferred") outranks the property’s normal values, so Wikidata stops counting them as current: when it would, the site names them ("Makes not current: …", makes_not_current) and refuses it (rank_choice_required) until you choose outranked: "end_date" end-dates each on end_date (YYYY-MM-DD, YYYY-MM or YYYY, not after today, or {"unknown": true}), filed as steps before it in one group; "keep_normal" makes it preferred and leaves them normal with no end time, for a value still true but less precise (Help:Ranking: a city of birth, Houston, preferred beside its country, United States, left normal); or "leave_normal" leaves them current and sets no preferred rank. A series of point-in-time values (a follower count P8687, a population, a revenue: each with a point in time, P585, and no start or end time; or a software version P348, each release with its publication date, P577, and no start or end time) is the exception: the newer value takes the preferred rank and the older ones stay normal with no end time, as Wikidata’s convention for such a series has it, without a choice (the dry run still names them in makes_not_current); an older value of the same account (the same identifier qualifier: P6552, P4033…), or an older release, that is preferred itself goes to normal too, a set_rank step after it, with its “most recent value” (P7452 Q71533355) removed first, and is named there as well — another account’s preferred count is left alone; "point_in_time" asks for that by name, and is refused (not_point_in_time) when one of them is not such a value. Or file the superseded bundle (action supersede, kind superseded): the statement you name end-dated on date, and a new statement of value on the same property at preferred rank with a start time of date (date {"unknown": true}: an end time of unknown value, and no start time), optional qualifiers and a REQUIRED reference, two steps of one group made in order (outranked / end_date for any other value it would outrank). A rebrand’s new logo is that bundle on the logo image property (P154 on www.wikidata.org; test.wikidata.org’s own is P95469) with value a Commons file name, found with search_commons_images: a file not on Commons is refused (file_not_found, “No logo on Commons yet: upload it there first, then propose it here.”, with Commons’ upload_url) and nothing is filed. Each is made only while the statement, its qualifiers and its rank are as you read them. Or move a statement to another item (move_to_item), or copy it there (copy_to_item; the same, leaving it where it is), kind superseded, duplicate or update: qid, property, statement_guid and value_seen name the statement, other_qid the item it goes to (never the same one). The site reads it live and files, on that item, a new statement with its whole value (a quantity’s range included), its qualifiers and its references exactly as read (kept as evidence.references_before), at normal rank; a move adds the removal of the statement, two steps of one group made in order, the removal only once the copy is made and only while the statement is still exactly as read. A reference that cites a Wikimedia page is never copied: the statement is refused (wikimedia_reference, naming those references by hash) unless you give a reference (an addition’s shape) to take its place; one given anyway is added after those read. Refused when that item already states the value (already_listed, a quantity inside a range stated included) or a proposal to add it is open (already_proposed). The dry run shows each step and the whole new statement as the write wiki will get it (statement). A proposal on a statement that already has an open correction of the same thing (the value, the rank, the same qualifier property, the same reference), or the site’s own suggestion, takes its place: the dry run names each one (replaces, their ids, and a line in warning, "Replaces #772 (dead_account, deprecate, reason Q1193907)."), and the answer gives the row it filed (ids) and those it replaced (replaced). A person’s open correction of the same change (the same statement, action, value and new property) is taken in as it stands only when it writes the same thing: the whole value, its qualifiers and rank, and the same reference (the day retrieved aside); the dry run names it (adopts, “Takes in the open change #3329 (…)”) and nothing new is filed for it. One that writes it otherwise (another reference, qualifier or rank) refuses the proposal (409 already_proposed, with its id, a group’s step and a message), dry run or not, and nothing is filed: leave the change out, or have that row dismissed first. A reference cited by a web archive’s copy and one cited by the original with that copy as its archive_url are the same reference. One beside a person’s open change to something else on the statement (another qualifier, a reference, the value beside a qualifier) closes nothing: it is joined to that open change as its next step, one group made in that order and one card on Review (the dry run’s joins, the answer’s joined and group_id, and a line in warning, "Joined to the open change #4364 (…) as its next step: one proposal, made in that order."; where the open change sets the value, the line says this one, checked against the old value, stops once that one is made and wants proposing again then). To withdraw a correction without filing one in its place, use dismiss_wikidata_correction. A change a person dismissed is not filed again while Wikidata says the same thing: the same kind and action on the same statement, with the same value seen, new value and new property and the whole value written (a quantity’s range, a new statement’s qualifiers and rank) and the same reference (the day retrieved aside), is refused (409 dismissed, the dry run included, with dismissed_id, dismissed_at and a message); send it again with refile: true to file it anyway (its evidence and the audit name the dismissed row). Any other change on that statement is filed as usual, so a dismissed row with the wrong reason, or a weak reference, is corrected by proposing the right one. Audited. Dry run by default: a deprecation’s, a term’s, a statement’s, a reference’s, a qualifier’s or a rank’s dry run has the site check it all and show what it would file (each step of a group, and the rank warning, included). The owner’s Wikidata conventions are checked as it is filed (each refusal’s message says what is wrong and its suggestion exactly what to change, and nothing is filed). Refused: a new YouTube channel ID statement (P2397) without its title as a “subject named as” (P1810) qualifier (channel_without_title); a YouTube handle (P11245) whose P2397 qualifier names a channel the item does not state and no earlier change of the proposal adds (handle_without_channel); a reference whose url is a web archive’s copy (web.archive.org, archive.today: archive_as_reference; give the original page as the url and the copy as archive_url); an add_claim whose value, and each qualifier it gives, the item states already (claim_already_present: add the reference to that statement instead, add_reference with its GUID); a set_value of a Bluesky handle (P12361) on a statement with no Bluesky DID (P12409) when the proposal adds none (bluesky_handle_without_did: add it with an add_qualifier in the same group); kind superseded filed as a set_value, which writes over a value that was true once (superseded_in_place: propose the supersede bundle, the old value ended and the new one added). Filed with a warning instead (warnings, each with its code, step, message and suggestion, and in warning; kept on the row for the reviewer): a YouTube count whose range is centred on its amount where YouTube rounds down (range_not_rounded_down: “1.42M” is 1420000 to 1429999); a YouTube count whose range starts at its amount but is wider than YouTube’s rounding to three significant figures (range_too_wide: “1.7M” is 1700000 to 1709999, not to 1799999); a round count on a platform that shows counts rounded (YouTube, TikTok, Instagram, Snapchat, X) filed as exact (rounded_count_exact: “399.1K” is 399100 to 399199); a new count at normal rank that is its account’s newest, where the item keeps each account’s newest count preferred or has none preferred (count_not_preferred); a preferred follower count that makes another account’s newest count not current (preferred_outranks_other_accounts); a new preferred count while an older count of the same account stays preferred, on the item or by another open proposal, which it names (same_account_still_preferred); a preferred count demoted with no newer one for its account in the proposal (depends_on_other_proposal: propose the two together); an account deprecated beside its successor, which wants an end time instead (replacement_deprecated); a start or end time (P580, P582) on the day it is proposed or its reference retrieved, which no source dates (made_up_date: Wikidata wants an end time of unknown value, {"unknown": true}, unless a source dates it); a reference stated in (P248) an item that is not the platform of the account it supports, or stated in a platform’s item (the YouTube API, Q8056784) for an identifier that is none of that platform’s, such as an Apple Music artist ID linked from a video (stated_in_mismatch, on www.wikidata.org: cite the page you read it on); a second value at normal rank of a single-best-value property (P2013, P7085, P19…) beside another normal one and none preferred (single_best_second_normal, on www.wikidata.org); an account statement that carries a reference, removed (remove_with_reference: deprecate another person’s account with reason Q35773207 instead, so no import adds it again; a reference imported from Wikimedia, P143, alone is no source and is not warned); a value deprecated as about someone else (“refers to different person” Q35773207 or “refers to different subject” Q28091153) on a statement with no reference, or only one imported from Wikimedia (P143), and none added by the proposal (unsourced_deprecated_remove: “This value has no source: a value about someone else is removed, not deprecated.” Remove it instead; deprecate only a wrong value a source states, which a removal would let be added again); aliases added in one language that are the item’s default (mul) aliases already (alias_duplicates_mul); a reference titled with a platform’s own page title, such as “TikTok - Make Your Day” (generic_reference_title; its suggestion keeps a stated_in you give); a reference stated in a class of accounts, such as “Twitch channel” (Q99869602), rather than the platform, Twitch (Q4555537) (stated_in_not_a_source, www.wikidata.org); a dead account deprecated while the item states another current value of its property (other_current_values), and a value deprecated as “changed username”, “redirect” or “cannot be confirmed by other sources” while the item or a VH entry on it holds another value of its property (outdated_not_wrong): each was right once, so end it (P582) rather than deprecate it; a new YouTube handle (P11245) that is not, case aside, the handle this site’s handle checker last saw its P2397 channel with (handle_differs_from_channel: the handle is what YouTube shows after the @, not the channel’s title); and a point in time, start or end time added to an award (P166) or nomination (P1411) statement that has one with another value already (second_date_on_statement: each year is a statement of its own; www.wikidata.org); a reference that is Verified Handles’ own page, this site’s or verifiedhandles.org’s (own_site_reference: keep it only where Verified Handles is genuinely the source); a reference on an account or official website (P856) statement whose url is a social profile page, read by the platform catalog’s templates: the account itself, such as an X username cited by its x.com page or a YouTube channel by its own page or /about tab, or another profile cited as the source, such as a YouTube /about page for an X or Instagram account or the website (profile_reference: cite a page independent of the account, the official website or a news article; a post, a video and any other page are never warned; on an account of a platform the site knows, such a reference is not filed as given: the statement is filed stated in the platform’s item instead, see reference); and a new TikTok, Instagram, Threads, Twitch or X account statement (P7085, P2003, P11892, P5797, P2002) with no “subject named as” (P1810) qualifier (missing_display_name: add the account’s display name as the platform shows it); and a duplicate removed (kind duplicate) whose value has capitals, on a platform that ignores letter case (X, Instagram, TikTok, Threads, a YouTube handle, Twitch, Kick, GitHub, Reddit, Facebook), while the copy the item keeps is all lower case (removes_cased_copy: the casing the account shows is the copy to keep, so remove the lowercase one instead, its references and qualifiers moved onto the other first, unless the account really is all lower case); and an account deprecated (set_rank deprecated, or a deprecation) as not the subject’s (“refers to different person”, “refers to different subject”, “incorrect value”, “incorrect identifier value” or “conflation”) while follower counts of it (P8687 qualified with one of its identifiers: P6552 or P2002 on X, P2397 or P11245 on YouTube…) stay current on the item, or such a count deprecated while its account stays current (account_counts_apart, naming them, and any open proposal that deprecates one of them apart: they stand or fall together, so propose the account’s set_rank deprecated and each count’s in one propose_wikidata_changes call, which takes those open proposals into its group). An official website (P856; test.wikidata.org’s P206) a proposal adds or changes, and each of the item’s other official websites with no language of work or name (P407; test.wikidata.org’s P77090), gets a step of its own after the proposal’s, adding the language its page declares (its , else its Content-Language header; en-US is English, Q1860), made as an edit of its own once the statement exists; a page that declares no language, several, or one with no item, or that does not load, gets no step, and nothing is guessed. The dry run and the answer name each (website_languages: the step, the language and what the page declared, or left_out with a message), and a reviewer may untick any. A statement the proposal gives a P407 itself is left as given.
| Name | Required | Description | Default |
|---|---|---|---|
| add | No | set_aliases: the aliases to add. | |
| qid | Yes | ||
| date | No | supersede (required): the day (or month, or year) the old value ended and the new one began; {"unknown": true} when no source dates it: the old one gets an end time of unknown value, and the new one no start time. A supersede takes `property`, `statement_guid`, `value`, `date` and `reference` (and optionally `qualifiers`), never `new_value`. | |
| kind | Yes | `merge` with a merge, `suppressed`, `dead_account` or `wrong_subject` with a deprecation; `superseded`, `duplicate` or `update` for a change you curate; `supersede` takes `superseded` only (a renamed account is one). The format kinds (`pasted_address`, `renamed_account`…) go with set_value, remove or move. | |
| rank | No | set_rank: the rank; add_claim: "preferred" for the new statement (default normal). | |
| value | No | add_claim, supersede: the new statement’s value, as its property’s datatype takes it. | |
| action | Yes | ||
| reason | No | deprecate, set_rank deprecated: the reason for the deprecated rank, an item id (e.g. Q113360982 "unavailable account"). Optional for kind wrong_subject, whose reason the site picks. | |
| refile | No | File it even though a person dismissed this same change before (refused 409 `dismissed` otherwise). | |
| remove | No | set_aliases: the aliases to take off. | |
| source | No | deprecate: an https page that says why (a news article, say). The site loads it and cites its title and date. | |
| dry_run | No | true (the default): write nothing — show the change and the exact request it would send. false: make the change. | |
| end_date | No | With outranked "end_date" only: the day, month or year the OTHER values it outranks ended, or {"unknown": true} for an end time of unknown value (supersede: `date` unless given). Never the superseded value’s own end, which is `date`. | |
| evidence | No | Required, except for a deprecation of kind `suppressed` or `wrong_subject`, whose evidence the site writes. | |
| language | No | set_label, set_description, set_aliases: the language code, e.g. "en", "da", "mul". | |
| property | No | The statement’s property (not for a merge). | |
| new_value | No | set_value and move: the new value (on a property outside the catalog, as `value` takes it; a move’s may be left out there, to move the value as it is); set_label and set_description: the new text, "" to remove the term. | |
| other_qid | No | merge: the item it duplicates; move_to_item, copy_to_item: the item the statement goes to. | |
| outranked | No | A preferred rank that would make other values not current: "end_date" end-dates them, "leave_normal" sets no preferred rank, "keep_normal" makes it preferred and leaves them normal with no end time, still true but less precise (a city of birth, P19, beside its country), "point_in_time" leaves them normal with no end time (each must have a point in time, P585, or as a software version, P348, a publication date, P577, and no start or end time). Point-in-time values alone (a follower count with P585, a software version’s releases with P577) need no choice. | |
| qualifier | No | add_qualifier, change_qualifier: the qualifier and its value; remove_qualifier: optionally its property. | |
| reference | No | add_claim, supersede, add_reference, replace_reference (required): the source. An account statement on a platform the site knows (X, Instagram, Facebook, YouTube, TikTok, …) cited by the account itself or another of the subject’s social profiles, or a new one (add_claim, supersede) given no reference, is filed stated in the platform’s item instead (P248, e.g. Q918 for X), retrieved the day given or today, as the site’s own suggestions are: the dry run shows it in `would_file`, the one given as `evidence.reference_given`, and says so in `warning`. Cite a page independent of the account (the official website, a news article) to have it filed as given. move_to_item, copy_to_item (optional): a reference the copy gets after those read, required when one of those cites a Wikimedia page. | |
| belongs_to | No | Kind wrong_subject (required): the other item of the pair, the one the value belongs to. | |
| qualifiers | No | add_claim, supersede: qualifiers on the new statement, each a property and a value; {"unknown": true} for a time of unknown value (an end time no source dates). | |
| value_seen | No | The statement’s value as you read it. A label or description: the term as you read it, null for none. Aliases: the list as you read it, [] for none. | |
| new_property | No | move: the property it belongs under. | |
| qualifier_hash | No | change_qualifier, remove_qualifier: the hash of the qualifier on the statement. | |
| reference_hash | No | replace_reference: the hash of the reference it replaces. | |
| statement_guid | No | The statement’s id, e.g. "Q42$0a1b…" (not for a merge; optional for a deprecation, which the site finds by its value). |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | A dry run: what to do next to make the change, in words. |
| result | No | A real run: the route’s own answer, where the tool adds facts of its own beside it. |
| confirm | No | A dry run of a change that needs it: the exact target to send back as `confirm` with dry_run: false. |
| dry_run | No | true: a dry run, which wrote nothing. Absent from a real run. |
| replayed | No | A real run with an idempotency_key already used for this change: the first call’s answer, given back; nothing was written now. |
| would_send | No | A dry run: the exact request the real run would send (`method`, `path`, any `headers` such as an Idempotency-Key, and its `body`, `form` or `query`), or the requests, in order. |
| may_edit_live | No | A dry run of a live edit: whether this key’s account may edit this entry live. |
| refused_because | No | A dry run the real run would be refused for: why, in words. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say readOnlyHint=false, destructiveHint=false, idempotentHint=true; the description goes far beyond them, disclosing that nothing is written to Wikidata, that approval is out of scope for this server, the trusted-editor 200/day (UTC) limit, the audit trail, the dry-run default, and the full set of refusal and warning codes with their `message`/`suggestion` payloads. This is exactly the behavioural context annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The body is a single multi-thousand-word run-on paragraph with semicolons and em-dashes carrying clause after clause; there is no heading, list or paragraph break across dozens of distinct action modes. Only the first sentence is front-loaded and readable; the rest is effectively unparseable for an agent trying to locate the rules for one action, so the material does not earn its place in this form.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 28 parameters, 18 actions, nested value/reference/qualifier objects, an output schema and annotations, this is an exceptionally complex tool and the description is comprehensively complete — it names dry-run outputs (`reference_snaks`, `statement`, `replaces`, `adopts`, `joins`, `website_languages`), every refusal code, and every downstream VH sync consequence. Nothing an agent needs in order to call it correctly is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 93%, but the description adds real meaning the schema does not: that `reference` is REQUIRED for add_claim and supersede, which parameters pair with which `action`/`kind`, the JSON-precision trap at 9007199254740991, and the safe-merge conditions on `value_seen`. Not every parameter is covered narratively (`property`, `statement_guid` and several hashes rely on the schema), which keeps it below a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence gives a specific verb and resource ("Propose a correction to a Wikidata statement … for an administrator to approve and make") and states the safety posture ("nothing is written to Wikidata"). It never distinguishes itself from the sibling propose_wikidata_changes, which is named once only as a batching mechanism, so an agent has no explicit rule for choosing between the two.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Extensive routing exists: "To withdraw a correction without filing one in your place, use dismiss_wikidata_correction," dry-run-by-default behaviour, the 409 `dismissed` → `refile: true` path, and per-kind refusal conditions that effectively state when-not. What is missing is an explicit "for single corrections use this, for batches use propose_wikidata_changes" contrast with the real sibling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reject_applicationDecline an applicationADestructiveInspect
Decline an open application with a reason and an optional note; the applicant is emailed both, and the note goes on its thread. Cannot be undone (they may apply again). Audited. Dry run by default; the real run needs confirm set to the application’s id.
| Name | Required | Description | Default |
|---|---|---|---|
| note | No | A note to the applicant: what would change the answer, if anything. | |
| reason | Yes | Why it is declined — the applicant is emailed it: "ineligible" (Does not meet the eligibility policy), "duplicate" (An entry for this subject already exists), "insufficient_evidence" (Not enough evidence to assess the application), "out_of_scope" (Outside what Verified Handles lists), "other" (Other — see the note). | |
| confirm | No | Needed with dry_run: false: this change’s exact target, as the dry run gives it in `confirm`. | |
| dry_run | No | true (the default): write nothing — show the change and the exact request it would send. false: make the change. | |
| application_id | Yes | The application’s id (list_applications). |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | A dry run: what to do next to make the change, in words. |
| result | No | A real run: the route’s own answer, where the tool adds facts of its own beside it. |
| confirm | No | A dry run of a change that needs it: the exact target to send back as `confirm` with dry_run: false. |
| dry_run | No | true: a dry run, which wrote nothing. Absent from a real run. |
| replayed | No | A real run with an idempotency_key already used for this change: the first call’s answer, given back; nothing was written now. |
| would_send | No | A dry run: the exact request the real run would send (`method`, `path`, any `headers` such as an Idempotency-Key, and its `body`, `form` or `query`), or the requests, in order. |
| may_edit_live | No | A dry run of a live edit: whether this key’s account may edit this entry live. |
| refused_because | No | A dry run the real run would be refused for: why, in words. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well past the annotations by disclosing side effects and constraints the agent cannot infer from structured fields: the applicant is emailed both reason and note, the note lands on the application thread, the action is audited, and it is irreversible though the applicant may reapply. This is consistent with destructiveHint=true and idempotentHint=false and adds real operational context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the action and its side effects, then the irreversibility warning, then the dry-run safety workflow. Every clause carries information an agent needs; nothing is padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, confirmation-gated mutation the description covers side effects, reversibility, audit, and the dry-run/confirm protocol, and an output schema exists so return values need no explanation. The only shortfall is the lack of explicit contrast with the other application-disposition siblings.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaning beyond the schema: it clarifies that confirm must equal the application's id (the schema only says 'this change's exact target'), and ties reason/note to the emailed-to-applicant behavior. The dry_run default is restated rather than clarified, so it is not a full 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Decline an open application') with the required inputs and its scope ('open application'), clearly separating it from approve_application and mark_application_spam in the sibling list. An agent knows exactly what this does without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'open application' qualifier implies the precondition, and the dry-run-default workflow tells the agent how to actually execute. It does not, however, explicitly distinguish this from adjacent siblings like mark_application_spam or comment_on_application, so the routing guidance is clear but not exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
report_entryReport an entryAInspect
Report an entry to the Verified Handles team, as its page’s “Report” form does: for a person to decide: delete, merge, image rights, wrong information. Reason image names the image it is about (media_id, one of the images the entry shows) and needs a note saying who owns it and what should change. Reason image_link is about where an image links (only for an image with a link — get_entry’s images[].link); media_id names which, else the first with one, and the report keeps the link as it is now. To delete or merge an entry, report it as incorrect or other with a note naming the entry to keep. It lands in Console → Reports. Audited. Dry run by default.
| Name | Required | Description | Default |
|---|---|---|---|
| note | No | What is wrong, for the team (at most 1000 characters). Needed for an image report. | |
| entry | Yes | The entry: its VHID (11 digits), its short name (as in verifiedhandles.org/<short>), or its Wikidata QID (Q42). | |
| reason | Yes | impersonation: a handle here isn’t the real account; incorrect information; outdated: a handle has changed or closed; abuse or inappropriate content; image: its rights or permission; image_link: where an image links goes somewhere wrong, misleading or harmful; other. | |
| dry_run | No | true (the default): write nothing — show the change and the exact request it would send. false: make the change. | |
| media_id | No | For reason `image` or `image_link`: which of the entry’s images (the dry run lists them). |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | A dry run: what to do next to make the change, in words. |
| result | No | A real run: the route’s own answer, where the tool adds facts of its own beside it. |
| confirm | No | A dry run of a change that needs it: the exact target to send back as `confirm` with dry_run: false. |
| dry_run | No | true: a dry run, which wrote nothing. Absent from a real run. |
| replayed | No | A real run with an idempotency_key already used for this change: the first call’s answer, given back; nothing was written now. |
| would_send | No | A dry run: the exact request the real run would send (`method`, `path`, any `headers` such as an Idempotency-Key, and its `body`, `form` or `query`), or the requests, in order. |
| may_edit_live | No | A dry run of a live edit: whether this key’s account may edit this entry live. |
| refused_because | No | A dry run the real run would be refused for: why, in words. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare the safety profile (readOnlyHint=false, destructiveHint=false, idempotentHint=false), so the description adds genuine new context: reports land in 'Console → Reports', are 'Audited', and the operation is 'Dry run by default'. It doesn't restate the schema's dry_run details, adding destination and auditability instead.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then organized by reason. It is dense with colon/dash clauses and runs fairly long, but nearly every clause is load-bearing (media_id rules, note requirement, dry-run default), so it stays efficient rather than padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return-value explanation is unneeded, and the description covers the remaining essentials: the reason taxonomy's least obvious cases, the note/media_id coupling, and the audited dry-run-default behavior. An agent can call this correctly without opening anything else.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% so the baseline is 3, but the description adds cross-parameter semantics the schema lacks: which reason forces media_id, that `image` needs a note stating ownership and the change, and that `image_link` defaults to the first image with a link and preserves the link as-is.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Report an entry to the Verified Handles team') and anchors it to a familiar surface ('as its page's Report form does'). It also distinguishes the reporting pathway from the direct mutation siblings by explaining that delete/merge are achieved by reporting as `incorrect` or `other`.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear conditions for the tricky reasons: `image` requires a media_id and an ownership note, `image_link` applies only to an image with a link (referencing get_entry's images[].link), and delete/merge should be reported as `incorrect`/`other`. It stops short of explicitly naming sibling tools like delete_entry or merge_entry as alternatives to avoid, leaving some routing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
retract_my_submissionRetract my own submissionAIdempotentInspect
Withdraw one of this key’s own account’s submissions while it is still open (waiting for a reviewer, or for your answer): no reviewer acts on it after, and it cannot be reopened. Only your own, whatever the key’s role. Audited. Dry run by default: it says whether the submission is yours and still open.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The submission’s id (list_my_submissions, or the tool that sent it). | |
| dry_run | No | true (the default): write nothing — show the change and the exact request it would send. false: make the change. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | A dry run: what to do next to make the change, in words. |
| result | No | A real run: the route’s own answer, where the tool adds facts of its own beside it. |
| confirm | No | A dry run of a change that needs it: the exact target to send back as `confirm` with dry_run: false. |
| dry_run | No | true: a dry run, which wrote nothing. Absent from a real run. |
| replayed | No | A real run with an idempotency_key already used for this change: the first call’s answer, given back; nothing was written now. |
| would_send | No | A dry run: the exact request the real run would send (`method`, `path`, any `headers` such as an Idempotency-Key, and its `body`, `form` or `query`), or the requests, in order. |
| may_edit_live | No | A dry run of a live edit: whether this key’s account may edit this entry live. |
| refused_because | No | A dry run the real run would be refused for: why, in words. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnlyHint=false, idempotentHint=true, destructiveHint=false, so the safety profile is partly given. The description adds genuinely new behavior: no reviewer acts afterwards, the submission cannot be reopened, the action is audited, and dry_run is on by default and merely validates ownership plus open state. That is meaningful consequence disclosure beyond the structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core action and its precondition are front-loaded, followed by the consequence, the ownership constraint, and the dry-run note. It is dense but every clause carries information; the telegraphic fragments ('Audited.', 'Only your own, whatever the key’s role.') are terse yet readable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation, and annotations carry the safety flags. Combined with the stated preconditions, irreversibility, audit trail, and dry-run behavior, an agent has everything needed to invoke this two-parameter tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3, but the description adds meaning the schema lacks: it explains that dry_run reports whether the submission is yours and still open, i.e. what the preview actually validates, and reinforces that id must refer to the key's own submission.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — withdrawing one of the key's own submissions — plus the scoping condition (still open, own account only). An agent can distinguish this from review_submission, comment_on_my_submission, or list_my_submissions without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear preconditions: the submission must still be open (awaiting a reviewer or your answer), it must belong to the key's account, and the key's role doesn't matter. It stops short of naming alternatives such as review_submission for cases where the submission is no longer open, so it is strong context rather than an explicit when-not routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
review_submissionDecide a submissionADestructiveInspect
Decide one waiting submission (list_review_queue, or a quick proposal from list_applications with tab "proposals"): approve a proposed change or new entry (it is applied as an edit — a conflict with a later edit is answered, not applied), reject it or mark it spam (with an optional note to the submitter), or resolve a report (with an optional reply). An application (one waiting on the applicant too) is decided through the Applications queue, as approve_application, reject_application (needs reason) and mark_application_spam do: approving records its assessment as it stands, and rejecting it or marking it spam needs confirm set to its id. Audited. Dry run by default.
| Name | Required | Description | Default |
|---|---|---|---|
| note | No | reject/spam: the reason; resolve: the reply to the reporter. An application’s decline note: up to 1,000 characters. | |
| reason | No | Rejecting an application: why, from the reasons reject_application lists. Needed there, and only there. | |
| confirm | No | Needed with dry_run: false: this change’s exact target, as the dry run gives it in `confirm`. | |
| dry_run | No | true (the default): write nothing — show the change and the exact request it would send. false: make the change. | |
| decision | Yes | ||
| submission_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | A dry run: what to do next to make the change, in words. |
| result | No | A real run: the route’s own answer, where the tool adds facts of its own beside it. |
| confirm | No | A dry run of a change that needs it: the exact target to send back as `confirm` with dry_run: false. |
| dry_run | No | true: a dry run, which wrote nothing. Absent from a real run. |
| replayed | No | A real run with an idempotency_key already used for this change: the first call’s answer, given back; nothing was written now. |
| would_send | No | A dry run: the exact request the real run would send (`method`, `path`, any `headers` such as an Idempotency-Key, and its `body`, `form` or `query`), or the requests, in order. |
| may_edit_live | No | A dry run of a live edit: whether this key’s account may edit this entry live. |
| refused_because | No | A dry run the real run would be refused for: why, in words. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, so the mutation profile is covered; the description adds substantial context beyond that: it is 'Audited', defaults to dry run, and explains that an approval is applied as an edit where 'a conflict with a later edit is answered, not applied'. The confirm/confirmation requirement for real writes is also disclosed. Minor gap: no mention of rate limiting or what the dry-run output looks like.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The routing constraint is front-loaded in the first clause, which is good, but the rest is delivered as two very long run-on sentences with heavily nested parentheticals that are hard to parse. Every clause carries information, yet the structure impedes quick scanning more than it needs to.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a high-complexity tool with an output schema (so return values need not be explained), the description covers the decision set, the source queues, the dry-run default, audit logging, conflict behavior, and the application-queue alternative. The remaining gap is the absence of any note on permissions required to decide submissions or on pagination/batching of the queue.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67%, and the description meaningfully supplements it: it clarifies that `reason` belongs only to rejecting an application (not to this tool's own reject decision), that `confirm` must hold 'this change's exact target, as the dry run gives it in `confirm`', and that `note` is the reject/spam reason or the reply to a reporter. The cross-tool dependency between dry_run and confirm is genuinely beyond the schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource ('Decide one waiting submission') and enumerates the four decision outcomes (approve, reject, spam, resolve), each tied to a concrete artifact (proposed change, new entry, report). It explicitly carves out the Applications queue as a separate flow, so the agent can tell it apart from approve_application/reject_application without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It names the sources that feed this tool (list_review_queue or list_applications tab "proposals") and explicitly routes applications ('one waiting on the applicant too') to the sibling tools approve_application, reject_application, and mark_application_spam. When-to-use, when-not, and the alternatives are all stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
revoke_api_keyRevoke an API keyADestructiveIdempotentInspect
Revoke an API key: anything using it stops working at once, and it cannot be brought back (its owner makes a new one). One of your own account’s keys, or — with sub, and the permission to manage users — one of another account’s. The dry run lists the account’s keys (never more than a key’s public prefix) and says if it is the key this call is made with. Audited. Dry run by default; the real run needs confirm set to the key’s id.
| Name | Required | Description | Default |
|---|---|---|---|
| sub | No | Another account’s id (`sub`), to revoke one of its keys. Left out: one of your own. | |
| key_id | Yes | The key’s id, as the dry run lists it. | |
| confirm | No | Needed with dry_run: false: this change’s exact target, as the dry run gives it in `confirm`. | |
| dry_run | No | true (the default): write nothing — show the change and the exact request it would send. false: make the change. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | A dry run: what to do next to make the change, in words. |
| result | No | A real run: the route’s own answer, where the tool adds facts of its own beside it. |
| confirm | No | A dry run of a change that needs it: the exact target to send back as `confirm` with dry_run: false. |
| dry_run | No | true: a dry run, which wrote nothing. Absent from a real run. |
| replayed | No | A real run with an idempotency_key already used for this change: the first call’s answer, given back; nothing was written now. |
| would_send | No | A dry run: the exact request the real run would send (`method`, `path`, any `headers` such as an Idempotency-Key, and its `body`, `form` or `query`), or the requests, in order. |
| may_edit_live | No | A dry run of a live edit: whether this key’s account may edit this entry live. |
| refused_because | No | A dry run the real run would be refused for: why, in words. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (destructiveHint/idempotentHint) by disclosing irreversibility ("cannot be brought back"), immediacy ("stops working at once"), audit logging, the dry-run-by-default posture, and what the dry run reveals (key list, no more than a public prefix, whether the key is the current caller's). This is exactly the context an agent needs before a destructive call.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and its consequence, then scope, then the dry-run/confirm workflow. Dense with em-dashes and parentheticals, and the final sentence partially restates the schema's dry_run/confirm semantics, so it is informative but not maximally tight.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, idempotent mutation with an output schema, the description covers irreversibility, permissions, audit, and the dry-run-to-confirm workflow. Nothing an agent needs to invoke it safely is missing, and return-format detail is correctly delegated to the output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the 3 baseline is already met by the schema. The description adds meaning the schema does not: `sub` implies a cross-account operation gated on "the permission to manage users," and it ties `confirm` concretely to the key's id rather than a generic target value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Revoke an API key") and immediately scopes the blast radius: anything using the key stops working and the key is unrecoverable. It also disambiguates the two target modes (your own key vs. another account's via `sub`), so an agent knows exactly what object is affected.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear preconditions rather than alternatives: `sub` requires "the permission to manage users," and the real mutation requires the dry run first plus `confirm` set to the key's id. No sibling alternative is named, but no equivalent sibling exists in the toolset, so the contextual guidance is adequate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_commons_imagesSearch Wikimedia CommonsARead-onlyInspect
Search Wikimedia Commons for an image to put on an entry, as the editor’s image picker does. An exact file name finds that file first, even one uploaded minutes ago. Each hit has a token: pass it to set_entry_image as commons_token.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| results | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnlyHint, openWorldHint), so the bar is lower; the description still adds real behavior: exact file names rank first and it can surface very recently uploaded files. It does not discuss pagination, result limits, or licensing/rate constraints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences with the core purpose front-loaded, followed by matching behavior and the cross-tool hand-off. Every sentence carries distinct, actionable information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be explained, and the description still flags the `token` field and its destination parameter. For a single-param read tool this is complete enough to call correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and the single `query` parameter is undocumented in the schema, so the description compensates by explaining that an exact file name is matched specially and ranked first. It stops short of describing other query syntax (e.g., fuzzy text search, case sensitivity).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Search) and resource (Wikimedia Commons images) with the concrete goal of putting an image on an entry, mirroring the editor's image picker. This is clearly distinguishable from siblings like search_entries, upload_image, and set_entry_image.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Makes clear when to use it (you want an image for an entry) and hands off explicitly to set_entry_image with the `commons_token` param. It does not name alternative routes such as upload_image or upload_image_from_url, so the exclusion guidance is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_entriesSearch entriesARead-onlyInspect
Search the entries as the site search does: words match titles, subtitles and descriptions; a Wikidata QID finds the entries linked to it; a VHID finds that entry and the entries that link to it.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes | ||
| offset | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| limit | No | The page size used: the `limit` asked for, clamped to the endpoint’s range. |
| query | Yes | The query as it was read: trimmed and cut to 100 characters. |
| total | Yes | How many entries matched in all. |
| offset | No | The offset used: the `offset` asked for, clamped to 0–10,000. |
| results | Yes | Best match first. |
| next_offset | No | The `offset` of the next page, or null when this is the last one. Follow it rather than computing it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered. The description does add meaningful behavior: which fields words match against, and that QID/VHID searches traverse links rather than matching text. It says nothing about result ordering, pagination limits, or the cap of 50 results.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One front-loaded sentence that defines the tool by analogy ("as the site search does") and then enumerates the three input forms. No filler and no repetition of the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return shape needn't be described, and the read-only annotation covers safety. The only material gap is pagination behavior, since limit and offset are unbounded in the description despite a 50-result cap in the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full burden for query, and it does that well by enumerating the three accepted query forms. The limit and offset parameters get no mention at all, so pagination semantics are undocumented in both places.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
A specific verb plus resource ("Search the entries") with the matching semantics spelled out, which tells an agent exactly what kind of lookup this performs. It does not name the neighboring get_entry/get_entries tools, so the distinction from exact-lookup siblings is left implicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The three query modes implicitly define when to use it (word search, known QID, known VHID), which is real guidance for choosing an input form. However, it never states how this differs from get_entries or get_entry, so an agent must infer the boundary from sibling names alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_article_heroSet an article’s hero imageADestructiveIdempotentInspect
Set the image at the top of an article, and its alt text (what it shows, for a reader who cannot see it), as a save does: an uploaded image’s media id (upload_image, upload_image_from_url, or media_catalog), or null to take it off; or, for a data story, a chart the site draws as the hero (its figures shown as a table under it). One or the other: a picture replaces a chart. Audited with the key and the tool. Dry run by default.
| Name | Required | Description | Default |
|---|---|---|---|
| alt | No | Its alt text. Left out, the alt text it has is kept while the image stays the same, and none is set for a new one. A chart’s goes in `chart.alt`. | |
| chart | No | A data story’s chart, drawn by the site as the hero: three images (1600×900, and 4:3 and 1:1 for search engines), stored as uploads under the article’s licence (CC BY 4.0, credited to Verified Handles), with the figures shown as a table under it. Saving the same spec again keeps its images; a corrected figure draws new ones. | |
| article | Yes | The article: its id (list_articles), its address ("/news/<slug>", "/guides/<slug>" or the full URL), or its slug alone. | |
| dry_run | No | true (the default): write nothing — show the change and the exact request it would send. false: make the change. | |
| summary | No | Why, in a few plain words, kept with the revision in the article’s history. Never an internal tracking ID. | |
| media_id | No | The image’s media id, or null for none. Not with `chart`. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | A dry run: what to do next to make the change, in words. |
| result | No | A real run: the route’s own answer, where the tool adds facts of its own beside it. |
| confirm | No | A dry run of a change that needs it: the exact target to send back as `confirm` with dry_run: false. |
| dry_run | No | true: a dry run, which wrote nothing. Absent from a real run. |
| replayed | No | A real run with an idempotency_key already used for this change: the first call’s answer, given back; nothing was written now. |
| would_send | No | A dry run: the exact request the real run would send (`method`, `path`, any `headers` such as an Idempotency-Key, and its `body`, `form` or `query`), or the requests, in order. |
| may_edit_live | No | A dry run of a live edit: whether this key’s account may edit this entry live. |
| refused_because | No | A dry run the real run would be refused for: why, in words. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true and readOnlyHint=false; the description adds genuinely non-obvious behavior on top: the call is audited against the key and tool, and it is a dry run by default. It also explains the replacement semantics (a picture displaces a chart). It doesn't say what happens to the previously set image's media asset when replaced with null.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded, but it is delivered as one very long semicolon-chained sentence mixing the image case, the chart case, the exclusivity rule, auditing and dry-run. Splitting into short sentences would make the key decision (image vs chart) easier to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, multi-modal mutation tool with a rich nested chart schema and an output schema (so return values need no explanation), the description covers both modes, removal, sourcing of the media id, audit behavior and the dry-run default. Nothing an agent needs before invoking it is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description earns above baseline by naming the source tools for media_id and by stating the mutual-exclusion constraint between media_id and chart, which the schema alone only implies via 'Not with `chart`'. Alt-text handling nuances remain in the schema rather than the description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (set an article's hero image) and immediately enumerates the two possible payloads — a media id or a chart spec — so the agent knows exactly what the tool mutates. It is clearly distinct from sibling set_entry_image/set_entry_gallery by scoping to articles, and from upload_image by describing the hero assignment rather than the upload.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent to upload_image, upload_image_from_url or media_catalog to obtain a media id, and states the exclusivity rule ('One or the other: a picture replaces a chart'). It also explains null as removal. It stops short of naming a sibling to use instead for entry-level images or stating prerequisites (e.g. article must be a draft).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_entry_gallerySet an entry’s galleryADestructiveInspect
Set the images an entry shows after its lead image: the whole ordered list of media ids (from media_catalog or get_entry), replacing the gallery; [] empties it. At most 5 (6 images in all with the lead), each once, never the lead itself (set_entry_image sets that). An image taken off loses its link; links sets or clears the link of an image in the list (needs Link images). A live edit, audited. Dry run by default. To ask a reviewer instead, use propose_entry_change.
| Name | Required | Description | Default |
|---|---|---|---|
| entry | Yes | The entry: its VHID (11 digits), its short name (as in verifiedhandles.org/<short>), or its Wikidata QID (Q42). | |
| links | No | media id → the address that image links to on the entry page instead of the full-screen viewer; "" clears it. Images not named keep theirs. Needs Link images. | |
| dry_run | No | true (the default): write nothing — show the change and the exact request it would send. false: make the change. | |
| summary | No | Why you made this edit, in a few plain words; shown in the entry’s public history. At most 200 characters. Never an internal tracking ID (a backlog or ticket number); a VHID is fine. | |
| media_ids | Yes | ||
| idempotency_key | No | Optional: a key you choose (1–255 printable ASCII, e.g. a UUID), sent as the write’s Idempotency-Key. Calling again with the same key and the same change within 24 hours answers the first call’s result (replayed: true) and writes nothing; the same key with another change is refused (422). | |
| base_revision_id | No | The revision you read (get_entry → editing.baseRevisionId). If the entry has changed since, the edit is refused as a conflict. Left out, the current revision is used. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | A dry run: what to do next to make the change, in words. |
| result | No | A real run: the route’s own answer, where the tool adds facts of its own beside it. |
| confirm | No | A dry run of a change that needs it: the exact target to send back as `confirm` with dry_run: false. |
| dry_run | No | true: a dry run, which wrote nothing. Absent from a real run. |
| replayed | No | A real run with an idempotency_key already used for this change: the first call’s answer, given back; nothing was written now. |
| would_send | No | A dry run: the exact request the real run would send (`method`, `path`, any `headers` such as an Idempotency-Key, and its `body`, `form` or `query`), or the requests, in order. |
| may_edit_live | No | A dry run of a live edit: whether this key’s account may edit this entry live. |
| refused_because | No | A dry run the real run would be refused for: why, in words. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as a destructive, non-read-only write. The description adds important behavior beyond annotations: it is a live audited edit, dry-run by default, images removed lose their links, links require the Link images permission, and the gallery is limited to 5 images with no duplicates or lead image.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but front-loaded with the primary action and then packs constraints efficiently. Every sentence carries operational information, and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, nested-object write tool with an output schema, the description covers the essential agent-facing context: purpose, replacement semantics, limits, permission needs, dry-run default, audit context, and the main alternative. Return values are appropriately left to the output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is high at 86%, so the schema already carries much of the parameter documentation. The description still adds meaningful semantics for media_ids and links, including the business limit of 5 images despite the schema allowing 50, ordering, replacement behavior, and link clearing behavior.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: set the ordered gallery of images an entry shows after its lead image, replacing the whole list. It explicitly distinguishes itself from set_entry_image for the lead image and propose_entry_change for review-based edits, so the agent can identify exactly what this tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear routing: use propose_entry_change to ask a reviewer instead, and use set_entry_image for the lead image. It also explains the replacement semantics and that dry_run defaults to true, giving practical invocation context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_entry_imageSet or clear an entry’s imageADestructiveInspect
Put an image on an entry — one already on the site (media_id, from media_catalog or get_entry) or a Wikimedia Commons file (commons_token, from search_commons_images) — or take the image off (clear: true). A new image starts with no link; link sets the address the image opens on the entry page instead of the full-screen viewer ("" clears it), which needs Link images. A live edit, audited. Setting the image yourself takes it from the Wikidata sync. Dry run by default. To ask a reviewer instead, use propose_entry_change.
| Name | Required | Description | Default |
|---|---|---|---|
| link | No | An absolute https:// (or http://) address the image links to instead of opening the full-screen viewer; "" for no link. Needs Link images. | |
| clear | No | ||
| entry | Yes | The entry: its VHID (11 digits), its short name (as in verifiedhandles.org/<short>), or its Wikidata QID (Q42). | |
| dry_run | No | true (the default): write nothing — show the change and the exact request it would send. false: make the change. | |
| summary | No | Why you made this edit, in a few plain words; shown in the entry’s public history. At most 200 characters. Never an internal tracking ID (a backlog or ticket number); a VHID is fine. | |
| media_id | No | ||
| commons_token | No | ||
| idempotency_key | No | Optional: a key you choose (1–255 printable ASCII, e.g. a UUID), sent as the write’s Idempotency-Key. Calling again with the same key and the same change within 24 hours answers the first call’s result (replayed: true) and writes nothing; the same key with another change is refused (422). | |
| base_revision_id | No | The revision you read (get_entry → editing.baseRevisionId). If the entry has changed since, the edit is refused as a conflict. Left out, the current revision is used. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | A dry run: what to do next to make the change, in words. |
| result | No | A real run: the route’s own answer, where the tool adds facts of its own beside it. |
| confirm | No | A dry run of a change that needs it: the exact target to send back as `confirm` with dry_run: false. |
| dry_run | No | true: a dry run, which wrote nothing. Absent from a real run. |
| replayed | No | A real run with an idempotency_key already used for this change: the first call’s answer, given back; nothing was written now. |
| would_send | No | A dry run: the exact request the real run would send (`method`, `path`, any `headers` such as an Idempotency-Key, and its `body`, `form` or `query`), or the requests, in order. |
| may_edit_live | No | A dry run of a live edit: whether this key’s account may edit this entry live. |
| refused_because | No | A dry run the real run would be refused for: why, in words. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag the write profile (readOnlyHint=false, destructiveHint=true), but the description adds non-obvious behavior: dry run is the default, edits are live and audited, and self-setting the image removes it from Wikidata sync. It doesn't state what happens on conflicting arguments (media_id + commons_token) or permission requirements, so not a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action and its two sources before branching into link/clear semantics, then closes with the default-dry-run note and the alternative tool. Dense with parentheticals but every clause carries information; only mild compression would improve it.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need no explanation, and conflict/idempotency behavior is covered by base_revision_id and idempotency_key schema descriptions. Remaining gap is the interaction between the mutually exclusive image-source arguments and what happens if none are supplied.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67%, and the description compensates for the undescribed params: it explains media_id and commons_token origins, clear:true semantics, and that link sets a click-through address ('' clears it) requiring Link images. It leaves the mutual exclusivity of media_id/commons_token/clear implicit and adds nothing on entry, dry_run, or summary already documented in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb+resource ('Put an image on an entry … or take the image off') and enumerates the two input routes (media_id from media_catalog/get_entry, commons_token from search_commons_images) plus the clear flag. An agent can distinguish this from set_entry_gallery, upload_image, or propose_entry_change without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: use media_catalog/get_entry for existing site media, search_commons_images for Commons files, and propose_entry_change 'to ask a reviewer instead.' It gives clear context but does not draw the boundary against adjacent siblings like set_entry_gallery or upload_image/upload_image_from_url.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_wikidata_ownershipHand fields or handles to Wikidata, or take them backADestructiveInspect
Say who manages an entry’s fields and handles. relinquish_* hands them to the Wikidata sync (the next sync refreshes them, and a relinquish queues one); takeover_* takes them back, so the sync leaves them alone. release_held_handles lets the sync add back handles that were held back after a removal. A live edit, audited. Dry run by default. To ask a reviewer instead, use propose_entry_change.
| Name | Required | Description | Default |
|---|---|---|---|
| entry | Yes | The entry: its VHID (11 digits), its short name (as in verifiedhandles.org/<short>), or its Wikidata QID (Q42). | |
| dry_run | No | true (the default): write nothing — show the change and the exact request it would send. false: make the change. | |
| summary | No | Why you made this edit, in a few plain words; shown in the entry’s public history. At most 200 characters. Never an internal tracking ID (a backlog or ticket number); a VHID is fine. | |
| idempotency_key | No | Optional: a key you choose (1–255 printable ASCII, e.g. a UUID), sent as the write’s Idempotency-Key. Calling again with the same key and the same change within 24 hours answers the first call’s result (replayed: true) and writes nothing; the same key with another change is refused (422). | |
| takeover_fields | No | ||
| base_revision_id | No | The revision you read (get_entry → editing.baseRevisionId). If the entry has changed since, the edit is refused as a conflict. Left out, the current revision is used. | |
| takeover_handles | No | ||
| relinquish_fields | No | ||
| relinquish_handles | No | Only while Wikidata lists the value. | |
| release_held_handles | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | A dry run: what to do next to make the change, in words. |
| result | No | A real run: the route’s own answer, where the tool adds facts of its own beside it. |
| confirm | No | A dry run of a change that needs it: the exact target to send back as `confirm` with dry_run: false. |
| dry_run | No | true: a dry run, which wrote nothing. Absent from a real run. |
| replayed | No | A real run with an idempotency_key already used for this change: the first call’s answer, given back; nothing was written now. |
| would_send | No | A dry run: the exact request the real run would send (`method`, `path`, any `headers` such as an Idempotency-Key, and its `body`, `form` or `query`), or the requests, in order. |
| may_edit_live | No | A dry run of a live edit: whether this key’s account may edit this entry live. |
| refused_because | No | A dry run the real run would be refused for: why, in words. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (which already flag destructiveHint=true and idempotentHint=false), the description adds real context: the edit is live and audited, dry_run defaults to true, a relinquish queues a sync, and takeover makes the sync "leave them alone." It does not describe the conflict/idempotency replay behavior, but the schema covers those. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Roughly six short sentences that are front-loaded with the core operation, then the mode semantics, then the fallback tool. Dense but every sentence carries information; no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 10-parameter mutation tool with an output schema, the description covers the essential mental model (ownership transfer, sync effects, dry-run default, audit trail, reviewer alternative). Remaining details (constraint that a handle must currently be on Wikidata, revision conflicts) are already in the schema, so nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 60% schema coverage, the description earns credit by giving meaning to the parameter families it names: what relinquishing does to the sync, that takeover reverses it, and that release_held_handles re-adds held-back handles. Individual params like entry, summary, and base_revision_id are left to the schema, which documents them well.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description conveys a specific operation: transferring management of an entry's fields and handles between the editor and the Wikidata sync, with relinquish_*/takeover_* semantics spelled out. It also differentiates from the sibling propose_entry_change. The phrasing "Say who manages..." is a bit abstract as a verb, but the surrounding sentences make the effect unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly routes the agent to an alternative ("To ask a reviewer instead, use propose_entry_change") and explains the differing behaviors of relinquish vs takeover vs release. It stops short of contrasting with other direct-write siblings such as update_entry_fields or update_entry_handles, so the when-to-use picture is partial.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_article_draftEdit an articleADestructiveIdempotentInspect
Save a new version of an article, as the console’s Save does: only the fields given change, over the article’s own (null clears one). A draft changes at once. A live (or scheduled) article changes at once for a key whose account may publish (modified: true moves its visible “Updated” date); for any other key the save waits for a publisher, and readers keep the words they see now. The slug of an article that has been published changes only with change_article_slug. Audited with the key and the tool. Dry run by default: it shows what changes, the cleaned HTML of a new body, its links and what the allowlist took out, and whether the save would wait.
| Name | Required | Description | Default |
|---|---|---|---|
| dek | No | ||
| body | No | The article’s text, in Markdown by default (body_format). A link to an entry is [Name](/<VHID>): it shows the entry’s current name while its text is that name. A heading “#” becomes a second-level heading (the title is the first). Raw HTML in Markdown is shown as text. | |
| slug | No | The address’s last part: lower-case letters and digits in words split by single hyphens (e.g. "x-drops-legacy-checkmarks"), at most 80, never 11 digits. | |
| title | No | ||
| topic | No | A News article’s one topic: "verification" (Verification), "impersonation" (Impersonation and scams), "official-accounts" (Official accounts), "vh-data" (VH data), "vh-updates" (VH updates); or a guide’s group on the guides page: "check" (Check an account), "use" (Use Verified Handles), "contribute" (Get listed and help keep it right), "developers" (Developers and AI). null for none. | |
| article | Yes | The article: its id (list_articles), its address ("/news/<slug>", "/guides/<slug>" or the full URL), or its slug alone. | |
| authors | No | The byline, in order: each author is an entry (VHID, short name or QID), at most 10. Whoever publishes may pick it again then. | |
| dry_run | No | true (the default): write nothing — show the change and the exact request it would send. false: make the change. | |
| summary | No | Why, in a few plain words, kept with the revision in the article’s history. Never an internal tracking ID. | |
| hero_alt | No | The hero image’s alt text: what it shows, for a reader who cannot see it. Only with a hero image. | |
| modified | No | A live article, saved by a publisher: true when this change matters to a reader, so its “Updated” date moves. | |
| body_format | No | "markdown" (the default) or "html": how `body` is written. Either is stored as cleaned HTML, through the site’s allowlist. | markdown |
| hero_media_id | No | The hero image: an uploaded image’s media id (upload_image, or media_catalog); null for none. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | A dry run: what to do next to make the change, in words. |
| result | No | A real run: the route’s own answer, where the tool adds facts of its own beside it. |
| confirm | No | A dry run of a change that needs it: the exact target to send back as `confirm` with dry_run: false. |
| dry_run | No | true: a dry run, which wrote nothing. Absent from a real run. |
| replayed | No | A real run with an idempotency_key already used for this change: the first call’s answer, given back; nothing was written now. |
| would_send | No | A dry run: the exact request the real run would send (`method`, `path`, any `headers` such as an Idempotency-Key, and its `body`, `form` or `query`), or the requests, in order. |
| may_edit_live | No | A dry run of a live edit: whether this key’s account may edit this entry live. |
| refused_because | No | A dry run the real run would be refused for: why, in words. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds substantial behavior beyond the annotations: partial updates only, null clearing fields, draft versus live/scheduled save behavior, publisher-gated changes, audit logging with key and tool, and the dry-run preview including cleaned HTML, links, allowlist removals, and whether the save would wait. This is rich transparency for a destructive mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but front-loaded and every sentence carries relevant operational meaning. For a 13-parameter destructive tool with dry-run, publishing, slug, and audit behavior, the length is justified and there is no obvious filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the annotations, output schema, and high schema coverage, the description supplies the missing operational context an agent needs: save semantics, authorization/waiting behavior, slug restriction, audit behavior, and dry-run output. Nothing critical is omitted for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is high at 85%, so the schema already documents most parameters. The description still adds valuable semantics beyond the schema: only provided fields change, null clears a field, modified controls the visible Updated date for publishers, and dry_run defaults to true.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource: it saves a new version of an article, with partial-update semantics matching the console's Save. It clearly frames the tool as an edit/save operation rather than a creation or listing tool, which helps separate it from siblings such as draft_article and get_article.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explains important usage conditions: dry run is the default, draft articles change immediately, live/scheduled articles may wait for a publisher, and slug changes must go through change_article_slug. It does not explicitly contrast with draft_article for creating new drafts, so it is strong but not fully exhaustive on alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_entriesEdit many entries liveADestructiveInspect
Live edits to up to 25 entries in one request, each as update_entry_fields and update_entry_handles make one (the text fields, handles added and removed): a new revision each, audited with one batch id. Whether this key may edit each entry live is decided entry by entry, as for one edit (the dry run’s may_edit_live). By default each edit stands alone and the answer gives each one’s outcome; with atomic: true, any refused edit means none is made. Dry run by default: it reads each entry and lists what would change. The real run needs confirm set to the batch digest the dry run names. To ask a reviewer instead, use propose_entry_changes.
| Name | Required | Description | Default |
|---|---|---|---|
| edits | Yes | The edits, each to a different entry. | |
| atomic | No | true: all or nothing — if any edit is refused, none is made (the route answers 422 naming each refused edit). false (the default): each edit on its own. | |
| confirm | No | Needed with dry_run: false: this change’s exact target, as the dry run gives it in `confirm`. | |
| dry_run | No | true (the default): write nothing — show the change and the exact request it would send. false: make the change. | |
| summary | No | Why you made these edits, in a few plain words: each edit’s summary unless it gives its own. Shown in each entry’s public history. Never an internal tracking ID; a VHID is fine. | |
| idempotency_key | No | Optional: a key you choose (1–255 printable ASCII, e.g. a UUID), sent as the write’s Idempotency-Key. Calling again with the same key and the same change within 24 hours answers the first call’s result (replayed: true) and writes nothing; the same key with another change is refused (422). |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | A dry run: what to do next to make the change, in words. |
| result | No | A real run: the route’s own answer, where the tool adds facts of its own beside it. |
| confirm | No | A dry run of a change that needs it: the exact target to send back as `confirm` with dry_run: false. |
| dry_run | No | true: a dry run, which wrote nothing. Absent from a real run. |
| replayed | No | A real run with an idempotency_key already used for this change: the first call’s answer, given back; nothing was written now. |
| would_send | No | A dry run: the exact request the real run would send (`method`, `path`, any `headers` such as an Idempotency-Key, and its `body`, `form` or `query`), or the requests, in order. |
| may_edit_live | No | A dry run of a live edit: whether this key’s account may edit this entry live. |
| refused_because | No | A dry run the real run would be refused for: why, in words. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, readOnlyHint=false, and idempotentHint=false, so the safety profile is covered. The description adds substantial context beyond that: a new revision per entry with one batch id for audit, per-entry may_edit_live authorization, dry-run-by-default, and the digest-confirm gate for real writes. It does not describe response shape, but an output schema exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action and scope in the first clause, then layers on atomicity, dry run, and the alternative. The parenthetical 'each as update_entry_fields and update_entry_handles make one (the text fields, handles added and removed)' is slightly convoluted but earns its place by anchoring the sibling relationship.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, 6-parameter batch mutation with an output schema, the description covers everything an agent needs to call it correctly: scope limit, per-entry vs atomic semantics, dry-run-first protocol, confirm token, authorization model, and the human-review alternative. Return values are properly left to the output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds workflow meaning the schema alone doesn't convey: confirm is 'the batch digest the dry run names' and atomic governs whether 'any refused edit means none is made.' That ties the discrete parameters into a coherent two-phase protocol.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource with scope: 'Live edits to up to 25 entries in one request.' It explicitly maps itself onto the single-entry siblings update_entry_fields and update_entry_handles ('each as ... make one'), so an agent can distinguish batch from single-edit tools without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit routing: use propose_entry_changes to ask a reviewer instead, and use this tool for direct live edits. It also states the operational preconditions — dry run is the default, the real run requires confirm set to the dry run's batch digest, and atomic: true changes failure semantics to all-or-nothing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_entry_fieldsEdit an entry’s textADestructiveInspect
Change an entry’s title, subtitle, description or short name, or remove its “from Wikipedia” credit or name the Wikipedia page it came from — a live edit, as the editor saves one: a new revision, audited. Give only what changes; null clears a field. The description is HTML (sanitised on save). A field you change here is no longer managed by the Wikidata sync; to hand one back, so the next sync refreshes it from the item, use set_wikidata_ownership (relinquish_fields). Dry run by default. To ask a reviewer instead, use propose_entry_change.
| Name | Required | Description | Default |
|---|---|---|---|
| entry | Yes | The entry: its VHID (11 digits), its short name (as in verifiedhandles.org/<short>), or its Wikidata QID (Q42). | |
| short | No | The short name in the entry’s URL; null removes it (the VHID URL stays). | |
| title | No | ||
| dry_run | No | true (the default): write nothing — show the change and the exact request it would send. false: make the change. | |
| summary | No | Why you made this edit, in a few plain words; shown in the entry’s public history. At most 200 characters. Never an internal tracking ID (a backlog or ticket number); a VHID is fine. | |
| subtitle | No | ||
| description | No | ||
| idempotency_key | No | Optional: a key you choose (1–255 printable ASCII, e.g. a UUID), sent as the write’s Idempotency-Key. Calling again with the same key and the same change within 24 hours answers the first call’s result (replayed: true) and writes nothing; the same key with another change is refused (422). | |
| base_revision_id | No | The revision you read (get_entry → editing.baseRevisionId). If the entry has changed since, the edit is refused as a conflict. Left out, the current revision is used. | |
| credit_wikipedia_page | No | Credit the description “from Wikipedia”: an English Wikipedia article or draft, by title ("Draft:Dominic McLaughlin") or address. The server reads the page (redirects followed) and refuses it unless at least half of the description’s three-word phrases are the page’s lead (credit_text_differs, with the share). | |
| remove_wikipedia_credit | No | true: remove the “from Wikipedia” credit from the description. | |
| credit_let_wikidata_manage | No | With a draft named in credit_wikipedia_page: false keeps the description site-authored. By default a draft’s credit hands the description to the Wikidata sync, which leaves it alone until the draft is an article linked from the entry’s Wikidata item. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | A dry run: what to do next to make the change, in words. |
| result | No | A real run: the route’s own answer, where the tool adds facts of its own beside it. |
| confirm | No | A dry run of a change that needs it: the exact target to send back as `confirm` with dry_run: false. |
| dry_run | No | true: a dry run, which wrote nothing. Absent from a real run. |
| replayed | No | A real run with an idempotency_key already used for this change: the first call’s answer, given back; nothing was written now. |
| would_send | No | A dry run: the exact request the real run would send (`method`, `path`, any `headers` such as an Idempotency-Key, and its `body`, `form` or `query`), or the requests, in order. |
| may_edit_live | No | A dry run of a live edit: whether this key’s account may edit this entry live. |
| refused_because | No | A dry run the real run would be refused for: why, in words. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructive/not-read-only/not-idempotent, but the description adds substantial context beyond them: live edit creating a new audited revision, dry-run-by-default behavior, null-clears semantics, HTML sanitisation on save, the credit validation threshold (half of three-word phrases, credit_text_differs), and the effect on Wikidata ownership. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core purpose and packs in a lot of value, but the prose is dense and relies on em-dashes and parentheticals that make it read as a single sprawling paragraph. Still, nearly every clause earns its place with routing or behavioral detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex 12-parameter mutation tool with an output schema, the description covers what an agent needs: scope, dry-run default, ownership side effects, credit validation, idempotency-key semantics, and the alternative reviewer workflow. Return values are handled by the output schema, so nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 75% and already documents most params, but the description adds cross-cutting semantics that the schema lacks: 'Give only what changes; null clears a field', the description-is-HTML note, and the ownership handoff for edited fields. It meaningfully enriches the 12-parameter surface.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States specific verbs and the exact fields it edits (title, subtitle, description, short name, Wikipedia credit) and explicitly names the sibling it is not: propose_entry_change. An agent can distinguish this from propose_entry_change, update_entries, and set_entry_setting without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Carries explicit routing rules — 'To ask a reviewer instead, use propose_entry_change' and 'to hand one back ... use set_wikidata_ownership (relinquish_fields)' — plus the condition that changed fields exit Wikidata sync management. When-to-use and when-to-use-something-else are both covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_entry_handlesAdd or remove handlesADestructiveInspect
Add handles to an entry or remove them — a live edit. Only the handles named are sent (add_handles / remove_handles), and the server applies them to the entry’s list as it is when it saves: an added handle goes at the end, one the entry has already, or one to remove that it has not, changes nothing (the answer’s handle_ops says which), and nothing is read first, so a handle someone else saved meanwhile is never undone. A handle you remove that the Wikidata sync supplied is held back so the sync does not bring it back. Dry run by default. To ask a reviewer instead, use propose_entry_change.
| Name | Required | Description | Default |
|---|---|---|---|
| add | No | ||
| entry | Yes | The entry: its VHID (11 digits), its short name (as in verifiedhandles.org/<short>), or its Wikidata QID (Q42). | |
| remove | No | Handles to take off, each by its value — or, for an email this key may not see, by {platform_id: "email", ref}. | |
| dry_run | No | true (the default): write nothing — show the change and the exact request it would send. false: make the change. | |
| summary | No | Why you made this edit, in a few plain words; shown in the entry’s public history. At most 200 characters. Never an internal tracking ID (a backlog or ticket number); a VHID is fine. | |
| idempotency_key | No | Optional: a key you choose (1–255 printable ASCII, e.g. a UUID), sent as the write’s Idempotency-Key. Calling again with the same key and the same change within 24 hours answers the first call’s result (replayed: true) and writes nothing; the same key with another change is refused (422). | |
| base_revision_id | No | Not needed, and not sent: handles are added and removed against the entry as it is when the edit is saved. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | A dry run: what to do next to make the change, in words. |
| result | No | A real run: the route’s own answer, where the tool adds facts of its own beside it. |
| confirm | No | A dry run of a change that needs it: the exact target to send back as `confirm` with dry_run: false. |
| dry_run | No | true: a dry run, which wrote nothing. Absent from a real run. |
| replayed | No | A real run with an idempotency_key already used for this change: the first call’s answer, given back; nothing was written now. |
| would_send | No | A dry run: the exact request the real run would send (`method`, `path`, any `headers` such as an Idempotency-Key, and its `body`, `form` or `query`), or the requests, in order. |
| may_edit_live | No | A dry run of a live edit: whether this key’s account may edit this entry live. |
| refused_because | No | A dry run the real run would be refused for: why, in words. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (readOnlyHint=false, destructiveHint=true): it explains the no-read merge semantics ('nothing is read first, so a handle someone else saved meanwhile is never undone'), what a no-op add/remove does, that removed Wikidata-synced handles are held back from re-sync, and that dry run is default. This is exactly the concurrency and side-effect context the annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core action is front-loaded and every sentence carries substance, but the middle portion is a dense run-on with stacked em-dash clauses that takes effort to parse. Slightly tighter phrasing would preserve the same information with less friction.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need no explanation, and the description still covers the full behavioral surface an agent needs: dry-run default, no-read merge guarantees, Wikidata-sync hold-back, and the reviewer alternative. Nothing material is left unstated for a tool of this complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 86%, so baseline is 3, but the description adds real meaning by naming the write fields (add_handles / remove_handles), explaining that only named handles are sent, and pointing to the response's handle_ops field. It stops short of detailing the entry identifier forms, which the schema already covers.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Add handles to an entry or remove them') and immediately frames it as 'a live edit', which distinguishes it from the sibling propose_entry_change. An agent can identify the action and its direct-edit nature without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent to the alternative: 'To ask a reviewer instead, use propose_entry_change.' It also flags that dry_run is the default, telling the agent both when to reach for this tool and how its default behavior sits relative to making a real change.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_imageUpload an image fileAInspect
Upload an image file you hold, sent as base64, with its licence, credit and source (the editor’s “upload a file”), stored as a new image — a lossless WebP at the file’s full resolution with its colour profile kept and every other metadata (EXIF, XMP, IPTC) dropped: at most 70 MB of file (its base64 is a third larger: up to 94 MB, which the site takes whole). POST /api/media (multipart, with this key) takes a file of the same 70 MB. The image is public at /img/w/…/ once stored, before any review — unless you set hold: true, which stores it held for a proposal: /img serves it only to you and to reviewers (never cached), it is in no list, and only your own proposal may name it, until a reviewer approves that proposal and releases it. A rejected or withdrawn proposal leaves it held, never deleted. The real run answers its mediaId: pass it to propose_entry_change as image_media_id to propose it for an entry. Audited, with the file name. Dry run by default; every run needs confirm_rights: true.
| Name | Required | Description | Default |
|---|---|---|---|
| hold | No | true: store it held, for a proposal (see above). Pass the mediaId to propose_entry_change as image_media_id. | |
| credit | No | Whom to credit, as shown beside the image — the author or rights holder. Needed by the licences that say so. | |
| source | No | Where you found the image (a web page), kept for a rights question; never shown publicly. | |
| content | Yes | The file’s bytes in base64 (standard or URL-safe alphabet, no line breaks, no data: prefix). Any image sharp reads (PNG, JPEG, WebP, GIF, AVIF, TIFF, SVG); it is stored as a lossless WebP at its full resolution, its colour profile kept, every other metadata dropped. | |
| dry_run | No | true (the default): write nothing — show the change and the exact request it would send. false: make the change. | |
| license | Yes | How the image may be reused: "cc0-1.0" (CC0 1.0), "public-domain" (Public domain), "cc-by-4.0" (CC BY 4.0, needs a credit), "cc-by-sa-4.0" (CC BY-SA 4.0, needs a credit), "supplied" (Supplied by the subject, needs a credit), "permission" (Used with permission, needs a credit), "none" (No licence, only with the upload-unlicensed permission). | |
| filename | Yes | The file’s name. Kept in the audit log for a rights question, never shown publicly or used to store it. | |
| confirm_rights | Yes | true: you confirm the image may be published under this licence. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | A dry run: what to do next to make the change, in words. |
| result | No | A real run: the route’s own answer, where the tool adds facts of its own beside it. |
| confirm | No | A dry run of a change that needs it: the exact target to send back as `confirm` with dry_run: false. |
| dry_run | No | true: a dry run, which wrote nothing. Absent from a real run. |
| replayed | No | A real run with an idempotency_key already used for this change: the first call’s answer, given back; nothing was written now. |
| would_send | No | A dry run: the exact request the real run would send (`method`, `path`, any `headers` such as an Idempotency-Key, and its `body`, `form` or `query`), or the requests, in order. |
| may_edit_live | No | A dry run of a live edit: whether this key’s account may edit this entry live. |
| refused_because | No | A dry run the real run would be refused for: why, in words. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
This description is extremely rich regarding behavioral traits beyond the structured data. It explains critical technical constraints like 70MB limits, WebP conversion, metadata stripping, and the entire storage lifecycle (public vs. held vs. rejected). It also explicitly details the dry-run mechanism and the necessary downstream use of the resulting mediaId.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The tool is dense and extremely verbose, reading more like a technical specification document than an easy-to-parse tool definition. While it contains no fluff, its lack of structure makes it difficult for an agent to quickly extract decision points.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the high complexity and the amount of technical and workflow information involved (conversion, size limits, URL generation, proposal handling), the description is complete. It addresses all necessary behavioral and functional concerns.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
While the input schema is 100% covered, the description provides crucial semantic context that deepens the meaning of the parameters. It clarifies the `content` format (no line breaks, no data: prefix), and explains the operational necessity and lifecycle impact of `hold`, `dry_run`, and `confirm_rights`.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description is highly specific, detailing that the tool uploads a local image file provided in base64 format. It distinguishes this purpose by describing the resulting storage format (lossless WebP) and contrasts its function implicitly with other potential upload methods, such as `upload_image_from_url`.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly defines the context for using this tool: uploading a file from the user's local environment (sent as base64). It provides critical conditional logic by explaining the difference between a standard public upload and setting `hold: true` for proposal review.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_image_from_urlUpload an image from a web addressAInspect
Upload an image the site fetches from an https address (the editor’s “from a web address”), with its licence, credit and source, stored as a new image (a lossless WebP at its full resolution, colour profile kept, other metadata dropped). The image is public at /img/w/…/ once stored, before any review — unless you set hold: true, which stores it held for a proposal: /img serves it only to you and to reviewers (never cached), it is in no list, and only your own proposal may name it, until a reviewer approves that proposal and releases it. A rejected or withdrawn proposal leaves it held, never deleted. The real run answers its mediaId: pass it to propose_entry_change as image_media_id to propose it for an entry. Refused (url_upload_disabled) while an admin has switched uploads from a web address off. Audited, with the address. Dry run by default; every run needs confirm_rights: true.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | The image’s own https address (the file itself, not the web page it is on). The site fetches it; this tool never does. | |
| hold | No | true: store it held, for a proposal (see above). Pass the mediaId to propose_entry_change as image_media_id. | |
| credit | No | Whom to credit, as shown beside the image — the author or rights holder. Needed by the licences that say so. | |
| source | No | Where you found the image (a web page), kept for a rights question; never shown publicly. Left out, the address it was fetched from is kept. | |
| dry_run | No | true (the default): write nothing — show the change and the exact request it would send. false: make the change. | |
| license | Yes | How the image may be reused: "cc0-1.0" (CC0 1.0), "public-domain" (Public domain), "cc-by-4.0" (CC BY 4.0, needs a credit), "cc-by-sa-4.0" (CC BY-SA 4.0, needs a credit), "supplied" (Supplied by the subject, needs a credit), "permission" (Used with permission, needs a credit), "none" (No licence, only with the upload-unlicensed permission). | |
| confirm_rights | Yes | true: you confirm the image may be published under this licence. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | A dry run: what to do next to make the change, in words. |
| result | No | A real run: the route’s own answer, where the tool adds facts of its own beside it. |
| confirm | No | A dry run of a change that needs it: the exact target to send back as `confirm` with dry_run: false. |
| dry_run | No | true: a dry run, which wrote nothing. Absent from a real run. |
| replayed | No | A real run with an idempotency_key already used for this change: the first call’s answer, given back; nothing was written now. |
| would_send | No | A dry run: the exact request the real run would send (`method`, `path`, any `headers` such as an Idempotency-Key, and its `body`, `form` or `query`), or the requests, in order. |
| may_edit_live | No | A dry run of a live edit: whether this key’s account may edit this entry live. |
| refused_because | No | A dry run the real run would be refused for: why, in words. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations already covering readOnly=false, openWorld=true, idempotent=false, and destructive=false, the description adds substantial behavior: public storage at /img/w/…, held-image visibility restrictions, non-deletion after rejected proposals, audit logging, dry-run default, disabled-state refusal, and required rights confirmation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core purpose is front-loaded and the dense paragraph contains little filler. It is long, but the length is mostly justified by the number of state transitions and constraints it must disclose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex mutation tool with an output schema, the description is complete enough to call safely: it covers storage format, visibility, hold semantics, proposal integration, rejection behavior, dry-run defaults, disabled-state refusal, and audit logging.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already defines the parameters thoroughly. The description still adds workflow meaning beyond the schema, especially the hold/proposal interaction with propose_entry_change and the significance of dry_run and confirm_rights.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: it uploads an image the site fetches from an https address and stores it as a new lossless WebP. It also clearly distinguishes this from sibling uploads by naming the editor’s “from a web address” flow and explaining the site-side fetch.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear usage context: use this for an image at an https address, use hold: true when storing for a proposal, and pass the returned mediaId to propose_entry_change. It does not explicitly contrast with upload_image or search_commons_images, so it stops short of full alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
23 tool updates
- Removed
bulk_change_entries - Removed
create_entry_from_qid - Removed
delete_entry - Removed
delete_renamed_short - Removed
delete_wikidata_deleted_entry - Removed
get_entry_admin - Removed
handle_health - Removed
keep_wikidata_deleted_entry - Removed
list_bulk_changes - Removed
list_duplicate_qids - Removed
merge_entry - Removed
restore_deleted_entry - Removed
restore_entry_revision - Removed
restore_wikipedia_credit - Removed
revert_bulk_change - Removed
revoke_claim - Removed
set_delete_notice - Removed
set_entry_setting - Removed
set_entry_wikidata_item - Removed
set_trending - Removed
trending - Removed
unmerge_entry - Removed
wikidata_deleted_entries
14 tool updates
- Added
draft_article - Added
get_article - Added
get_article_history - Changed
get_entries1 field changed- changed
Output schema / properties / results / items / anyOfPrevious value: -[ - { - "additionalProperties": {}, - "properties": { - "entity": { - "additionalProperties": {}, - "description": "Exactly what `GET /api/v1/entities/{key}` answers for this key.", - "properties": { - "claimed": { - "description": "The person or organisation the entry is about has claimed it. Never who.", - "type": "boolean" - }, - "description": { - "description": "The description as sanitised HTML, links to other entries named as they are today.", - "type": [ - "string", - "null" - ] - }, - "description_license": { - "anyOf": [ - { - "const": "CC-BY-SA-4.0", - "type": "string" - }, - { - "type": "null" - } - ], - "description": "The description’s licence, as an SPDX id: `CC-BY-SA-4.0` when it was taken from Wikipedia (`description_source` is set), which means crediting the article and sharing alike. Null otherwise: the description is CC0 like the rest of the text." - }, - "description_source": { - "anyOf": [ - { - "additionalProperties": {}, - "description": "The English Wikipedia page an entry’s description was taken from: an article, or a draft (`draft: true`).", - "properties": { - "adapted": { - "description": "Present and true when the text has been edited on the site since.", - "type": "boolean" - }, - "draft": { - "const": true, - "description": "Present and true when the page is an English Wikipedia draft (the Draft namespace), not yet an article.", - "type": "boolean" - }, - "kind": { - "description": "The source’s kind (`wikipedia`).", - "type": "string" - }, - "revision": { - "description": "The page’s revision the text was taken from: its permalink is `https://en.wikipedia.org/w/index.php?title=<title>&oldid=<revision>`. Absent on a credit from before revisions were kept.", - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "title": { - "description": "The page’s title, underscored (`Draft:` first for a draft).", - "type": "string" - }, - "url": { - "description": "The page.", - "type": "string" - } - }, - "required": [ - "kind", - "title", - "url" - ], - "type": "object" - }, - { - "type": "null" - } - ] - }, - "entity_kind": { - "anyOf": [ - { - "enum": [ - "person", - "musical_group", - "sports_organization", - "broadcaster", - "publisher", - "educational_institution", - "research_organization", - "religious_organization", - "museum", - "financial_institution", - "chain", - "nonprofit", - "company", - "organization", - "show", - "website", - "software", - "brand" - ], - "type": "string" - }, - { - "type": "null" - } - ], - "description": "The finer kind of thing it is, from its Wikidata item’s classes; null when unknown (an organisation or a brand not yet read since kinds were added reads null until the sync next reads its item). Each kind belongs to one `entity_type`, and `person`, `organization` and `brand` are also the kinds of an entry of that type with no finer one. The kinds, with their type: `person` (person: person), `musical_group` (organization: musical group), `sports_organization` (organization: sports organisation), `broadcaster` (organization: broadcaster), `publisher` (organization: publisher), `educational_institution` (organization: educational institution), `research_organization` (organization: research organisation), `religious_organization` (organization: religious organisation), `museum` (organization: museum), `financial_institution` (organization: financial institution), `chain` (organization: retail or hospitality chain), `nonprofit` (organization: charity or non-profit), `company` (organization: company), `organization` (organization: organisation), `show` (brand: show), `website` (brand: website or app), `software` (brand: software), `brand` (brand: brand). New kinds may be added; treat an unknown value as its `entity_type`." - }, - "entity_type": { - "description": "What it is, from its Wikidata item: `person`, `organization` or `brand`; null when unknown. `entity_kind` says more.", - "type": [ - "string", - "null" - ] - }, - "handles": { - "items": { - "additionalProperties": {}, - "description": "One account or identifier of an entry, in the order the entry page shows them. A Wikidata item linked to the entry comes last, as platform `wikidata`.", - "properties": { - "category": { - "description": "How the entry page groups it.", - "enum": [ - "social", - "messaging", - "website", - "identifier" - ], - "type": "string" - }, - "checked": { - "additionalProperties": {}, - "description": "What Verified Handles’ own handle checker found when it last looked at this account, from the platform’s official API: only on YouTube (channel and handle), Deezer and GitHub, and only for a look at most 7 days old. Absent otherwise. The entry page shows it only for `dead` (“Not found when checked …”) and `renamed`.", - "properties": { - "at": { - "description": "When it looked (ISO 8601, UTC).", - "type": "string" - }, - "now": { - "description": "For `renamed`, the name it answers to now, when the platform gave one. A YouTube handle’s is lowercase.", - "type": "string" - }, - "verdict": { - "description": "`live`: the profile was there. `dead`: the platform did not find it. `renamed`: it answers under another name. `unknown`: the platform gave no answer a rule could read.", - "enum": [ - "live", - "dead", - "renamed", - "unknown" - ], - "type": "string" - } - }, - "required": [ - "verdict", - "at" - ], - "type": "object" - }, - "display": { - "description": "The label the entry page shows instead of the value, if an editor set one. Null for email.", - "type": [ - "string", - "null" - ] - }, - "name": { - "description": "The platform’s display name.", - "type": "string" - }, - "platform": { - "description": "The platform’s id (`twitter`, `instagram`, `wikidata`, …).", - "type": "string" - }, - "shown_first": { - "description": "The entry page shows it before anyone opens anything: true for the accounts above a long list’s “Show N more accounts”, false for the ones folded under it, for the external identifiers (listed under their own closed heading, unless the entry has nothing else), and for an account the page does not draw.", - "type": "boolean" - }, - "url": { - "description": "The profile’s address, built from the platform’s URL pattern. Null for email.", - "type": [ - "string", - "null" - ] - }, - "value": { - "description": "The handle as stored (a username, an id, a URL). Null for an email address, which is never published as data.", - "type": [ - "string", - "null" - ] - }, - "verified": { - "description": "Verified Handles has checked that this account belongs to the entry.", - "type": "boolean" - } - }, - "required": [ - "platform", - "name", - "category", - "value", - "display", - "url", - "verified", - "shown_first" - ], - "type": "object" - }, - "type": "array" - }, - "image": { - "description": "The lead image (the same as `images[0].url`), or null.", - "type": [ - "string", - "null" - ] - }, - "image_rights": { - "anyOf": [ - { - "additionalProperties": {}, - "description": "Who owns an image and how it may be reused. An entry’s text is CC0 (bar a description taken from Wikipedia); its images are licensed separately, by their owners.", - "properties": { - "credit": { - "description": "The credit line to show when reusing the image.", - "type": [ - "string", - "null" - ] - }, - "details_url": { - "description": "The entry’s \"About this image\" page.", - "type": "string" - }, - "freely_licensed": { - "description": "May be reused under a free licence. Null when no licence is recorded.", - "type": [ - "boolean", - "null" - ] - }, - "license": { - "anyOf": [ - { - "enum": [ - "cc0-1.0", - "public-domain", - "cc-by-4.0", - "cc-by-sa-4.0", - "supplied", - "permission", - "none" - ], - "type": "string" - }, - { - "type": "null" - } - ], - "description": "An upload’s licence, by id. Null for a Commons image (see `license_name`) or when none was recorded." - }, - "license_name": { - "description": "The licence’s name, e.g. \"CC BY-SA 4.0\". Null until it is known.", - "type": [ - "string", - "null" - ] - }, - "license_url": { - "description": "The licence’s text.", - "type": [ - "string", - "null" - ] - }, - "source": { - "description": "Where the image came from.", - "enum": [ - "wikimedia_commons", - "upload" - ], - "type": "string" - }, - "source_page": { - "description": "The image’s Wikimedia Commons file page, which states its licence and author.", - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "source", - "license", - "license_name", - "license_url", - "freely_licensed", - "credit", - "source_page", - "details_url" - ], - "type": "object" - }, - { - "type": "null" - } - ], - "description": "The lead image’s rights, or null when there is no image." - }, - "images": { - "description": "Every image the entry shows, the lead first. Empty when it shows none.", - "items": { - "additionalProperties": {}, - "description": "One image an entry shows.", - "properties": { - "image_rights": { - "additionalProperties": {}, - "description": "Who owns an image and how it may be reused. An entry’s text is CC0 (bar a description taken from Wikipedia); its images are licensed separately, by their owners.", - "properties": { - "credit": { - "description": "The credit line to show when reusing the image.", - "type": [ - "string", - "null" - ] - }, - "details_url": { - "description": "The entry’s \"About this image\" page.", - "type": "string" - }, - "freely_licensed": { - "description": "May be reused under a free licence. Null when no licence is recorded.", - "type": [ - "boolean", - "null" - ] - }, - "license": { - "anyOf": [ - { - "enum": [ - "cc0-1.0", - "public-domain", - "cc-by-4.0", - "cc-by-sa-4.0", - "supplied", - "permission", - "none" - ], - "type": "string" - }, - { - "type": "null" - } - ], - "description": "An upload’s licence, by id. Null for a Commons image (see `license_name`) or when none was recorded." - }, - "license_name": { - "description": "The licence’s name, e.g. \"CC BY-SA 4.0\". Null until it is known.", - "type": [ - "string", - "null" - ] - }, - "license_url": { - "description": "The licence’s text.", - "type": [ - "string", - "null" - ] - }, - "source": { - "description": "Where the image came from.", - "enum": [ - "wikimedia_commons", - "upload" - ], - "type": "string" - }, - "source_page": { - "description": "The image’s Wikimedia Commons file page, which states its licence and author.", - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "source", - "license", - "license_name", - "license_url", - "freely_licensed", - "credit", - "source_page", - "details_url" - ], - "type": "object" - }, - "link": { - "description": "Where the image links on the entry page instead of opening the full-screen viewer, or null.", - "type": [ - "string", - "null" - ] - }, - "main": { - "description": "True for the lead image, false for the gallery images after it.", - "type": "boolean" - }, - "url": { - "description": "The image, as a path on this site (`/img/w/480q75/<id>`).", - "type": "string" - } - }, - "required": [ - "url", - "main", - "image_rights", - "link" - ], - "type": "object" - }, - "type": "array" - }, - "merged_into": { - "description": "Present when the key asked for named an entry that was merged into this one: this entry’s VHID.", - "pattern": "^\\d{11}$", - "type": "string" - }, - "rev": { - "description": "The version of the entry this body was made from: a later change’s is a larger number. A stamp (`GET /api/v1/stamps`) that differs means the entry has changed. To read an entry past every cache (after your own change, say), ask `?v=<rev>` with the rev your change returned.", - "pattern": "^\\d+$", - "type": "string" - }, - "short": { - "description": "The entry’s short name (`/<short>`), if it has one.", - "type": [ - "string", - "null" - ] - }, - "subtitle": { - "type": [ - "string", - "null" - ] - }, - "thumb": { - "description": "The lead image at the width a list row draws it (100 CSS pixels), as a path on the site: the width the image is really served at (200 for a Commons picture), never one that redirects. Null when there is no image.", - "type": [ - "string", - "null" - ] - }, - "title": { - "type": "string" - }, - "url": { - "description": "The entry’s canonical page.", - "type": "string" - }, - "verified": { - "description": "Verified Handles has verified the entry.", - "type": "boolean" - }, - "vhid": { - "description": "The entry’s VHID: 11 digits, permanent.", - "pattern": "^\\d{11}$", - "type": "string" - } - }, - "required": [ - "vhid", - "short", - "title", - "subtitle", - "entity_type", - "entity_kind", - "verified", - "claimed", - "rev", - "description", - "description_source", - "description_license", - "url", - "image", - "thumb", - "image_rights", - "images", - "handles" - ], - "type": "object" - }, - "key": { - "description": "The key as asked for, trimmed.", - "type": "string" - }, - "status": { - "const": "ok", - "type": "string" - } - }, - "required": [ - "key", - "status", - "entity" - ], - "type": "object" - }, - { - "additionalProperties": {}, - "properties": { - "key": { - "description": "The key as asked for, trimmed.", - "type": "string" - }, - "status": { - "const": "not_found", - "description": "No public entry answers to the key: where the single read answers 404.", - "type": "string" - } - }, - "required": [ - "key", - "status" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": {}, + "properties": { + "entity": { + "additionalProperties": {}, + "description": "Exactly what `GET /api/v1/entities/{key}` answers for this key.", + "properties": { + "claimed": { + "description": "The person or organisation the entry is about has claimed it. Never who.", + "type": "boolean" + }, + "description": { + "description": "The description as sanitised HTML, links to other entries named as they are today.", + "type": [ + "string", + "null" + ] + }, + "description_license": { + "anyOf": [ + { + "const": "CC-BY-SA-4.0", + "type": "string" + }, + { + "type": "null" + } + ], + "description": "The description’s licence, as an SPDX id: `CC-BY-SA-4.0` when it was taken from Wikipedia (`description_source` is set), which means crediting the article and sharing alike. Null otherwise: the description is CC0 like the rest of the text." + }, + "description_source": { + "anyOf": [ + { + "additionalProperties": {}, + "description": "The English Wikipedia page an entry’s description was taken from: an article, or a draft (`draft: true`).", + "properties": { + "adapted": { + "description": "Present and true when the text has been edited on the site since.", + "type": "boolean" + }, + "draft": { + "const": true, + "description": "Present and true when the page is an English Wikipedia draft (the Draft namespace), not yet an article.", + "type": "boolean" + }, + "kind": { + "description": "The source’s kind (`wikipedia`).", + "type": "string" + }, + "revision": { + "description": "The page’s revision the text was taken from: its permalink is `https://en.wikipedia.org/w/index.php?title=<title>&oldid=<revision>`. Absent on a credit from before revisions were kept.", + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" + }, + "title": { + "description": "The page’s title, underscored (`Draft:` first for a draft).", + "type": "string" + }, + "url": { + "description": "The page.", + "type": "string" + } + }, + "required": [ + "kind", + "title", + "url" + ], + "type": "object" + }, + { + "type": "null" + } + ] + }, + "entity_kind": { + "anyOf": [ + { + "enum": [ + "person", + "musical_group", + "sports_organization", + "broadcaster", + "publisher", + "educational_institution", + "research_organization", + "religious_organization", + "museum", + "financial_institution", + "chain", + "nonprofit", + "company", + "organization", + "show", + "website", + "software", + "brand" + ], + "type": "string" + }, + { + "type": "null" + } + ], + "description": "The finer kind of thing it is, from its Wikidata item’s classes; null when unknown (an organisation or a brand not yet read since kinds were added reads null until the sync next reads its item). Each kind belongs to one `entity_type`, and `person`, `organization` and `brand` are also the kinds of an entry of that type with no finer one. The kinds, with their type: `person` (person: person), `musical_group` (organization: musical group), `sports_organization` (organization: sports organisation), `broadcaster` (organization: broadcaster), `publisher` (organization: publisher), `educational_institution` (organization: educational institution), `research_organization` (organization: research organisation), `religious_organization` (organization: religious organisation), `museum` (organization: museum), `financial_institution` (organization: financial institution), `chain` (organization: retail or hospitality chain), `nonprofit` (organization: charity or non-profit), `company` (organization: company), `organization` (organization: organisation), `show` (brand: show), `website` (brand: website or app), `software` (brand: software), `brand` (brand: brand). New kinds may be added; treat an unknown value as its `entity_type`." + }, + "entity_type": { + "description": "What it is, from its Wikidata item: `person`, `organization` or `brand`; null when unknown. `entity_kind` says more.", + "type": [ + "string", + "null" + ] + }, + "handles": { + "items": { + "additionalProperties": {}, + "description": "One account or identifier of an entry, in the order the entry page shows them. A Wikidata item linked to the entry comes last, as platform `wikidata`.", + "properties": { + "category": { + "description": "How the entry page groups it.", + "enum": [ + "social", + "messaging", + "website", + "identifier" + ], + "type": "string" + }, + "checked": { + "additionalProperties": {}, + "description": "What Verified Handles’ own handle checker found when it last looked at this account, from the platform’s official API: only on YouTube (channel and handle), Deezer and GitHub, and only for a look at most 7 days old. Absent otherwise. The entry page shows it only for `dead` (“Not found when checked …”) and `renamed`.", + "properties": { + "at": { + "description": "When it looked (ISO 8601, UTC).", + "type": "string" + }, + "now": { + "description": "For `renamed`, the name it answers to now, when the platform gave one. A YouTube handle’s is lowercase.", + "type": "string" + }, + "verdict": { + "description": "`live`: the profile was there. `dead`: the platform did not find it. `renamed`: it answers under another name. `unknown`: the platform gave no answer a rule could read.", + "enum": [ + "live", + "dead", + "renamed", + "unknown" + ], + "type": "string" + } + }, + "required": [ + "verdict", + "at" + ], + "type": "object" + }, + "display": { + "description": "The label the entry page shows instead of the value, if an editor set one. Null for email.", + "type": [ + "string", + "null" + ] + }, + "name": { + "description": "The platform’s display name.", + "type": "string" + }, + "platform": { + "description": "The platform’s id (`twitter`, `instagram`, `wikidata`, …).", + "type": "string" + }, + "shown_first": { + "description": "The entry page shows it before anyone opens anything: true for the accounts above a long list’s “Show N more accounts”, false for the ones folded under it, for the external identifiers (listed under their own closed heading, unless the entry has nothing else), and for an account the page does not draw.", + "type": "boolean" + }, + "url": { + "description": "The profile’s address, built from the platform’s URL pattern. Null for email.", + "type": [ + "string", + "null" + ] + }, + "value": { + "description": "The handle as stored (a username, an id, a URL). Null for an email address, which is never published as data.", + "type": [ + "string", + "null" + ] + }, + "verified": { + "description": "Verified Handles has checked that this account belongs to the entry.", + "type": "boolean" + } + }, + "required": [ + "platform", + "name", + "category", + "value", + "display", + "url", + "verified", + "shown_first" + ], + "type": "object" + }, + "type": "array" + }, + "image": { + "description": "The lead image (the same as `images[0].url`), or null.", + "type": [ + "string", + "null" + ] + }, + "image_rights": { + "anyOf": [ + { + "additionalProperties": {}, + "description": "Who owns an image and how it may be reused. An entry’s text is CC0 (bar a description taken from Wikipedia); its images are licensed separately, by their owners.", + "properties": { + "credit": { + "description": "The credit line to show when reusing the image.", + "type": [ + "string", + "null" + ] + }, + "details_url": { + "description": "The entry’s \"About this image\" page.", + "type": "string" + }, + "freely_licensed": { + "description": "May be reused under a free licence. Null when no licence is recorded.", + "type": [ + "boolean", + "null" + ] + }, + "license": { + "anyOf": [ + { + "enum": [ + "cc0-1.0", + "public-domain", + "cc-by-4.0", + "cc-by-sa-4.0", + "supplied", + "permission", + "none" + ], + "type": "string" + }, + { + "type": "null" + } + ], + "description": "An upload’s licence, by id. Null for a Commons image (see `license_name`) or when none was recorded." + }, + "license_name": { + "description": "The licence’s name, e.g. \"CC BY-SA 4.0\". Null until it is known.", + "type": [ + "string", + "null" + ] + }, + "license_url": { + "description": "The licence’s text.", + "type": [ + "string", + "null" + ] + }, + "source": { + "description": "Where the image came from.", + "enum": [ + "wikimedia_commons", + "upload" + ], + "type": "string" + }, + "source_page": { + "description": "The image’s Wikimedia Commons file page, which states its licence and author.", + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "source", + "license", + "license_name", + "license_url", + "freely_licensed", + "credit", + "source_page", + "details_url" + ], + "type": "object" + }, + { + "type": "null" + } + ], + "description": "The lead image’s rights, or null when there is no image." + }, + "images": { + "description": "Every image the entry shows, the lead first. Empty when it shows none.", + "items": { + "additionalProperties": {}, + "description": "One image an entry shows.", + "properties": { + "height": { + "anyOf": [ + { + "maximum": 9007199254740991, + "minimum": 1, + "type": "integer" + }, + { + "type": "null" + } + ], + "description": "The original’s height in pixels, or null when it is not known." + }, + "image_rights": { + "additionalProperties": {}, + "description": "Who owns an image and how it may be reused. An entry’s text is CC0 (bar a description taken from Wikipedia); its images are licensed separately, by their owners.", + "properties": { + "credit": { + "description": "The credit line to show when reusing the image.", + "type": [ + "string", + "null" + ] + }, + "details_url": { + "description": "The entry’s \"About this image\" page.", + "type": "string" + }, + "freely_licensed": { + "description": "May be reused under a free licence. Null when no licence is recorded.", + "type": [ + "boolean", + "null" + ] + }, + "license": { + "anyOf": [ + { + "enum": [ + "cc0-1.0", + "public-domain", + "cc-by-4.0", + "cc-by-sa-4.0", + "supplied", + "permission", + "none" + ], + "type": "string" + }, + { + "type": "null" + } + ], + "description": "An upload’s licence, by id. Null for a Commons image (see `license_name`) or when none was recorded." + }, + "license_name": { + "description": "The licence’s name, e.g. \"CC BY-SA 4.0\". Null until it is known.", + "type": [ + "string", + "null" + ] + }, + "license_url": { + "description": "The licence’s text.", + "type": [ + "string", + "null" + ] + }, + "source": { + "description": "Where the image came from.", + "enum": [ + "wikimedia_commons", + "upload" + ], + "type": "string" + }, + "source_page": { + "description": "The image’s Wikimedia Commons file page, which states its licence and author.", + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "source", + "license", + "license_name", + "license_url", + "freely_licensed", + "credit", + "source_page", + "details_url" + ], + "type": "object" + }, + "link": { + "description": "Where the image links on the entry page instead of opening the full-screen viewer, or null.", + "type": [ + "string", + "null" + ] + }, + "main": { + "description": "True for the lead image, false for the gallery images after it.", + "type": "boolean" + }, + "plate": { + "anyOf": [ + { + "enum": [ + "light", + "dark", + "none" + ], + "type": "string" + }, + { + "type": "null" + } + ], + "description": "The plate the image is drawn on, as the entry page draws it. `light` or `dark`: a picture with transparent pixels (a logo, most often), drawn on a plate of that colour so its ink shows in light and dark mode alike. `none`: an opaque picture (a photo), drawn as it is, with no plate. Null while the site has not yet looked at its pixels: decide from the picture itself, as the site’s pages then do." + }, + "url": { + "description": "The image, as a path on this site (`/img/w/480q75/<id>`).", + "type": "string" + }, + "width": { + "anyOf": [ + { + "maximum": 9007199254740991, + "minimum": 1, + "type": "integer" + }, + { + "type": "null" + } + ], + "description": "The original’s width in pixels, or null when it is not known." + }, + "zoom_max_url": { + "description": "The widest picture this site serves of the image, no wider than the original, as a path on this site: what to load once the viewer is zoomed past twice the screen. Null when there is none wider than `zoom_url` (always for a Wikimedia Commons image), or when `zoom_url` is null.", + "type": [ + "string", + "null" + ] + }, + "zoom_url": { + "description": "The full-screen viewer’s picture, 1600 pixels wide at most, as a path on this site (`/img/w/1600q75/<id>`): what to load when the viewer opens. Null when the image has a `link`, which opens instead.", + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "url", + "main", + "image_rights", + "link", + "zoom_url", + "zoom_max_url", + "width", + "height", + "plate" + ], + "type": "object" + }, + "type": "array" + }, + "merged_into": { + "description": "Present when the key asked for named an entry that was merged into this one: this entry’s VHID.", + "pattern": "^\\d{11}$", + "type": "string" + }, + "rev": { + "description": "The version of the entry this body was made from: a later change’s is a larger number. A stamp (`GET /api/v1/stamps`) that differs means the entry has changed. To read an entry past every cache (after your own change, say), ask `?v=<rev>` with the rev your change returned.", + "pattern": "^\\d+$", + "type": "string" + }, + "short": { + "description": "The entry’s short name (`/<short>`), if it has one.", + "type": [ + "string", + "null" + ] + }, + "subtitle": { + "type": [ + "string", + "null" + ] + }, + "thumb": { + "description": "The lead image at the width a list row draws it (100 CSS pixels), as a path on the site: the width the image is really served at (200 for a Commons picture), never one that redirects. Null when there is no image.", + "type": [ + "string", + "null" + ] + }, + "thumb_plate": { + "anyOf": [ + { + "enum": [ + "light", + "dark", + "none" + ], + "type": "string" + }, + { + "type": "null" + } + ], + "description": "The plate `thumb` is drawn on (the lead image’s `plate`), and always null when `thumb` is. `light` or `dark`: a picture with transparent pixels (a logo, most often), drawn on a plate of that colour so its ink shows in light and dark mode alike. `none`: an opaque picture (a photo), drawn as it is, with no plate. Null while the site has not yet looked at its pixels: decide from the picture itself, as the site’s pages then do." + }, + "title": { + "type": "string" + }, + "url": { + "description": "The entry’s canonical page.", + "type": "string" + }, + "verified": { + "description": "Verified Handles has verified the entry.", + "type": "boolean" + }, + "vhid": { + "description": "The entry’s VHID: 11 digits, permanent.", + "pattern": "^\\d{11}$", + "type": "string" + } + }, + "required": [ + "vhid", + "short", + "title", + "subtitle", + "entity_type", + "entity_kind", + "verified", + "claimed", + "rev", + "description", + "description_source", + "description_license", + "url", + "image", + "thumb", + "thumb_plate", + "image_rights", + "images", + "handles" + ], + "type": "object" + }, + "key": { + "description": "The key as asked for, trimmed.", + "type": "string" + }, + "status": { + "const": "ok", + "type": "string" + } + }, + "required": [ + "key", + "status", + "entity" + ], + "type": "object" + }, + { + "additionalProperties": {}, + "properties": { + "key": { + "description": "The key as asked for, trimmed.", + "type": "string" + }, + "status": { + "const": "not_found", + "description": "No public entry answers to the key: where the single read answers 404.", + "type": "string" + } + }, + "required": [ + "key", + "status" + ], + "type": "object" + } +]
- Changed
get_entry1 field changed- changed
Output schema / properties / entry / anyOfPrevious value: -[ - { - "additionalProperties": {}, - "description": "An entry: the same data its page shows, from the same code. Email addresses are masked. The text is CC0, except a description taken from Wikipedia (`description_license`).", - "properties": { - "claimed": { - "description": "The person or organisation the entry is about has claimed it. Never who.", - "type": "boolean" - }, - "description": { - "description": "The description as sanitised HTML, links to other entries named as they are today.", - "type": [ - "string", - "null" - ] - }, - "description_license": { - "anyOf": [ - { - "const": "CC-BY-SA-4.0", - "type": "string" - }, - { - "type": "null" - } - ], - "description": "The description’s licence, as an SPDX id: `CC-BY-SA-4.0` when it was taken from Wikipedia (`description_source` is set), which means crediting the article and sharing alike. Null otherwise: the description is CC0 like the rest of the text." - }, - "description_source": { - "anyOf": [ - { - "additionalProperties": {}, - "description": "The English Wikipedia page an entry’s description was taken from: an article, or a draft (`draft: true`).", - "properties": { - "adapted": { - "description": "Present and true when the text has been edited on the site since.", - "type": "boolean" - }, - "draft": { - "const": true, - "description": "Present and true when the page is an English Wikipedia draft (the Draft namespace), not yet an article.", - "type": "boolean" - }, - "kind": { - "description": "The source’s kind (`wikipedia`).", - "type": "string" - }, - "revision": { - "description": "The page’s revision the text was taken from: its permalink is `https://en.wikipedia.org/w/index.php?title=<title>&oldid=<revision>`. Absent on a credit from before revisions were kept.", - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "title": { - "description": "The page’s title, underscored (`Draft:` first for a draft).", - "type": "string" - }, - "url": { - "description": "The page.", - "type": "string" - } - }, - "required": [ - "kind", - "title", - "url" - ], - "type": "object" - }, - { - "type": "null" - } - ] - }, - "entity_kind": { - "anyOf": [ - { - "enum": [ - "person", - "musical_group", - "sports_organization", - "broadcaster", - "publisher", - "educational_institution", - "research_organization", - "religious_organization", - "museum", - "financial_institution", - "chain", - "nonprofit", - "company", - "organization", - "show", - "website", - "software", - "brand" - ], - "type": "string" - }, - { - "type": "null" - } - ], - "description": "The finer kind of thing it is, from its Wikidata item’s classes; null when unknown (an organisation or a brand not yet read since kinds were added reads null until the sync next reads its item). Each kind belongs to one `entity_type`, and `person`, `organization` and `brand` are also the kinds of an entry of that type with no finer one. The kinds, with their type: `person` (person: person), `musical_group` (organization: musical group), `sports_organization` (organization: sports organisation), `broadcaster` (organization: broadcaster), `publisher` (organization: publisher), `educational_institution` (organization: educational institution), `research_organization` (organization: research organisation), `religious_organization` (organization: religious organisation), `museum` (organization: museum), `financial_institution` (organization: financial institution), `chain` (organization: retail or hospitality chain), `nonprofit` (organization: charity or non-profit), `company` (organization: company), `organization` (organization: organisation), `show` (brand: show), `website` (brand: website or app), `software` (brand: software), `brand` (brand: brand). New kinds may be added; treat an unknown value as its `entity_type`." - }, - "entity_type": { - "description": "What it is, from its Wikidata item: `person`, `organization` or `brand`; null when unknown. `entity_kind` says more.", - "type": [ - "string", - "null" - ] - }, - "handles": { - "items": { - "additionalProperties": {}, - "description": "One account or identifier of an entry, in the order the entry page shows them. A Wikidata item linked to the entry comes last, as platform `wikidata`.", - "properties": { - "category": { - "description": "How the entry page groups it.", - "enum": [ - "social", - "messaging", - "website", - "identifier" - ], - "type": "string" - }, - "checked": { - "additionalProperties": {}, - "description": "What Verified Handles’ own handle checker found when it last looked at this account, from the platform’s official API: only on YouTube (channel and handle), Deezer and GitHub, and only for a look at most 7 days old. Absent otherwise. The entry page shows it only for `dead` (“Not found when checked …”) and `renamed`.", - "properties": { - "at": { - "description": "When it looked (ISO 8601, UTC).", - "type": "string" - }, - "now": { - "description": "For `renamed`, the name it answers to now, when the platform gave one. A YouTube handle’s is lowercase.", - "type": "string" - }, - "verdict": { - "description": "`live`: the profile was there. `dead`: the platform did not find it. `renamed`: it answers under another name. `unknown`: the platform gave no answer a rule could read.", - "enum": [ - "live", - "dead", - "renamed", - "unknown" - ], - "type": "string" - } - }, - "required": [ - "verdict", - "at" - ], - "type": "object" - }, - "display": { - "description": "The label the entry page shows instead of the value, if an editor set one. Null for email.", - "type": [ - "string", - "null" - ] - }, - "name": { - "description": "The platform’s display name.", - "type": "string" - }, - "platform": { - "description": "The platform’s id (`twitter`, `instagram`, `wikidata`, …).", - "type": "string" - }, - "shown_first": { - "description": "The entry page shows it before anyone opens anything: true for the accounts above a long list’s “Show N more accounts”, false for the ones folded under it, for the external identifiers (listed under their own closed heading, unless the entry has nothing else), and for an account the page does not draw.", - "type": "boolean" - }, - "url": { - "description": "The profile’s address, built from the platform’s URL pattern. Null for email.", - "type": [ - "string", - "null" - ] - }, - "value": { - "description": "The handle as stored (a username, an id, a URL). Null for an email address, which is never published as data.", - "type": [ - "string", - "null" - ] - }, - "verified": { - "description": "Verified Handles has checked that this account belongs to the entry.", - "type": "boolean" - } - }, - "required": [ - "platform", - "name", - "category", - "value", - "display", - "url", - "verified", - "shown_first" - ], - "type": "object" - }, - "type": "array" - }, - "image": { - "description": "The lead image (the same as `images[0].url`), or null.", - "type": [ - "string", - "null" - ] - }, - "image_rights": { - "anyOf": [ - { - "additionalProperties": {}, - "description": "Who owns an image and how it may be reused. An entry’s text is CC0 (bar a description taken from Wikipedia); its images are licensed separately, by their owners.", - "properties": { - "credit": { - "description": "The credit line to show when reusing the image.", - "type": [ - "string", - "null" - ] - }, - "details_url": { - "description": "The entry’s \"About this image\" page.", - "type": "string" - }, - "freely_licensed": { - "description": "May be reused under a free licence. Null when no licence is recorded.", - "type": [ - "boolean", - "null" - ] - }, - "license": { - "anyOf": [ - { - "enum": [ - "cc0-1.0", - "public-domain", - "cc-by-4.0", - "cc-by-sa-4.0", - "supplied", - "permission", - "none" - ], - "type": "string" - }, - { - "type": "null" - } - ], - "description": "An upload’s licence, by id. Null for a Commons image (see `license_name`) or when none was recorded." - }, - "license_name": { - "description": "The licence’s name, e.g. \"CC BY-SA 4.0\". Null until it is known.", - "type": [ - "string", - "null" - ] - }, - "license_url": { - "description": "The licence’s text.", - "type": [ - "string", - "null" - ] - }, - "source": { - "description": "Where the image came from.", - "enum": [ - "wikimedia_commons", - "upload" - ], - "type": "string" - }, - "source_page": { - "description": "The image’s Wikimedia Commons file page, which states its licence and author.", - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "source", - "license", - "license_name", - "license_url", - "freely_licensed", - "credit", - "source_page", - "details_url" - ], - "type": "object" - }, - { - "type": "null" - } - ], - "description": "The lead image’s rights, or null when there is no image." - }, - "images": { - "description": "Every image the entry shows, the lead first. Empty when it shows none.", - "items": { - "additionalProperties": {}, - "description": "One image an entry shows.", - "properties": { - "image_rights": { - "additionalProperties": {}, - "description": "Who owns an image and how it may be reused. An entry’s text is CC0 (bar a description taken from Wikipedia); its images are licensed separately, by their owners.", - "properties": { - "credit": { - "description": "The credit line to show when reusing the image.", - "type": [ - "string", - "null" - ] - }, - "details_url": { - "description": "The entry’s \"About this image\" page.", - "type": "string" - }, - "freely_licensed": { - "description": "May be reused under a free licence. Null when no licence is recorded.", - "type": [ - "boolean", - "null" - ] - }, - "license": { - "anyOf": [ - { - "enum": [ - "cc0-1.0", - "public-domain", - "cc-by-4.0", - "cc-by-sa-4.0", - "supplied", - "permission", - "none" - ], - "type": "string" - }, - { - "type": "null" - } - ], - "description": "An upload’s licence, by id. Null for a Commons image (see `license_name`) or when none was recorded." - }, - "license_name": { - "description": "The licence’s name, e.g. \"CC BY-SA 4.0\". Null until it is known.", - "type": [ - "string", - "null" - ] - }, - "license_url": { - "description": "The licence’s text.", - "type": [ - "string", - "null" - ] - }, - "source": { - "description": "Where the image came from.", - "enum": [ - "wikimedia_commons", - "upload" - ], - "type": "string" - }, - "source_page": { - "description": "The image’s Wikimedia Commons file page, which states its licence and author.", - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "source", - "license", - "license_name", - "license_url", - "freely_licensed", - "credit", - "source_page", - "details_url" - ], - "type": "object" - }, - "link": { - "description": "Where the image links on the entry page instead of opening the full-screen viewer, or null.", - "type": [ - "string", - "null" - ] - }, - "main": { - "description": "True for the lead image, false for the gallery images after it.", - "type": "boolean" - }, - "url": { - "description": "The image, as a path on this site (`/img/w/480q75/<id>`).", - "type": "string" - } - }, - "required": [ - "url", - "main", - "image_rights", - "link" - ], - "type": "object" - }, - "type": "array" - }, - "merged_into": { - "description": "Present when the key asked for named an entry that was merged into this one: this entry’s VHID.", - "pattern": "^\\d{11}$", - "type": "string" - }, - "rev": { - "description": "The version of the entry this body was made from: a later change’s is a larger number. A stamp (`GET /api/v1/stamps`) that differs means the entry has changed. To read an entry past every cache (after your own change, say), ask `?v=<rev>` with the rev your change returned.", - "pattern": "^\\d+$", - "type": "string" - }, - "short": { - "description": "The entry’s short name (`/<short>`), if it has one.", - "type": [ - "string", - "null" - ] - }, - "subtitle": { - "type": [ - "string", - "null" - ] - }, - "thumb": { - "description": "The lead image at the width a list row draws it (100 CSS pixels), as a path on the site: the width the image is really served at (200 for a Commons picture), never one that redirects. Null when there is no image.", - "type": [ - "string", - "null" - ] - }, - "title": { - "type": "string" - }, - "url": { - "description": "The entry’s canonical page.", - "type": "string" - }, - "verified": { - "description": "Verified Handles has verified the entry.", - "type": "boolean" - }, - "vhid": { - "description": "The entry’s VHID: 11 digits, permanent.", - "pattern": "^\\d{11}$", - "type": "string" - } - }, - "required": [ - "vhid", - "short", - "title", - "subtitle", - "entity_type", - "entity_kind", - "verified", - "claimed", - "rev", - "description", - "description_source", - "description_license", - "url", - "image", - "thumb", - "image_rights", - "images", - "handles" - ], - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": {}, + "description": "An entry: the same data its page shows, from the same code. Email addresses are masked. The text is CC0, except a description taken from Wikipedia (`description_license`).", + "properties": { + "claimed": { + "description": "The person or organisation the entry is about has claimed it. Never who.", + "type": "boolean" + }, + "description": { + "description": "The description as sanitised HTML, links to other entries named as they are today.", + "type": [ + "string", + "null" + ] + }, + "description_license": { + "anyOf": [ + { + "const": "CC-BY-SA-4.0", + "type": "string" + }, + { + "type": "null" + } + ], + "description": "The description’s licence, as an SPDX id: `CC-BY-SA-4.0` when it was taken from Wikipedia (`description_source` is set), which means crediting the article and sharing alike. Null otherwise: the description is CC0 like the rest of the text." + }, + "description_source": { + "anyOf": [ + { + "additionalProperties": {}, + "description": "The English Wikipedia page an entry’s description was taken from: an article, or a draft (`draft: true`).", + "properties": { + "adapted": { + "description": "Present and true when the text has been edited on the site since.", + "type": "boolean" + }, + "draft": { + "const": true, + "description": "Present and true when the page is an English Wikipedia draft (the Draft namespace), not yet an article.", + "type": "boolean" + }, + "kind": { + "description": "The source’s kind (`wikipedia`).", + "type": "string" + }, + "revision": { + "description": "The page’s revision the text was taken from: its permalink is `https://en.wikipedia.org/w/index.php?title=<title>&oldid=<revision>`. Absent on a credit from before revisions were kept.", + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" + }, + "title": { + "description": "The page’s title, underscored (`Draft:` first for a draft).", + "type": "string" + }, + "url": { + "description": "The page.", + "type": "string" + } + }, + "required": [ + "kind", + "title", + "url" + ], + "type": "object" + }, + { + "type": "null" + } + ] + }, + "entity_kind": { + "anyOf": [ + { + "enum": [ + "person", + "musical_group", + "sports_organization", + "broadcaster", + "publisher", + "educational_institution", + "research_organization", + "religious_organization", + "museum", + "financial_institution", + "chain", + "nonprofit", + "company", + "organization", + "show", + "website", + "software", + "brand" + ], + "type": "string" + }, + { + "type": "null" + } + ], + "description": "The finer kind of thing it is, from its Wikidata item’s classes; null when unknown (an organisation or a brand not yet read since kinds were added reads null until the sync next reads its item). Each kind belongs to one `entity_type`, and `person`, `organization` and `brand` are also the kinds of an entry of that type with no finer one. The kinds, with their type: `person` (person: person), `musical_group` (organization: musical group), `sports_organization` (organization: sports organisation), `broadcaster` (organization: broadcaster), `publisher` (organization: publisher), `educational_institution` (organization: educational institution), `research_organization` (organization: research organisation), `religious_organization` (organization: religious organisation), `museum` (organization: museum), `financial_institution` (organization: financial institution), `chain` (organization: retail or hospitality chain), `nonprofit` (organization: charity or non-profit), `company` (organization: company), `organization` (organization: organisation), `show` (brand: show), `website` (brand: website or app), `software` (brand: software), `brand` (brand: brand). New kinds may be added; treat an unknown value as its `entity_type`." + }, + "entity_type": { + "description": "What it is, from its Wikidata item: `person`, `organization` or `brand`; null when unknown. `entity_kind` says more.", + "type": [ + "string", + "null" + ] + }, + "handles": { + "items": { + "additionalProperties": {}, + "description": "One account or identifier of an entry, in the order the entry page shows them. A Wikidata item linked to the entry comes last, as platform `wikidata`.", + "properties": { + "category": { + "description": "How the entry page groups it.", + "enum": [ + "social", + "messaging", + "website", + "identifier" + ], + "type": "string" + }, + "checked": { + "additionalProperties": {}, + "description": "What Verified Handles’ own handle checker found when it last looked at this account, from the platform’s official API: only on YouTube (channel and handle), Deezer and GitHub, and only for a look at most 7 days old. Absent otherwise. The entry page shows it only for `dead` (“Not found when checked …”) and `renamed`.", + "properties": { + "at": { + "description": "When it looked (ISO 8601, UTC).", + "type": "string" + }, + "now": { + "description": "For `renamed`, the name it answers to now, when the platform gave one. A YouTube handle’s is lowercase.", + "type": "string" + }, + "verdict": { + "description": "`live`: the profile was there. `dead`: the platform did not find it. `renamed`: it answers under another name. `unknown`: the platform gave no answer a rule could read.", + "enum": [ + "live", + "dead", + "renamed", + "unknown" + ], + "type": "string" + } + }, + "required": [ + "verdict", + "at" + ], + "type": "object" + }, + "display": { + "description": "The label the entry page shows instead of the value, if an editor set one. Null for email.", + "type": [ + "string", + "null" + ] + }, + "name": { + "description": "The platform’s display name.", + "type": "string" + }, + "platform": { + "description": "The platform’s id (`twitter`, `instagram`, `wikidata`, …).", + "type": "string" + }, + "shown_first": { + "description": "The entry page shows it before anyone opens anything: true for the accounts above a long list’s “Show N more accounts”, false for the ones folded under it, for the external identifiers (listed under their own closed heading, unless the entry has nothing else), and for an account the page does not draw.", + "type": "boolean" + }, + "url": { + "description": "The profile’s address, built from the platform’s URL pattern. Null for email.", + "type": [ + "string", + "null" + ] + }, + "value": { + "description": "The handle as stored (a username, an id, a URL). Null for an email address, which is never published as data.", + "type": [ + "string", + "null" + ] + }, + "verified": { + "description": "Verified Handles has checked that this account belongs to the entry.", + "type": "boolean" + } + }, + "required": [ + "platform", + "name", + "category", + "value", + "display", + "url", + "verified", + "shown_first" + ], + "type": "object" + }, + "type": "array" + }, + "image": { + "description": "The lead image (the same as `images[0].url`), or null.", + "type": [ + "string", + "null" + ] + }, + "image_rights": { + "anyOf": [ + { + "additionalProperties": {}, + "description": "Who owns an image and how it may be reused. An entry’s text is CC0 (bar a description taken from Wikipedia); its images are licensed separately, by their owners.", + "properties": { + "credit": { + "description": "The credit line to show when reusing the image.", + "type": [ + "string", + "null" + ] + }, + "details_url": { + "description": "The entry’s \"About this image\" page.", + "type": "string" + }, + "freely_licensed": { + "description": "May be reused under a free licence. Null when no licence is recorded.", + "type": [ + "boolean", + "null" + ] + }, + "license": { + "anyOf": [ + { + "enum": [ + "cc0-1.0", + "public-domain", + "cc-by-4.0", + "cc-by-sa-4.0", + "supplied", + "permission", + "none" + ], + "type": "string" + }, + { + "type": "null" + } + ], + "description": "An upload’s licence, by id. Null for a Commons image (see `license_name`) or when none was recorded." + }, + "license_name": { + "description": "The licence’s name, e.g. \"CC BY-SA 4.0\". Null until it is known.", + "type": [ + "string", + "null" + ] + }, + "license_url": { + "description": "The licence’s text.", + "type": [ + "string", + "null" + ] + }, + "source": { + "description": "Where the image came from.", + "enum": [ + "wikimedia_commons", + "upload" + ], + "type": "string" + }, + "source_page": { + "description": "The image’s Wikimedia Commons file page, which states its licence and author.", + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "source", + "license", + "license_name", + "license_url", + "freely_licensed", + "credit", + "source_page", + "details_url" + ], + "type": "object" + }, + { + "type": "null" + } + ], + "description": "The lead image’s rights, or null when there is no image." + }, + "images": { + "description": "Every image the entry shows, the lead first. Empty when it shows none.", + "items": { + "additionalProperties": {}, + "description": "One image an entry shows.", + "properties": { + "height": { + "anyOf": [ + { + "maximum": 9007199254740991, + "minimum": 1, + "type": "integer" + }, + { + "type": "null" + } + ], + "description": "The original’s height in pixels, or null when it is not known." + }, + "image_rights": { + "additionalProperties": {}, + "description": "Who owns an image and how it may be reused. An entry’s text is CC0 (bar a description taken from Wikipedia); its images are licensed separately, by their owners.", + "properties": { + "credit": { + "description": "The credit line to show when reusing the image.", + "type": [ + "string", + "null" + ] + }, + "details_url": { + "description": "The entry’s \"About this image\" page.", + "type": "string" + }, + "freely_licensed": { + "description": "May be reused under a free licence. Null when no licence is recorded.", + "type": [ + "boolean", + "null" + ] + }, + "license": { + "anyOf": [ + { + "enum": [ + "cc0-1.0", + "public-domain", + "cc-by-4.0", + "cc-by-sa-4.0", + "supplied", + "permission", + "none" + ], + "type": "string" + }, + { + "type": "null" + } + ], + "description": "An upload’s licence, by id. Null for a Commons image (see `license_name`) or when none was recorded." + }, + "license_name": { + "description": "The licence’s name, e.g. \"CC BY-SA 4.0\". Null until it is known.", + "type": [ + "string", + "null" + ] + }, + "license_url": { + "description": "The licence’s text.", + "type": [ + "string", + "null" + ] + }, + "source": { + "description": "Where the image came from.", + "enum": [ + "wikimedia_commons", + "upload" + ], + "type": "string" + }, + "source_page": { + "description": "The image’s Wikimedia Commons file page, which states its licence and author.", + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "source", + "license", + "license_name", + "license_url", + "freely_licensed", + "credit", + "source_page", + "details_url" + ], + "type": "object" + }, + "link": { + "description": "Where the image links on the entry page instead of opening the full-screen viewer, or null.", + "type": [ + "string", + "null" + ] + }, + "main": { + "description": "True for the lead image, false for the gallery images after it.", + "type": "boolean" + }, + "plate": { + "anyOf": [ + { + "enum": [ + "light", + "dark", + "none" + ], + "type": "string" + }, + { + "type": "null" + } + ], + "description": "The plate the image is drawn on, as the entry page draws it. `light` or `dark`: a picture with transparent pixels (a logo, most often), drawn on a plate of that colour so its ink shows in light and dark mode alike. `none`: an opaque picture (a photo), drawn as it is, with no plate. Null while the site has not yet looked at its pixels: decide from the picture itself, as the site’s pages then do." + }, + "url": { + "description": "The image, as a path on this site (`/img/w/480q75/<id>`).", + "type": "string" + }, + "width": { + "anyOf": [ + { + "maximum": 9007199254740991, + "minimum": 1, + "type": "integer" + }, + { + "type": "null" + } + ], + "description": "The original’s width in pixels, or null when it is not known." + }, + "zoom_max_url": { + "description": "The widest picture this site serves of the image, no wider than the original, as a path on this site: what to load once the viewer is zoomed past twice the screen. Null when there is none wider than `zoom_url` (always for a Wikimedia Commons image), or when `zoom_url` is null.", + "type": [ + "string", + "null" + ] + }, + "zoom_url": { + "description": "The full-screen viewer’s picture, 1600 pixels wide at most, as a path on this site (`/img/w/1600q75/<id>`): what to load when the viewer opens. Null when the image has a `link`, which opens instead.", + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "url", + "main", + "image_rights", + "link", + "zoom_url", + "zoom_max_url", + "width", + "height", + "plate" + ], + "type": "object" + }, + "type": "array" + }, + "merged_into": { + "description": "Present when the key asked for named an entry that was merged into this one: this entry’s VHID.", + "pattern": "^\\d{11}$", + "type": "string" + }, + "rev": { + "description": "The version of the entry this body was made from: a later change’s is a larger number. A stamp (`GET /api/v1/stamps`) that differs means the entry has changed. To read an entry past every cache (after your own change, say), ask `?v=<rev>` with the rev your change returned.", + "pattern": "^\\d+$", + "type": "string" + }, + "short": { + "description": "The entry’s short name (`/<short>`), if it has one.", + "type": [ + "string", + "null" + ] + }, + "subtitle": { + "type": [ + "string", + "null" + ] + }, + "thumb": { + "description": "The lead image at the width a list row draws it (100 CSS pixels), as a path on the site: the width the image is really served at (200 for a Commons picture), never one that redirects. Null when there is no image.", + "type": [ + "string", + "null" + ] + }, + "thumb_plate": { + "anyOf": [ + { + "enum": [ + "light", + "dark", + "none" + ], + "type": "string" + }, + { + "type": "null" + } + ], + "description": "The plate `thumb` is drawn on (the lead image’s `plate`), and always null when `thumb` is. `light` or `dark`: a picture with transparent pixels (a logo, most often), drawn on a plate of that colour so its ink shows in light and dark mode alike. `none`: an opaque picture (a photo), drawn as it is, with no plate. Null while the site has not yet looked at its pixels: decide from the picture itself, as the site’s pages then do." + }, + "title": { + "type": "string" + }, + "url": { + "description": "The entry’s canonical page.", + "type": "string" + }, + "verified": { + "description": "Verified Handles has verified the entry.", + "type": "boolean" + }, + "vhid": { + "description": "The entry’s VHID: 11 digits, permanent.", + "pattern": "^\\d{11}$", + "type": "string" + } + }, + "required": [ + "vhid", + "short", + "title", + "subtitle", + "entity_type", + "entity_kind", + "verified", + "claimed", + "rev", + "description", + "description_source", + "description_license", + "url", + "image", + "thumb", + "thumb_plate", + "image_rights", + "images", + "handles" + ], + "type": "object" + }, + { + "type": "null" + } +]
- Changed
get_entry_history1 field changed- changed
Output schema / properties / history / items / properties / is_bot / descriptionPrevious value: -"Made by an automated process (the Wikidata sync, an import)."New value: +"Made by an automated process: the Wikidata sync, an import, or an account an administrator has marked as automation (a script or agent). A legacy (archive) revision keeps the old wiki’s own flag."
- Added
link_article_entries - Added
list_articles - Changed
propose_wikidata_changes1 field changed- changed
Input schema / properties / changes / items / properties / action / enumPrevious value: -[ - "set_label", - "set_description", - "set_aliases", - "add_claim", - "add_reference", - "replace_reference", - "add_qualifier", - "change_qualifier", - "remove_qualifier", - "set_rank", - "supersede", - "move_to_item", - "copy_to_item" -]New value: +[ + "create_item", + "set_label", + "set_description", + "set_aliases", + "add_claim", + "add_reference", + "replace_reference", + "add_qualifier", + "change_qualifier", + "remove_qualifier", + "set_rank", + "supersede", + "move_to_item", + "copy_to_item" +]
- Changed
propose_wikidata_correction1 field changed- changed
Input schema / properties / reference / descriptionPrevious value: -"add_claim, supersede, add_reference, replace_reference (required): the source. move_to_item, copy_to_item (optional): a reference the copy gets after those read, required when one of those cites a Wikimedia page."New value: +"add_claim, supersede, add_reference, replace_reference (required): the source. An account statement on a platform the site knows (X, Instagram, Facebook, YouTube, TikTok, …) cited by the account itself or another of the subject’s social profiles, or a new one (add_claim, supersede) given no reference, is filed stated in the platform’s item instead (P248, e.g. Q918 for X), retrieved the day given or today, as the site’s own suggestions are: the dry run shows it in `would_file`, the one given as `evidence.reference_given`, and says so in `warning`. Cite a page independent of the account (the official website, a news article) to have it filed as given. move_to_item, copy_to_item (optional): a reference the copy gets after those read, required when one of those cites a Wikimedia page."
- Changed
search_entries2 fields changed- added
Output schema / properties / results / items / properties / thumb_plateAdded value: +{ + "anyOf": [ + { + "enum": [ + "light", + "dark", + "none" + ], + "type": "string" + }, + { + "type": "null" + } + ], + "description": "The plate `thumb` is drawn on (the lead image’s `plate`), and always null when `thumb` is. `light` or `dark`: a picture with transparent pixels (a logo, most often), drawn on a plate of that colour so its ink shows in light and dark mode alike. `none`: an opaque picture (a photo), drawn as it is, with no plate. Null while the site has not yet looked at its pixels: decide from the picture itself, as the site’s pages then do." +} - changed
Output schema / properties / results / items / requiredPrevious value: -[ - "vhid", - "short", - "title", - "subtitle", - "verified", - "claimed", - "entity_kind", - "thumb", - "snippet", - "highlighted", - "url" -]New value: +[ + "vhid", + "short", + "title", + "subtitle", + "verified", + "claimed", + "entity_kind", + "thumb", + "thumb_plate", + "snippet", + "highlighted", + "url" +]
- Added
set_article_hero - Added
update_article_draft - Changed
wikidata_deleted_entries1 field changed- changed
Output schema / properties / entries / items / anyOfPrevious value: -[ - { - "additionalProperties": {}, - "properties": { - "blocked": { - "description": "The entry is deleted on the site.", - "type": "boolean" - }, - "claimed": { - "type": "boolean" - }, - "first_seen_at": { - "type": "string" - }, - "handles": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "kept": { - "anyOf": [ - { - "additionalProperties": {}, - "properties": { - "at": { - "type": "string" - }, - "by": { - "description": "Who kept it, by name as you may see it; null once their account is gone.", - "type": [ - "string", - "null" - ] - }, - "reason": { - "type": [ - "string", - "null" - ] - }, - "wd_deleted_at": { - "description": "The Wikidata deletion it was kept for.", - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "by", - "at", - "reason", - "wd_deleted_at" - ], - "type": "object" - }, - { - "type": "null" - } - ], - "description": "Its “Keep, still linked” decision while in force (the entry still on that QID, and the item not deleted again since); null otherwise." - }, - "protected": { - "type": "boolean" - }, - "qid": { - "type": "string" - }, - "short": { - "type": [ - "string", - "null" - ] - }, - "status": { - "description": "Wikidata answered \"no such item\" once (`suspected`), or it is confirmed.", - "enum": [ - "suspected", - "deleted", - "never_existed" - ], - "type": "string" - }, - "subtitle": { - "type": [ - "string", - "null" - ] - }, - "title": { - "type": "string" - }, - "verified": { - "type": "boolean" - }, - "vhid": { - "type": "string" - }, - "wd_deleted_at": { - "description": "When Wikidata’s deletion log says it was deleted.", - "type": [ - "string", - "null" - ] - }, - "wd_label": { - "type": [ - "string", - "null" - ] - }, - "wd_reason": { - "description": "The deletion log’s comment, as plain text.", - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "qid", - "status", - "first_seen_at", - "wd_deleted_at", - "wd_reason", - "wd_label", - "vhid", - "short", - "title", - "subtitle", - "blocked", - "protected", - "verified", - "claimed", - "handles", - "kept" - ], - "type": "object" - }, - { - "additionalProperties": {}, - "properties": { - "checked_at": { - "description": "When the check last read it.", - "type": "string" - }, - "credit_title": { - "description": "The Wikipedia page the description is credited to, as the credit names it.", - "type": "string" - }, - "links": { - "additionalProperties": {}, - "description": "Where each action is done: this view changes nothing itself.", - "properties": { - "editor": { - "description": "Where the description is edited and the credit removed.", - "type": "string" - }, - "entry": { - "type": "string" - }, - "manager": { - "description": "The Entry Manager card, where an admin credits another page.", - "type": "string" - }, - "permalink": { - "type": [ - "string", - "null" - ] - }, - "wikipedia": { - "type": "string" - } - }, - "required": [ - "entry", - "editor", - "manager", - "wikipedia", - "permalink" - ], - "type": "object" - }, - "missing_since": { - "description": "When the check first found it so.", - "type": "string" - }, - "page_ns": { - "anyOf": [ - { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "page_title": { - "description": "Where it now leads (`outside_namespace`).", - "type": [ - "string", - "null" - ] - }, - "revision": { - "description": "The credit’s revision, when it has one.", - "type": [ - "string", - "null" - ] - }, - "short": { - "type": [ - "string", - "null" - ] - }, - "state": { - "description": "Wikipedia has no such page, or it now leads outside the article and draft namespaces.", - "enum": [ - "missing", - "outside_namespace" - ], - "type": "string" - }, - "sync_owned": { - "description": "The sync writes this description: it leaves the text and credit as they are while the item has no English article, and rewording the text takes the field from it.", - "type": "boolean" - }, - "title": { - "description": "The entry’s title.", - "type": "string" - }, - "vhid": { - "type": "string" - } - }, - "required": [ - "vhid", - "short", - "title", - "credit_title", - "revision", - "state", - "page_title", - "page_ns", - "missing_since", - "checked_at", - "sync_owned", - "links" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": {}, + "properties": { + "auto_blocked": { + "description": "Deleted by the importer’s auto-block: an entry the importer created and no person had touched, deleted once Wikidata’s deletion was confirmed. Handled; nothing to review.", + "type": "boolean" + }, + "blocked": { + "description": "The entry is deleted on the site.", + "type": "boolean" + }, + "claimed": { + "type": "boolean" + }, + "first_seen_at": { + "type": "string" + }, + "handles": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "kept": { + "anyOf": [ + { + "additionalProperties": {}, + "properties": { + "at": { + "type": "string" + }, + "by": { + "description": "Who kept it, by name as you may see it; null once their account is gone.", + "type": [ + "string", + "null" + ] + }, + "reason": { + "type": [ + "string", + "null" + ] + }, + "wd_deleted_at": { + "description": "The Wikidata deletion it was kept for.", + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "by", + "at", + "reason", + "wd_deleted_at" + ], + "type": "object" + }, + { + "type": "null" + } + ], + "description": "Its “Keep, still linked” decision while in force (the entry still on that QID, and the item not deleted again since); null otherwise." + }, + "protected": { + "type": "boolean" + }, + "qid": { + "type": "string" + }, + "short": { + "type": [ + "string", + "null" + ] + }, + "status": { + "description": "Wikidata answered \"no such item\" once (`suspected`), or it is confirmed.", + "enum": [ + "suspected", + "deleted", + "never_existed" + ], + "type": "string" + }, + "subtitle": { + "type": [ + "string", + "null" + ] + }, + "title": { + "type": "string" + }, + "verified": { + "type": "boolean" + }, + "vhid": { + "type": "string" + }, + "wd_deleted_at": { + "description": "When Wikidata’s deletion log says it was deleted.", + "type": [ + "string", + "null" + ] + }, + "wd_label": { + "type": [ + "string", + "null" + ] + }, + "wd_reason": { + "description": "The deletion log’s comment, as plain text.", + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "qid", + "status", + "first_seen_at", + "wd_deleted_at", + "wd_reason", + "wd_label", + "vhid", + "short", + "title", + "subtitle", + "blocked", + "protected", + "verified", + "claimed", + "handles", + "auto_blocked", + "kept" + ], + "type": "object" + }, + { + "additionalProperties": {}, + "properties": { + "checked_at": { + "description": "When the check last read it.", + "type": "string" + }, + "credit_title": { + "description": "The Wikipedia page the description is credited to, as the credit names it.", + "type": "string" + }, + "links": { + "additionalProperties": {}, + "description": "Where each action is done: this view changes nothing itself.", + "properties": { + "editor": { + "description": "Where the description is edited and the credit removed.", + "type": "string" + }, + "entry": { + "type": "string" + }, + "manager": { + "description": "The Entry Manager card, where an admin credits another page.", + "type": "string" + }, + "permalink": { + "type": [ + "string", + "null" + ] + }, + "wikipedia": { + "type": "string" + } + }, + "required": [ + "entry", + "editor", + "manager", + "wikipedia", + "permalink" + ], + "type": "object" + }, + "missing_since": { + "description": "When the check first found it so.", + "type": "string" + }, + "page_ns": { + "anyOf": [ + { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "page_title": { + "description": "Where it now leads (`outside_namespace`).", + "type": [ + "string", + "null" + ] + }, + "revision": { + "description": "The credit’s revision, when it has one.", + "type": [ + "string", + "null" + ] + }, + "short": { + "type": [ + "string", + "null" + ] + }, + "state": { + "description": "Wikipedia has no such page, or it now leads outside the article and draft namespaces.", + "enum": [ + "missing", + "outside_namespace" + ], + "type": "string" + }, + "sync_owned": { + "description": "The sync writes this description: it leaves the text and credit as they are while the item has no English article, and rewording the text takes the field from it.", + "type": "boolean" + }, + "title": { + "description": "The entry’s title.", + "type": "string" + }, + "vhid": { + "type": "string" + } + }, + "required": [ + "vhid", + "short", + "title", + "credit_title", + "revision", + "state", + "page_title", + "page_ns", + "missing_since", + "checked_at", + "sync_owned", + "links" + ], + "type": "object" + } +]
9 tool updates
- Changed
bulk_change_entries1 field changed- changed
Input schema / properties / reason / descriptionPrevious value: -"A delete’s reason (blocked: true only), kept in the audit log."New value: +"A delete’s reason (blocked: true only) or a Verified change’s message (either way), kept in the audit log."
- Changed
delete_entry3 fields changed- added
Input schema / properties / hide_titleAdded value: +{ + "default": false, + "description": "With notice: leave the entry’s name off it.", + "type": "boolean" +} - added
Input schema / properties / noticeAdded value: +{ + "description": "A public removal notice (410) instead of the 404; none when left out.", + "enum": [ + "wikidata_deleted", + "not_eligible", + "duplicate", + "terms" + ], + "type": "string" +} - changed
Input schema / properties / reason / descriptionPrevious value: -"Why — the Deleted entries list shows it."New value: +"Why — the Deleted entries list shows it. Never shown publicly."
- Added
delete_renamed_short - Changed
delete_wikidata_deleted_entry1 field changed- added
Input schema / properties / hide_titleAdded value: +{ + "default": false, + "description": "Leave the entry’s name off its public notice.", + "type": "boolean" +}
- Changed
get_entry_admin6 fields changed- added
Output schema / properties / entity / properties / delete_noticeAdded value: +{ + "anyOf": [ + { + "enum": [ + "wikidata_deleted", + "not_eligible", + "duplicate", + "terms" + ], + "type": "string" + }, + { + "type": "null" + } + ], + "description": "A deleted entry’s public removal notice: its address answers 410 with that notice’s fixed line. Null = none: it 404s as if it never existed." +} - added
Output schema / properties / entity / properties / delete_notice_title_hiddenAdded value: +{ + "description": "The notice leaves the entry’s name out.", + "type": "boolean" +} - added
Output schema / properties / entity / properties / deleted_atAdded value: +{ + "anyOf": [ + { + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$", + "type": "string" + }, + { + "type": "null" + } + ], + "description": "When it was deleted; null when live or merged, or deleted before the notice existed (2026-10-27)." +} - changed
Output schema / properties / entity / requiredPrevious value: -[ - "vhid", - "short", - "qid", - "title", - "subtitle", - "description", - "entity_type", - "kind_label", - "entity_kind", - "image_id", - "image", - "image_source", - "gallery_count", - "gallery", - "gallery_logo", - "image_links", - "field_sources", - "has_description", - "description_credit", - "description_source", - "synced_at", - "retry_at", - "verified", - "spotlight", - "blocked", - "protected", - "history_hidden", - "trending_hidden", - "trending_hidden_source", - "follow_links", - "handles_shown", - "edit_policy", - "propose_policy", - "claimed_by", - "custom_handle_order", - "updated_at" -]New value: +[ + "vhid", + "short", + "qid", + "title", + "subtitle", + "description", + "entity_type", + "kind_label", + "entity_kind", + "image_id", + "image", + "image_source", + "gallery_count", + "gallery", + "gallery_logo", + "image_links", + "field_sources", + "has_description", + "description_credit", + "description_source", + "synced_at", + "retry_at", + "verified", + "spotlight", + "blocked", + "delete_notice", + "delete_notice_title_hidden", + "deleted_at", + "protected", + "history_hidden", + "trending_hidden", + "trending_hidden_source", + "follow_links", + "handles_shown", + "edit_policy", + "propose_policy", + "claimed_by", + "custom_handle_order", + "updated_at" +] - added
Output schema / properties / renamedAdded value: +{ + "description": "The entry’s old short names, newest first, each a 301 here until another entry takes it; `DELETE /api/redirects/:key` removes one.", + "items": { + "additionalProperties": {}, + "properties": { + "key": { + "description": "An old short name: `/<key>` still 301s here.", + "type": "string" + }, + "revision_ref": { + "description": "The edit that changed the short (`r<n>`), found by its diff; null if none records it.", + "type": [ + "string", + "null" + ] + }, + "written_at": { + "description": "When that edit was made.", + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "key", + "revision_ref", + "written_at" + ], + "type": "object" + }, + "type": "array" +} - changed
Output schema / requiredPrevious value: -[ - "entity", - "merge", - "baseRevisionId", - "linkNames", - "handles", - "heldBack", - "heldBackNotListed", - "history", - "audit", - "tools", - "can" -]New value: +[ + "entity", + "merge", + "renamed", + "baseRevisionId", + "linkNames", + "handles", + "heldBack", + "heldBackNotListed", + "history", + "audit", + "tools", + "can" +]
- Changed
list_bulk_changes4 fields changed- added
Output schema / properties / op / properties / reasonAdded value: +{ + "description": "The admin’s message for the whole change: a delete’s reason, or a Verified change’s message.", + "type": [ + "string", + "null" + ] +} - changed
Output schema / properties / op / requiredPrevious value: -[ - "id", - "actor", - "actor_name", - "ts", - "field", - "value", - "count", - "revert_of", - "targets" -]New value: +[ + "id", + "actor", + "actor_name", + "ts", + "field", + "value", + "count", + "revert_of", + "reason", + "targets" +] - added
Output schema / properties / ops / items / properties / reasonAdded value: +{ + "description": "The admin’s message for the whole change: a delete’s reason, or a Verified change’s message.", + "type": [ + "string", + "null" + ] +} - changed
Output schema / properties / ops / items / requiredPrevious value: -[ - "id", - "actor", - "actor_name", - "ts", - "field", - "value", - "count", - "revert_of" -]New value: +[ + "id", + "actor", + "actor_name", + "ts", + "field", + "value", + "count", + "revert_of", + "reason" +]
- Changed
revert_bulk_change1 field changed- added
Input schema / properties / reasonAdded value: +{ + "description": "Why, for an undo of a Verified change, kept in the audit log; an undo of any other setting keeps none.", + "maxLength": 500, + "type": "string" +}
- Added
set_delete_notice - Changed
set_entry_setting1 field changed- added
Input schema / properties / reasonAdded value: +{ + "description": "Why, for a Verified change (either way), kept in the audit log. Plain words; any other setting keeps none.", + "maxLength": 500, + "type": "string" +}
4 tool updates
- Changed
get_entries1 field changed- changed
Output schema / properties / results / items / anyOfPrevious value: -[ - { - "additionalProperties": {}, - "properties": { - "entity": { - "additionalProperties": {}, - "description": "Exactly what `GET /api/v1/entities/{key}` answers for this key.", - "properties": { - "description": { - "description": "The description as sanitised HTML, links to other entries named as they are today.", - "type": [ - "string", - "null" - ] - }, - "description_license": { - "anyOf": [ - { - "const": "CC-BY-SA-4.0", - "type": "string" - }, - { - "type": "null" - } - ], - "description": "The description’s licence, as an SPDX id: `CC-BY-SA-4.0` when it was taken from Wikipedia (`description_source` is set), which means crediting the article and sharing alike. Null otherwise: the description is CC0 like the rest of the text." - }, - "description_source": { - "anyOf": [ - { - "additionalProperties": {}, - "description": "The English Wikipedia page an entry’s description was taken from: an article, or a draft (`draft: true`).", - "properties": { - "adapted": { - "description": "Present and true when the text has been edited on the site since.", - "type": "boolean" - }, - "draft": { - "const": true, - "description": "Present and true when the page is an English Wikipedia draft (the Draft namespace), not yet an article.", - "type": "boolean" - }, - "kind": { - "description": "The source’s kind (`wikipedia`).", - "type": "string" - }, - "revision": { - "description": "The page’s revision the text was taken from: its permalink is `https://en.wikipedia.org/w/index.php?title=<title>&oldid=<revision>`. Absent on a credit from before revisions were kept.", - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "title": { - "description": "The page’s title, underscored (`Draft:` first for a draft).", - "type": "string" - }, - "url": { - "description": "The page.", - "type": "string" - } - }, - "required": [ - "kind", - "title", - "url" - ], - "type": "object" - }, - { - "type": "null" - } - ] - }, - "entity_kind": { - "anyOf": [ - { - "enum": [ - "person", - "musical_group", - "sports_organization", - "broadcaster", - "publisher", - "educational_institution", - "research_organization", - "religious_organization", - "museum", - "financial_institution", - "chain", - "nonprofit", - "company", - "organization", - "show", - "website", - "software", - "brand" - ], - "type": "string" - }, - { - "type": "null" - } - ], - "description": "The finer kind of thing it is, from its Wikidata item’s classes; null when unknown (an organisation or a brand not yet read since kinds were added reads null until the sync next reads its item). Each kind belongs to one `entity_type`, and `person`, `organization` and `brand` are also the kinds of an entry of that type with no finer one. The kinds, with their type: `person` (person: person), `musical_group` (organization: musical group), `sports_organization` (organization: sports organisation), `broadcaster` (organization: broadcaster), `publisher` (organization: publisher), `educational_institution` (organization: educational institution), `research_organization` (organization: research organisation), `religious_organization` (organization: religious organisation), `museum` (organization: museum), `financial_institution` (organization: financial institution), `chain` (organization: retail or hospitality chain), `nonprofit` (organization: charity or non-profit), `company` (organization: company), `organization` (organization: organisation), `show` (brand: show), `website` (brand: website or app), `software` (brand: software), `brand` (brand: brand). New kinds may be added; treat an unknown value as its `entity_type`." - }, - "entity_type": { - "description": "What it is, from its Wikidata item: `person`, `organization` or `brand`; null when unknown. `entity_kind` says more.", - "type": [ - "string", - "null" - ] - }, - "handles": { - "items": { - "additionalProperties": {}, - "description": "One account or identifier of an entry, in the order the entry page shows them. A Wikidata item linked to the entry comes last, as platform `wikidata`.", - "properties": { - "category": { - "description": "How the entry page groups it.", - "enum": [ - "social", - "messaging", - "website", - "identifier" - ], - "type": "string" - }, - "checked": { - "additionalProperties": {}, - "description": "What Verified Handles’ own handle checker found when it last looked at this account, from the platform’s official API: only on YouTube (channel and handle), Deezer and GitHub, and only for a look at most 7 days old. Absent otherwise. The entry page shows it only for `dead` (“Not found when checked …”) and `renamed`.", - "properties": { - "at": { - "description": "When it looked (ISO 8601, UTC).", - "type": "string" - }, - "now": { - "description": "For `renamed`, the name it answers to now, when the platform gave one. A YouTube handle’s is lowercase.", - "type": "string" - }, - "verdict": { - "description": "`live`: the profile was there. `dead`: the platform did not find it. `renamed`: it answers under another name. `unknown`: the platform gave no answer a rule could read.", - "enum": [ - "live", - "dead", - "renamed", - "unknown" - ], - "type": "string" - } - }, - "required": [ - "verdict", - "at" - ], - "type": "object" - }, - "display": { - "description": "The label the entry page shows instead of the value, if an editor set one. Null for email.", - "type": [ - "string", - "null" - ] - }, - "name": { - "description": "The platform’s display name.", - "type": "string" - }, - "platform": { - "description": "The platform’s id (`twitter`, `instagram`, `wikidata`, …).", - "type": "string" - }, - "url": { - "description": "The profile’s address, built from the platform’s URL pattern. Null for email.", - "type": [ - "string", - "null" - ] - }, - "value": { - "description": "The handle as stored (a username, an id, a URL). Null for an email address, which is never published as data.", - "type": [ - "string", - "null" - ] - }, - "verified": { - "description": "Verified Handles has checked that this account belongs to the entry.", - "type": "boolean" - } - }, - "required": [ - "platform", - "name", - "category", - "value", - "display", - "url", - "verified" - ], - "type": "object" - }, - "type": "array" - }, - "image": { - "description": "The lead image (the same as `images[0].url`), or null.", - "type": [ - "string", - "null" - ] - }, - "image_rights": { - "anyOf": [ - { - "additionalProperties": {}, - "description": "Who owns an image and how it may be reused. An entry’s text is CC0 (bar a description taken from Wikipedia); its images are licensed separately, by their owners.", - "properties": { - "credit": { - "description": "The credit line to show when reusing the image.", - "type": [ - "string", - "null" - ] - }, - "details_url": { - "description": "The entry’s \"About this image\" page.", - "type": "string" - }, - "freely_licensed": { - "description": "May be reused under a free licence. Null when no licence is recorded.", - "type": [ - "boolean", - "null" - ] - }, - "license": { - "anyOf": [ - { - "enum": [ - "cc0-1.0", - "public-domain", - "cc-by-4.0", - "cc-by-sa-4.0", - "supplied", - "permission", - "none" - ], - "type": "string" - }, - { - "type": "null" - } - ], - "description": "An upload’s licence, by id. Null for a Commons image (see `license_name`) or when none was recorded." - }, - "license_name": { - "description": "The licence’s name, e.g. \"CC BY-SA 4.0\". Null until it is known.", - "type": [ - "string", - "null" - ] - }, - "license_url": { - "description": "The licence’s text.", - "type": [ - "string", - "null" - ] - }, - "source": { - "description": "Where the image came from.", - "enum": [ - "wikimedia_commons", - "upload" - ], - "type": "string" - }, - "source_page": { - "description": "The image’s Wikimedia Commons file page, which states its licence and author.", - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "source", - "license", - "license_name", - "license_url", - "freely_licensed", - "credit", - "source_page", - "details_url" - ], - "type": "object" - }, - { - "type": "null" - } - ], - "description": "The lead image’s rights, or null when there is no image." - }, - "images": { - "description": "Every image the entry shows, the lead first. Empty when it shows none.", - "items": { - "additionalProperties": {}, - "description": "One image an entry shows.", - "properties": { - "image_rights": { - "additionalProperties": {}, - "description": "Who owns an image and how it may be reused. An entry’s text is CC0 (bar a description taken from Wikipedia); its images are licensed separately, by their owners.", - "properties": { - "credit": { - "description": "The credit line to show when reusing the image.", - "type": [ - "string", - "null" - ] - }, - "details_url": { - "description": "The entry’s \"About this image\" page.", - "type": "string" - }, - "freely_licensed": { - "description": "May be reused under a free licence. Null when no licence is recorded.", - "type": [ - "boolean", - "null" - ] - }, - "license": { - "anyOf": [ - { - "enum": [ - "cc0-1.0", - "public-domain", - "cc-by-4.0", - "cc-by-sa-4.0", - "supplied", - "permission", - "none" - ], - "type": "string" - }, - { - "type": "null" - } - ], - "description": "An upload’s licence, by id. Null for a Commons image (see `license_name`) or when none was recorded." - }, - "license_name": { - "description": "The licence’s name, e.g. \"CC BY-SA 4.0\". Null until it is known.", - "type": [ - "string", - "null" - ] - }, - "license_url": { - "description": "The licence’s text.", - "type": [ - "string", - "null" - ] - }, - "source": { - "description": "Where the image came from.", - "enum": [ - "wikimedia_commons", - "upload" - ], - "type": "string" - }, - "source_page": { - "description": "The image’s Wikimedia Commons file page, which states its licence and author.", - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "source", - "license", - "license_name", - "license_url", - "freely_licensed", - "credit", - "source_page", - "details_url" - ], - "type": "object" - }, - "link": { - "description": "Where the image links on the entry page instead of opening the full-screen viewer, or null.", - "type": [ - "string", - "null" - ] - }, - "main": { - "description": "True for the lead image, false for the gallery images after it.", - "type": "boolean" - }, - "url": { - "description": "The image, as a path on this site (`/img/w/480q75/<id>`).", - "type": "string" - } - }, - "required": [ - "url", - "main", - "image_rights", - "link" - ], - "type": "object" - }, - "type": "array" - }, - "short": { - "description": "The entry’s short name (`/<short>`), if it has one.", - "type": [ - "string", - "null" - ] - }, - "subtitle": { - "type": [ - "string", - "null" - ] - }, - "title": { - "type": "string" - }, - "url": { - "description": "The entry’s canonical page.", - "type": "string" - }, - "verified": { - "description": "Verified Handles has verified the entry.", - "type": "boolean" - }, - "vhid": { - "description": "The entry’s VHID: 11 digits, permanent.", - "pattern": "^\\d{11}$", - "type": "string" - } - }, - "required": [ - "vhid", - "short", - "title", - "subtitle", - "entity_type", - "entity_kind", - "verified", - "description", - "description_source", - "description_license", - "url", - "image", - "image_rights", - "images", - "handles" - ], - "type": "object" - }, - "key": { - "description": "The key as asked for, trimmed.", - "type": "string" - }, - "status": { - "const": "ok", - "type": "string" - } - }, - "required": [ - "key", - "status", - "entity" - ], - "type": "object" - }, - { - "additionalProperties": {}, - "properties": { - "key": { - "description": "The key as asked for, trimmed.", - "type": "string" - }, - "status": { - "const": "not_found", - "description": "No public entry answers to the key: where the single read answers 404.", - "type": "string" - } - }, - "required": [ - "key", - "status" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": {}, + "properties": { + "entity": { + "additionalProperties": {}, + "description": "Exactly what `GET /api/v1/entities/{key}` answers for this key.", + "properties": { + "claimed": { + "description": "The person or organisation the entry is about has claimed it. Never who.", + "type": "boolean" + }, + "description": { + "description": "The description as sanitised HTML, links to other entries named as they are today.", + "type": [ + "string", + "null" + ] + }, + "description_license": { + "anyOf": [ + { + "const": "CC-BY-SA-4.0", + "type": "string" + }, + { + "type": "null" + } + ], + "description": "The description’s licence, as an SPDX id: `CC-BY-SA-4.0` when it was taken from Wikipedia (`description_source` is set), which means crediting the article and sharing alike. Null otherwise: the description is CC0 like the rest of the text." + }, + "description_source": { + "anyOf": [ + { + "additionalProperties": {}, + "description": "The English Wikipedia page an entry’s description was taken from: an article, or a draft (`draft: true`).", + "properties": { + "adapted": { + "description": "Present and true when the text has been edited on the site since.", + "type": "boolean" + }, + "draft": { + "const": true, + "description": "Present and true when the page is an English Wikipedia draft (the Draft namespace), not yet an article.", + "type": "boolean" + }, + "kind": { + "description": "The source’s kind (`wikipedia`).", + "type": "string" + }, + "revision": { + "description": "The page’s revision the text was taken from: its permalink is `https://en.wikipedia.org/w/index.php?title=<title>&oldid=<revision>`. Absent on a credit from before revisions were kept.", + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" + }, + "title": { + "description": "The page’s title, underscored (`Draft:` first for a draft).", + "type": "string" + }, + "url": { + "description": "The page.", + "type": "string" + } + }, + "required": [ + "kind", + "title", + "url" + ], + "type": "object" + }, + { + "type": "null" + } + ] + }, + "entity_kind": { + "anyOf": [ + { + "enum": [ + "person", + "musical_group", + "sports_organization", + "broadcaster", + "publisher", + "educational_institution", + "research_organization", + "religious_organization", + "museum", + "financial_institution", + "chain", + "nonprofit", + "company", + "organization", + "show", + "website", + "software", + "brand" + ], + "type": "string" + }, + { + "type": "null" + } + ], + "description": "The finer kind of thing it is, from its Wikidata item’s classes; null when unknown (an organisation or a brand not yet read since kinds were added reads null until the sync next reads its item). Each kind belongs to one `entity_type`, and `person`, `organization` and `brand` are also the kinds of an entry of that type with no finer one. The kinds, with their type: `person` (person: person), `musical_group` (organization: musical group), `sports_organization` (organization: sports organisation), `broadcaster` (organization: broadcaster), `publisher` (organization: publisher), `educational_institution` (organization: educational institution), `research_organization` (organization: research organisation), `religious_organization` (organization: religious organisation), `museum` (organization: museum), `financial_institution` (organization: financial institution), `chain` (organization: retail or hospitality chain), `nonprofit` (organization: charity or non-profit), `company` (organization: company), `organization` (organization: organisation), `show` (brand: show), `website` (brand: website or app), `software` (brand: software), `brand` (brand: brand). New kinds may be added; treat an unknown value as its `entity_type`." + }, + "entity_type": { + "description": "What it is, from its Wikidata item: `person`, `organization` or `brand`; null when unknown. `entity_kind` says more.", + "type": [ + "string", + "null" + ] + }, + "handles": { + "items": { + "additionalProperties": {}, + "description": "One account or identifier of an entry, in the order the entry page shows them. A Wikidata item linked to the entry comes last, as platform `wikidata`.", + "properties": { + "category": { + "description": "How the entry page groups it.", + "enum": [ + "social", + "messaging", + "website", + "identifier" + ], + "type": "string" + }, + "checked": { + "additionalProperties": {}, + "description": "What Verified Handles’ own handle checker found when it last looked at this account, from the platform’s official API: only on YouTube (channel and handle), Deezer and GitHub, and only for a look at most 7 days old. Absent otherwise. The entry page shows it only for `dead` (“Not found when checked …”) and `renamed`.", + "properties": { + "at": { + "description": "When it looked (ISO 8601, UTC).", + "type": "string" + }, + "now": { + "description": "For `renamed`, the name it answers to now, when the platform gave one. A YouTube handle’s is lowercase.", + "type": "string" + }, + "verdict": { + "description": "`live`: the profile was there. `dead`: the platform did not find it. `renamed`: it answers under another name. `unknown`: the platform gave no answer a rule could read.", + "enum": [ + "live", + "dead", + "renamed", + "unknown" + ], + "type": "string" + } + }, + "required": [ + "verdict", + "at" + ], + "type": "object" + }, + "display": { + "description": "The label the entry page shows instead of the value, if an editor set one. Null for email.", + "type": [ + "string", + "null" + ] + }, + "name": { + "description": "The platform’s display name.", + "type": "string" + }, + "platform": { + "description": "The platform’s id (`twitter`, `instagram`, `wikidata`, …).", + "type": "string" + }, + "shown_first": { + "description": "The entry page shows it before anyone opens anything: true for the accounts above a long list’s “Show N more accounts”, false for the ones folded under it, for the external identifiers (listed under their own closed heading, unless the entry has nothing else), and for an account the page does not draw.", + "type": "boolean" + }, + "url": { + "description": "The profile’s address, built from the platform’s URL pattern. Null for email.", + "type": [ + "string", + "null" + ] + }, + "value": { + "description": "The handle as stored (a username, an id, a URL). Null for an email address, which is never published as data.", + "type": [ + "string", + "null" + ] + }, + "verified": { + "description": "Verified Handles has checked that this account belongs to the entry.", + "type": "boolean" + } + }, + "required": [ + "platform", + "name", + "category", + "value", + "display", + "url", + "verified", + "shown_first" + ], + "type": "object" + }, + "type": "array" + }, + "image": { + "description": "The lead image (the same as `images[0].url`), or null.", + "type": [ + "string", + "null" + ] + }, + "image_rights": { + "anyOf": [ + { + "additionalProperties": {}, + "description": "Who owns an image and how it may be reused. An entry’s text is CC0 (bar a description taken from Wikipedia); its images are licensed separately, by their owners.", + "properties": { + "credit": { + "description": "The credit line to show when reusing the image.", + "type": [ + "string", + "null" + ] + }, + "details_url": { + "description": "The entry’s \"About this image\" page.", + "type": "string" + }, + "freely_licensed": { + "description": "May be reused under a free licence. Null when no licence is recorded.", + "type": [ + "boolean", + "null" + ] + }, + "license": { + "anyOf": [ + { + "enum": [ + "cc0-1.0", + "public-domain", + "cc-by-4.0", + "cc-by-sa-4.0", + "supplied", + "permission", + "none" + ], + "type": "string" + }, + { + "type": "null" + } + ], + "description": "An upload’s licence, by id. Null for a Commons image (see `license_name`) or when none was recorded." + }, + "license_name": { + "description": "The licence’s name, e.g. \"CC BY-SA 4.0\". Null until it is known.", + "type": [ + "string", + "null" + ] + }, + "license_url": { + "description": "The licence’s text.", + "type": [ + "string", + "null" + ] + }, + "source": { + "description": "Where the image came from.", + "enum": [ + "wikimedia_commons", + "upload" + ], + "type": "string" + }, + "source_page": { + "description": "The image’s Wikimedia Commons file page, which states its licence and author.", + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "source", + "license", + "license_name", + "license_url", + "freely_licensed", + "credit", + "source_page", + "details_url" + ], + "type": "object" + }, + { + "type": "null" + } + ], + "description": "The lead image’s rights, or null when there is no image." + }, + "images": { + "description": "Every image the entry shows, the lead first. Empty when it shows none.", + "items": { + "additionalProperties": {}, + "description": "One image an entry shows.", + "properties": { + "image_rights": { + "additionalProperties": {}, + "description": "Who owns an image and how it may be reused. An entry’s text is CC0 (bar a description taken from Wikipedia); its images are licensed separately, by their owners.", + "properties": { + "credit": { + "description": "The credit line to show when reusing the image.", + "type": [ + "string", + "null" + ] + }, + "details_url": { + "description": "The entry’s \"About this image\" page.", + "type": "string" + }, + "freely_licensed": { + "description": "May be reused under a free licence. Null when no licence is recorded.", + "type": [ + "boolean", + "null" + ] + }, + "license": { + "anyOf": [ + { + "enum": [ + "cc0-1.0", + "public-domain", + "cc-by-4.0", + "cc-by-sa-4.0", + "supplied", + "permission", + "none" + ], + "type": "string" + }, + { + "type": "null" + } + ], + "description": "An upload’s licence, by id. Null for a Commons image (see `license_name`) or when none was recorded." + }, + "license_name": { + "description": "The licence’s name, e.g. \"CC BY-SA 4.0\". Null until it is known.", + "type": [ + "string", + "null" + ] + }, + "license_url": { + "description": "The licence’s text.", + "type": [ + "string", + "null" + ] + }, + "source": { + "description": "Where the image came from.", + "enum": [ + "wikimedia_commons", + "upload" + ], + "type": "string" + }, + "source_page": { + "description": "The image’s Wikimedia Commons file page, which states its licence and author.", + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "source", + "license", + "license_name", + "license_url", + "freely_licensed", + "credit", + "source_page", + "details_url" + ], + "type": "object" + }, + "link": { + "description": "Where the image links on the entry page instead of opening the full-screen viewer, or null.", + "type": [ + "string", + "null" + ] + }, + "main": { + "description": "True for the lead image, false for the gallery images after it.", + "type": "boolean" + }, + "url": { + "description": "The image, as a path on this site (`/img/w/480q75/<id>`).", + "type": "string" + } + }, + "required": [ + "url", + "main", + "image_rights", + "link" + ], + "type": "object" + }, + "type": "array" + }, + "merged_into": { + "description": "Present when the key asked for named an entry that was merged into this one: this entry’s VHID.", + "pattern": "^\\d{11}$", + "type": "string" + }, + "rev": { + "description": "The version of the entry this body was made from: a later change’s is a larger number. A stamp (`GET /api/v1/stamps`) that differs means the entry has changed. To read an entry past every cache (after your own change, say), ask `?v=<rev>` with the rev your change returned.", + "pattern": "^\\d+$", + "type": "string" + }, + "short": { + "description": "The entry’s short name (`/<short>`), if it has one.", + "type": [ + "string", + "null" + ] + }, + "subtitle": { + "type": [ + "string", + "null" + ] + }, + "thumb": { + "description": "The lead image at the width a list row draws it (100 CSS pixels), as a path on the site: the width the image is really served at (200 for a Commons picture), never one that redirects. Null when there is no image.", + "type": [ + "string", + "null" + ] + }, + "title": { + "type": "string" + }, + "url": { + "description": "The entry’s canonical page.", + "type": "string" + }, + "verified": { + "description": "Verified Handles has verified the entry.", + "type": "boolean" + }, + "vhid": { + "description": "The entry’s VHID: 11 digits, permanent.", + "pattern": "^\\d{11}$", + "type": "string" + } + }, + "required": [ + "vhid", + "short", + "title", + "subtitle", + "entity_type", + "entity_kind", + "verified", + "claimed", + "rev", + "description", + "description_source", + "description_license", + "url", + "image", + "thumb", + "image_rights", + "images", + "handles" + ], + "type": "object" + }, + "key": { + "description": "The key as asked for, trimmed.", + "type": "string" + }, + "status": { + "const": "ok", + "type": "string" + } + }, + "required": [ + "key", + "status", + "entity" + ], + "type": "object" + }, + { + "additionalProperties": {}, + "properties": { + "key": { + "description": "The key as asked for, trimmed.", + "type": "string" + }, + "status": { + "const": "not_found", + "description": "No public entry answers to the key: where the single read answers 404.", + "type": "string" + } + }, + "required": [ + "key", + "status" + ], + "type": "object" + } +]
- Changed
get_entry1 field changed- changed
Output schema / properties / entry / anyOfPrevious value: -[ - { - "additionalProperties": {}, - "description": "An entry: the same data its page shows, from the same code. Email addresses are masked. The text is CC0, except a description taken from Wikipedia (`description_license`).", - "properties": { - "description": { - "description": "The description as sanitised HTML, links to other entries named as they are today.", - "type": [ - "string", - "null" - ] - }, - "description_license": { - "anyOf": [ - { - "const": "CC-BY-SA-4.0", - "type": "string" - }, - { - "type": "null" - } - ], - "description": "The description’s licence, as an SPDX id: `CC-BY-SA-4.0` when it was taken from Wikipedia (`description_source` is set), which means crediting the article and sharing alike. Null otherwise: the description is CC0 like the rest of the text." - }, - "description_source": { - "anyOf": [ - { - "additionalProperties": {}, - "description": "The English Wikipedia page an entry’s description was taken from: an article, or a draft (`draft: true`).", - "properties": { - "adapted": { - "description": "Present and true when the text has been edited on the site since.", - "type": "boolean" - }, - "draft": { - "const": true, - "description": "Present and true when the page is an English Wikipedia draft (the Draft namespace), not yet an article.", - "type": "boolean" - }, - "kind": { - "description": "The source’s kind (`wikipedia`).", - "type": "string" - }, - "revision": { - "description": "The page’s revision the text was taken from: its permalink is `https://en.wikipedia.org/w/index.php?title=<title>&oldid=<revision>`. Absent on a credit from before revisions were kept.", - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "title": { - "description": "The page’s title, underscored (`Draft:` first for a draft).", - "type": "string" - }, - "url": { - "description": "The page.", - "type": "string" - } - }, - "required": [ - "kind", - "title", - "url" - ], - "type": "object" - }, - { - "type": "null" - } - ] - }, - "entity_kind": { - "anyOf": [ - { - "enum": [ - "person", - "musical_group", - "sports_organization", - "broadcaster", - "publisher", - "educational_institution", - "research_organization", - "religious_organization", - "museum", - "financial_institution", - "chain", - "nonprofit", - "company", - "organization", - "show", - "website", - "software", - "brand" - ], - "type": "string" - }, - { - "type": "null" - } - ], - "description": "The finer kind of thing it is, from its Wikidata item’s classes; null when unknown (an organisation or a brand not yet read since kinds were added reads null until the sync next reads its item). Each kind belongs to one `entity_type`, and `person`, `organization` and `brand` are also the kinds of an entry of that type with no finer one. The kinds, with their type: `person` (person: person), `musical_group` (organization: musical group), `sports_organization` (organization: sports organisation), `broadcaster` (organization: broadcaster), `publisher` (organization: publisher), `educational_institution` (organization: educational institution), `research_organization` (organization: research organisation), `religious_organization` (organization: religious organisation), `museum` (organization: museum), `financial_institution` (organization: financial institution), `chain` (organization: retail or hospitality chain), `nonprofit` (organization: charity or non-profit), `company` (organization: company), `organization` (organization: organisation), `show` (brand: show), `website` (brand: website or app), `software` (brand: software), `brand` (brand: brand). New kinds may be added; treat an unknown value as its `entity_type`." - }, - "entity_type": { - "description": "What it is, from its Wikidata item: `person`, `organization` or `brand`; null when unknown. `entity_kind` says more.", - "type": [ - "string", - "null" - ] - }, - "handles": { - "items": { - "additionalProperties": {}, - "description": "One account or identifier of an entry, in the order the entry page shows them. A Wikidata item linked to the entry comes last, as platform `wikidata`.", - "properties": { - "category": { - "description": "How the entry page groups it.", - "enum": [ - "social", - "messaging", - "website", - "identifier" - ], - "type": "string" - }, - "checked": { - "additionalProperties": {}, - "description": "What Verified Handles’ own handle checker found when it last looked at this account, from the platform’s official API: only on YouTube (channel and handle), Deezer and GitHub, and only for a look at most 7 days old. Absent otherwise. The entry page shows it only for `dead` (“Not found when checked …”) and `renamed`.", - "properties": { - "at": { - "description": "When it looked (ISO 8601, UTC).", - "type": "string" - }, - "now": { - "description": "For `renamed`, the name it answers to now, when the platform gave one. A YouTube handle’s is lowercase.", - "type": "string" - }, - "verdict": { - "description": "`live`: the profile was there. `dead`: the platform did not find it. `renamed`: it answers under another name. `unknown`: the platform gave no answer a rule could read.", - "enum": [ - "live", - "dead", - "renamed", - "unknown" - ], - "type": "string" - } - }, - "required": [ - "verdict", - "at" - ], - "type": "object" - }, - "display": { - "description": "The label the entry page shows instead of the value, if an editor set one. Null for email.", - "type": [ - "string", - "null" - ] - }, - "name": { - "description": "The platform’s display name.", - "type": "string" - }, - "platform": { - "description": "The platform’s id (`twitter`, `instagram`, `wikidata`, …).", - "type": "string" - }, - "url": { - "description": "The profile’s address, built from the platform’s URL pattern. Null for email.", - "type": [ - "string", - "null" - ] - }, - "value": { - "description": "The handle as stored (a username, an id, a URL). Null for an email address, which is never published as data.", - "type": [ - "string", - "null" - ] - }, - "verified": { - "description": "Verified Handles has checked that this account belongs to the entry.", - "type": "boolean" - } - }, - "required": [ - "platform", - "name", - "category", - "value", - "display", - "url", - "verified" - ], - "type": "object" - }, - "type": "array" - }, - "image": { - "description": "The lead image (the same as `images[0].url`), or null.", - "type": [ - "string", - "null" - ] - }, - "image_rights": { - "anyOf": [ - { - "additionalProperties": {}, - "description": "Who owns an image and how it may be reused. An entry’s text is CC0 (bar a description taken from Wikipedia); its images are licensed separately, by their owners.", - "properties": { - "credit": { - "description": "The credit line to show when reusing the image.", - "type": [ - "string", - "null" - ] - }, - "details_url": { - "description": "The entry’s \"About this image\" page.", - "type": "string" - }, - "freely_licensed": { - "description": "May be reused under a free licence. Null when no licence is recorded.", - "type": [ - "boolean", - "null" - ] - }, - "license": { - "anyOf": [ - { - "enum": [ - "cc0-1.0", - "public-domain", - "cc-by-4.0", - "cc-by-sa-4.0", - "supplied", - "permission", - "none" - ], - "type": "string" - }, - { - "type": "null" - } - ], - "description": "An upload’s licence, by id. Null for a Commons image (see `license_name`) or when none was recorded." - }, - "license_name": { - "description": "The licence’s name, e.g. \"CC BY-SA 4.0\". Null until it is known.", - "type": [ - "string", - "null" - ] - }, - "license_url": { - "description": "The licence’s text.", - "type": [ - "string", - "null" - ] - }, - "source": { - "description": "Where the image came from.", - "enum": [ - "wikimedia_commons", - "upload" - ], - "type": "string" - }, - "source_page": { - "description": "The image’s Wikimedia Commons file page, which states its licence and author.", - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "source", - "license", - "license_name", - "license_url", - "freely_licensed", - "credit", - "source_page", - "details_url" - ], - "type": "object" - }, - { - "type": "null" - } - ], - "description": "The lead image’s rights, or null when there is no image." - }, - "images": { - "description": "Every image the entry shows, the lead first. Empty when it shows none.", - "items": { - "additionalProperties": {}, - "description": "One image an entry shows.", - "properties": { - "image_rights": { - "additionalProperties": {}, - "description": "Who owns an image and how it may be reused. An entry’s text is CC0 (bar a description taken from Wikipedia); its images are licensed separately, by their owners.", - "properties": { - "credit": { - "description": "The credit line to show when reusing the image.", - "type": [ - "string", - "null" - ] - }, - "details_url": { - "description": "The entry’s \"About this image\" page.", - "type": "string" - }, - "freely_licensed": { - "description": "May be reused under a free licence. Null when no licence is recorded.", - "type": [ - "boolean", - "null" - ] - }, - "license": { - "anyOf": [ - { - "enum": [ - "cc0-1.0", - "public-domain", - "cc-by-4.0", - "cc-by-sa-4.0", - "supplied", - "permission", - "none" - ], - "type": "string" - }, - { - "type": "null" - } - ], - "description": "An upload’s licence, by id. Null for a Commons image (see `license_name`) or when none was recorded." - }, - "license_name": { - "description": "The licence’s name, e.g. \"CC BY-SA 4.0\". Null until it is known.", - "type": [ - "string", - "null" - ] - }, - "license_url": { - "description": "The licence’s text.", - "type": [ - "string", - "null" - ] - }, - "source": { - "description": "Where the image came from.", - "enum": [ - "wikimedia_commons", - "upload" - ], - "type": "string" - }, - "source_page": { - "description": "The image’s Wikimedia Commons file page, which states its licence and author.", - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "source", - "license", - "license_name", - "license_url", - "freely_licensed", - "credit", - "source_page", - "details_url" - ], - "type": "object" - }, - "link": { - "description": "Where the image links on the entry page instead of opening the full-screen viewer, or null.", - "type": [ - "string", - "null" - ] - }, - "main": { - "description": "True for the lead image, false for the gallery images after it.", - "type": "boolean" - }, - "url": { - "description": "The image, as a path on this site (`/img/w/480q75/<id>`).", - "type": "string" - } - }, - "required": [ - "url", - "main", - "image_rights", - "link" - ], - "type": "object" - }, - "type": "array" - }, - "short": { - "description": "The entry’s short name (`/<short>`), if it has one.", - "type": [ - "string", - "null" - ] - }, - "subtitle": { - "type": [ - "string", - "null" - ] - }, - "title": { - "type": "string" - }, - "url": { - "description": "The entry’s canonical page.", - "type": "string" - }, - "verified": { - "description": "Verified Handles has verified the entry.", - "type": "boolean" - }, - "vhid": { - "description": "The entry’s VHID: 11 digits, permanent.", - "pattern": "^\\d{11}$", - "type": "string" - } - }, - "required": [ - "vhid", - "short", - "title", - "subtitle", - "entity_type", - "entity_kind", - "verified", - "description", - "description_source", - "description_license", - "url", - "image", - "image_rights", - "images", - "handles" - ], - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": {}, + "description": "An entry: the same data its page shows, from the same code. Email addresses are masked. The text is CC0, except a description taken from Wikipedia (`description_license`).", + "properties": { + "claimed": { + "description": "The person or organisation the entry is about has claimed it. Never who.", + "type": "boolean" + }, + "description": { + "description": "The description as sanitised HTML, links to other entries named as they are today.", + "type": [ + "string", + "null" + ] + }, + "description_license": { + "anyOf": [ + { + "const": "CC-BY-SA-4.0", + "type": "string" + }, + { + "type": "null" + } + ], + "description": "The description’s licence, as an SPDX id: `CC-BY-SA-4.0` when it was taken from Wikipedia (`description_source` is set), which means crediting the article and sharing alike. Null otherwise: the description is CC0 like the rest of the text." + }, + "description_source": { + "anyOf": [ + { + "additionalProperties": {}, + "description": "The English Wikipedia page an entry’s description was taken from: an article, or a draft (`draft: true`).", + "properties": { + "adapted": { + "description": "Present and true when the text has been edited on the site since.", + "type": "boolean" + }, + "draft": { + "const": true, + "description": "Present and true when the page is an English Wikipedia draft (the Draft namespace), not yet an article.", + "type": "boolean" + }, + "kind": { + "description": "The source’s kind (`wikipedia`).", + "type": "string" + }, + "revision": { + "description": "The page’s revision the text was taken from: its permalink is `https://en.wikipedia.org/w/index.php?title=<title>&oldid=<revision>`. Absent on a credit from before revisions were kept.", + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" + }, + "title": { + "description": "The page’s title, underscored (`Draft:` first for a draft).", + "type": "string" + }, + "url": { + "description": "The page.", + "type": "string" + } + }, + "required": [ + "kind", + "title", + "url" + ], + "type": "object" + }, + { + "type": "null" + } + ] + }, + "entity_kind": { + "anyOf": [ + { + "enum": [ + "person", + "musical_group", + "sports_organization", + "broadcaster", + "publisher", + "educational_institution", + "research_organization", + "religious_organization", + "museum", + "financial_institution", + "chain", + "nonprofit", + "company", + "organization", + "show", + "website", + "software", + "brand" + ], + "type": "string" + }, + { + "type": "null" + } + ], + "description": "The finer kind of thing it is, from its Wikidata item’s classes; null when unknown (an organisation or a brand not yet read since kinds were added reads null until the sync next reads its item). Each kind belongs to one `entity_type`, and `person`, `organization` and `brand` are also the kinds of an entry of that type with no finer one. The kinds, with their type: `person` (person: person), `musical_group` (organization: musical group), `sports_organization` (organization: sports organisation), `broadcaster` (organization: broadcaster), `publisher` (organization: publisher), `educational_institution` (organization: educational institution), `research_organization` (organization: research organisation), `religious_organization` (organization: religious organisation), `museum` (organization: museum), `financial_institution` (organization: financial institution), `chain` (organization: retail or hospitality chain), `nonprofit` (organization: charity or non-profit), `company` (organization: company), `organization` (organization: organisation), `show` (brand: show), `website` (brand: website or app), `software` (brand: software), `brand` (brand: brand). New kinds may be added; treat an unknown value as its `entity_type`." + }, + "entity_type": { + "description": "What it is, from its Wikidata item: `person`, `organization` or `brand`; null when unknown. `entity_kind` says more.", + "type": [ + "string", + "null" + ] + }, + "handles": { + "items": { + "additionalProperties": {}, + "description": "One account or identifier of an entry, in the order the entry page shows them. A Wikidata item linked to the entry comes last, as platform `wikidata`.", + "properties": { + "category": { + "description": "How the entry page groups it.", + "enum": [ + "social", + "messaging", + "website", + "identifier" + ], + "type": "string" + }, + "checked": { + "additionalProperties": {}, + "description": "What Verified Handles’ own handle checker found when it last looked at this account, from the platform’s official API: only on YouTube (channel and handle), Deezer and GitHub, and only for a look at most 7 days old. Absent otherwise. The entry page shows it only for `dead` (“Not found when checked …”) and `renamed`.", + "properties": { + "at": { + "description": "When it looked (ISO 8601, UTC).", + "type": "string" + }, + "now": { + "description": "For `renamed`, the name it answers to now, when the platform gave one. A YouTube handle’s is lowercase.", + "type": "string" + }, + "verdict": { + "description": "`live`: the profile was there. `dead`: the platform did not find it. `renamed`: it answers under another name. `unknown`: the platform gave no answer a rule could read.", + "enum": [ + "live", + "dead", + "renamed", + "unknown" + ], + "type": "string" + } + }, + "required": [ + "verdict", + "at" + ], + "type": "object" + }, + "display": { + "description": "The label the entry page shows instead of the value, if an editor set one. Null for email.", + "type": [ + "string", + "null" + ] + }, + "name": { + "description": "The platform’s display name.", + "type": "string" + }, + "platform": { + "description": "The platform’s id (`twitter`, `instagram`, `wikidata`, …).", + "type": "string" + }, + "shown_first": { + "description": "The entry page shows it before anyone opens anything: true for the accounts above a long list’s “Show N more accounts”, false for the ones folded under it, for the external identifiers (listed under their own closed heading, unless the entry has nothing else), and for an account the page does not draw.", + "type": "boolean" + }, + "url": { + "description": "The profile’s address, built from the platform’s URL pattern. Null for email.", + "type": [ + "string", + "null" + ] + }, + "value": { + "description": "The handle as stored (a username, an id, a URL). Null for an email address, which is never published as data.", + "type": [ + "string", + "null" + ] + }, + "verified": { + "description": "Verified Handles has checked that this account belongs to the entry.", + "type": "boolean" + } + }, + "required": [ + "platform", + "name", + "category", + "value", + "display", + "url", + "verified", + "shown_first" + ], + "type": "object" + }, + "type": "array" + }, + "image": { + "description": "The lead image (the same as `images[0].url`), or null.", + "type": [ + "string", + "null" + ] + }, + "image_rights": { + "anyOf": [ + { + "additionalProperties": {}, + "description": "Who owns an image and how it may be reused. An entry’s text is CC0 (bar a description taken from Wikipedia); its images are licensed separately, by their owners.", + "properties": { + "credit": { + "description": "The credit line to show when reusing the image.", + "type": [ + "string", + "null" + ] + }, + "details_url": { + "description": "The entry’s \"About this image\" page.", + "type": "string" + }, + "freely_licensed": { + "description": "May be reused under a free licence. Null when no licence is recorded.", + "type": [ + "boolean", + "null" + ] + }, + "license": { + "anyOf": [ + { + "enum": [ + "cc0-1.0", + "public-domain", + "cc-by-4.0", + "cc-by-sa-4.0", + "supplied", + "permission", + "none" + ], + "type": "string" + }, + { + "type": "null" + } + ], + "description": "An upload’s licence, by id. Null for a Commons image (see `license_name`) or when none was recorded." + }, + "license_name": { + "description": "The licence’s name, e.g. \"CC BY-SA 4.0\". Null until it is known.", + "type": [ + "string", + "null" + ] + }, + "license_url": { + "description": "The licence’s text.", + "type": [ + "string", + "null" + ] + }, + "source": { + "description": "Where the image came from.", + "enum": [ + "wikimedia_commons", + "upload" + ], + "type": "string" + }, + "source_page": { + "description": "The image’s Wikimedia Commons file page, which states its licence and author.", + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "source", + "license", + "license_name", + "license_url", + "freely_licensed", + "credit", + "source_page", + "details_url" + ], + "type": "object" + }, + { + "type": "null" + } + ], + "description": "The lead image’s rights, or null when there is no image." + }, + "images": { + "description": "Every image the entry shows, the lead first. Empty when it shows none.", + "items": { + "additionalProperties": {}, + "description": "One image an entry shows.", + "properties": { + "image_rights": { + "additionalProperties": {}, + "description": "Who owns an image and how it may be reused. An entry’s text is CC0 (bar a description taken from Wikipedia); its images are licensed separately, by their owners.", + "properties": { + "credit": { + "description": "The credit line to show when reusing the image.", + "type": [ + "string", + "null" + ] + }, + "details_url": { + "description": "The entry’s \"About this image\" page.", + "type": "string" + }, + "freely_licensed": { + "description": "May be reused under a free licence. Null when no licence is recorded.", + "type": [ + "boolean", + "null" + ] + }, + "license": { + "anyOf": [ + { + "enum": [ + "cc0-1.0", + "public-domain", + "cc-by-4.0", + "cc-by-sa-4.0", + "supplied", + "permission", + "none" + ], + "type": "string" + }, + { + "type": "null" + } + ], + "description": "An upload’s licence, by id. Null for a Commons image (see `license_name`) or when none was recorded." + }, + "license_name": { + "description": "The licence’s name, e.g. \"CC BY-SA 4.0\". Null until it is known.", + "type": [ + "string", + "null" + ] + }, + "license_url": { + "description": "The licence’s text.", + "type": [ + "string", + "null" + ] + }, + "source": { + "description": "Where the image came from.", + "enum": [ + "wikimedia_commons", + "upload" + ], + "type": "string" + }, + "source_page": { + "description": "The image’s Wikimedia Commons file page, which states its licence and author.", + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "source", + "license", + "license_name", + "license_url", + "freely_licensed", + "credit", + "source_page", + "details_url" + ], + "type": "object" + }, + "link": { + "description": "Where the image links on the entry page instead of opening the full-screen viewer, or null.", + "type": [ + "string", + "null" + ] + }, + "main": { + "description": "True for the lead image, false for the gallery images after it.", + "type": "boolean" + }, + "url": { + "description": "The image, as a path on this site (`/img/w/480q75/<id>`).", + "type": "string" + } + }, + "required": [ + "url", + "main", + "image_rights", + "link" + ], + "type": "object" + }, + "type": "array" + }, + "merged_into": { + "description": "Present when the key asked for named an entry that was merged into this one: this entry’s VHID.", + "pattern": "^\\d{11}$", + "type": "string" + }, + "rev": { + "description": "The version of the entry this body was made from: a later change’s is a larger number. A stamp (`GET /api/v1/stamps`) that differs means the entry has changed. To read an entry past every cache (after your own change, say), ask `?v=<rev>` with the rev your change returned.", + "pattern": "^\\d+$", + "type": "string" + }, + "short": { + "description": "The entry’s short name (`/<short>`), if it has one.", + "type": [ + "string", + "null" + ] + }, + "subtitle": { + "type": [ + "string", + "null" + ] + }, + "thumb": { + "description": "The lead image at the width a list row draws it (100 CSS pixels), as a path on the site: the width the image is really served at (200 for a Commons picture), never one that redirects. Null when there is no image.", + "type": [ + "string", + "null" + ] + }, + "title": { + "type": "string" + }, + "url": { + "description": "The entry’s canonical page.", + "type": "string" + }, + "verified": { + "description": "Verified Handles has verified the entry.", + "type": "boolean" + }, + "vhid": { + "description": "The entry’s VHID: 11 digits, permanent.", + "pattern": "^\\d{11}$", + "type": "string" + } + }, + "required": [ + "vhid", + "short", + "title", + "subtitle", + "entity_type", + "entity_kind", + "verified", + "claimed", + "rev", + "description", + "description_source", + "description_license", + "url", + "image", + "thumb", + "image_rights", + "images", + "handles" + ], + "type": "object" + }, + { + "type": "null" + } +]
- Changed
list_review_queue1 field changed- changed
Output schema / properties / submissions / items / anyOfPrevious value: -[ - { - "additionalProperties": {}, - "description": "One proposal, report or application in the review queue.", - "properties": { - "base_revision_id": { - "anyOf": [ - { - "pattern": "^\\d+$", - "type": "string" - }, - { - "type": "null" - } - ], - "description": "The revision a change was made against." - }, - "created_at": { - "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$", - "type": "string" - }, - "decided_at": { - "anyOf": [ - { - "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$", - "type": "string" - }, - { - "type": "null" - } - ] - }, - "duplicate": { - "anyOf": [ - { - "additionalProperties": {}, - "description": "The entry already on its Wikidata item, a deleted one too; approving it is refused while one is.", - "properties": { - "deleted": { - "type": "boolean" - }, - "short": { - "type": [ - "string", - "null" - ] - }, - "title": { - "type": "string" - }, - "vhid": { - "type": "string" - } - }, - "required": [ - "vhid", - "short", - "title", - "deleted" - ], - "type": "object" - }, - { - "type": "null" - } - ], - "description": "A `new_entity` or `application` only: the entry already on its item, or null." - }, - "entity_blocked": { - "type": [ - "boolean", - "null" - ] - }, - "entity_claimed_by": { - "type": [ - "string", - "null" - ] - }, - "entity_edit_policy": { - "anyOf": [ - { - "enum": [ - "trusted", - "admin" - ], - "type": "string" - }, - { - "type": "null" - } - ] - }, - "entity_history_hidden": { - "type": [ - "boolean", - "null" - ] - }, - "entity_id": { - "anyOf": [ - { - "pattern": "^\\d+$", - "type": "string" - }, - { - "type": "null" - } - ], - "description": "The entry’s internal id; null for a new entry." - }, - "entity_propose_policy": { - "anyOf": [ - { - "enum": [ - "registered", - "trusted", - "admin", - "closed" - ], - "type": "string" - }, - { - "type": "null" - } - ] - }, - "entity_short": { - "type": [ - "string", - "null" - ] - }, - "entity_title": { - "type": [ - "string", - "null" - ] - }, - "entity_vhid": { - "type": [ - "string", - "null" - ] - }, - "evidence": { - "anyOf": [ - { - "additionalProperties": {}, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - { - "type": "null" - } - ], - "description": "The case it carries, in its kind’s shape: an application’s eligibility case, a claim’s proof; null for the rest." - }, - "id": { - "pattern": "^\\d+$", - "type": "string" - }, - "kind": { - "description": "`correction` (a change, a revert too), `new_entity`, `claim`, `report` or `application`.", - "enum": [ - "new_entity", - "correction", - "claim", - "report", - "application" - ], - "type": "string" - }, - "payload": { - "additionalProperties": {}, - "description": "What it asks for, in its kind’s shape: for `correction`, `new_entity` and `application`, an `EditPayload` (the fields to set, and for a revert or an approval the server’s own); for `report`, `{reason, note?, media_id?, link?}`; for `claim`, `{method}`.", - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "qid": { - "type": [ - "string", - "null" - ] - }, - "review_notes": { - "type": [ - "string", - "null" - ] - }, - "reviewer": { - "type": [ - "string", - "null" - ] - }, - "status": { - "enum": [ - "pending", - "needs_info", - "approved", - "rejected", - "merged", - "spam", - "superseded", - "retracted", - "resolved" - ], - "type": "string" - }, - "submitter": { - "description": "The account that sent it.", - "type": "string" - }, - "submitter_ip": { - "description": "The address it was sent from; erased after a year.", - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "id", - "kind", - "entity_id", - "qid", - "payload", - "base_revision_id", - "submitter", - "submitter_ip", - "evidence", - "status", - "reviewer", - "review_notes", - "decided_at", - "created_at", - "entity_vhid", - "entity_short", - "entity_title", - "entity_edit_policy", - "entity_claimed_by", - "entity_propose_policy", - "entity_blocked", - "entity_history_hidden" - ], - "type": "object" - }, - { - "additionalProperties": {}, - "properties": { - "decided_at": { - "anyOf": [ - { - "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$", - "type": "string" - }, - { - "type": "null" - } - ] - }, - "kind": { - "enum": [ - "new_entity", - "correction", - "claim", - "report", - "application" - ], - "type": "string" - }, - "redacted": { - "const": true, - "description": "An approved proposal on an entry whose history is hidden, to a reviewer who may not see it.", - "type": "boolean" - }, - "status": { - "enum": [ - "pending", - "needs_info", - "approved", - "rejected", - "merged", - "spam", - "superseded", - "retracted", - "resolved" - ], - "type": "string" - } - }, - "required": [ - "kind", - "status", - "decided_at", - "redacted" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": {}, + "description": "One proposal, report or application in the review queue.", + "properties": { + "base_revision_id": { + "anyOf": [ + { + "pattern": "^\\d+$", + "type": "string" + }, + { + "type": "null" + } + ], + "description": "The revision a change was made against." + }, + "created_at": { + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$", + "type": "string" + }, + "decided_at": { + "anyOf": [ + { + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$", + "type": "string" + }, + { + "type": "null" + } + ] + }, + "duplicate": { + "anyOf": [ + { + "additionalProperties": {}, + "description": "The entry already on its Wikidata item, a deleted one too; approving it is refused while one is.", + "properties": { + "deleted": { + "type": "boolean" + }, + "short": { + "type": [ + "string", + "null" + ] + }, + "title": { + "type": "string" + }, + "vhid": { + "type": "string" + } + }, + "required": [ + "vhid", + "short", + "title", + "deleted" + ], + "type": "object" + }, + { + "type": "null" + } + ], + "description": "A `new_entity` or `application` only: the entry already on its item, or null." + }, + "entity_blocked": { + "type": [ + "boolean", + "null" + ] + }, + "entity_claimed_by": { + "type": [ + "string", + "null" + ] + }, + "entity_edit_policy": { + "anyOf": [ + { + "enum": [ + "trusted", + "admin" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "entity_history_hidden": { + "type": [ + "boolean", + "null" + ] + }, + "entity_id": { + "anyOf": [ + { + "pattern": "^\\d+$", + "type": "string" + }, + { + "type": "null" + } + ], + "description": "The entry’s internal id; null for a new entry." + }, + "entity_propose_policy": { + "anyOf": [ + { + "enum": [ + "registered", + "trusted", + "admin", + "closed" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "entity_short": { + "type": [ + "string", + "null" + ] + }, + "entity_title": { + "type": [ + "string", + "null" + ] + }, + "entity_vhid": { + "type": [ + "string", + "null" + ] + }, + "evidence": { + "anyOf": [ + { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + { + "type": "null" + } + ], + "description": "The case it carries, in its kind’s shape: an application’s eligibility case, a claim’s proof; null for the rest." + }, + "id": { + "pattern": "^\\d+$", + "type": "string" + }, + "kind": { + "description": "`correction` (a change, a revert too), `new_entity`, `claim`, `report` or `application`.", + "enum": [ + "new_entity", + "correction", + "claim", + "report", + "application" + ], + "type": "string" + }, + "payload": { + "additionalProperties": {}, + "description": "What it asks for, in its kind’s shape: for `correction`, `new_entity` and `application`, an `EditPayload` (the fields to set, and for a revert or an approval the server’s own); for `report`, `{reason, note?, media_id?, link?}`; for `claim`, `{method}`.", + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "qid": { + "type": [ + "string", + "null" + ] + }, + "review_notes": { + "type": [ + "string", + "null" + ] + }, + "reviewer": { + "type": [ + "string", + "null" + ] + }, + "status": { + "enum": [ + "pending", + "needs_info", + "approved", + "rejected", + "merged", + "spam", + "superseded", + "retracted", + "resolved" + ], + "type": "string" + }, + "submitter": { + "description": "The account that sent it.", + "type": "string" + }, + "submitter_ip": { + "description": "The address it was sent from; erased after a year.", + "type": [ + "string", + "null" + ] + }, + "target_kind": { + "anyOf": [ + { + "enum": [ + "entry", + "comment", + "account" + ], + "type": "string" + }, + { + "type": "null" + } + ], + "description": "A report: what it is about (null: its entry, or not a report)." + }, + "target_ref": { + "description": "A comment or account report: the comment (`c<id>`) or history row (`r<id>` its editor, `p<id>` its proposer) it was made from.", + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "id", + "kind", + "entity_id", + "qid", + "payload", + "base_revision_id", + "submitter", + "submitter_ip", + "evidence", + "status", + "reviewer", + "review_notes", + "decided_at", + "created_at", + "target_kind", + "target_ref", + "entity_vhid", + "entity_short", + "entity_title", + "entity_edit_policy", + "entity_claimed_by", + "entity_propose_policy", + "entity_blocked", + "entity_history_hidden" + ], + "type": "object" + }, + { + "additionalProperties": {}, + "properties": { + "decided_at": { + "anyOf": [ + { + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$", + "type": "string" + }, + { + "type": "null" + } + ] + }, + "kind": { + "enum": [ + "new_entity", + "correction", + "claim", + "report", + "application" + ], + "type": "string" + }, + "redacted": { + "const": true, + "description": "An approved proposal on an entry whose history is hidden, to a reviewer who may not see it.", + "type": "boolean" + }, + "status": { + "enum": [ + "pending", + "needs_info", + "approved", + "rejected", + "merged", + "spam", + "superseded", + "retracted", + "resolved" + ], + "type": "string" + } + }, + "required": [ + "kind", + "status", + "decided_at", + "redacted" + ], + "type": "object" + } +]
- Changed
search_entries4 fields changed- added
Output schema / properties / results / items / properties / claimedAdded value: +{ + "description": "The person or organisation the entry is about has claimed it. Never who.", + "type": "boolean" +} - added
Output schema / properties / results / items / properties / entity_kindAdded value: +{ + "anyOf": [ + { + "enum": [ + "person", + "musical_group", + "sports_organization", + "broadcaster", + "publisher", + "educational_institution", + "research_organization", + "religious_organization", + "museum", + "financial_institution", + "chain", + "nonprofit", + "company", + "organization", + "show", + "website", + "software", + "brand" + ], + "type": "string" + }, + { + "type": "null" + } + ], + "description": "The finer kind of thing it is, from its Wikidata item’s classes; null when unknown (an organisation or a brand not yet read since kinds were added reads null until the sync next reads its item). Each kind belongs to one `entity_type`, and `person`, `organization` and `brand` are also the kinds of an entry of that type with no finer one. The kinds, with their type: `person` (person: person), `musical_group` (organization: musical group), `sports_organization` (organization: sports organisation), `broadcaster` (organization: broadcaster), `publisher` (organization: publisher), `educational_institution` (organization: educational institution), `research_organization` (organization: research organisation), `religious_organization` (organization: religious organisation), `museum` (organization: museum), `financial_institution` (organization: financial institution), `chain` (organization: retail or hospitality chain), `nonprofit` (organization: charity or non-profit), `company` (organization: company), `organization` (organization: organisation), `show` (brand: show), `website` (brand: website or app), `software` (brand: software), `brand` (brand: brand). New kinds may be added; treat an unknown value as its `entity_type`." +} - added
Output schema / properties / results / items / properties / thumbAdded value: +{ + "description": "The lead image at the width a list row draws it (100 CSS pixels), as a path on the site: the width the image is really served at (200 for a Commons picture), never one that redirects. Null when there is no image.", + "type": [ + "string", + "null" + ] +} - changed
Output schema / properties / results / items / requiredPrevious value: -[ - "vhid", - "short", - "title", - "subtitle", - "verified", - "snippet", - "highlighted", - "url" -]New value: +[ + "vhid", + "short", + "title", + "subtitle", + "verified", + "claimed", + "entity_kind", + "thumb", + "snippet", + "highlighted", + "url" +]
3 tool updates
- Changed
bulk_change_entries2 fields changed- changed
Input schema / properties / setting / enumPrevious value: -[ - "blocked", - "edit_policy", - "propose_policy", - "protected", - "history_hidden", - "trending_hidden", - "verified", - "follow_links", - "spotlight" -]New value: +[ + "blocked", + "edit_policy", + "propose_policy", + "protected", + "history_hidden", + "trending_hidden", + "verified", + "follow_links", + "spotlight", + "handles_shown" +] - changed
Input schema / properties / value / anyOfPrevious value: -[ - { - "type": "boolean" - }, - { - "maximum": 1000000, - "minimum": 0, - "type": "integer" - }, - { - "maxLength": 20, - "type": "string" - } -]New value: +[ + { + "type": "boolean" + }, + { + "maximum": 1000000, + "minimum": 0, + "type": "integer" + }, + { + "maxLength": 20, + "type": "string" + }, + { + "type": "null" + } +]
- Changed
get_entry_admin3 fields changed- changed
Output schema / properties / entity / properties / gallery_logo / descriptionPrevious value: -"The image the Wikidata sync keeps in the gallery (the item’s logo), or null."New value: +"The image the Wikidata sync keeps in the gallery (the item’s logo; an organisation’s, which leads with its logo, its image), or null." - added
Output schema / properties / entity / properties / handles_shownAdded value: +{ + "anyOf": [ + { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + { + "type": "null" + } + ], + "description": "How many accounts the page shows before “Show more”: null the site-wide rule (Settings), 0 every account." +} - changed
Output schema / properties / entity / requiredPrevious value: -[ - "vhid", - "short", - "qid", - "title", - "subtitle", - "description", - "entity_type", - "kind_label", - "entity_kind", - "image_id", - "image", - "image_source", - "gallery_count", - "gallery", - "gallery_logo", - "image_links", - "field_sources", - "has_description", - "description_credit", - "description_source", - "synced_at", - "retry_at", - "verified", - "spotlight", - "blocked", - "protected", - "history_hidden", - "trending_hidden", - "trending_hidden_source", - "follow_links", - "edit_policy", - "propose_policy", - "claimed_by", - "custom_handle_order", - "updated_at" -]New value: +[ + "vhid", + "short", + "qid", + "title", + "subtitle", + "description", + "entity_type", + "kind_label", + "entity_kind", + "image_id", + "image", + "image_source", + "gallery_count", + "gallery", + "gallery_logo", + "image_links", + "field_sources", + "has_description", + "description_credit", + "description_source", + "synced_at", + "retry_at", + "verified", + "spotlight", + "blocked", + "protected", + "history_hidden", + "trending_hidden", + "trending_hidden_source", + "follow_links", + "handles_shown", + "edit_policy", + "propose_policy", + "claimed_by", + "custom_handle_order", + "updated_at" +]
- Changed
set_entry_setting2 fields changed- changed
Input schema / properties / setting / enumPrevious value: -[ - "edit_policy", - "propose_policy", - "protected", - "history_hidden", - "trending_hidden", - "verified", - "follow_links", - "spotlight" -]New value: +[ + "edit_policy", + "propose_policy", + "protected", + "history_hidden", + "trending_hidden", + "verified", + "follow_links", + "spotlight", + "handles_shown" +] - changed
Input schema / properties / value / anyOfPrevious value: -[ - { - "type": "boolean" - }, - { - "maximum": 1000000, - "minimum": 0, - "type": "integer" - }, - { - "maxLength": 20, - "type": "string" - } -]New value: +[ + { + "type": "boolean" + }, + { + "maximum": 1000000, + "minimum": 0, + "type": "integer" + }, + { + "maxLength": 20, + "type": "string" + }, + { + "type": "null" + } +]
1 tool update
- Changed
upload_image1 field changed- changed
Input schema / properties / content / descriptionPrevious value: -"The file’s bytes in base64 (standard or URL-safe alphabet, no line breaks, no data: prefix). Any image sharp reads (PNG, JPEG, WebP, GIF, AVIF, TIFF, SVG); it is re-encoded to WebP."New value: +"The file’s bytes in base64 (standard or URL-safe alphabet, no line breaks, no data: prefix). Any image sharp reads (PNG, JPEG, WebP, GIF, AVIF, TIFF, SVG); it is stored as a lossless WebP at its full resolution, its colour profile kept, every other metadata dropped."
1 tool update
- Changed
propose_wikidata_correction4 fields changed- changed
Input schema / properties / outranked / descriptionPrevious value: -"A preferred rank that would make other values not current: \"end_date\" end-dates them, \"leave_normal\" sets no preferred rank, \"point_in_time\" leaves them normal with no end time (each must have a point in time and no start or end time). Point-in-time values alone (a follower count with P585) need no choice."New value: +"A preferred rank that would make other values not current: \"end_date\" end-dates them, \"leave_normal\" sets no preferred rank, \"keep_normal\" makes it preferred and leaves them normal with no end time, still true but less precise (a city of birth, P19, beside its country), \"point_in_time\" leaves them normal with no end time (each must have a point in time, P585, or as a software version, P348, a publication date, P577, and no start or end time). Point-in-time values alone (a follower count with P585, a software version’s releases with P577) need no choice." - changed
Input schema / properties / outranked / enumPrevious value: -[ - "end_date", - "leave_normal", - "point_in_time" -]New value: +[ + "end_date", + "leave_normal", + "point_in_time", + "keep_normal" +] - changed
Input schema / properties / qualifiers / descriptionPrevious value: -"add_claim, supersede: qualifiers on the new statement, each a property and a value."New value: +"add_claim, supersede: qualifiers on the new statement, each a property and a value; {\"unknown\": true} for a time of unknown value (an end time no source dates)." - added
Input schema / properties / reference / properties / identifierAdded value: +{ + "description": "An identifier in the work it is stated in: an external-id property and its value, e.g. {\"property\": \"P244\", \"value\": \"no97057848\"} beside stated_in Q13219454 (Library of Congress Authorities), for a record with no address the site can load. Written after stated_in.", + "properties": { + "property": { + "pattern": "^P[1-9][0-9]*$", + "type": "string" + }, + "value": { + "maxLength": 400, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "property", + "value" + ], + "type": "object" +}
2 tool updates
- Changed
get_entries1 field changed- changed
Output schema / properties / results / items / anyOfPrevious value: -[ - { - "additionalProperties": {}, - "properties": { - "entity": { - "additionalProperties": {}, - "description": "Exactly what `GET /api/v1/entities/{key}` answers for this key.", - "properties": { - "description": { - "description": "The description as sanitised HTML, links to other entries named as they are today.", - "type": [ - "string", - "null" - ] - }, - "description_license": { - "anyOf": [ - { - "const": "CC-BY-SA-4.0", - "type": "string" - }, - { - "type": "null" - } - ], - "description": "The description’s licence, as an SPDX id: `CC-BY-SA-4.0` when it was taken from Wikipedia (`description_source` is set), which means crediting the article and sharing alike. Null otherwise: the description is CC0 like the rest of the text." - }, - "description_source": { - "anyOf": [ - { - "additionalProperties": {}, - "description": "The English Wikipedia page an entry’s description was taken from: an article, or a draft (`draft: true`).", - "properties": { - "adapted": { - "description": "Present and true when the text has been edited on the site since.", - "type": "boolean" - }, - "draft": { - "const": true, - "description": "Present and true when the page is an English Wikipedia draft (the Draft namespace), not yet an article.", - "type": "boolean" - }, - "kind": { - "description": "The source’s kind (`wikipedia`).", - "type": "string" - }, - "revision": { - "description": "The page’s revision the text was taken from: its permalink is `https://en.wikipedia.org/w/index.php?title=<title>&oldid=<revision>`. Absent on a credit from before revisions were kept.", - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "title": { - "description": "The page’s title, underscored (`Draft:` first for a draft).", - "type": "string" - }, - "url": { - "description": "The page.", - "type": "string" - } - }, - "required": [ - "kind", - "title", - "url" - ], - "type": "object" - }, - { - "type": "null" - } - ] - }, - "entity_kind": { - "anyOf": [ - { - "enum": [ - "person", - "musical_group", - "sports_organization", - "broadcaster", - "publisher", - "educational_institution", - "research_organization", - "religious_organization", - "museum", - "financial_institution", - "chain", - "nonprofit", - "company", - "organization", - "show", - "website", - "brand" - ], - "type": "string" - }, - { - "type": "null" - } - ], - "description": "The finer kind of thing it is, from its Wikidata item’s classes; null when unknown (an organisation or a brand not yet read since kinds were added reads null until the sync next reads its item). Each kind belongs to one `entity_type`, and `person`, `organization` and `brand` are also the kinds of an entry of that type with no finer one. The kinds, with their type: `person` (person: person), `musical_group` (organization: musical group), `sports_organization` (organization: sports organisation), `broadcaster` (organization: broadcaster), `publisher` (organization: publisher), `educational_institution` (organization: educational institution), `research_organization` (organization: research organisation), `religious_organization` (organization: religious organisation), `museum` (organization: museum), `financial_institution` (organization: financial institution), `chain` (organization: retail or hospitality chain), `nonprofit` (organization: charity or non-profit), `company` (organization: company), `organization` (organization: organisation), `show` (brand: show), `website` (brand: website or app), `brand` (brand: brand). New kinds may be added; treat an unknown value as its `entity_type`." - }, - "entity_type": { - "description": "What it is, from its Wikidata item: `person`, `organization` or `brand`; null when unknown. `entity_kind` says more.", - "type": [ - "string", - "null" - ] - }, - "handles": { - "items": { - "additionalProperties": {}, - "description": "One account or identifier of an entry, in the order the entry page shows them. A Wikidata item linked to the entry comes last, as platform `wikidata`.", - "properties": { - "category": { - "description": "How the entry page groups it.", - "enum": [ - "social", - "messaging", - "website", - "identifier" - ], - "type": "string" - }, - "checked": { - "additionalProperties": {}, - "description": "What Verified Handles’ own handle checker found when it last looked at this account, from the platform’s official API: only on YouTube (channel and handle), Deezer and GitHub, and only for a look at most 7 days old. Absent otherwise. The entry page shows it only for `dead` (“Not found when checked …”) and `renamed`.", - "properties": { - "at": { - "description": "When it looked (ISO 8601, UTC).", - "type": "string" - }, - "now": { - "description": "For `renamed`, the name it answers to now, when the platform gave one. A YouTube handle’s is lowercase.", - "type": "string" - }, - "verdict": { - "description": "`live`: the profile was there. `dead`: the platform did not find it. `renamed`: it answers under another name. `unknown`: the platform gave no answer a rule could read.", - "enum": [ - "live", - "dead", - "renamed", - "unknown" - ], - "type": "string" - } - }, - "required": [ - "verdict", - "at" - ], - "type": "object" - }, - "display": { - "description": "The label the entry page shows instead of the value, if an editor set one. Null for email.", - "type": [ - "string", - "null" - ] - }, - "name": { - "description": "The platform’s display name.", - "type": "string" - }, - "platform": { - "description": "The platform’s id (`twitter`, `instagram`, `wikidata`, …).", - "type": "string" - }, - "url": { - "description": "The profile’s address, built from the platform’s URL pattern. Null for email.", - "type": [ - "string", - "null" - ] - }, - "value": { - "description": "The handle as stored (a username, an id, a URL). Null for an email address, which is never published as data.", - "type": [ - "string", - "null" - ] - }, - "verified": { - "description": "Verified Handles has checked that this account belongs to the entry.", - "type": "boolean" - } - }, - "required": [ - "platform", - "name", - "category", - "value", - "display", - "url", - "verified" - ], - "type": "object" - }, - "type": "array" - }, - "image": { - "description": "The lead image (the same as `images[0].url`), or null.", - "type": [ - "string", - "null" - ] - }, - "image_rights": { - "anyOf": [ - { - "additionalProperties": {}, - "description": "Who owns an image and how it may be reused. An entry’s text is CC0 (bar a description taken from Wikipedia); its images are licensed separately, by their owners.", - "properties": { - "credit": { - "description": "The credit line to show when reusing the image.", - "type": [ - "string", - "null" - ] - }, - "details_url": { - "description": "The entry’s \"About this image\" page.", - "type": "string" - }, - "freely_licensed": { - "description": "May be reused under a free licence. Null when no licence is recorded.", - "type": [ - "boolean", - "null" - ] - }, - "license": { - "anyOf": [ - { - "enum": [ - "cc0-1.0", - "public-domain", - "cc-by-4.0", - "cc-by-sa-4.0", - "supplied", - "permission", - "none" - ], - "type": "string" - }, - { - "type": "null" - } - ], - "description": "An upload’s licence, by id. Null for a Commons image (see `license_name`) or when none was recorded." - }, - "license_name": { - "description": "The licence’s name, e.g. \"CC BY-SA 4.0\". Null until it is known.", - "type": [ - "string", - "null" - ] - }, - "license_url": { - "description": "The licence’s text.", - "type": [ - "string", - "null" - ] - }, - "source": { - "description": "Where the image came from.", - "enum": [ - "wikimedia_commons", - "upload" - ], - "type": "string" - }, - "source_page": { - "description": "The image’s Wikimedia Commons file page, which states its licence and author.", - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "source", - "license", - "license_name", - "license_url", - "freely_licensed", - "credit", - "source_page", - "details_url" - ], - "type": "object" - }, - { - "type": "null" - } - ], - "description": "The lead image’s rights, or null when there is no image." - }, - "images": { - "description": "Every image the entry shows, the lead first. Empty when it shows none.", - "items": { - "additionalProperties": {}, - "description": "One image an entry shows.", - "properties": { - "image_rights": { - "additionalProperties": {}, - "description": "Who owns an image and how it may be reused. An entry’s text is CC0 (bar a description taken from Wikipedia); its images are licensed separately, by their owners.", - "properties": { - "credit": { - "description": "The credit line to show when reusing the image.", - "type": [ - "string", - "null" - ] - }, - "details_url": { - "description": "The entry’s \"About this image\" page.", - "type": "string" - }, - "freely_licensed": { - "description": "May be reused under a free licence. Null when no licence is recorded.", - "type": [ - "boolean", - "null" - ] - }, - "license": { - "anyOf": [ - { - "enum": [ - "cc0-1.0", - "public-domain", - "cc-by-4.0", - "cc-by-sa-4.0", - "supplied", - "permission", - "none" - ], - "type": "string" - }, - { - "type": "null" - } - ], - "description": "An upload’s licence, by id. Null for a Commons image (see `license_name`) or when none was recorded." - }, - "license_name": { - "description": "The licence’s name, e.g. \"CC BY-SA 4.0\". Null until it is known.", - "type": [ - "string", - "null" - ] - }, - "license_url": { - "description": "The licence’s text.", - "type": [ - "string", - "null" - ] - }, - "source": { - "description": "Where the image came from.", - "enum": [ - "wikimedia_commons", - "upload" - ], - "type": "string" - }, - "source_page": { - "description": "The image’s Wikimedia Commons file page, which states its licence and author.", - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "source", - "license", - "license_name", - "license_url", - "freely_licensed", - "credit", - "source_page", - "details_url" - ], - "type": "object" - }, - "link": { - "description": "Where the image links on the entry page instead of opening the full-screen viewer, or null.", - "type": [ - "string", - "null" - ] - }, - "main": { - "description": "True for the lead image, false for the gallery images after it.", - "type": "boolean" - }, - "url": { - "description": "The image, as a path on this site (`/img/w/480q75/<id>`).", - "type": "string" - } - }, - "required": [ - "url", - "main", - "image_rights", - "link" - ], - "type": "object" - }, - "type": "array" - }, - "short": { - "description": "The entry’s short name (`/<short>`), if it has one.", - "type": [ - "string", - "null" - ] - }, - "subtitle": { - "type": [ - "string", - "null" - ] - }, - "title": { - "type": "string" - }, - "url": { - "description": "The entry’s canonical page.", - "type": "string" - }, - "verified": { - "description": "Verified Handles has verified the entry.", - "type": "boolean" - }, - "vhid": { - "description": "The entry’s VHID: 11 digits, permanent.", - "pattern": "^\\d{11}$", - "type": "string" - } - }, - "required": [ - "vhid", - "short", - "title", - "subtitle", - "entity_type", - "entity_kind", - "verified", - "description", - "description_source", - "description_license", - "url", - "image", - "image_rights", - "images", - "handles" - ], - "type": "object" - }, - "key": { - "description": "The key as asked for, trimmed.", - "type": "string" - }, - "status": { - "const": "ok", - "type": "string" - } - }, - "required": [ - "key", - "status", - "entity" - ], - "type": "object" - }, - { - "additionalProperties": {}, - "properties": { - "key": { - "description": "The key as asked for, trimmed.", - "type": "string" - }, - "status": { - "const": "not_found", - "description": "No public entry answers to the key: where the single read answers 404.", - "type": "string" - } - }, - "required": [ - "key", - "status" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": {}, + "properties": { + "entity": { + "additionalProperties": {}, + "description": "Exactly what `GET /api/v1/entities/{key}` answers for this key.", + "properties": { + "description": { + "description": "The description as sanitised HTML, links to other entries named as they are today.", + "type": [ + "string", + "null" + ] + }, + "description_license": { + "anyOf": [ + { + "const": "CC-BY-SA-4.0", + "type": "string" + }, + { + "type": "null" + } + ], + "description": "The description’s licence, as an SPDX id: `CC-BY-SA-4.0` when it was taken from Wikipedia (`description_source` is set), which means crediting the article and sharing alike. Null otherwise: the description is CC0 like the rest of the text." + }, + "description_source": { + "anyOf": [ + { + "additionalProperties": {}, + "description": "The English Wikipedia page an entry’s description was taken from: an article, or a draft (`draft: true`).", + "properties": { + "adapted": { + "description": "Present and true when the text has been edited on the site since.", + "type": "boolean" + }, + "draft": { + "const": true, + "description": "Present and true when the page is an English Wikipedia draft (the Draft namespace), not yet an article.", + "type": "boolean" + }, + "kind": { + "description": "The source’s kind (`wikipedia`).", + "type": "string" + }, + "revision": { + "description": "The page’s revision the text was taken from: its permalink is `https://en.wikipedia.org/w/index.php?title=<title>&oldid=<revision>`. Absent on a credit from before revisions were kept.", + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" + }, + "title": { + "description": "The page’s title, underscored (`Draft:` first for a draft).", + "type": "string" + }, + "url": { + "description": "The page.", + "type": "string" + } + }, + "required": [ + "kind", + "title", + "url" + ], + "type": "object" + }, + { + "type": "null" + } + ] + }, + "entity_kind": { + "anyOf": [ + { + "enum": [ + "person", + "musical_group", + "sports_organization", + "broadcaster", + "publisher", + "educational_institution", + "research_organization", + "religious_organization", + "museum", + "financial_institution", + "chain", + "nonprofit", + "company", + "organization", + "show", + "website", + "software", + "brand" + ], + "type": "string" + }, + { + "type": "null" + } + ], + "description": "The finer kind of thing it is, from its Wikidata item’s classes; null when unknown (an organisation or a brand not yet read since kinds were added reads null until the sync next reads its item). Each kind belongs to one `entity_type`, and `person`, `organization` and `brand` are also the kinds of an entry of that type with no finer one. The kinds, with their type: `person` (person: person), `musical_group` (organization: musical group), `sports_organization` (organization: sports organisation), `broadcaster` (organization: broadcaster), `publisher` (organization: publisher), `educational_institution` (organization: educational institution), `research_organization` (organization: research organisation), `religious_organization` (organization: religious organisation), `museum` (organization: museum), `financial_institution` (organization: financial institution), `chain` (organization: retail or hospitality chain), `nonprofit` (organization: charity or non-profit), `company` (organization: company), `organization` (organization: organisation), `show` (brand: show), `website` (brand: website or app), `software` (brand: software), `brand` (brand: brand). New kinds may be added; treat an unknown value as its `entity_type`." + }, + "entity_type": { + "description": "What it is, from its Wikidata item: `person`, `organization` or `brand`; null when unknown. `entity_kind` says more.", + "type": [ + "string", + "null" + ] + }, + "handles": { + "items": { + "additionalProperties": {}, + "description": "One account or identifier of an entry, in the order the entry page shows them. A Wikidata item linked to the entry comes last, as platform `wikidata`.", + "properties": { + "category": { + "description": "How the entry page groups it.", + "enum": [ + "social", + "messaging", + "website", + "identifier" + ], + "type": "string" + }, + "checked": { + "additionalProperties": {}, + "description": "What Verified Handles’ own handle checker found when it last looked at this account, from the platform’s official API: only on YouTube (channel and handle), Deezer and GitHub, and only for a look at most 7 days old. Absent otherwise. The entry page shows it only for `dead` (“Not found when checked …”) and `renamed`.", + "properties": { + "at": { + "description": "When it looked (ISO 8601, UTC).", + "type": "string" + }, + "now": { + "description": "For `renamed`, the name it answers to now, when the platform gave one. A YouTube handle’s is lowercase.", + "type": "string" + }, + "verdict": { + "description": "`live`: the profile was there. `dead`: the platform did not find it. `renamed`: it answers under another name. `unknown`: the platform gave no answer a rule could read.", + "enum": [ + "live", + "dead", + "renamed", + "unknown" + ], + "type": "string" + } + }, + "required": [ + "verdict", + "at" + ], + "type": "object" + }, + "display": { + "description": "The label the entry page shows instead of the value, if an editor set one. Null for email.", + "type": [ + "string", + "null" + ] + }, + "name": { + "description": "The platform’s display name.", + "type": "string" + }, + "platform": { + "description": "The platform’s id (`twitter`, `instagram`, `wikidata`, …).", + "type": "string" + }, + "url": { + "description": "The profile’s address, built from the platform’s URL pattern. Null for email.", + "type": [ + "string", + "null" + ] + }, + "value": { + "description": "The handle as stored (a username, an id, a URL). Null for an email address, which is never published as data.", + "type": [ + "string", + "null" + ] + }, + "verified": { + "description": "Verified Handles has checked that this account belongs to the entry.", + "type": "boolean" + } + }, + "required": [ + "platform", + "name", + "category", + "value", + "display", + "url", + "verified" + ], + "type": "object" + }, + "type": "array" + }, + "image": { + "description": "The lead image (the same as `images[0].url`), or null.", + "type": [ + "string", + "null" + ] + }, + "image_rights": { + "anyOf": [ + { + "additionalProperties": {}, + "description": "Who owns an image and how it may be reused. An entry’s text is CC0 (bar a description taken from Wikipedia); its images are licensed separately, by their owners.", + "properties": { + "credit": { + "description": "The credit line to show when reusing the image.", + "type": [ + "string", + "null" + ] + }, + "details_url": { + "description": "The entry’s \"About this image\" page.", + "type": "string" + }, + "freely_licensed": { + "description": "May be reused under a free licence. Null when no licence is recorded.", + "type": [ + "boolean", + "null" + ] + }, + "license": { + "anyOf": [ + { + "enum": [ + "cc0-1.0", + "public-domain", + "cc-by-4.0", + "cc-by-sa-4.0", + "supplied", + "permission", + "none" + ], + "type": "string" + }, + { + "type": "null" + } + ], + "description": "An upload’s licence, by id. Null for a Commons image (see `license_name`) or when none was recorded." + }, + "license_name": { + "description": "The licence’s name, e.g. \"CC BY-SA 4.0\". Null until it is known.", + "type": [ + "string", + "null" + ] + }, + "license_url": { + "description": "The licence’s text.", + "type": [ + "string", + "null" + ] + }, + "source": { + "description": "Where the image came from.", + "enum": [ + "wikimedia_commons", + "upload" + ], + "type": "string" + }, + "source_page": { + "description": "The image’s Wikimedia Commons file page, which states its licence and author.", + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "source", + "license", + "license_name", + "license_url", + "freely_licensed", + "credit", + "source_page", + "details_url" + ], + "type": "object" + }, + { + "type": "null" + } + ], + "description": "The lead image’s rights, or null when there is no image." + }, + "images": { + "description": "Every image the entry shows, the lead first. Empty when it shows none.", + "items": { + "additionalProperties": {}, + "description": "One image an entry shows.", + "properties": { + "image_rights": { + "additionalProperties": {}, + "description": "Who owns an image and how it may be reused. An entry’s text is CC0 (bar a description taken from Wikipedia); its images are licensed separately, by their owners.", + "properties": { + "credit": { + "description": "The credit line to show when reusing the image.", + "type": [ + "string", + "null" + ] + }, + "details_url": { + "description": "The entry’s \"About this image\" page.", + "type": "string" + }, + "freely_licensed": { + "description": "May be reused under a free licence. Null when no licence is recorded.", + "type": [ + "boolean", + "null" + ] + }, + "license": { + "anyOf": [ + { + "enum": [ + "cc0-1.0", + "public-domain", + "cc-by-4.0", + "cc-by-sa-4.0", + "supplied", + "permission", + "none" + ], + "type": "string" + }, + { + "type": "null" + } + ], + "description": "An upload’s licence, by id. Null for a Commons image (see `license_name`) or when none was recorded." + }, + "license_name": { + "description": "The licence’s name, e.g. \"CC BY-SA 4.0\". Null until it is known.", + "type": [ + "string", + "null" + ] + }, + "license_url": { + "description": "The licence’s text.", + "type": [ + "string", + "null" + ] + }, + "source": { + "description": "Where the image came from.", + "enum": [ + "wikimedia_commons", + "upload" + ], + "type": "string" + }, + "source_page": { + "description": "The image’s Wikimedia Commons file page, which states its licence and author.", + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "source", + "license", + "license_name", + "license_url", + "freely_licensed", + "credit", + "source_page", + "details_url" + ], + "type": "object" + }, + "link": { + "description": "Where the image links on the entry page instead of opening the full-screen viewer, or null.", + "type": [ + "string", + "null" + ] + }, + "main": { + "description": "True for the lead image, false for the gallery images after it.", + "type": "boolean" + }, + "url": { + "description": "The image, as a path on this site (`/img/w/480q75/<id>`).", + "type": "string" + } + }, + "required": [ + "url", + "main", + "image_rights", + "link" + ], + "type": "object" + }, + "type": "array" + }, + "short": { + "description": "The entry’s short name (`/<short>`), if it has one.", + "type": [ + "string", + "null" + ] + }, + "subtitle": { + "type": [ + "string", + "null" + ] + }, + "title": { + "type": "string" + }, + "url": { + "description": "The entry’s canonical page.", + "type": "string" + }, + "verified": { + "description": "Verified Handles has verified the entry.", + "type": "boolean" + }, + "vhid": { + "description": "The entry’s VHID: 11 digits, permanent.", + "pattern": "^\\d{11}$", + "type": "string" + } + }, + "required": [ + "vhid", + "short", + "title", + "subtitle", + "entity_type", + "entity_kind", + "verified", + "description", + "description_source", + "description_license", + "url", + "image", + "image_rights", + "images", + "handles" + ], + "type": "object" + }, + "key": { + "description": "The key as asked for, trimmed.", + "type": "string" + }, + "status": { + "const": "ok", + "type": "string" + } + }, + "required": [ + "key", + "status", + "entity" + ], + "type": "object" + }, + { + "additionalProperties": {}, + "properties": { + "key": { + "description": "The key as asked for, trimmed.", + "type": "string" + }, + "status": { + "const": "not_found", + "description": "No public entry answers to the key: where the single read answers 404.", + "type": "string" + } + }, + "required": [ + "key", + "status" + ], + "type": "object" + } +]
- Changed
get_entry1 field changed- changed
Output schema / properties / entry / anyOfPrevious value: -[ - { - "additionalProperties": {}, - "description": "An entry: the same data its page shows, from the same code. Email addresses are masked. The text is CC0, except a description taken from Wikipedia (`description_license`).", - "properties": { - "description": { - "description": "The description as sanitised HTML, links to other entries named as they are today.", - "type": [ - "string", - "null" - ] - }, - "description_license": { - "anyOf": [ - { - "const": "CC-BY-SA-4.0", - "type": "string" - }, - { - "type": "null" - } - ], - "description": "The description’s licence, as an SPDX id: `CC-BY-SA-4.0` when it was taken from Wikipedia (`description_source` is set), which means crediting the article and sharing alike. Null otherwise: the description is CC0 like the rest of the text." - }, - "description_source": { - "anyOf": [ - { - "additionalProperties": {}, - "description": "The English Wikipedia page an entry’s description was taken from: an article, or a draft (`draft: true`).", - "properties": { - "adapted": { - "description": "Present and true when the text has been edited on the site since.", - "type": "boolean" - }, - "draft": { - "const": true, - "description": "Present and true when the page is an English Wikipedia draft (the Draft namespace), not yet an article.", - "type": "boolean" - }, - "kind": { - "description": "The source’s kind (`wikipedia`).", - "type": "string" - }, - "revision": { - "description": "The page’s revision the text was taken from: its permalink is `https://en.wikipedia.org/w/index.php?title=<title>&oldid=<revision>`. Absent on a credit from before revisions were kept.", - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "title": { - "description": "The page’s title, underscored (`Draft:` first for a draft).", - "type": "string" - }, - "url": { - "description": "The page.", - "type": "string" - } - }, - "required": [ - "kind", - "title", - "url" - ], - "type": "object" - }, - { - "type": "null" - } - ] - }, - "entity_kind": { - "anyOf": [ - { - "enum": [ - "person", - "musical_group", - "sports_organization", - "broadcaster", - "publisher", - "educational_institution", - "research_organization", - "religious_organization", - "museum", - "financial_institution", - "chain", - "nonprofit", - "company", - "organization", - "show", - "website", - "brand" - ], - "type": "string" - }, - { - "type": "null" - } - ], - "description": "The finer kind of thing it is, from its Wikidata item’s classes; null when unknown (an organisation or a brand not yet read since kinds were added reads null until the sync next reads its item). Each kind belongs to one `entity_type`, and `person`, `organization` and `brand` are also the kinds of an entry of that type with no finer one. The kinds, with their type: `person` (person: person), `musical_group` (organization: musical group), `sports_organization` (organization: sports organisation), `broadcaster` (organization: broadcaster), `publisher` (organization: publisher), `educational_institution` (organization: educational institution), `research_organization` (organization: research organisation), `religious_organization` (organization: religious organisation), `museum` (organization: museum), `financial_institution` (organization: financial institution), `chain` (organization: retail or hospitality chain), `nonprofit` (organization: charity or non-profit), `company` (organization: company), `organization` (organization: organisation), `show` (brand: show), `website` (brand: website or app), `brand` (brand: brand). New kinds may be added; treat an unknown value as its `entity_type`." - }, - "entity_type": { - "description": "What it is, from its Wikidata item: `person`, `organization` or `brand`; null when unknown. `entity_kind` says more.", - "type": [ - "string", - "null" - ] - }, - "handles": { - "items": { - "additionalProperties": {}, - "description": "One account or identifier of an entry, in the order the entry page shows them. A Wikidata item linked to the entry comes last, as platform `wikidata`.", - "properties": { - "category": { - "description": "How the entry page groups it.", - "enum": [ - "social", - "messaging", - "website", - "identifier" - ], - "type": "string" - }, - "checked": { - "additionalProperties": {}, - "description": "What Verified Handles’ own handle checker found when it last looked at this account, from the platform’s official API: only on YouTube (channel and handle), Deezer and GitHub, and only for a look at most 7 days old. Absent otherwise. The entry page shows it only for `dead` (“Not found when checked …”) and `renamed`.", - "properties": { - "at": { - "description": "When it looked (ISO 8601, UTC).", - "type": "string" - }, - "now": { - "description": "For `renamed`, the name it answers to now, when the platform gave one. A YouTube handle’s is lowercase.", - "type": "string" - }, - "verdict": { - "description": "`live`: the profile was there. `dead`: the platform did not find it. `renamed`: it answers under another name. `unknown`: the platform gave no answer a rule could read.", - "enum": [ - "live", - "dead", - "renamed", - "unknown" - ], - "type": "string" - } - }, - "required": [ - "verdict", - "at" - ], - "type": "object" - }, - "display": { - "description": "The label the entry page shows instead of the value, if an editor set one. Null for email.", - "type": [ - "string", - "null" - ] - }, - "name": { - "description": "The platform’s display name.", - "type": "string" - }, - "platform": { - "description": "The platform’s id (`twitter`, `instagram`, `wikidata`, …).", - "type": "string" - }, - "url": { - "description": "The profile’s address, built from the platform’s URL pattern. Null for email.", - "type": [ - "string", - "null" - ] - }, - "value": { - "description": "The handle as stored (a username, an id, a URL). Null for an email address, which is never published as data.", - "type": [ - "string", - "null" - ] - }, - "verified": { - "description": "Verified Handles has checked that this account belongs to the entry.", - "type": "boolean" - } - }, - "required": [ - "platform", - "name", - "category", - "value", - "display", - "url", - "verified" - ], - "type": "object" - }, - "type": "array" - }, - "image": { - "description": "The lead image (the same as `images[0].url`), or null.", - "type": [ - "string", - "null" - ] - }, - "image_rights": { - "anyOf": [ - { - "additionalProperties": {}, - "description": "Who owns an image and how it may be reused. An entry’s text is CC0 (bar a description taken from Wikipedia); its images are licensed separately, by their owners.", - "properties": { - "credit": { - "description": "The credit line to show when reusing the image.", - "type": [ - "string", - "null" - ] - }, - "details_url": { - "description": "The entry’s \"About this image\" page.", - "type": "string" - }, - "freely_licensed": { - "description": "May be reused under a free licence. Null when no licence is recorded.", - "type": [ - "boolean", - "null" - ] - }, - "license": { - "anyOf": [ - { - "enum": [ - "cc0-1.0", - "public-domain", - "cc-by-4.0", - "cc-by-sa-4.0", - "supplied", - "permission", - "none" - ], - "type": "string" - }, - { - "type": "null" - } - ], - "description": "An upload’s licence, by id. Null for a Commons image (see `license_name`) or when none was recorded." - }, - "license_name": { - "description": "The licence’s name, e.g. \"CC BY-SA 4.0\". Null until it is known.", - "type": [ - "string", - "null" - ] - }, - "license_url": { - "description": "The licence’s text.", - "type": [ - "string", - "null" - ] - }, - "source": { - "description": "Where the image came from.", - "enum": [ - "wikimedia_commons", - "upload" - ], - "type": "string" - }, - "source_page": { - "description": "The image’s Wikimedia Commons file page, which states its licence and author.", - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "source", - "license", - "license_name", - "license_url", - "freely_licensed", - "credit", - "source_page", - "details_url" - ], - "type": "object" - }, - { - "type": "null" - } - ], - "description": "The lead image’s rights, or null when there is no image." - }, - "images": { - "description": "Every image the entry shows, the lead first. Empty when it shows none.", - "items": { - "additionalProperties": {}, - "description": "One image an entry shows.", - "properties": { - "image_rights": { - "additionalProperties": {}, - "description": "Who owns an image and how it may be reused. An entry’s text is CC0 (bar a description taken from Wikipedia); its images are licensed separately, by their owners.", - "properties": { - "credit": { - "description": "The credit line to show when reusing the image.", - "type": [ - "string", - "null" - ] - }, - "details_url": { - "description": "The entry’s \"About this image\" page.", - "type": "string" - }, - "freely_licensed": { - "description": "May be reused under a free licence. Null when no licence is recorded.", - "type": [ - "boolean", - "null" - ] - }, - "license": { - "anyOf": [ - { - "enum": [ - "cc0-1.0", - "public-domain", - "cc-by-4.0", - "cc-by-sa-4.0", - "supplied", - "permission", - "none" - ], - "type": "string" - }, - { - "type": "null" - } - ], - "description": "An upload’s licence, by id. Null for a Commons image (see `license_name`) or when none was recorded." - }, - "license_name": { - "description": "The licence’s name, e.g. \"CC BY-SA 4.0\". Null until it is known.", - "type": [ - "string", - "null" - ] - }, - "license_url": { - "description": "The licence’s text.", - "type": [ - "string", - "null" - ] - }, - "source": { - "description": "Where the image came from.", - "enum": [ - "wikimedia_commons", - "upload" - ], - "type": "string" - }, - "source_page": { - "description": "The image’s Wikimedia Commons file page, which states its licence and author.", - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "source", - "license", - "license_name", - "license_url", - "freely_licensed", - "credit", - "source_page", - "details_url" - ], - "type": "object" - }, - "link": { - "description": "Where the image links on the entry page instead of opening the full-screen viewer, or null.", - "type": [ - "string", - "null" - ] - }, - "main": { - "description": "True for the lead image, false for the gallery images after it.", - "type": "boolean" - }, - "url": { - "description": "The image, as a path on this site (`/img/w/480q75/<id>`).", - "type": "string" - } - }, - "required": [ - "url", - "main", - "image_rights", - "link" - ], - "type": "object" - }, - "type": "array" - }, - "short": { - "description": "The entry’s short name (`/<short>`), if it has one.", - "type": [ - "string", - "null" - ] - }, - "subtitle": { - "type": [ - "string", - "null" - ] - }, - "title": { - "type": "string" - }, - "url": { - "description": "The entry’s canonical page.", - "type": "string" - }, - "verified": { - "description": "Verified Handles has verified the entry.", - "type": "boolean" - }, - "vhid": { - "description": "The entry’s VHID: 11 digits, permanent.", - "pattern": "^\\d{11}$", - "type": "string" - } - }, - "required": [ - "vhid", - "short", - "title", - "subtitle", - "entity_type", - "entity_kind", - "verified", - "description", - "description_source", - "description_license", - "url", - "image", - "image_rights", - "images", - "handles" - ], - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": {}, + "description": "An entry: the same data its page shows, from the same code. Email addresses are masked. The text is CC0, except a description taken from Wikipedia (`description_license`).", + "properties": { + "description": { + "description": "The description as sanitised HTML, links to other entries named as they are today.", + "type": [ + "string", + "null" + ] + }, + "description_license": { + "anyOf": [ + { + "const": "CC-BY-SA-4.0", + "type": "string" + }, + { + "type": "null" + } + ], + "description": "The description’s licence, as an SPDX id: `CC-BY-SA-4.0` when it was taken from Wikipedia (`description_source` is set), which means crediting the article and sharing alike. Null otherwise: the description is CC0 like the rest of the text." + }, + "description_source": { + "anyOf": [ + { + "additionalProperties": {}, + "description": "The English Wikipedia page an entry’s description was taken from: an article, or a draft (`draft: true`).", + "properties": { + "adapted": { + "description": "Present and true when the text has been edited on the site since.", + "type": "boolean" + }, + "draft": { + "const": true, + "description": "Present and true when the page is an English Wikipedia draft (the Draft namespace), not yet an article.", + "type": "boolean" + }, + "kind": { + "description": "The source’s kind (`wikipedia`).", + "type": "string" + }, + "revision": { + "description": "The page’s revision the text was taken from: its permalink is `https://en.wikipedia.org/w/index.php?title=<title>&oldid=<revision>`. Absent on a credit from before revisions were kept.", + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" + }, + "title": { + "description": "The page’s title, underscored (`Draft:` first for a draft).", + "type": "string" + }, + "url": { + "description": "The page.", + "type": "string" + } + }, + "required": [ + "kind", + "title", + "url" + ], + "type": "object" + }, + { + "type": "null" + } + ] + }, + "entity_kind": { + "anyOf": [ + { + "enum": [ + "person", + "musical_group", + "sports_organization", + "broadcaster", + "publisher", + "educational_institution", + "research_organization", + "religious_organization", + "museum", + "financial_institution", + "chain", + "nonprofit", + "company", + "organization", + "show", + "website", + "software", + "brand" + ], + "type": "string" + }, + { + "type": "null" + } + ], + "description": "The finer kind of thing it is, from its Wikidata item’s classes; null when unknown (an organisation or a brand not yet read since kinds were added reads null until the sync next reads its item). Each kind belongs to one `entity_type`, and `person`, `organization` and `brand` are also the kinds of an entry of that type with no finer one. The kinds, with their type: `person` (person: person), `musical_group` (organization: musical group), `sports_organization` (organization: sports organisation), `broadcaster` (organization: broadcaster), `publisher` (organization: publisher), `educational_institution` (organization: educational institution), `research_organization` (organization: research organisation), `religious_organization` (organization: religious organisation), `museum` (organization: museum), `financial_institution` (organization: financial institution), `chain` (organization: retail or hospitality chain), `nonprofit` (organization: charity or non-profit), `company` (organization: company), `organization` (organization: organisation), `show` (brand: show), `website` (brand: website or app), `software` (brand: software), `brand` (brand: brand). New kinds may be added; treat an unknown value as its `entity_type`." + }, + "entity_type": { + "description": "What it is, from its Wikidata item: `person`, `organization` or `brand`; null when unknown. `entity_kind` says more.", + "type": [ + "string", + "null" + ] + }, + "handles": { + "items": { + "additionalProperties": {}, + "description": "One account or identifier of an entry, in the order the entry page shows them. A Wikidata item linked to the entry comes last, as platform `wikidata`.", + "properties": { + "category": { + "description": "How the entry page groups it.", + "enum": [ + "social", + "messaging", + "website", + "identifier" + ], + "type": "string" + }, + "checked": { + "additionalProperties": {}, + "description": "What Verified Handles’ own handle checker found when it last looked at this account, from the platform’s official API: only on YouTube (channel and handle), Deezer and GitHub, and only for a look at most 7 days old. Absent otherwise. The entry page shows it only for `dead` (“Not found when checked …”) and `renamed`.", + "properties": { + "at": { + "description": "When it looked (ISO 8601, UTC).", + "type": "string" + }, + "now": { + "description": "For `renamed`, the name it answers to now, when the platform gave one. A YouTube handle’s is lowercase.", + "type": "string" + }, + "verdict": { + "description": "`live`: the profile was there. `dead`: the platform did not find it. `renamed`: it answers under another name. `unknown`: the platform gave no answer a rule could read.", + "enum": [ + "live", + "dead", + "renamed", + "unknown" + ], + "type": "string" + } + }, + "required": [ + "verdict", + "at" + ], + "type": "object" + }, + "display": { + "description": "The label the entry page shows instead of the value, if an editor set one. Null for email.", + "type": [ + "string", + "null" + ] + }, + "name": { + "description": "The platform’s display name.", + "type": "string" + }, + "platform": { + "description": "The platform’s id (`twitter`, `instagram`, `wikidata`, …).", + "type": "string" + }, + "url": { + "description": "The profile’s address, built from the platform’s URL pattern. Null for email.", + "type": [ + "string", + "null" + ] + }, + "value": { + "description": "The handle as stored (a username, an id, a URL). Null for an email address, which is never published as data.", + "type": [ + "string", + "null" + ] + }, + "verified": { + "description": "Verified Handles has checked that this account belongs to the entry.", + "type": "boolean" + } + }, + "required": [ + "platform", + "name", + "category", + "value", + "display", + "url", + "verified" + ], + "type": "object" + }, + "type": "array" + }, + "image": { + "description": "The lead image (the same as `images[0].url`), or null.", + "type": [ + "string", + "null" + ] + }, + "image_rights": { + "anyOf": [ + { + "additionalProperties": {}, + "description": "Who owns an image and how it may be reused. An entry’s text is CC0 (bar a description taken from Wikipedia); its images are licensed separately, by their owners.", + "properties": { + "credit": { + "description": "The credit line to show when reusing the image.", + "type": [ + "string", + "null" + ] + }, + "details_url": { + "description": "The entry’s \"About this image\" page.", + "type": "string" + }, + "freely_licensed": { + "description": "May be reused under a free licence. Null when no licence is recorded.", + "type": [ + "boolean", + "null" + ] + }, + "license": { + "anyOf": [ + { + "enum": [ + "cc0-1.0", + "public-domain", + "cc-by-4.0", + "cc-by-sa-4.0", + "supplied", + "permission", + "none" + ], + "type": "string" + }, + { + "type": "null" + } + ], + "description": "An upload’s licence, by id. Null for a Commons image (see `license_name`) or when none was recorded." + }, + "license_name": { + "description": "The licence’s name, e.g. \"CC BY-SA 4.0\". Null until it is known.", + "type": [ + "string", + "null" + ] + }, + "license_url": { + "description": "The licence’s text.", + "type": [ + "string", + "null" + ] + }, + "source": { + "description": "Where the image came from.", + "enum": [ + "wikimedia_commons", + "upload" + ], + "type": "string" + }, + "source_page": { + "description": "The image’s Wikimedia Commons file page, which states its licence and author.", + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "source", + "license", + "license_name", + "license_url", + "freely_licensed", + "credit", + "source_page", + "details_url" + ], + "type": "object" + }, + { + "type": "null" + } + ], + "description": "The lead image’s rights, or null when there is no image." + }, + "images": { + "description": "Every image the entry shows, the lead first. Empty when it shows none.", + "items": { + "additionalProperties": {}, + "description": "One image an entry shows.", + "properties": { + "image_rights": { + "additionalProperties": {}, + "description": "Who owns an image and how it may be reused. An entry’s text is CC0 (bar a description taken from Wikipedia); its images are licensed separately, by their owners.", + "properties": { + "credit": { + "description": "The credit line to show when reusing the image.", + "type": [ + "string", + "null" + ] + }, + "details_url": { + "description": "The entry’s \"About this image\" page.", + "type": "string" + }, + "freely_licensed": { + "description": "May be reused under a free licence. Null when no licence is recorded.", + "type": [ + "boolean", + "null" + ] + }, + "license": { + "anyOf": [ + { + "enum": [ + "cc0-1.0", + "public-domain", + "cc-by-4.0", + "cc-by-sa-4.0", + "supplied", + "permission", + "none" + ], + "type": "string" + }, + { + "type": "null" + } + ], + "description": "An upload’s licence, by id. Null for a Commons image (see `license_name`) or when none was recorded." + }, + "license_name": { + "description": "The licence’s name, e.g. \"CC BY-SA 4.0\". Null until it is known.", + "type": [ + "string", + "null" + ] + }, + "license_url": { + "description": "The licence’s text.", + "type": [ + "string", + "null" + ] + }, + "source": { + "description": "Where the image came from.", + "enum": [ + "wikimedia_commons", + "upload" + ], + "type": "string" + }, + "source_page": { + "description": "The image’s Wikimedia Commons file page, which states its licence and author.", + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "source", + "license", + "license_name", + "license_url", + "freely_licensed", + "credit", + "source_page", + "details_url" + ], + "type": "object" + }, + "link": { + "description": "Where the image links on the entry page instead of opening the full-screen viewer, or null.", + "type": [ + "string", + "null" + ] + }, + "main": { + "description": "True for the lead image, false for the gallery images after it.", + "type": "boolean" + }, + "url": { + "description": "The image, as a path on this site (`/img/w/480q75/<id>`).", + "type": "string" + } + }, + "required": [ + "url", + "main", + "image_rights", + "link" + ], + "type": "object" + }, + "type": "array" + }, + "short": { + "description": "The entry’s short name (`/<short>`), if it has one.", + "type": [ + "string", + "null" + ] + }, + "subtitle": { + "type": [ + "string", + "null" + ] + }, + "title": { + "type": "string" + }, + "url": { + "description": "The entry’s canonical page.", + "type": "string" + }, + "verified": { + "description": "Verified Handles has verified the entry.", + "type": "boolean" + }, + "vhid": { + "description": "The entry’s VHID: 11 digits, permanent.", + "pattern": "^\\d{11}$", + "type": "string" + } + }, + "required": [ + "vhid", + "short", + "title", + "subtitle", + "entity_type", + "entity_kind", + "verified", + "description", + "description_source", + "description_license", + "url", + "image", + "image_rights", + "images", + "handles" + ], + "type": "object" + }, + { + "type": "null" + } +]
2 tool updates
- Changed
get_entries1 field changed- changed
Output schema / properties / results / items / anyOfPrevious value: -[ - { - "additionalProperties": {}, - "properties": { - "entity": { - "additionalProperties": {}, - "description": "Exactly what `GET /api/v1/entities/{key}` answers for this key.", - "properties": { - "description": { - "description": "The description as sanitised HTML, links to other entries named as they are today.", - "type": [ - "string", - "null" - ] - }, - "description_license": { - "anyOf": [ - { - "const": "CC-BY-SA-4.0", - "type": "string" - }, - { - "type": "null" - } - ], - "description": "The description’s licence, as an SPDX id: `CC-BY-SA-4.0` when it was taken from Wikipedia (`description_source` is set), which means crediting the article and sharing alike. Null otherwise: the description is CC0 like the rest of the text." - }, - "description_source": { - "anyOf": [ - { - "additionalProperties": {}, - "description": "The English Wikipedia page an entry’s description was taken from: an article, or a draft (`draft: true`).", - "properties": { - "adapted": { - "description": "Present and true when the text has been edited on the site since.", - "type": "boolean" - }, - "draft": { - "const": true, - "description": "Present and true when the page is an English Wikipedia draft (the Draft namespace), not yet an article.", - "type": "boolean" - }, - "kind": { - "description": "The source’s kind (`wikipedia`).", - "type": "string" - }, - "revision": { - "description": "The page’s revision the text was taken from: its permalink is `https://en.wikipedia.org/w/index.php?title=<title>&oldid=<revision>`. Absent on a credit from before revisions were kept.", - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "title": { - "description": "The page’s title, underscored (`Draft:` first for a draft).", - "type": "string" - }, - "url": { - "description": "The page.", - "type": "string" - } - }, - "required": [ - "kind", - "title", - "url" - ], - "type": "object" - }, - { - "type": "null" - } - ] - }, - "entity_kind": { - "anyOf": [ - { - "enum": [ - "person", - "musical_group", - "sports_organization", - "broadcaster", - "publisher", - "educational_institution", - "research_organization", - "religious_organization", - "museum", - "financial_institution", - "chain", - "nonprofit", - "company", - "organization", - "website", - "brand" - ], - "type": "string" - }, - { - "type": "null" - } - ], - "description": "The finer kind of thing it is, from its Wikidata item’s classes; null when unknown (an organisation or a brand not yet read since kinds were added reads null until the sync next reads its item). Each kind belongs to one `entity_type`, and `person`, `organization` and `brand` are also the kinds of an entry of that type with no finer one. The kinds, with their type: `person` (person: person), `musical_group` (organization: musical group), `sports_organization` (organization: sports organisation), `broadcaster` (organization: broadcaster), `publisher` (organization: publisher), `educational_institution` (organization: educational institution), `research_organization` (organization: research organisation), `religious_organization` (organization: religious organisation), `museum` (organization: museum), `financial_institution` (organization: financial institution), `chain` (organization: retail or hospitality chain), `nonprofit` (organization: charity or non-profit), `company` (organization: company), `organization` (organization: organisation), `website` (brand: website or app), `brand` (brand: brand). New kinds may be added; treat an unknown value as its `entity_type`." - }, - "entity_type": { - "description": "What it is, from its Wikidata item: `person`, `organization` or `brand`; null when unknown. `entity_kind` says more.", - "type": [ - "string", - "null" - ] - }, - "handles": { - "items": { - "additionalProperties": {}, - "description": "One account or identifier of an entry, in the order the entry page shows them. A Wikidata item linked to the entry comes last, as platform `wikidata`.", - "properties": { - "category": { - "description": "How the entry page groups it.", - "enum": [ - "social", - "messaging", - "website", - "identifier" - ], - "type": "string" - }, - "checked": { - "additionalProperties": {}, - "description": "What Verified Handles’ own handle checker found when it last looked at this account, from the platform’s official API: only on YouTube (channel and handle), Deezer and GitHub, and only for a look at most 7 days old. Absent otherwise. The entry page shows it only for `dead` (“Not found when checked …”) and `renamed`.", - "properties": { - "at": { - "description": "When it looked (ISO 8601, UTC).", - "type": "string" - }, - "now": { - "description": "For `renamed`, the name it answers to now, when the platform gave one. A YouTube handle’s is lowercase.", - "type": "string" - }, - "verdict": { - "description": "`live`: the profile was there. `dead`: the platform did not find it. `renamed`: it answers under another name. `unknown`: the platform gave no answer a rule could read.", - "enum": [ - "live", - "dead", - "renamed", - "unknown" - ], - "type": "string" - } - }, - "required": [ - "verdict", - "at" - ], - "type": "object" - }, - "display": { - "description": "The label the entry page shows instead of the value, if an editor set one. Null for email.", - "type": [ - "string", - "null" - ] - }, - "name": { - "description": "The platform’s display name.", - "type": "string" - }, - "platform": { - "description": "The platform’s id (`twitter`, `instagram`, `wikidata`, …).", - "type": "string" - }, - "url": { - "description": "The profile’s address, built from the platform’s URL pattern. Null for email.", - "type": [ - "string", - "null" - ] - }, - "value": { - "description": "The handle as stored (a username, an id, a URL). Null for an email address, which is never published as data.", - "type": [ - "string", - "null" - ] - }, - "verified": { - "description": "Verified Handles has checked that this account belongs to the entry.", - "type": "boolean" - } - }, - "required": [ - "platform", - "name", - "category", - "value", - "display", - "url", - "verified" - ], - "type": "object" - }, - "type": "array" - }, - "image": { - "description": "The lead image (the same as `images[0].url`), or null.", - "type": [ - "string", - "null" - ] - }, - "image_rights": { - "anyOf": [ - { - "additionalProperties": {}, - "description": "Who owns an image and how it may be reused. An entry’s text is CC0 (bar a description taken from Wikipedia); its images are licensed separately, by their owners.", - "properties": { - "credit": { - "description": "The credit line to show when reusing the image.", - "type": [ - "string", - "null" - ] - }, - "details_url": { - "description": "The entry’s \"About this image\" page.", - "type": "string" - }, - "freely_licensed": { - "description": "May be reused under a free licence. Null when no licence is recorded.", - "type": [ - "boolean", - "null" - ] - }, - "license": { - "anyOf": [ - { - "enum": [ - "cc0-1.0", - "public-domain", - "cc-by-4.0", - "cc-by-sa-4.0", - "supplied", - "permission", - "none" - ], - "type": "string" - }, - { - "type": "null" - } - ], - "description": "An upload’s licence, by id. Null for a Commons image (see `license_name`) or when none was recorded." - }, - "license_name": { - "description": "The licence’s name, e.g. \"CC BY-SA 4.0\". Null until it is known.", - "type": [ - "string", - "null" - ] - }, - "license_url": { - "description": "The licence’s text.", - "type": [ - "string", - "null" - ] - }, - "source": { - "description": "Where the image came from.", - "enum": [ - "wikimedia_commons", - "upload" - ], - "type": "string" - }, - "source_page": { - "description": "The image’s Wikimedia Commons file page, which states its licence and author.", - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "source", - "license", - "license_name", - "license_url", - "freely_licensed", - "credit", - "source_page", - "details_url" - ], - "type": "object" - }, - { - "type": "null" - } - ], - "description": "The lead image’s rights, or null when there is no image." - }, - "images": { - "description": "Every image the entry shows, the lead first. Empty when it shows none.", - "items": { - "additionalProperties": {}, - "description": "One image an entry shows.", - "properties": { - "image_rights": { - "additionalProperties": {}, - "description": "Who owns an image and how it may be reused. An entry’s text is CC0 (bar a description taken from Wikipedia); its images are licensed separately, by their owners.", - "properties": { - "credit": { - "description": "The credit line to show when reusing the image.", - "type": [ - "string", - "null" - ] - }, - "details_url": { - "description": "The entry’s \"About this image\" page.", - "type": "string" - }, - "freely_licensed": { - "description": "May be reused under a free licence. Null when no licence is recorded.", - "type": [ - "boolean", - "null" - ] - }, - "license": { - "anyOf": [ - { - "enum": [ - "cc0-1.0", - "public-domain", - "cc-by-4.0", - "cc-by-sa-4.0", - "supplied", - "permission", - "none" - ], - "type": "string" - }, - { - "type": "null" - } - ], - "description": "An upload’s licence, by id. Null for a Commons image (see `license_name`) or when none was recorded." - }, - "license_name": { - "description": "The licence’s name, e.g. \"CC BY-SA 4.0\". Null until it is known.", - "type": [ - "string", - "null" - ] - }, - "license_url": { - "description": "The licence’s text.", - "type": [ - "string", - "null" - ] - }, - "source": { - "description": "Where the image came from.", - "enum": [ - "wikimedia_commons", - "upload" - ], - "type": "string" - }, - "source_page": { - "description": "The image’s Wikimedia Commons file page, which states its licence and author.", - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "source", - "license", - "license_name", - "license_url", - "freely_licensed", - "credit", - "source_page", - "details_url" - ], - "type": "object" - }, - "link": { - "description": "Where the image links on the entry page instead of opening the full-screen viewer, or null.", - "type": [ - "string", - "null" - ] - }, - "main": { - "description": "True for the lead image, false for the gallery images after it.", - "type": "boolean" - }, - "url": { - "description": "The image, as a path on this site (`/img/w/480q75/<id>`).", - "type": "string" - } - }, - "required": [ - "url", - "main", - "image_rights", - "link" - ], - "type": "object" - }, - "type": "array" - }, - "short": { - "description": "The entry’s short name (`/<short>`), if it has one.", - "type": [ - "string", - "null" - ] - }, - "subtitle": { - "type": [ - "string", - "null" - ] - }, - "title": { - "type": "string" - }, - "url": { - "description": "The entry’s canonical page.", - "type": "string" - }, - "verified": { - "description": "Verified Handles has verified the entry.", - "type": "boolean" - }, - "vhid": { - "description": "The entry’s VHID: 11 digits, permanent.", - "pattern": "^\\d{11}$", - "type": "string" - } - }, - "required": [ - "vhid", - "short", - "title", - "subtitle", - "entity_type", - "entity_kind", - "verified", - "description", - "description_source", - "description_license", - "url", - "image", - "image_rights", - "images", - "handles" - ], - "type": "object" - }, - "key": { - "description": "The key as asked for, trimmed.", - "type": "string" - }, - "status": { - "const": "ok", - "type": "string" - } - }, - "required": [ - "key", - "status", - "entity" - ], - "type": "object" - }, - { - "additionalProperties": {}, - "properties": { - "key": { - "description": "The key as asked for, trimmed.", - "type": "string" - }, - "status": { - "const": "not_found", - "description": "No public entry answers to the key: where the single read answers 404.", - "type": "string" - } - }, - "required": [ - "key", - "status" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": {}, + "properties": { + "entity": { + "additionalProperties": {}, + "description": "Exactly what `GET /api/v1/entities/{key}` answers for this key.", + "properties": { + "description": { + "description": "The description as sanitised HTML, links to other entries named as they are today.", + "type": [ + "string", + "null" + ] + }, + "description_license": { + "anyOf": [ + { + "const": "CC-BY-SA-4.0", + "type": "string" + }, + { + "type": "null" + } + ], + "description": "The description’s licence, as an SPDX id: `CC-BY-SA-4.0` when it was taken from Wikipedia (`description_source` is set), which means crediting the article and sharing alike. Null otherwise: the description is CC0 like the rest of the text." + }, + "description_source": { + "anyOf": [ + { + "additionalProperties": {}, + "description": "The English Wikipedia page an entry’s description was taken from: an article, or a draft (`draft: true`).", + "properties": { + "adapted": { + "description": "Present and true when the text has been edited on the site since.", + "type": "boolean" + }, + "draft": { + "const": true, + "description": "Present and true when the page is an English Wikipedia draft (the Draft namespace), not yet an article.", + "type": "boolean" + }, + "kind": { + "description": "The source’s kind (`wikipedia`).", + "type": "string" + }, + "revision": { + "description": "The page’s revision the text was taken from: its permalink is `https://en.wikipedia.org/w/index.php?title=<title>&oldid=<revision>`. Absent on a credit from before revisions were kept.", + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" + }, + "title": { + "description": "The page’s title, underscored (`Draft:` first for a draft).", + "type": "string" + }, + "url": { + "description": "The page.", + "type": "string" + } + }, + "required": [ + "kind", + "title", + "url" + ], + "type": "object" + }, + { + "type": "null" + } + ] + }, + "entity_kind": { + "anyOf": [ + { + "enum": [ + "person", + "musical_group", + "sports_organization", + "broadcaster", + "publisher", + "educational_institution", + "research_organization", + "religious_organization", + "museum", + "financial_institution", + "chain", + "nonprofit", + "company", + "organization", + "show", + "website", + "brand" + ], + "type": "string" + }, + { + "type": "null" + } + ], + "description": "The finer kind of thing it is, from its Wikidata item’s classes; null when unknown (an organisation or a brand not yet read since kinds were added reads null until the sync next reads its item). Each kind belongs to one `entity_type`, and `person`, `organization` and `brand` are also the kinds of an entry of that type with no finer one. The kinds, with their type: `person` (person: person), `musical_group` (organization: musical group), `sports_organization` (organization: sports organisation), `broadcaster` (organization: broadcaster), `publisher` (organization: publisher), `educational_institution` (organization: educational institution), `research_organization` (organization: research organisation), `religious_organization` (organization: religious organisation), `museum` (organization: museum), `financial_institution` (organization: financial institution), `chain` (organization: retail or hospitality chain), `nonprofit` (organization: charity or non-profit), `company` (organization: company), `organization` (organization: organisation), `show` (brand: show), `website` (brand: website or app), `brand` (brand: brand). New kinds may be added; treat an unknown value as its `entity_type`." + }, + "entity_type": { + "description": "What it is, from its Wikidata item: `person`, `organization` or `brand`; null when unknown. `entity_kind` says more.", + "type": [ + "string", + "null" + ] + }, + "handles": { + "items": { + "additionalProperties": {}, + "description": "One account or identifier of an entry, in the order the entry page shows them. A Wikidata item linked to the entry comes last, as platform `wikidata`.", + "properties": { + "category": { + "description": "How the entry page groups it.", + "enum": [ + "social", + "messaging", + "website", + "identifier" + ], + "type": "string" + }, + "checked": { + "additionalProperties": {}, + "description": "What Verified Handles’ own handle checker found when it last looked at this account, from the platform’s official API: only on YouTube (channel and handle), Deezer and GitHub, and only for a look at most 7 days old. Absent otherwise. The entry page shows it only for `dead` (“Not found when checked …”) and `renamed`.", + "properties": { + "at": { + "description": "When it looked (ISO 8601, UTC).", + "type": "string" + }, + "now": { + "description": "For `renamed`, the name it answers to now, when the platform gave one. A YouTube handle’s is lowercase.", + "type": "string" + }, + "verdict": { + "description": "`live`: the profile was there. `dead`: the platform did not find it. `renamed`: it answers under another name. `unknown`: the platform gave no answer a rule could read.", + "enum": [ + "live", + "dead", + "renamed", + "unknown" + ], + "type": "string" + } + }, + "required": [ + "verdict", + "at" + ], + "type": "object" + }, + "display": { + "description": "The label the entry page shows instead of the value, if an editor set one. Null for email.", + "type": [ + "string", + "null" + ] + }, + "name": { + "description": "The platform’s display name.", + "type": "string" + }, + "platform": { + "description": "The platform’s id (`twitter`, `instagram`, `wikidata`, …).", + "type": "string" + }, + "url": { + "description": "The profile’s address, built from the platform’s URL pattern. Null for email.", + "type": [ + "string", + "null" + ] + }, + "value": { + "description": "The handle as stored (a username, an id, a URL). Null for an email address, which is never published as data.", + "type": [ + "string", + "null" + ] + }, + "verified": { + "description": "Verified Handles has checked that this account belongs to the entry.", + "type": "boolean" + } + }, + "required": [ + "platform", + "name", + "category", + "value", + "display", + "url", + "verified" + ], + "type": "object" + }, + "type": "array" + }, + "image": { + "description": "The lead image (the same as `images[0].url`), or null.", + "type": [ + "string", + "null" + ] + }, + "image_rights": { + "anyOf": [ + { + "additionalProperties": {}, + "description": "Who owns an image and how it may be reused. An entry’s text is CC0 (bar a description taken from Wikipedia); its images are licensed separately, by their owners.", + "properties": { + "credit": { + "description": "The credit line to show when reusing the image.", + "type": [ + "string", + "null" + ] + }, + "details_url": { + "description": "The entry’s \"About this image\" page.", + "type": "string" + }, + "freely_licensed": { + "description": "May be reused under a free licence. Null when no licence is recorded.", + "type": [ + "boolean", + "null" + ] + }, + "license": { + "anyOf": [ + { + "enum": [ + "cc0-1.0", + "public-domain", + "cc-by-4.0", + "cc-by-sa-4.0", + "supplied", + "permission", + "none" + ], + "type": "string" + }, + { + "type": "null" + } + ], + "description": "An upload’s licence, by id. Null for a Commons image (see `license_name`) or when none was recorded." + }, + "license_name": { + "description": "The licence’s name, e.g. \"CC BY-SA 4.0\". Null until it is known.", + "type": [ + "string", + "null" + ] + }, + "license_url": { + "description": "The licence’s text.", + "type": [ + "string", + "null" + ] + }, + "source": { + "description": "Where the image came from.", + "enum": [ + "wikimedia_commons", + "upload" + ], + "type": "string" + }, + "source_page": { + "description": "The image’s Wikimedia Commons file page, which states its licence and author.", + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "source", + "license", + "license_name", + "license_url", + "freely_licensed", + "credit", + "source_page", + "details_url" + ], + "type": "object" + }, + { + "type": "null" + } + ], + "description": "The lead image’s rights, or null when there is no image." + }, + "images": { + "description": "Every image the entry shows, the lead first. Empty when it shows none.", + "items": { + "additionalProperties": {}, + "description": "One image an entry shows.", + "properties": { + "image_rights": { + "additionalProperties": {}, + "description": "Who owns an image and how it may be reused. An entry’s text is CC0 (bar a description taken from Wikipedia); its images are licensed separately, by their owners.", + "properties": { + "credit": { + "description": "The credit line to show when reusing the image.", + "type": [ + "string", + "null" + ] + }, + "details_url": { + "description": "The entry’s \"About this image\" page.", + "type": "string" + }, + "freely_licensed": { + "description": "May be reused under a free licence. Null when no licence is recorded.", + "type": [ + "boolean", + "null" + ] + }, + "license": { + "anyOf": [ + { + "enum": [ + "cc0-1.0", + "public-domain", + "cc-by-4.0", + "cc-by-sa-4.0", + "supplied", + "permission", + "none" + ], + "type": "string" + }, + { + "type": "null" + } + ], + "description": "An upload’s licence, by id. Null for a Commons image (see `license_name`) or when none was recorded." + }, + "license_name": { + "description": "The licence’s name, e.g. \"CC BY-SA 4.0\". Null until it is known.", + "type": [ + "string", + "null" + ] + }, + "license_url": { + "description": "The licence’s text.", + "type": [ + "string", + "null" + ] + }, + "source": { + "description": "Where the image came from.", + "enum": [ + "wikimedia_commons", + "upload" + ], + "type": "string" + }, + "source_page": { + "description": "The image’s Wikimedia Commons file page, which states its licence and author.", + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "source", + "license", + "license_name", + "license_url", + "freely_licensed", + "credit", + "source_page", + "details_url" + ], + "type": "object" + }, + "link": { + "description": "Where the image links on the entry page instead of opening the full-screen viewer, or null.", + "type": [ + "string", + "null" + ] + }, + "main": { + "description": "True for the lead image, false for the gallery images after it.", + "type": "boolean" + }, + "url": { + "description": "The image, as a path on this site (`/img/w/480q75/<id>`).", + "type": "string" + } + }, + "required": [ + "url", + "main", + "image_rights", + "link" + ], + "type": "object" + }, + "type": "array" + }, + "short": { + "description": "The entry’s short name (`/<short>`), if it has one.", + "type": [ + "string", + "null" + ] + }, + "subtitle": { + "type": [ + "string", + "null" + ] + }, + "title": { + "type": "string" + }, + "url": { + "description": "The entry’s canonical page.", + "type": "string" + }, + "verified": { + "description": "Verified Handles has verified the entry.", + "type": "boolean" + }, + "vhid": { + "description": "The entry’s VHID: 11 digits, permanent.", + "pattern": "^\\d{11}$", + "type": "string" + } + }, + "required": [ + "vhid", + "short", + "title", + "subtitle", + "entity_type", + "entity_kind", + "verified", + "description", + "description_source", + "description_license", + "url", + "image", + "image_rights", + "images", + "handles" + ], + "type": "object" + }, + "key": { + "description": "The key as asked for, trimmed.", + "type": "string" + }, + "status": { + "const": "ok", + "type": "string" + } + }, + "required": [ + "key", + "status", + "entity" + ], + "type": "object" + }, + { + "additionalProperties": {}, + "properties": { + "key": { + "description": "The key as asked for, trimmed.", + "type": "string" + }, + "status": { + "const": "not_found", + "description": "No public entry answers to the key: where the single read answers 404.", + "type": "string" + } + }, + "required": [ + "key", + "status" + ], + "type": "object" + } +]
- Changed
get_entry1 field changed- changed
Output schema / properties / entry / anyOfPrevious value: -[ - { - "additionalProperties": {}, - "description": "An entry: the same data its page shows, from the same code. Email addresses are masked. The text is CC0, except a description taken from Wikipedia (`description_license`).", - "properties": { - "description": { - "description": "The description as sanitised HTML, links to other entries named as they are today.", - "type": [ - "string", - "null" - ] - }, - "description_license": { - "anyOf": [ - { - "const": "CC-BY-SA-4.0", - "type": "string" - }, - { - "type": "null" - } - ], - "description": "The description’s licence, as an SPDX id: `CC-BY-SA-4.0` when it was taken from Wikipedia (`description_source` is set), which means crediting the article and sharing alike. Null otherwise: the description is CC0 like the rest of the text." - }, - "description_source": { - "anyOf": [ - { - "additionalProperties": {}, - "description": "The English Wikipedia page an entry’s description was taken from: an article, or a draft (`draft: true`).", - "properties": { - "adapted": { - "description": "Present and true when the text has been edited on the site since.", - "type": "boolean" - }, - "draft": { - "const": true, - "description": "Present and true when the page is an English Wikipedia draft (the Draft namespace), not yet an article.", - "type": "boolean" - }, - "kind": { - "description": "The source’s kind (`wikipedia`).", - "type": "string" - }, - "revision": { - "description": "The page’s revision the text was taken from: its permalink is `https://en.wikipedia.org/w/index.php?title=<title>&oldid=<revision>`. Absent on a credit from before revisions were kept.", - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "title": { - "description": "The page’s title, underscored (`Draft:` first for a draft).", - "type": "string" - }, - "url": { - "description": "The page.", - "type": "string" - } - }, - "required": [ - "kind", - "title", - "url" - ], - "type": "object" - }, - { - "type": "null" - } - ] - }, - "entity_kind": { - "anyOf": [ - { - "enum": [ - "person", - "musical_group", - "sports_organization", - "broadcaster", - "publisher", - "educational_institution", - "research_organization", - "religious_organization", - "museum", - "financial_institution", - "chain", - "nonprofit", - "company", - "organization", - "website", - "brand" - ], - "type": "string" - }, - { - "type": "null" - } - ], - "description": "The finer kind of thing it is, from its Wikidata item’s classes; null when unknown (an organisation or a brand not yet read since kinds were added reads null until the sync next reads its item). Each kind belongs to one `entity_type`, and `person`, `organization` and `brand` are also the kinds of an entry of that type with no finer one. The kinds, with their type: `person` (person: person), `musical_group` (organization: musical group), `sports_organization` (organization: sports organisation), `broadcaster` (organization: broadcaster), `publisher` (organization: publisher), `educational_institution` (organization: educational institution), `research_organization` (organization: research organisation), `religious_organization` (organization: religious organisation), `museum` (organization: museum), `financial_institution` (organization: financial institution), `chain` (organization: retail or hospitality chain), `nonprofit` (organization: charity or non-profit), `company` (organization: company), `organization` (organization: organisation), `website` (brand: website or app), `brand` (brand: brand). New kinds may be added; treat an unknown value as its `entity_type`." - }, - "entity_type": { - "description": "What it is, from its Wikidata item: `person`, `organization` or `brand`; null when unknown. `entity_kind` says more.", - "type": [ - "string", - "null" - ] - }, - "handles": { - "items": { - "additionalProperties": {}, - "description": "One account or identifier of an entry, in the order the entry page shows them. A Wikidata item linked to the entry comes last, as platform `wikidata`.", - "properties": { - "category": { - "description": "How the entry page groups it.", - "enum": [ - "social", - "messaging", - "website", - "identifier" - ], - "type": "string" - }, - "checked": { - "additionalProperties": {}, - "description": "What Verified Handles’ own handle checker found when it last looked at this account, from the platform’s official API: only on YouTube (channel and handle), Deezer and GitHub, and only for a look at most 7 days old. Absent otherwise. The entry page shows it only for `dead` (“Not found when checked …”) and `renamed`.", - "properties": { - "at": { - "description": "When it looked (ISO 8601, UTC).", - "type": "string" - }, - "now": { - "description": "For `renamed`, the name it answers to now, when the platform gave one. A YouTube handle’s is lowercase.", - "type": "string" - }, - "verdict": { - "description": "`live`: the profile was there. `dead`: the platform did not find it. `renamed`: it answers under another name. `unknown`: the platform gave no answer a rule could read.", - "enum": [ - "live", - "dead", - "renamed", - "unknown" - ], - "type": "string" - } - }, - "required": [ - "verdict", - "at" - ], - "type": "object" - }, - "display": { - "description": "The label the entry page shows instead of the value, if an editor set one. Null for email.", - "type": [ - "string", - "null" - ] - }, - "name": { - "description": "The platform’s display name.", - "type": "string" - }, - "platform": { - "description": "The platform’s id (`twitter`, `instagram`, `wikidata`, …).", - "type": "string" - }, - "url": { - "description": "The profile’s address, built from the platform’s URL pattern. Null for email.", - "type": [ - "string", - "null" - ] - }, - "value": { - "description": "The handle as stored (a username, an id, a URL). Null for an email address, which is never published as data.", - "type": [ - "string", - "null" - ] - }, - "verified": { - "description": "Verified Handles has checked that this account belongs to the entry.", - "type": "boolean" - } - }, - "required": [ - "platform", - "name", - "category", - "value", - "display", - "url", - "verified" - ], - "type": "object" - }, - "type": "array" - }, - "image": { - "description": "The lead image (the same as `images[0].url`), or null.", - "type": [ - "string", - "null" - ] - }, - "image_rights": { - "anyOf": [ - { - "additionalProperties": {}, - "description": "Who owns an image and how it may be reused. An entry’s text is CC0 (bar a description taken from Wikipedia); its images are licensed separately, by their owners.", - "properties": { - "credit": { - "description": "The credit line to show when reusing the image.", - "type": [ - "string", - "null" - ] - }, - "details_url": { - "description": "The entry’s \"About this image\" page.", - "type": "string" - }, - "freely_licensed": { - "description": "May be reused under a free licence. Null when no licence is recorded.", - "type": [ - "boolean", - "null" - ] - }, - "license": { - "anyOf": [ - { - "enum": [ - "cc0-1.0", - "public-domain", - "cc-by-4.0", - "cc-by-sa-4.0", - "supplied", - "permission", - "none" - ], - "type": "string" - }, - { - "type": "null" - } - ], - "description": "An upload’s licence, by id. Null for a Commons image (see `license_name`) or when none was recorded." - }, - "license_name": { - "description": "The licence’s name, e.g. \"CC BY-SA 4.0\". Null until it is known.", - "type": [ - "string", - "null" - ] - }, - "license_url": { - "description": "The licence’s text.", - "type": [ - "string", - "null" - ] - }, - "source": { - "description": "Where the image came from.", - "enum": [ - "wikimedia_commons", - "upload" - ], - "type": "string" - }, - "source_page": { - "description": "The image’s Wikimedia Commons file page, which states its licence and author.", - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "source", - "license", - "license_name", - "license_url", - "freely_licensed", - "credit", - "source_page", - "details_url" - ], - "type": "object" - }, - { - "type": "null" - } - ], - "description": "The lead image’s rights, or null when there is no image." - }, - "images": { - "description": "Every image the entry shows, the lead first. Empty when it shows none.", - "items": { - "additionalProperties": {}, - "description": "One image an entry shows.", - "properties": { - "image_rights": { - "additionalProperties": {}, - "description": "Who owns an image and how it may be reused. An entry’s text is CC0 (bar a description taken from Wikipedia); its images are licensed separately, by their owners.", - "properties": { - "credit": { - "description": "The credit line to show when reusing the image.", - "type": [ - "string", - "null" - ] - }, - "details_url": { - "description": "The entry’s \"About this image\" page.", - "type": "string" - }, - "freely_licensed": { - "description": "May be reused under a free licence. Null when no licence is recorded.", - "type": [ - "boolean", - "null" - ] - }, - "license": { - "anyOf": [ - { - "enum": [ - "cc0-1.0", - "public-domain", - "cc-by-4.0", - "cc-by-sa-4.0", - "supplied", - "permission", - "none" - ], - "type": "string" - }, - { - "type": "null" - } - ], - "description": "An upload’s licence, by id. Null for a Commons image (see `license_name`) or when none was recorded." - }, - "license_name": { - "description": "The licence’s name, e.g. \"CC BY-SA 4.0\". Null until it is known.", - "type": [ - "string", - "null" - ] - }, - "license_url": { - "description": "The licence’s text.", - "type": [ - "string", - "null" - ] - }, - "source": { - "description": "Where the image came from.", - "enum": [ - "wikimedia_commons", - "upload" - ], - "type": "string" - }, - "source_page": { - "description": "The image’s Wikimedia Commons file page, which states its licence and author.", - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "source", - "license", - "license_name", - "license_url", - "freely_licensed", - "credit", - "source_page", - "details_url" - ], - "type": "object" - }, - "link": { - "description": "Where the image links on the entry page instead of opening the full-screen viewer, or null.", - "type": [ - "string", - "null" - ] - }, - "main": { - "description": "True for the lead image, false for the gallery images after it.", - "type": "boolean" - }, - "url": { - "description": "The image, as a path on this site (`/img/w/480q75/<id>`).", - "type": "string" - } - }, - "required": [ - "url", - "main", - "image_rights", - "link" - ], - "type": "object" - }, - "type": "array" - }, - "short": { - "description": "The entry’s short name (`/<short>`), if it has one.", - "type": [ - "string", - "null" - ] - }, - "subtitle": { - "type": [ - "string", - "null" - ] - }, - "title": { - "type": "string" - }, - "url": { - "description": "The entry’s canonical page.", - "type": "string" - }, - "verified": { - "description": "Verified Handles has verified the entry.", - "type": "boolean" - }, - "vhid": { - "description": "The entry’s VHID: 11 digits, permanent.", - "pattern": "^\\d{11}$", - "type": "string" - } - }, - "required": [ - "vhid", - "short", - "title", - "subtitle", - "entity_type", - "entity_kind", - "verified", - "description", - "description_source", - "description_license", - "url", - "image", - "image_rights", - "images", - "handles" - ], - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": {}, + "description": "An entry: the same data its page shows, from the same code. Email addresses are masked. The text is CC0, except a description taken from Wikipedia (`description_license`).", + "properties": { + "description": { + "description": "The description as sanitised HTML, links to other entries named as they are today.", + "type": [ + "string", + "null" + ] + }, + "description_license": { + "anyOf": [ + { + "const": "CC-BY-SA-4.0", + "type": "string" + }, + { + "type": "null" + } + ], + "description": "The description’s licence, as an SPDX id: `CC-BY-SA-4.0` when it was taken from Wikipedia (`description_source` is set), which means crediting the article and sharing alike. Null otherwise: the description is CC0 like the rest of the text." + }, + "description_source": { + "anyOf": [ + { + "additionalProperties": {}, + "description": "The English Wikipedia page an entry’s description was taken from: an article, or a draft (`draft: true`).", + "properties": { + "adapted": { + "description": "Present and true when the text has been edited on the site since.", + "type": "boolean" + }, + "draft": { + "const": true, + "description": "Present and true when the page is an English Wikipedia draft (the Draft namespace), not yet an article.", + "type": "boolean" + }, + "kind": { + "description": "The source’s kind (`wikipedia`).", + "type": "string" + }, + "revision": { + "description": "The page’s revision the text was taken from: its permalink is `https://en.wikipedia.org/w/index.php?title=<title>&oldid=<revision>`. Absent on a credit from before revisions were kept.", + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" + }, + "title": { + "description": "The page’s title, underscored (`Draft:` first for a draft).", + "type": "string" + }, + "url": { + "description": "The page.", + "type": "string" + } + }, + "required": [ + "kind", + "title", + "url" + ], + "type": "object" + }, + { + "type": "null" + } + ] + }, + "entity_kind": { + "anyOf": [ + { + "enum": [ + "person", + "musical_group", + "sports_organization", + "broadcaster", + "publisher", + "educational_institution", + "research_organization", + "religious_organization", + "museum", + "financial_institution", + "chain", + "nonprofit", + "company", + "organization", + "show", + "website", + "brand" + ], + "type": "string" + }, + { + "type": "null" + } + ], + "description": "The finer kind of thing it is, from its Wikidata item’s classes; null when unknown (an organisation or a brand not yet read since kinds were added reads null until the sync next reads its item). Each kind belongs to one `entity_type`, and `person`, `organization` and `brand` are also the kinds of an entry of that type with no finer one. The kinds, with their type: `person` (person: person), `musical_group` (organization: musical group), `sports_organization` (organization: sports organisation), `broadcaster` (organization: broadcaster), `publisher` (organization: publisher), `educational_institution` (organization: educational institution), `research_organization` (organization: research organisation), `religious_organization` (organization: religious organisation), `museum` (organization: museum), `financial_institution` (organization: financial institution), `chain` (organization: retail or hospitality chain), `nonprofit` (organization: charity or non-profit), `company` (organization: company), `organization` (organization: organisation), `show` (brand: show), `website` (brand: website or app), `brand` (brand: brand). New kinds may be added; treat an unknown value as its `entity_type`." + }, + "entity_type": { + "description": "What it is, from its Wikidata item: `person`, `organization` or `brand`; null when unknown. `entity_kind` says more.", + "type": [ + "string", + "null" + ] + }, + "handles": { + "items": { + "additionalProperties": {}, + "description": "One account or identifier of an entry, in the order the entry page shows them. A Wikidata item linked to the entry comes last, as platform `wikidata`.", + "properties": { + "category": { + "description": "How the entry page groups it.", + "enum": [ + "social", + "messaging", + "website", + "identifier" + ], + "type": "string" + }, + "checked": { + "additionalProperties": {}, + "description": "What Verified Handles’ own handle checker found when it last looked at this account, from the platform’s official API: only on YouTube (channel and handle), Deezer and GitHub, and only for a look at most 7 days old. Absent otherwise. The entry page shows it only for `dead` (“Not found when checked …”) and `renamed`.", + "properties": { + "at": { + "description": "When it looked (ISO 8601, UTC).", + "type": "string" + }, + "now": { + "description": "For `renamed`, the name it answers to now, when the platform gave one. A YouTube handle’s is lowercase.", + "type": "string" + }, + "verdict": { + "description": "`live`: the profile was there. `dead`: the platform did not find it. `renamed`: it answers under another name. `unknown`: the platform gave no answer a rule could read.", + "enum": [ + "live", + "dead", + "renamed", + "unknown" + ], + "type": "string" + } + }, + "required": [ + "verdict", + "at" + ], + "type": "object" + }, + "display": { + "description": "The label the entry page shows instead of the value, if an editor set one. Null for email.", + "type": [ + "string", + "null" + ] + }, + "name": { + "description": "The platform’s display name.", + "type": "string" + }, + "platform": { + "description": "The platform’s id (`twitter`, `instagram`, `wikidata`, …).", + "type": "string" + }, + "url": { + "description": "The profile’s address, built from the platform’s URL pattern. Null for email.", + "type": [ + "string", + "null" + ] + }, + "value": { + "description": "The handle as stored (a username, an id, a URL). Null for an email address, which is never published as data.", + "type": [ + "string", + "null" + ] + }, + "verified": { + "description": "Verified Handles has checked that this account belongs to the entry.", + "type": "boolean" + } + }, + "required": [ + "platform", + "name", + "category", + "value", + "display", + "url", + "verified" + ], + "type": "object" + }, + "type": "array" + }, + "image": { + "description": "The lead image (the same as `images[0].url`), or null.", + "type": [ + "string", + "null" + ] + }, + "image_rights": { + "anyOf": [ + { + "additionalProperties": {}, + "description": "Who owns an image and how it may be reused. An entry’s text is CC0 (bar a description taken from Wikipedia); its images are licensed separately, by their owners.", + "properties": { + "credit": { + "description": "The credit line to show when reusing the image.", + "type": [ + "string", + "null" + ] + }, + "details_url": { + "description": "The entry’s \"About this image\" page.", + "type": "string" + }, + "freely_licensed": { + "description": "May be reused under a free licence. Null when no licence is recorded.", + "type": [ + "boolean", + "null" + ] + }, + "license": { + "anyOf": [ + { + "enum": [ + "cc0-1.0", + "public-domain", + "cc-by-4.0", + "cc-by-sa-4.0", + "supplied", + "permission", + "none" + ], + "type": "string" + }, + { + "type": "null" + } + ], + "description": "An upload’s licence, by id. Null for a Commons image (see `license_name`) or when none was recorded." + }, + "license_name": { + "description": "The licence’s name, e.g. \"CC BY-SA 4.0\". Null until it is known.", + "type": [ + "string", + "null" + ] + }, + "license_url": { + "description": "The licence’s text.", + "type": [ + "string", + "null" + ] + }, + "source": { + "description": "Where the image came from.", + "enum": [ + "wikimedia_commons", + "upload" + ], + "type": "string" + }, + "source_page": { + "description": "The image’s Wikimedia Commons file page, which states its licence and author.", + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "source", + "license", + "license_name", + "license_url", + "freely_licensed", + "credit", + "source_page", + "details_url" + ], + "type": "object" + }, + { + "type": "null" + } + ], + "description": "The lead image’s rights, or null when there is no image." + }, + "images": { + "description": "Every image the entry shows, the lead first. Empty when it shows none.", + "items": { + "additionalProperties": {}, + "description": "One image an entry shows.", + "properties": { + "image_rights": { + "additionalProperties": {}, + "description": "Who owns an image and how it may be reused. An entry’s text is CC0 (bar a description taken from Wikipedia); its images are licensed separately, by their owners.", + "properties": { + "credit": { + "description": "The credit line to show when reusing the image.", + "type": [ + "string", + "null" + ] + }, + "details_url": { + "description": "The entry’s \"About this image\" page.", + "type": "string" + }, + "freely_licensed": { + "description": "May be reused under a free licence. Null when no licence is recorded.", + "type": [ + "boolean", + "null" + ] + }, + "license": { + "anyOf": [ + { + "enum": [ + "cc0-1.0", + "public-domain", + "cc-by-4.0", + "cc-by-sa-4.0", + "supplied", + "permission", + "none" + ], + "type": "string" + }, + { + "type": "null" + } + ], + "description": "An upload’s licence, by id. Null for a Commons image (see `license_name`) or when none was recorded." + }, + "license_name": { + "description": "The licence’s name, e.g. \"CC BY-SA 4.0\". Null until it is known.", + "type": [ + "string", + "null" + ] + }, + "license_url": { + "description": "The licence’s text.", + "type": [ + "string", + "null" + ] + }, + "source": { + "description": "Where the image came from.", + "enum": [ + "wikimedia_commons", + "upload" + ], + "type": "string" + }, + "source_page": { + "description": "The image’s Wikimedia Commons file page, which states its licence and author.", + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "source", + "license", + "license_name", + "license_url", + "freely_licensed", + "credit", + "source_page", + "details_url" + ], + "type": "object" + }, + "link": { + "description": "Where the image links on the entry page instead of opening the full-screen viewer, or null.", + "type": [ + "string", + "null" + ] + }, + "main": { + "description": "True for the lead image, false for the gallery images after it.", + "type": "boolean" + }, + "url": { + "description": "The image, as a path on this site (`/img/w/480q75/<id>`).", + "type": "string" + } + }, + "required": [ + "url", + "main", + "image_rights", + "link" + ], + "type": "object" + }, + "type": "array" + }, + "short": { + "description": "The entry’s short name (`/<short>`), if it has one.", + "type": [ + "string", + "null" + ] + }, + "subtitle": { + "type": [ + "string", + "null" + ] + }, + "title": { + "type": "string" + }, + "url": { + "description": "The entry’s canonical page.", + "type": "string" + }, + "verified": { + "description": "Verified Handles has verified the entry.", + "type": "boolean" + }, + "vhid": { + "description": "The entry’s VHID: 11 digits, permanent.", + "pattern": "^\\d{11}$", + "type": "string" + } + }, + "required": [ + "vhid", + "short", + "title", + "subtitle", + "entity_type", + "entity_kind", + "verified", + "description", + "description_source", + "description_license", + "url", + "image", + "image_rights", + "images", + "handles" + ], + "type": "object" + }, + { + "type": "null" + } +]
Publisher details
- Operator
- Verified Handles · Publisher source
- Operator website
- https://verifiedhandles.org/ · Publisher source
- Vendor relationship
- Not applicable
- Documentation
- https://verifiedhandles.org/developers/mcp
- Trust center
- Not applicable
- Restrictions
- https://verifiedhandles.org/developers/mcp#access
Related MCP Connectors
OSINT lookups: usernames, social profiles, phones, domains, IPs, crypto wallets and companies.
Read public social profiles and posts, and search videos, news and trends.
Machine-readable entity discovery with provenance, trust and verified source evidence.
Look up creators on lookmybio: public bio pages, their links and published blog posts.
Related MCP Servers
- AlicenseAqualityBmaintenanceEnables users to look up a person's public GitHub, Bluesky, personal site, Substack, and X profiles from their full name and company domain, with status and confidence per platform and no emails or phone numbers.10MIT
- AlicenseAqualityDmaintenanceChecks username availability and retrieves account information across major social media platforms including YouTube, TikTok, Threads, X (Twitter), and Instagram, perfect for brand name qualification and competitive research.1864 npmMIT

bluepages-mcpofficial
AlicenseNot gradedqualityBmaintenanceEnables looking up Ethereum address mappings to Twitter/X and Farcaster identities, with tools for checking and retrieving identity data.1MIT- AlicenseAqualityAmaintenanceResolves TikTok handles or company domains to brand accounts, returning follower, like, video counts, verification status, and more.188 npmMIT
Glama MCP Gateway
Add one secure layer between your agents and this server.