Verified Handles
Server Details
Look up people, organisations and things, and their official social media accounts and identifiers.
- Status
- Healthy
- Uptime
- 99.8% over 21 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 63 tools
Most tools fall into recognizable families, but there are many near-duplicates: propose_entry_change vs propose_entry_changes vs propose_from_wikidata vs propose_entry_revert, and propose_wikidata_correction vs propose_wikidata_changes. The unusually detailed descriptions explicitly cross-reference alternatives, which mitigates but does not eliminate misselection risk.
Names use snake_case consistently and mostly follow a verb_noun pattern (get_entry, update_entry_fields, delete_entry_note), with batch/plural variants clearly related. A few noun-only names such as trending, handle_health, and wikidata_deleted_entries break the pattern but remain readable.
63 tools is far beyond the typical 3-15 range and falls into the 50+ extreme-load category. Even for a broad admin-console domain, the surface is too large for an agent to scan and select reliably.
Coverage is broad across entries, applications, submissions, Wikidata proposals, images, bulk changes, notes, and trending. However, several referenced tools are absent (dismiss_wikidata_correction, list_wikidata_wrong_subject_pairs, queue_entry_sync, media_catalog), creating dead ends in otherwise complete workflows.
Available Tools
63 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.
bulk_change_entriesChange a setting on many entriesADestructiveInspect
Set one setting to one value on up to 500 entries at once, named by VHID, as the Entry manager’s Bulk action does: deleted (blocked: true, with an optional reason — a merged entry stays deleted), protected, verified, follow this entry’s handle links (follow_links), history hidden (needs the Hide history permission), kept off Trending, spotlight, who may edit live (edit_policy — "admin" needs the Edit locked entries permission) or propose. An entry already so is left alone. One audit row for the whole change, which revert_bulk_change undoes. The dry run reads each entry and lists what would change. The real run needs confirm set to the target the dry run names.
| Name | Required | Description | Default |
|---|---|---|---|
| value | Yes | ||
| vhids | Yes | ||
| reason | No | A delete’s reason (blocked: true only) or a Verified change’s message (either way), kept in the audit log. | |
| 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. | |
| setting | 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?
Beyond the destructive annotation, the description adds substantial context: one audit row for the whole change, revertability via revert_bulk_change, dry-run behavior, permission requirements, merged-entry deletion behavior, and that entries already in the target state are left 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?
The purpose is front-loaded and almost every clause carries necessary information about settings, audit behavior, or confirmation. It is dense and could be easier to scan if split, but there is little actual waste.
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 bulk mutation tool, the description covers selection scope, dry-run safety, confirmation, permissions, audit/revert behavior, and most setting semantics. With annotations and an output schema also present, no major agent-facing gap remains.
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 50%, so the description must carry weight, and it does: it maps most `setting` values to behavior and explains `dry_run`, `confirm`, and `reason` semantics. However, `handles_shown` is not mentioned and the value-type mapping across settings remains only partially clarified.
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 precise verb and resource: set one setting to one value on up to 500 entries identified by VHID. The scope and bulk nature clearly distinguish it from single-entry siblings such as set_entry_setting.
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 the dry-run-first workflow, that the real run requires `confirm` from the dry run, and that revert_bulk_change undoes the whole change. It also notes permission constraints for specific settings, though it does not explicitly name single-entry alternatives like set_entry_setting.
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.
create_entry_from_qidCreate an entry from a Wikidata itemADestructiveInspect
Create a live entry straight from a Wikidata item (Console → Create from QID), with no review step: its title, subtitle, description, image and identifier handles come from the item, and the sync keeps them up to date. Refused, naming the entry, when one is already on the item or on an item Wikidata merged into it. A merged-away QID is refused (409 qid_merged), naming the item Wikidata kept in wikidata_item: create from that one. Audited. Dry run by default: it names the entries already on the item. To propose it for review instead, use propose_new_entry with qid.
| Name | Required | Description | Default |
|---|---|---|---|
| qid | Yes | The Wikidata item, e.g. "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?
Annotations already declare destructive=true and idempotent=false, and the description adds substantial context on top: no review step, ongoing sync of title/subtitle/description/image/handles, audited, and the specific 409 qid_merged refusal with a redirect to wikidata_item. That is exactly the beyond-annotation behavioral detail this dimension rewards.
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 and structured as operation → behavior/refusals → alternative. Dense and long in absolute terms, but nearly every clause (sync, refusals, 409 code, audit, dry run) carries operational weight, so little 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?
An output schema exists, so return values need not be explained, and the description fills the remaining gaps: creation path, sync behavior, refusal/error handling, audit trail, dry-run default, and the sibling alternative. Nothing an agent needs to call it correctly 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% and both params are documented in-schema, so the baseline is 3. The description adds meaning beyond the schema, though: it clarifies that dry_run (the default) 'names the entries already on the item,' and explains the QID's merged-away handling that the schema only constrains by regex.
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 ('Create a live entry straight from a Wikidata item') and frames it as the Console → Create from QID flow, so the agent knows exactly what operation is performed. It also distinguishes itself from the sibling propose_new_entry by contrasting 'no review step' with 'propose it for review instead.'
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 names the alternative ('To propose it for review instead, use propose_new_entry with qid') with the condition that selects it. It also documents refusal conditions (already on the item, or on a merged item) and routes the agent to the surviving QID via wikidata_item, which is genuine when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_entryDelete an entryADestructiveInspect
Delete an entry: it comes off the public site and joins Console → Deleted entries, with your reason (kept private). Its page and its links answer 404, as if it never existed, unless notice gives it a public removal notice: its address then answers 410 “This entry was removed” with the date and that notice’s fixed line (wikidata_deleted: its Wikidata item was deleted; not_eligible; duplicate; terms: removed under the terms of use), and its name unless hide_title. Leave notice out for a removal at the subject’s request. set_delete_notice changes it later. Nothing is erased, and restore_deleted_entry brings it back (and clears the notice). Audited. Dry run by default; the real run needs confirm set to the entry’s VHID. To ask for it instead, use report_entry.
| 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). | |
| notice | No | A public removal notice (410) instead of the 404; none when left out. | |
| reason | No | Why — the Deleted entries list shows it. Never shown publicly. | |
| 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. | |
| hide_title | No | With notice: leave the entry’s name off it. |
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 destructive/not idempotent; the description adds what an agent actually needs: the entry leaves the public site but is not erased, reason is private while listed in Console, page and links 404 unless a notice is supplied (then 410 with a fixed line and date), audited, and dry-run-by-default requiring confirm set to the VHID. That is substantive context 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?
Lead clause states the action and the public/console consequence first, then the notice behaviour, then dry-run/confirm and the sibling alternative. Dense and long, but nearly every clause carries operational information; the notice enumeration could be trimmed since the enum itself lists the values.
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, non-idempotent mutation with confirm-gated dry-run, the description covers irreversibility (only soft), restoration path, audit trail, public-visibility effects and the 404/410 distinction. Return values are covered by the output schema, so nothing essential 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 baseline is 3; the description adds public-effect semantics the schema lacks — the 410 status and per-enum fixed line, hide_title suppressing the name on the notice, and reason being private but listed. Minor friction: it says confirm must be the entry's VHID while the schema says 'this change's exact target, as the dry run gives it'.
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 ('Delete an entry') and immediately distinguishes it from look-alikes by naming restore_deleted_entry, set_delete_notice and report_entry. An agent can separate this from delete_wikidata_deleted_entry / delete_renamed_short without opening a schema, since the entry-address and 404/410 consequences are stated.
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 real routing guidance: 'leave notice out for a removal at the subject's request', 'to ask for it instead, use report_entry', and set_delete_notice for later changes. It stops short of covering the neighbouring deletion variants (delete_wikidata_deleted_entry, delete_renamed_short) or when deletion should be refused in favour of a merge.
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.
delete_renamed_shortRemove an old short nameADestructiveInspect
Remove an entry’s old short name (list_path_redirects’ renamed), as Remove on Console → Redirects and on the entry’s console card does: / stops leading to the entry and is a 404 at once (it is taken off the site’s cache), or an entry’s once one takes it as its short name. Only an old short name a rename left; never an entry’s current short or the old wiki’s aliases. Audited against the entry with the key and the tool. Dry run by default; the real run needs confirm set to the old short name’s exact key, as the dry run gives it.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | The old short name, without its leading “/”, e.g. "old-name" for /old-name. | |
| 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?
Beyond the destructive annotation, the description discloses immediate behavioral effects: /<key> stops leading to the entry, becomes a 404 at once, and is removed from the site’s cache. It also notes auditing and the dry-run/confirm workflow, adding meaningful 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?
The purpose is front-loaded, but the first sentence is dense and contains a confusing clause about an entry taking the old name as its short name. The information is largely useful, but the structure could be clearer and more concise.
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 mutation tool with full schema coverage, annotations, and an output schema, the description is complete. It covers effects, prerequisites, exclusions, auditing, and the dry-run/confirm flow.
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 key, confirm, and dry_run are already documented in the schema. The description reinforces their roles but adds little syntax or format detail 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 states a specific verb and resource: removing an entry’s old short name. It also distinguishes this from an entry’s current short name and the old wiki’s aliases, so the agent can tell exactly which resource is targeted.
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 states when to use it: only for an old short name left by a rename, never for the current short name or old wiki aliases. It also explains the dry-run default and the confirm requirement for real execution, though it does not name sibling alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_wikidata_deleted_entryDelete an entry whose Wikidata item was deletedADestructiveInspect
The Delete button on Deleted on Wikidata’s “To review” list: delete an entry because its Wikidata item is deleted. It comes off the public site, and its address answers 410 with a public notice saying its Wikidata item was deleted, with its name unless hide_title (set_delete_notice changes or suppresses it). It comes back by itself if Wikidata restores the item (restore_deleted_entry brings it back by hand), and the notice goes with the delete. A deletion on Wikidata is a reason to look at an entry, not to delete it. Audited. Dry run by default; the real run needs confirm set to the entry’s VHID.
| 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). | |
| 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. | |
| hide_title | No | Leave the entry’s name off its public notice. |
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 destructiveHint=true: it discloses the public-site effect (410 response with a public notice), that the entry's name appears in the notice unless hide_title is set, that deletion reverses automatically if Wikidata restores the item, that the action is audited, and that it dry-runs by default requiring confirm. That is exactly the behavioral 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?
Front-loaded with the core action and its trigger, then consequences, then safety mechanism. Dense but nearly every clause adds information; the nested parentheticals ('with its name unless hide_title (set_delete_notice changes or suppresses it)') make a few sentences harder to parse than necessary.
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, non-idempotent mutation with an output schema already present, the description covers effect, reversibility, audit trail, and the dry-run/confirm safety gate. An agent has everything needed to decide and to invoke correctly without needing return-value details.
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 the schema doesn't: confirm must be set to the entry's VHID as returned by the dry run, hide_title controls the public notice content rather than just a flag, and the dry-run/real-run pairing is explained. It does not restate the entry parameter's VHID/short-name/QID forms, but the schema covers those fully.
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, and triggering condition: 'delete an entry because its Wikidata item is deleted', and anchors it to the 'Delete' button on the 'Deleted on Wikidata' review list. This clearly separates it from delete_entry (ordinary deletion) and keep_wikidata_deleted_entry (the opposite action).
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?
Places the tool in a concrete workflow (the 'To review' list) and warns 'A deletion on Wikidata is a reason to look at an entry, not to delete it', which is real usage guidance. It names restore_deleted_entry and set_delete_notice as related tools, but never mentions keep_wikidata_deleted_entry, the sibling that represents the alternative decision, so the when-not-to-use branch 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.
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_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?
Beyond the readOnlyHint/openWorldHint annotations, the description discloses per-item result semantics ('each answered as get_entry answers it signed out — the entry, or not_found'), guarantees result ordering, and states that duplicated names are collapsed to one answer. That is genuinely useful behavioral context an agent cannot get from 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?
A single dense sentence with zero filler; the batch size, accepted inputs, and fallback routing are all front-loaded before the per-item result behavior. Every clause carries 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 and 100% parameter coverage, the description covers the remaining gaps an agent needs — input forms, limit, ordering, dedup, and per-item failure mode. Nothing material 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 coverage is 100%, but the description still adds value: it clarifies the accepted identifier forms, rules out QIDs (a critical constraint the schema's string pattern does not cover), and explains deduplication semantics for repeated names.
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 the specific action (fetch public records for many entries in one call), the identifier forms accepted (VHID or short name), and the batch limit. It explicitly differentiates from siblings by excluding Wikidata QIDs and naming get_entry and search_entries as the tools for the item-based lookup.
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 when-not rule ('not a Wikidata QID') and routes the agent to the correct alternatives for that case. Batch-vs-single usage is implied by 'up to 50 ... in one call' rather than stated outright, so it stops short of a full when/when-not/alternatives treatment.
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 establish readOnlyHint=true and openWorldHint=false, so the description's added value is the auth-dependence ('Without an API key, the public record alone') and the disclosure that the payload expands into an `editing` block including live-edit permission. That is meaningful behavior beyond the structured fields; only rate limits / not-found behavior are unaddressed.
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?
It is a single dense sentence-pair that front-loads the lookup keys before the payload detail, with no filler. It borders on overlong for a read tool, and the em-dash cascade of returned fields is harder to scan than a short list would 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 the description needn't explain return values, yet it does, plus the auth-gated difference between public and editing payloads. What remains missing is minor: not-found/error behavior and whether the entry key is case-sensitive.
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 already documented, and the description merely restates the three accepted key forms (VHID, short name, QID). The `include_platforms` auth requirement is stated in the schema, not added here, so 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 opens with a precise verb+resource and a retrieval key set ('One entry, by VHID, short name or Wikidata QID'), then enumerates the returned record. It implicitly separates itself from get_entries (plural) and get_entry_history by describing the current-record payload, but it never names a sibling to differentiate against 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?
'Without an API key, the public record alone' gives a real conditional on when you get the full editing payload, which is useful context. However, there is no guidance on choosing this over get_entry_admin, get_entry_history, find_by_handle, or search_entries — the agent has to infer the boundary from the return-shape prose.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_entry_adminEntry, as the Entry manager shows itBRead-onlyInspect
The Entry manager’s card for one entry (deleted and merged ones too, by VHID): its status and policies, who manages each field (field_sources), when it was last synced (synced_at) and, after a failed fetch, when the sync tries again (retry_at), its merge state and duplicates on its QID, its recent history and its audit trail.
| 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 |
|---|---|---|
| can | Yes | What the caller may see and do here beyond managing it. |
| audit | Yes | The last 20 audit rows on it; empty without `view_audit`. |
| kinds | No | The kinds the Kind control offers, when `can.kind`: each kind’s id and its label (“musical group”). |
| merge | Yes | |
| tools | Yes | The entry editor’s tools for the caller, as `GET /api/editor/{vhid}` gives them: `sync`, `syncBlockedBy` and `syncTypeOnly` (Sync from Wikidata now, `POST /api/entity/{vhid}/sync`), and with `review` the waiting proposals and reports to decide in place (`POST /api/entity/{vhid}/submissions/{id}/{decision}`). |
| entity | Yes | |
| handles | Yes | |
| history | Yes | The last 30 revisions, as the caller may see them. |
| renamed | Yes | The entry’s old short names, newest first, each a 301 here until another entry takes it; `DELETE /api/redirects/:key` removes one. |
| heldBack | Yes | Values Wikidata lists as current that a person took off, so the sync does not add them back. An email’s are left out of both lists for an account that may not edit the entry (`can.edit` false), as its handle is masked. |
| linkNames | Yes | The current name of each live entry the description links to, by VHID: its cross-links store only the VHID. |
| baseRevisionId | Yes | The revision an edit is made against. |
| heldBackNotListed | Yes | Held back too, but Wikidata no longer lists them as current. Empty, like `heldBack`, without an item or on a protected or claimed entry. |
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 known. The description adds useful content-level context, including field_sources, synced_at, retry_at, merge state, duplicates, history, and audit trail, but does not mention admin permissions, access requirements, or pagination behavior.
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 front-loaded and keeps to a single dense sentence with no filler. Every listed element corresponds to useful card content, though the long parenthetical sequence is somewhat hard to parse quickly.
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, full parameter schema coverage, and read-only annotations, the description does not need to explain return values or parameter syntax. It is complete about the card’s contents but leaves the critical get_entry vs get_entry_admin choice and admin-access expectations 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 description coverage is 100%, so the schema already documents that the entry parameter accepts a VHID, short name, or QID. The description only says 'by VHID', which adds no meaning beyond the schema and slightly under-represents the accepted identifier formats.
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 specifies a clear verb-and-resource: retrieving the Entry manager’s card for one entry, including deleted and merged entries. It does not explicitly distinguish itself from the sibling get_entry tool, leaving the admin-vs-public distinction implicit in the title and phrasing.
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 lists what the card contains but gives no explicit guidance on when to use this tool instead of get_entry, get_entries, or get_entry_history. The only hint is that deleted and merged entries are included, which implies an admin use case without stating it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_entry_historyEntry historyBRead-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?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds real value beyond that: newest-first ordering, pagination ('next_offset pages on'), and the merged-entry key behavior. Note the response token 'next_offset' is referenced but absent from the schema, which is useful output 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?
Two short sentences, front-loaded with the core purpose and followed by scope/edge-case detail. Nearly no waste, though the parenthetical 'next_offset pages on' is slightly cryptic without schema support.
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 not be explained, and the read-only nature is covered by annotations. However, the undocumented limit/offset parameters and the absence of any when-to-use framing leave the definition only minimally complete for a paginated history tool.
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 only 33%: 'entry' is documented, but 'limit' and 'offset' have no description anywhere. The description does not compensate for those gaps (e.g., paging semantics, defaults, max values), leaving half the parameters ambiguous.
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: an entry's public edit history, newest first. It distinguishes itself from get_entry/get_entry_admin by specifying 'public' history, and it handles the merged-entry edge case. Clear, though it does not explicitly name a sibling to avoid.
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 explicit when-to-use/when-not guidance or routing to alternatives (e.g., get_entry_admin for admin history). Usage is implied by the resource name, and the merged-entry note is a partial hint, but nothing tells the agent which of get_entry, get_entry_admin, or this tool to pick.
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.
handle_healthHandle healthBRead-onlyInspect
Stored handles whose value is malformed (Console → Handle health), YouTube channel IDs Wikidata states only as a qualifier on the item’s YouTube handle (channel_qualifier_only, “The channel ID is only a qualifier on Wikidata”: the sync still counts them as listed; get_reconcile offers the statement), and the YouTube pair, an @handle and a channel ID that are one channel: youtube_pair_differs (the entry’s handle and channel are different channels, not always wrong: an organisation can have two channels), youtube_channel_missing (the handle’s channel is known and the entry lacks it), youtube_handle_missing (the channel’s @handle is known and the entry lacks it; YouTube gives it in lower case, so its offer has case_known false unless Wikidata gives the case) and youtube_pair_conflict (VH’s handle checker and Wikidata name different channels for a handle). A count per check, by where the value came from, and — for one check — the handles it finds, oldest first, 50 a page, each with the value it offers to add, if any. A job adds a missing half by itself where the checker confirmed it and the case is known; the rest is a person’s call. Fix or add with update_entry_handles.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| vhid | No | Only this entry (counted live). | |
| check | No | A check id from `checks` — lists the handles that fail it. |
Output Schema
| Name | Required | Description |
|---|---|---|
| list | Yes | The handles failing `check`, when one was asked for. |
| vhid | Yes | |
| checks | Yes | |
| not_live | Yes | |
| counted_at | Yes | When the site-wide counts were taken; null for one entry’s. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description goes well beyond that: it explains each check's meaning, that a job auto-adds a missing half when the checker confirmed it and the case is known (with the rest deferred to a person), that YouTube supplies handles lower-cased so `offer.case_known` may be false, and that results are oldest-first, 50 per page. That is real behavioral context the annotations do not 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 bulk is one enormous run-on sentence cramming five check definitions, output shape, pagination, and remediation routing into a single breath. Only the trailing sentences are separable. The key purpose statement is buried mid-clause rather than front-loaded, so the reader must parse the whole thing to learn what the tool is.
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 the per-check counts and handle listings need not be re-explained, yet the description spends most of its length on them while leaving practical gaps: how the agent obtains a valid `check` id (presumably from the `checks` output), and what happens when no `check` is supplied. For a read-only diagnostic whose safety is annotation-covered, this is adequate but not tight.
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%: `vhid` and `check` are documented in the schema, `page` is not. The description reinforces `check` semantics ('lists the handles that fail it') and adds pagination/ordering detail ('oldest first, 50 a page'), plus that `vhid` is counted live. That is marginal value over the schema and consistent with the 3 baseline for high-ish coverage.
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 apenultimate clause reveals the tool is a report of malformed/stored handle values, and the check ids establish the resource as 'handles'. But the opening clause is a dense fragment with no verb, so an agent must reconstruct 'this lists handles that fail health checks' from the check vocabulary rather than reading it stated. It is distinguishable from siblings like get_reconcile and update_entry_handles, but only indirectly.
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 final sentence routes the agent: 'Fix or add with update_entry_handles,' which names the alternative for remediation. However, there is no explicit statement of when to reach for this tool (e.g. before a sync, after a reconcile, to audit an entry) and no exclusions. Usage is implied by the check list rather than declared.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
keep_wikidata_deleted_entryKeep an entry whose Wikidata item was deleted, still linkedADestructiveIdempotentInspect
Deleted on Wikidata’s “Keep, still linked” on an entry in “To review”: takes it off that list and leaves it exactly as it is, on its deleted item, with its notice. The sync still reads the item, so if Wikidata restores it the entry syncs again by itself (and the decision ends); with its QID it is never offered as a new Wikidata item; if Wikidata deletes the item again later, it comes back to “To review”. reason is recorded with the decision. With undo: true, “Put back to To review” on an entry in “Kept, still linked”. Audited. Dry run by default.
| Name | Required | Description | Default |
|---|---|---|---|
| undo | No | Put it back to “To review” instead. | |
| entry | Yes | The entry: its VHID (11 digits), its short name (as in verifiedhandles.org/<short>), or its Wikidata QID (Q42). | |
| reason | No | Why it is kept (optional; not with undo). | |
| 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?
With readOnlyHint=false, destructiveHint=true, idempotentHint=true and openWorldHint=false already declared, the description still adds real context: the sync keeps reading the item so the entry re-syncs automatically if Wikidata restores it, the QID prevents re-offering as a new item, re-deletion returns it to "To review", and the action is audited. It doesn't reconcile the apparent tension between "leaves it exactly as it is" and destructiveHint=true, nor explain what auditing entails, so it stops short of 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?
The main effect and the alternative path are front-loaded, followed by consequences, then undo, audit and dry-run in a tight single paragraph with no filler. Dense nesting of quoted UI labels makes it heavier reading than it needs to be, but every clause carries 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 state-machine workflow tool with an output schema and full annotation coverage, the description covers the transitions, the automatic re-sync consequence, the undo path, and the dry-run default. Nothing an agent would need to invoke it correctly in the review workflow 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, but the description genuinely adds meaning: it clarifies what undo actually targets (an entry in "Kept, still linked", reverting to "To review") and that reason is recorded with the decision record, beyond the schema's terse 'why it is kept'. The dry_run default is restated rather than expanded.
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?
It states a specific verb and resource (keep an entry whose Wikidata item was deleted) and the concrete effect: removes it from the "To review" list while leaving the entry linked to its deleted item. The mapping to the UI action "Keep, still linked" separates it from the sibling delete_wikidata_deleted_entry and restore-style tools. The jargon-laden opening sentence slightly obscures the plain statement of purpose.
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 the exact applicability conditions: an entry sitting in "To review" because its Wikidata item was deleted, plus the inverse state ("Kept, still linked") required for undo. It does not explicitly name a sibling tool to prefer instead, but the state-machine framing makes the when-to-use boundary inferable.
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_bulk_changesBulk changesARead-onlyInspect
The latest 50 bulk changes to entries’ settings (Entry manager → Bulk), newest first: who, when, which setting, to what, how many entries, and which earlier change a revert undid. With bulk_id, that one change and every entry it changed, each with its value before.
| Name | Required | Description | Default |
|---|---|---|---|
| bulk_id | No | The bulk change’s id (list_bulk_changes). |
Output Schema
| Name | Required | Description |
|---|---|---|
| op | No | |
| ops | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare read-only and closed-world behavior, and the description adds meaningful context: the latest 50 changes, newest-first ordering, returned fields, and before-values for the bulk_id detail mode. It still does not clarify whether the 50-item cap is truncation with no pagination or how to access older bulk changes.
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 front-loaded with the default result, then immediately explains the bulk_id variant. Every phrase adds useful information, and the parenthetical helps orient the agent to the product area without wasting space.
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 low-complexity read-only tool with one optional parameter, full schema coverage, annotations, and an output schema, the description covers both retrieval modes and the most important behavioral traits. No critical calling information 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, but the description adds real meaning beyond the schema by explaining that bulk_id switches from the latest-50 list to one bulk change plus every affected entry with prior values. It does not repeat the schema's ID pattern, which is fine, and the 'With bulk_id' phrasing usefully implies the parameter is optional.
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: listing bulk changes to entries' settings, with a clear default and single-change mode. It is easy to distinguish from mutation siblings by name and behavior, but it does not explicitly name alternatives such as bulk_change_entries or revert_bulk_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?
It implies when to pass bulk_id by describing the resulting single-change view, but it gives no explicit when-to-use guidance versus sibling tools. There are no exclusions or named alternatives for listing other kinds of entry history.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_duplicate_qidsEntries sharing a Wikidata itemARead-onlyInspect
Entries that share a Wikidata QID, with the one the merge would keep. With a qid, that item’s cluster; without, the largest clusters still to merge.
| Name | Required | Description | Default |
|---|---|---|---|
| qid | No | ||
| limit | No | How many clusters, without a qid. |
Output Schema
| Name | Required | Description |
|---|---|---|
| qid | No | |
| live | No | Entries on the item that are neither deleted nor merged. |
| members | No | Every entry on the item, the suggested one to keep first, merged and deleted ones last. |
| clusters | No | |
| suggested | No | The entry to keep: the first live one, or null when none is. |
| qids_as_of | No | When the items more than one entry is linked to were last looked for. |
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 useful behavior beyond that: the result marks which entry a merge would retain, and the no-qid mode is scoped to 'largest clusters still to merge', implying ordering/priority — genuinely useful 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?
Two tight sentences, zero filler, with the core purpose front-loaded and the two input modes following. Every clause carries information about behavior or usage.
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 detail is not required, and annotations cover safety. The description explains both invocation modes for a read-only listing tool with 2 params, leaving only minor gaps (no explicit sibling routing) for an otherwise complete definition.
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% (qid has a pattern but no description), so the description must compensate, and it does: it defines what supplying or omitting `qid` returns. It also contextualizes `limit` via 'largest clusters', adding meaning beyond the schema's bare 'how many clusters'.
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 returns: entries sharing a Wikidata QID, annotated with the entry a merge would keep. It is a specific resource (duplicate QID clusters) distinct from action tools like merge_entry or unmerge_entry, though it never names a sibling to disambiguate against get_entries or search_entries.
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 conditional usage: pass a `qid` for that item's cluster, omit it for the largest clusters still to merge. This explains both operating modes clearly, but it stops short of naming alternatives or stating when-not to use the tool.
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.
merge_entryMerge an entry into anotherADestructiveInspect
Merge a duplicate entry into the one to keep (list_duplicate_qids suggests which): the kept entry gains the handles it lacks, and the merged one comes off the site and redirects there for good. Open proposals, claims and reports on the merged entry must be decided first. Needs the right to edit both. Undo with unmerge_entry. Audited. Dry run by default; the real run needs confirm set to the VHID of the entry being merged away. To ask for it instead, use report_entry.
| Name | Required | Description | Default |
|---|---|---|---|
| into | Yes | The entry to keep. | |
| entry | Yes | The entry to merge away. | |
| 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 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. |
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 destructive/not-idempotent, but the description adds substantial context beyond them: the kept entry inherits handles, the merged entry leaves the site and redirects permanently, edits are audited, permission to edit both entries is required, and dry_run defaults to true with the real run gated on confirm. This is exactly what an agent needs before a destructive merge.
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: merge semantics first, then preconditions, permissions, undo, and finally the dry-run/confirm gate. Every sentence adds a distinct operational fact with 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, non-idempotent tool the description covers preconditions, auth requirements, audit behavior, reversibility, and the two-phase dry-run/confirm flow. With an output schema present, there is no need to explain return values, 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 100%, so the baseline is 3, but the description adds genuine meaning: confirm must be 'the VHID of the entry being merged away' and dry_run is default-true, clarifying the otherwise circular schema wording ('as the dry run gives it in confirm'). It does not restate entry/into beyond the schema's own 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 with directionality baked in: 'Merge a duplicate entry into the one to keep.' The agent immediately knows which entry survives and which is removed, and it is clearly distinct from unmerge_entry and report_entry named in the same text.
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 between alternatives: list_duplicate_qids to find candidates, unmerge_entry to undo, report_entry to merely ask. It also gives a hard precondition ('Open proposals, claims and reports on the merged entry must be decided first'), so the agent knows when the call will be rejected.
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. 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 adds extensive behavior beyond the annotations: dry-run defaults, no writes to Wikidata, review/card workflow, ordered edits, stop-on-failure, permissions, rate limits, 409 refusal cases, warnings, adoption/joining of open changes, and extra website-language steps. This is unusually rich disclosure and does not contradict `readOnlyHint=false`, `destructiveHint=false`, or `idempotentHint=true`.
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, and most details are relevant to correct invocation, but the description is a very long, dense paragraph with legalistic parentheticals and repeated refusal wording. It is comprehensive but could be structured with bullets or sections to make the operational rules 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?
Given the tool's complexity, the description covers the critical operational context: permissions, dry-run behavior, ordering, validation, refusal cases, warnings, adoption/joining, and post-processing. Since an output schema exists, the description need not explain return values, and it is otherwise complete enough for an agent to invoke the 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?
Although schema description coverage is 67%, the description adds substantial meaning: `qid` identifies the item, `kind` applies to every change, `evidence` is shared unless overridden, and `changes` are ordered and shaped like `propose_wikidata_correction` entries without `qid`, `kind`, or `dry_run`. It also explains allowed action families, per-change `evidence`, and `statement_guid` references such as `step:N`.
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: propose several changes to one Wikidata item as one group/proposal. It clearly distinguishes this from `propose_wikidata_correction` by emphasizing multiple changes and by explaining that a one-change proposal falls back to that tool's behavior.
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 strong context for when this tool is appropriate: multiple changes to one item, filed as one proposal, dry-run by default, with trusted/administrator permissions and rate-limit rules. It also references `propose_wikidata_correction` as the per-change schema and single-change behavior, though it does not give a crisp explicit routing rule between the two.
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); 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); 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); 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. 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?
Adds substantial behavior beyond annotations: dry-run by default, nothing written to Wikidata, filing and audit behavior, approval requirements, the trusted-editor 200/day limit, and many 409/422 refusal and warning paths. This is consistent with readOnlyHint=false and destructiveHint=false: the tool writes a proposal row, not a Wikidata 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?
The opening is front-loaded, but the body is an extremely long, semicolon-heavy wall of text without headings or action-based structure. The detail is mostly relevant, yet readability and scanability suffer badly, so it is not appropriately concise for an agent selecting the tool.
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 tool with 18 actions, 28 parameters, nested objects, and an output schema, the description covers workflow, edge cases, refusals, warnings, and return-side signals. Nothing material appears 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 coverage is already high at 93%, but the description meaningfully expands semantics for value shapes, references, qualifiers, value_seen, outranked, and action-specific requirements. It adds much more than the schema alone, so it earns full credit.
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 and resource: 'Propose a correction to a Wikidata statement', names the review workflow, and describes the proposal-only scope. It does not explicitly contrast with the closely named sibling propose_wikidata_changes, so selecting between the two still requires inference.
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 extensive when-to-use guidance, including dry-run default, filing behavior, alternatives such as dismiss_wikidata_correction, update_entry_handles, search_commons_images, and propose_wikidata_changes for grouped account/count changes. The guidance is embedded in dense prose rather than a clear top-level selection rule, so the sibling distinction remains easy to miss.
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.
restore_deleted_entryRestore a deleted entryADestructiveInspect
Bring a deleted entry back onto the public site, as it was; any public removal notice goes. Name it by its VHID (a deleted entry has no public short name). A merged entry stays deleted while it redirects: undo the merge with unmerge_entry instead. Audited. 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. |
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, the description discloses that any public removal notice goes away, that merged entries remain deleted unless unmerged, that the action is audited, and that dry run is the default. This is substantial behavioral context for a mutation tool with destructiveHint=true.
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 compact and front-loaded with the main action. Every sentence adds relevant information: scope, identifier handling, the merge exception, auditing, and dry-run default.
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, full schema coverage, and presence of an output schema, the description covers what an agent needs: the restore effect, the merge exception, the identifier nuance, audit behavior, and dry-run default.
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 documents both parameters. The description still adds useful meaning by explaining why the entry should be specified as a VHID for deleted entries, though it does not go beyond the schema on dry_run 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?
The description states a specific verb and resource: bringing a deleted entry back onto the public site. It also distinguishes this from the similar unmerge_entry sibling by explaining that merged entries must be handled there instead.
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 when-to-use guidance for restoring a deleted entry and an explicit when-not-to-use case: merged entries that still redirect should use unmerge_entry. It also notes that the entry should be named by VHID because deleted entries have no public short name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
restore_entry_revisionRestore an entry to an earlier revisionADestructiveInspect
Put an entry back as it was at one of its revisions (get_entry_admin → history: a ref_id like "r123" with restorable: true; imported legacy revisions cannot be restored). It is a new revision, so it can itself be undone. Needs the right to edit the entry. To ask a reviewer instead, use propose_entry_revert. Audited. 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. | |
| 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. | |
| revision | Yes | The revision’s ref_id, e.g. "r123". |
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 (destructiveHint=true, idempotentHint=false) by explaining that the restore is itself a new revision and therefore undoable, that it requires edit rights, that it is audited, and that it defaults to a dry run. The 'imported legacy revisions cannot be restored' constraint is behavioral knowledge available nowhere else. No contradiction with the destructive hint — the write is real, just recoverable.
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 preconditions, alternative, and defaults. Dense and every clause carries information, though the parenthetical dependency chain plus the trailing short sentences make it a touch cluttered rather than 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?
An output schema exists so return values need no explanation; the description covers everything else an agent needs — permission, revision precondition, restorability limits, alternative tool, dry-run default, and undoability. Nothing material is missing for a 4-param destructive mutation.
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 meaning beyond the schema: where the `revision` value comes from (get_entry_admin history), its accepted shape and the `restorable: true` gating flag, and the dry-run/undo semantics of the operation. That is real value over 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: 'Put an entry back as it was at one of its revisions.' It distinguishes itself from the sibling propose_entry_revert and from the read-only get_entry_admin/history it depends on, so an agent can route correctly 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 the exact precondition chain (get_entry_admin → history, look for a ref_id with restorable: true), an explicit exclusion (imported legacy revisions cannot be restored), required permission (right to edit the entry), and a named alternative with its selecting condition ('To ask a reviewer instead, use propose_entry_revert').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
restore_wikipedia_creditRestore the “from Wikipedia” creditADestructiveInspect
Put back the “from Wikipedia” credit on an entry’s description, with no likeness threshold (your judgement): read fresh from its Wikidata item’s English Wikipedia article, or from the article or draft named in title (a title or an address; the server reads it, redirects followed). A draft’s credit hands the description to the Wikidata sync unless let_wikidata_manage is false; any other description, or field, is handed back with set_wikidata_ownership (relinquish_fields). Needs a description, a linked item when no title is named, and the right to edit the entry. A revision. Audited. 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). | |
| title | No | The English Wikipedia article or draft to credit, by title or address. Left out: the item’s own English article. | |
| 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. | |
| 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 flag destructive=true and readOnly=false, and the description adds real context on top: dry run by default, a revision is created, the action is audited, redirects are followed, and a draft's credit hands the description to the Wikidata sync unless let_wikidata_manage is false. It never states plainly that the entry's current description is overwritten, which is the main destructive consequence.
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, and the clipped final sentences ('A revision. Audited. Dry run by default.') are efficient. However, the middle runs as one long chain of parentheticals about drafts and ownership handoff, which costs readability for an agent parsing it once.
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, irreversible-ish mutation with external Wikipedia/Wikidata reads, the description covers what is needed: prerequisites, what source is read, ownership side effects, opt-out flag, dry-run default, revision/audit trail. With an output schema present and annotations covering the safety profile, nothing load-bearing 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, but the description adds meaning the schema does not: `title` may be a title or an address and the server reads it with redirects followed, and `let_wikidata_manage` is explained through the draft-vs-article lifecycle. The `entry` and `summary` parameters get no added semantics, which keeps it out of 5 territory.
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 ('Put back the "from Wikipedia" credit on an entry's description') and immediately distinguishes itself from the neighboring ownership tool by naming set_wikidata_ownership as the route for any other description or field. An agent can tell it apart from create_entry_from_qid or set_wikidata_ownership without opening 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 prerequisites ('Needs a description, a linked item when no title is named, and the right to edit the entry') and routes the non-matching case to set_wikidata_ownership (relinquish_fields), which is genuine when-not guidance. The route is buried in a dense parenthetical rather than framed as an explicit 'use this instead when', so it stops short of a clean 5.
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.
revert_bulk_changeUndo a bulk changeADestructiveInspect
Undo a bulk change (list_bulk_changes): each entry it changed goes back to its value before, unless it is already there — or, for a delete, it has been merged since. The revert is itself a bulk change, so it can be undone the same way. Audited. Dry run by default; the real run needs confirm set to the bulk change’s id.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | No | Why, for an undo of a Verified change, kept in the audit log; an undo of any other setting keeps none. | |
| bulk_id | Yes | The bulk change’s id (list_bulk_changes). | |
| 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: it discloses skip conditions (already at prior value; deleted entries that were merged since), that the revert is itself a bulk change and therefore recursively undoable, that it is audited, and that it is dry-run by default. These are exactly the facts an agent needs before touching a destructive operation.
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 dense sentences, no filler. Safety-critical facts (skip conditions, reversibility of the revert) come before the operational detail (audited, dry run, confirm), which is the right ordering.
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 covers the mutation semantics thoroughly. Minor gaps: no statement of permissions/auth requirements or of what happens on partial failure, and the confirm-value ambiguity noted above.
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, and the description adds the dry-run default and the confirm gate. However, it says confirm is 'set to the bulk change’s id' while the schema says confirm is 'this change’s exact target, as the dry run gives it in `confirm`' — a discrepancy that could cause a failed or wrong call.
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 ('Undo a bulk change') and immediately ties it to the lookup sibling (list_bulk_changes), so an agent knows how to obtain the required id. The per-entry semantics (restore prior value, skip if already there, skip deletes already merged) make it unmistakable against siblings like propose_entry_revert or bulk_change_entries.
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?
Explicit invocation protocol: dry run is the default and the real run requires confirm. It also routes id discovery to list_bulk_changes. It does not explicitly state when to prefer this over propose_entry_revert (proposal vs. direct undo), so the alternative-selection 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.
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.
revoke_claimRevoke a claimADestructiveInspect
Revoke the claim on an entry (Console → Policy): the account that claimed it no longer holds it, so the entry is edited and synced like any other again. Whether it is protected from the Wikidata sync is left as it is (set_entry_setting). A revision, and audited. Dry run by default; the real run needs confirm set to the entry’s VHID.
| 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). | |
| 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?
Annotations already declare destructiveHint=true and readOnlyHint=false, and the description adds substantive behavior beyond them: a revision is produced, the action is audited, the Wikidata-sync protection flag is explicitly left unchanged, and the dry-run/confirm safety workflow is spelled out. This is exactly the extra context the 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?
Three dense sentences with the core effect front-loaded, followed by scope limits and the safety workflow. The parenthetical pointers add navigation value rather than filler, though the confirm/VHID phrasing is slightly compressed and ambiguous.
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 an output schema exists and annotations carry the safety profile, the description covers what an agent needs: mutation semantics, auditability, unchanged settings, and the two-step dry-run/confirm flow. The only residual gap is the minor inconsistency in how confirm's value is described relative to the dry-run output.
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 entry, confirm and dry_run are already documented, and the description appropriately reinforces the dry-run default. However, it says confirm must be 'set to the entry's VHID' while the schema says confirm is the exact target as returned by the dry run—a subtle mismatch that could mislead rather than clarify.
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 the claim on an entry') and immediately clarifies the effect: the claiming account no longer holds it and the entry returns to normal editing/sync behavior. It also routes adjacent concerns to set_entry_setting, so an agent can separate this from the many other entry-mutating siblings.
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 operational context: dry run is the default and a real run requires confirm, plus an explicit pointer to set_entry_setting for the Wikidata-sync protection decision it deliberately does not touch. It stops short of stating when revocation is inappropriate (e.g. versus revert or propose_entry_revert), so it is 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.
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 the safety profile is covered. The description usefully explains matching behavior (QID resolves linked entries; VHID returns the entry plus its backlinkers), which is real added context. It says nothing about result ordering, pagination behaviour, or caps, which is a gap but not a contradiction.
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 front-loaded sentence that opens with the search metaphor, then enumerates the three matching modes in a compact colon-separated list. Dense but every clause carries distinct meaning; 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 read-only search with an output schema already defining return shape, the description covers the essential matching semantics an agent needs. The remaining gap is pagination (limit/offset behaviour), which matters given the hard caps but is minor relative to what is 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 description coverage is 0%, so the description carries the burden, and it does explain "query" thoroughly across all three input forms. However, limit and offset are documented nowhere — neither the 50-item cap nor the 10000 offset ceiling — leaving two of three parameters opaque.
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") whose three matching modes — free text over titles/subtitles/descriptions, Wikidata QID, and VHID — clearly separate it from lookup siblings like get_entry or find_by_handle. It stops short of naming an alternative outright, but the semantics are unmistakable.
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 clause "as the site search does" plus the three query modes tells an agent exactly which input shapes are valid and therefore when this tool applies. It never states when to prefer get_entry, get_entries, or find_by_handle instead, so there is no exclusion guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_delete_noticeSet or suppress a deleted entry’s public noticeADestructiveIdempotentInspect
Change what a deleted entry’s address shows: a public removal notice (HTTP 410 “This entry was removed”, with the date and the notice’s fixed line — wikidata_deleted, not_eligible, duplicate or terms — and the entry’s name unless hide_title), or none (notice: null), when it 404s as if it never existed. The delete’s own reason is never shown. Only a deleted entry (not a merged one). Audited; the cached page is purged. 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). | |
| notice | Yes | The notice, or null for none (the 404). | |
| dry_run | No | true (the default): write nothing — show the change and the exact request it would send. false: make the change. | |
| hide_title | No | Leave the entry’s name off the notice. |
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 annotations by explaining the HTTP 410 notice behavior, the fixed notice lines, hide_title effect, what happens when notice is null, and that the delete reason is never shown. It also states the operation is audited and purges the cached page, adding important mutation 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?
The key behavior is front-loaded: “Change what a deleted entry’s address shows.” Despite being dense, every clause carries useful information about notice content, null behavior, scope, audit/purge side effects, and dry-run default.
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?
Complete for a destructive mutation tool: annotations cover safety/idempotency, the schema fully documents parameters, and an output schema exists. The description supplies the remaining behavioral context an agent needs before invoking it.
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 by explaining what the notice enum values and null actually display, and how hide_title affects the public notice. It does not add much detail for the entry identifier beyond what the schema already documents.
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: changing what a deleted entry’s address shows, either a public removal notice or a 404. It also scopes the operation to deleted entries only, explicitly excluding merged entries, which distinguishes it from restore/keep/delete siblings.
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: only a deleted entry, not a merged one, and notes that dry run is the default. It does not explicitly name alternative sibling tools such as keep_wikidata_deleted_entry or restore_deleted_entry, so routing guidance is strong but not fully explicit.
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_entry_settingChange an entry’s settingADestructiveIdempotentInspect
Set one of an entry’s settings, as the Entry manager’s switches do: who may edit it live (edit_policy: "trusted" | "admin" — "admin" locks it), who may propose changes (propose_policy: "registered" | "trusted" | "admin" | "closed"), protected from the Wikidata sync, history hidden (needs the Hide history permission), kept off Trending, verified, follow this entry’s handle links (follow_links: its handle links are followed as a verified entry’s are), how many accounts its page shows before “Show more” (handles_shown: a whole number, 0 = every account, null = the site-wide rule; use sparingly), or its spotlight rank (a whole number, 0 = none). A Verified change takes an optional message, kept in the audit log. Audited; undo by setting it back. To delete an entry use delete_entry. 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). | |
| value | Yes | ||
| reason | No | Why, for a Verified change (either way), kept in the audit log. Plain words; any other setting keeps none. | |
| dry_run | No | true (the default): write nothing — show the change and the exact request it would send. false: make the change. | |
| setting | 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?
Adds substantial behavior beyond the annotations: dry run is default, changes are audited, they can be undone by setting the value back, and history hiding requires the Hide history permission. It also explains locking behavior, the optional audit reason for Verified changes, and cautions that handles_shown should be used sparingly.
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 and every clause carries specific information, which is justified by the nine settings. However, the main sentence is very long and could be more scannable as a list, and the final dry-run sentence partly repeats the schema description.
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 complexity, destructive potential, and permission-sensitive settings, the description provides enough operational context: what each setting does, required permissions, audit behavior, undo path, and deletion routing. An output schema exists, so return-value detail is not needed here.
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 60%, but the description compensates extensively by explaining every setting and its accepted values, including edit_policy, propose_policy, follow_links, handles_shown semantics (0 vs null), and spotlight rank. It also clarifies the reason and dry_run parameters beyond what the schema states.
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 one of an entry’s settings," then enumerates the actual settings and values. It also distinguishes deletion by pointing to delete_entry, so an agent can separate it from the delete sibling.
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 through the setting list, the dry-run default, and the explicit "To delete an entry use delete_entry" alternative. It does not contrast with other update siblings such as update_entry_fields, bulk_change_entries, or set_trending, so some alternative routing is left implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_entry_wikidata_itemLink an entry to a Wikidata item, or unlink itADestructiveInspect
Point an entry at a different Wikidata item (a QID), or unlink it (qid: null) — the fix for a wrong link. The item decides what the sync writes onto the entry; adopt chooses which fields it may manage (left out: the server’s default on a first link, unchanged on a re-point). A revision, so it can be undone. Needs the right to edit the entry. Audited. Dry run by default. To ask a reviewer instead, use propose_entry_change.
| Name | Required | Description | Default |
|---|---|---|---|
| qid | Yes | ||
| adopt | No | 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). | |
| 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. |
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 mutation and destruction profile, and the description adds substantial context beyond them: dry run by default, requirement of edit rights on the entry, audit, and that the change is a revision and therefore undoable. It also explains how the item drives what the sync writes onto the entry.
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, leading with the core action and constraint before the fallback sibling. The em-dash-heavy phrasing packs a lot in, bordering on compressed, but every clause carries operational 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?
An output schema exists, so return values need no explanation, and the description covers the remaining essentials for a destructive mutation: permissions, audit, undoability, dry-run default, and the reviewer alternative. Nothing an agent needs to call it correctly 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 80% schema coverage the schema already documents the parameters, but the description adds real meaning: qid: null means unlink, and adopt's omission resolves differently on a first link (server default) versus a re-point (unchanged). That default-behavior nuance is not in the schema, though the individual field choices of adopt remain schema-only.
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: point an entry at a different Wikidata item (a QID), or unlink it with qid: null. It distinguishes itself from siblings both by scope and by naming propose_entry_change as the reviewer alternative.
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 the scenario ("the fix for a wrong link") and names the alternative path to a reviewer (propose_entry_change), with the dry-run default signalling when a real change is committed. Nothing material is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_trendingHide an entry from Trending, or decide a suggestionADestructiveIdempotentInspect
Decide an entry’s place in Trending, as Console → Trending does. "hide": keep it out of the Trending row and the search box’s trending list, even when spotlighted or most viewed (the entry stays public). "allow": undo that — when the sync hid it, it will not hide it again. "keep": decide a suggested entry stays, which takes it off the suggestions without hiding it (nothing public changes). "undecide": undo a keep, so it may be suggested again. Audited. 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. | |
| decision | 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, idempotentHint=true and non-readOnly, so the safety profile is partly covered; the description goes further by disclosing the audit trail, dry-run-by-default behavior, the persistence rule that a sync-hidden entry 'will not hide it again', and the reassurance that hide leaves the entry public and keep changes nothing public. It does not describe rate limits or what the dry-run output contains, but the added behavioral context is substantive.
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 purpose sentence followed by tight, parallel one-line definitions per decision value, plus a compact closing note on auditing and dry run. Length is justified by four distinct modes; no filler or repetition of schema content.
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, four-mode mutation tool with an output schema present, the description covers the decision semantics, visibility consequences, undo pairings (hide/allow, keep/undecide) and the dry-run default. Nothing an agent needs to invoke it correctly is missing, and return values need not be explained given 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 67% and the enum 'decision' has no description in the schema at all; the description fully compensates by defining all four values and their side effects. The 'entry' and 'dry_run' formats are covered in the schema, so the description adds the missing half rather than duplicating.
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 ('Decide an entry's place in Trending') and enumerates the four distinct operations (hide/allow/keep/undecide) with their exact semantics. This clearly distinguishes it from the read-only sibling 'trending' and from entry-editing tools. An agent can pick this tool over siblings 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?
Each enum value is paired with the situation that selects it (hide = keep out of Trending row and search trending list; allow = undo a sync hide; keep = accept a suggestion without hiding; undecide = undo a keep and make it suggestible again), which is effectively when-to-use guidance. It gives clear context but never names an alternative tool or an explicit when-not-to-use case (e.g. 'to just view Trending, use trending').
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.
trendingTrendingBRead-onlyInspect
The homepage’s Trending row (Console → Trending): what it shows now and why (spotlighted, pinned, or most viewed), the entries suggested for hiding (an OnlyFans handle or an adult-work occupation on Wikidata — only a suggestion; the 25 most viewed) with the total waiting, and the entries hidden from it, 25 a page, with who hid each (a person, or the sync and the Wikidata claim it matched).
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | The page of the hidden list. |
Output Schema
| Name | Required | Description |
|---|---|---|
| hidden | Yes | |
| showing | Yes | |
| suggested | Yes | |
| featured_auto | Yes | Trending fills itself from what is read. |
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 real behavioral context beyond that: the hiding suggestions are derived from an OnlyFans handle or an adult-work occupation on Wikidata and are non-binding, the hidden list is paginated 25 per page, and each hidden entry records whether a person or the sync (with the matched Wikidata claim) hid it. That is meaningful semantics an agent cannot get from 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?
It is a single enormous sentence with parenthetical asides and dash-separated clauses. The resource is front-loaded, which is good, but the run-on structure makes it hard to parse and the density of detail ('an OnlyFans handle or an adult-work occupation on Wikidata') borders on over-specification for an agent deciding whether to call 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?
For a read-only tool with an output schema already covering return values and a fully documented single parameter, the description supplies the domain framing needed to interpret the three result sections. The main gap is the lack of any routing to the mutation sibling, but the core calling information is 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 100% for the single 'page' parameter, so the baseline is 3. The description does mention '25 a page' and that page indexes the hidden list, which adds minor meaning beyond the schema, but not enough to lift it above 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?
The description names a specific resource — the homepage's Trending row — and enumerates the three things it reports: what is currently shown (and why), the entries suggested for hiding, and the entries already hidden. It is clearly a read/inspection tool and distinguishable in substance from write siblings like set_trending. However it never names the alternative, so differentiation is implicit rather than stated.
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?
There is no explicit statement of when to reach for this tool versus alternatives, nor any pointer to set_trending for actually changing the row. The presence of 'only a suggestion' and 'with the total waiting' implies a review/inspection context, but the agent must infer that this is the read counterpart to set_trending entirely on its own.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unmerge_entryUndo a mergeADestructiveInspect
Undo an entry’s merge: it is its own entry on the site again, and the handles the merge added come off the entry it was merged into (refused, naming them, if they have changed since). Name it by its VHID. Audited. Dry run by default; the real run needs confirm set to that VHID.
| Name | Required | Description | Default |
|---|---|---|---|
| entry | Yes | The merged entry, by its VHID. | |
| 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 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. |
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 cover the safety profile (destructive, non-idempotent, not read-only), and the description adds substantially on top: what state changes, that added handles are removed from the merged-into entry, the refusal condition, that the action is audited, and the dry-run/confirm two-step. That is exactly the extra 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?
Extremely dense with zero filler: each clause adds a distinct fact (post-state, handle removal, refusal, identifier, audit, default mode, confirm requirement) and the core action is front-loaded in the first phrase.
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 need not explain return values, and it correctly ties confirm to what the dry run returns. Nothing an agent needs to invoke this mutation safely 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 schema already documents all four parameters; the description still adds the workflow meaning of confirm ('set to that VHID' for the real run) and reinforces that entry is named by VHID. Minor tension: the description says confirm is the VHID while the schema says it is the exact target token the dry run returns.
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?
Names a specific verb+resource (undo a merge) and states the resulting state ('its own entry on the site again'), which cleanly distinguishes it from the sibling merge_entry. An agent can tell 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?
Gives clear operating conditions: dry run by default, real run requires confirm, and the call is refused if the merged-into entry's handles changed. It never explicitly says 'use merge_entry to do the forward operation' or states when not to use it, so it stops short of full when/when-not guidance.
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.
wikidata_deleted_entriesEntries whose Wikidata item was deletedARead-onlyInspect
Console → Deleted on Wikidata, 50 a page, with every view’s count: “review” (public entries whose item is confirmed deleted — each shows a notice saying so — and not kept), “deleted_entries” (deleted on VH too), “curated” (protected, verified or claimed: no notice), “kept” (kept, still linked: keep_wikidata_deleted_entry; each row’s kept says by whom, when and why), “never_existed” (the QID was never an item) and “suspected” (not confirmed yet; re-checked daily). Find by name, QID or VHID. Each with Wikidata’s deletion date and comment. And “credit_gone” (the page’s “Wikipedia credit gone”): entries whose “from Wikipedia” credit names a page the credit check (every credit in turn, up to 2,000 a week) found gone or now outside the articles and drafts, newest finding first, each with its credit_title, revision, state (missing or outside_namespace, with page_title where it now leads), missing_since, sync_owned (the sync writes that description, and leaves it while the item has no English article; rewording it takes it from the sync) and links to where its actions are done. That view changes nothing: to fix the text or remove the credit use update_entry_fields (or propose_entry_change), and to credit another page restore_wikipedia_credit with a title.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| view | No | review | |
| query | No | A name, QID or VHID. |
Output Schema
| Name | Required | Description |
|---|---|---|
| q | Yes | |
| note | Yes | What the view is, in words. |
| page | Yes | |
| view | Yes | |
| counts | Yes | |
| entries | Yes | `credit_gone`’s are the credits; every other view’s the entries. |
| has_next | Yes | |
| recheck_batch | Yes | How many items "Re-check now" reads. |
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 behavioral context beyond them: "That view changes nothing" and the explicit hand-off to writer tools, the daily re-check of "suspected", and the credit check budget (every credit in turn, up to 2,000 a week). It also discloses that sync-owned credits are written by the sync and that rewording one takes ownership from it.
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 enormous run-on sentence packed with em-dash parentheticals; the essential purpose is buried behind view-level detail. Much of the credit_gone exposition (sync_owned ownership rules, credit budget) exceeds what an agent needs to select and call the tool. High information density, but poorly front-loaded and hard to parse.
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 documentation is not required, yet the definition still names key fields (kept, credit_title, revision, state, missing_since, sync_owned). Combined with full view semantics, filtering, and pagination size, an agent has enough to call it correctly; only the absence of sibling contrast keeps it from 5.
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 only 33% (only `query` is documented), so the description has to compensate, and it largely does: it enumerates all seven `view` values with their meanings and states "50 a page" for `page`, plus "Find by name, QID or VHID" for `query`. Absolute page-number semantics beyond the default and maximum are still left to 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?
The definition states a specific resource and scope: entries whose Wikidata item was deleted, paginated 50 per page, with named views. It clearly separates itself from siblings by pointing at keep_wikidata_deleted_entry, update_entry_fields, propose_entry_change, and restore_wikipedia_credit. The listing verb itself is only implied ("Console → Deleted on Wikidata"), so it falls just short of 5.
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 follow-up tools and the conditions that select them, e.g. fixing text or removing a credit goes to update_entry_fields or propose_entry_change, and re-crediting another page goes to restore_wikipedia_credit with a title. It also explains what each view is for. It does not contrast this tool against near-siblings such as get_entries or search_entries, so it stops at a strong 4.
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.
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" + } +]
6 tool updates
- Changed
get_entry_admin4 fields changed- changed
Output schema / properties / entity / properties / gallery / items / properties / license / descriptionPrevious value: -"Its licence id, or null when none is recorded."New value: +"An upload’s licence id, or null when none is recorded (always null for a Commons file)." - added
Output schema / properties / entity / properties / gallery / items / properties / license_nameAdded value: +{ + "description": "Its licence by name: an upload’s, or a Commons file’s as read from its file page (“CC BY 3.0”); null until it is read.", + "type": [ + "string", + "null" + ] +} - changed
Output schema / properties / entity / properties / gallery / items / requiredPrevious value: -[ - "id", - "kind", - "commons_filename", - "url", - "width", - "height", - "commonsPage", - "license", - "credit", - "plate" -]New value: +[ + "id", + "kind", + "commons_filename", + "url", + "width", + "height", + "commonsPage", + "license", + "license_name", + "credit", + "plate" +] - changed
Output schema / properties / entity / properties / image / anyOfPrevious value: -[ - { - "additionalProperties": {}, - "properties": { - "commonsPage": { - "description": "Its page on Wikimedia Commons, for a Commons file.", - "type": [ - "string", - "null" - ] - }, - "commons_filename": { - "type": [ - "string", - "null" - ] - }, - "credit": { - "description": "Its credit, or null.", - "type": [ - "string", - "null" - ] - }, - "height": { - "anyOf": [ - { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "id": { - "pattern": "^\\d+$", - "type": "string" - }, - "kind": { - "enum": [ - "commons", - "local" - ], - "type": "string" - }, - "license": { - "description": "Its licence id, or null when none is recorded.", - "type": [ - "string", - "null" - ] - }, - "plate": { - "anyOf": [ - { - "enum": [ - "light", - "dark", - "none" - ], - "type": "string" - }, - { - "type": "null" - } - ], - "description": "The plate behind it; null until it is classified." - }, - "url": { - "description": "A 200-pixel thumbnail, on this site.", - "type": "string" - }, - "width": { - "anyOf": [ - { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - { - "type": "null" - } - ] - } - }, - "required": [ - "id", - "kind", - "commons_filename", - "url", - "width", - "height", - "commonsPage", - "license", - "credit", - "plate" - ], - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": {}, + "properties": { + "commonsPage": { + "description": "Its page on Wikimedia Commons, for a Commons file.", + "type": [ + "string", + "null" + ] + }, + "commons_filename": { + "type": [ + "string", + "null" + ] + }, + "credit": { + "description": "Its credit, or null.", + "type": [ + "string", + "null" + ] + }, + "height": { + "anyOf": [ + { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "id": { + "pattern": "^\\d+$", + "type": "string" + }, + "kind": { + "enum": [ + "commons", + "local" + ], + "type": "string" + }, + "license": { + "description": "An upload’s licence id, or null when none is recorded (always null for a Commons file).", + "type": [ + "string", + "null" + ] + }, + "license_name": { + "description": "Its licence by name: an upload’s, or a Commons file’s as read from its file page (“CC BY 3.0”); null until it is read.", + "type": [ + "string", + "null" + ] + }, + "plate": { + "anyOf": [ + { + "enum": [ + "light", + "dark", + "none" + ], + "type": "string" + }, + { + "type": "null" + } + ], + "description": "The plate behind it; null until it is classified." + }, + "url": { + "description": "A 200-pixel thumbnail, on this site.", + "type": "string" + }, + "width": { + "anyOf": [ + { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "id", + "kind", + "commons_filename", + "url", + "width", + "height", + "commonsPage", + "license", + "license_name", + "credit", + "plate" + ], + "type": "object" + }, + { + "type": "null" + } +]
- Changed
get_reconcile4 fields changed- changed
Output schema / properties / result / properties / fields / items / properties / propose / descriptionPrevious value: -"On a value that differs: the change VH could propose for it (a statement to add, or a term to set), as `propose_wikidata_changes` takes one; for a lead image that stands for the item’s logo (P154, the item states no image), `logo`: the console’s “Replace the logo” with that Commons file. For a handle VH holds that the item deprecated, or that VH’s handle checker last found dead and the item does not count as current: `remove_from_vh` (`because` `deprecated` or `dead`), taking it off VH — never a change on Wikidata (owner decision 2026-10-10); the console links to the entry’s editor, and `update_entry_handles` makes it. For one the item states but no longer counts as current otherwise, read on the write wiki (`write_wiki`): `set_rank` `preferred` (outranked) or `remove_qualifier` (its one end time, by hash) on that statement, by its GUID; `value` is the statement’s value there. Never `set_rank` `normal`: a deprecated statement is not made current again. A title’s `value_seen` is the item’s English label alone, as the write wiki has it. Null while the same change waits in Review (`pending_id`), or when the write wiki was not read."New value: +"On a value that differs: the change VH could propose for it (a statement to add, or a term to set), as `propose_wikidata_changes` takes one; for a lead image that stands for the item’s logo (P154, the item states no image), `logo`: the console’s “Replace the logo” with that Commons file. For a handle VH holds that the item deprecated, or that VH’s handle checker last found dead and the item does not count as current: `remove_from_vh` (`because` `deprecated` or `dead`), taking it off VH — never a change on Wikidata (owner decision 2026-10-10); the console links to the entry’s editor, and `update_entry_handles` makes it. For one the item states but no longer counts as current otherwise, read on the write wiki (`write_wiki`): `set_rank` `preferred` (outranked) or `remove_qualifier` (its one end time, by hash) on that statement, by its GUID; `value` is the statement’s value there. Never `set_rank` `normal`: a deprecated statement is not made current again. Never `remove_qualifier` on a handle the sync keeps (`owner` `sync`): VH has it only because Wikidata listed it, so the sync takes it off VH instead (`remove_after`). A title’s `value_seen` is the item’s English label alone, as the write wiki has it. Null while the same change waits in Review (`pending_id`), or when the write wiki was not read." - changed
Output schema / properties / result / properties / handles / items / properties / propose / descriptionPrevious value: -"On a value that differs: the change VH could propose for it (a statement to add, or a term to set), as `propose_wikidata_changes` takes one; for a lead image that stands for the item’s logo (P154, the item states no image), `logo`: the console’s “Replace the logo” with that Commons file. For a handle VH holds that the item deprecated, or that VH’s handle checker last found dead and the item does not count as current: `remove_from_vh` (`because` `deprecated` or `dead`), taking it off VH — never a change on Wikidata (owner decision 2026-10-10); the console links to the entry’s editor, and `update_entry_handles` makes it. For one the item states but no longer counts as current otherwise, read on the write wiki (`write_wiki`): `set_rank` `preferred` (outranked) or `remove_qualifier` (its one end time, by hash) on that statement, by its GUID; `value` is the statement’s value there. Never `set_rank` `normal`: a deprecated statement is not made current again. A title’s `value_seen` is the item’s English label alone, as the write wiki has it. Null while the same change waits in Review (`pending_id`), or when the write wiki was not read."New value: +"On a value that differs: the change VH could propose for it (a statement to add, or a term to set), as `propose_wikidata_changes` takes one; for a lead image that stands for the item’s logo (P154, the item states no image), `logo`: the console’s “Replace the logo” with that Commons file. For a handle VH holds that the item deprecated, or that VH’s handle checker last found dead and the item does not count as current: `remove_from_vh` (`because` `deprecated` or `dead`), taking it off VH — never a change on Wikidata (owner decision 2026-10-10); the console links to the entry’s editor, and `update_entry_handles` makes it. For one the item states but no longer counts as current otherwise, read on the write wiki (`write_wiki`): `set_rank` `preferred` (outranked) or `remove_qualifier` (its one end time, by hash) on that statement, by its GUID; `value` is the statement’s value there. Never `set_rank` `normal`: a deprecated statement is not made current again. Never `remove_qualifier` on a handle the sync keeps (`owner` `sync`): VH has it only because Wikidata listed it, so the sync takes it off VH instead (`remove_after`). A title’s `value_seen` is the item’s English label alone, as the write wiki has it. Null while the same change waits in Review (`pending_id`), or when the write wiki was not read." - added
Output schema / properties / result / properties / handles / items / properties / remove_afterAdded value: +{ + "description": "When the sync takes it off VH (ISO), not before: a handle the sync keeps that the item deprecated, ended or no longer states, its removal grace counted from `since`, with removal switched on (it also waits for its minimum number of reads). Null otherwise.", + "type": [ + "string", + "null" + ] +} - changed
Output schema / properties / result / properties / handles / items / requiredPrevious value: -[ - "platform_id", - "platform", - "property", - "value", - "on_vh", - "owner", - "wikidata", - "rank", - "since", - "qualifier_only", - "held_back", - "agrees", - "propose", - "pending_id" -]New value: +[ + "platform_id", + "platform", + "property", + "value", + "on_vh", + "owner", + "wikidata", + "rank", + "since", + "qualifier_only", + "held_back", + "agrees", + "remove_after", + "propose", + "pending_id" +]
- Added
keep_wikidata_deleted_entry - Changed
propose_wikidata_changes1 field changed- added
Input schema / properties / refileAdded value: +{ + "description": "File every change even where a person dismissed the same change before (refused 409 `dismissed` otherwise).", + "type": "boolean" +}
- Changed
propose_wikidata_correction16 fields changed- added
Input schema / properties / belongs_toAdded value: +{ + "description": "Kind wrong_subject (required): the other item of the pair, the one the value belongs to.", + "pattern": "^Q[1-9][0-9]*$", + "type": "string" +} - added
Input schema / properties / date / anyOfAdded value: +[ + { + "maxLength": 10, + "type": "string" + }, + { + "additionalProperties": false, + "properties": { + "unknown": { + "const": true, + "type": "boolean" + } + }, + "required": [ + "unknown" + ], + "type": "object" + } +] - changed
Input schema / properties / date / descriptionPrevious value: -"supersede: the day (or month, or year) the old value ended and the new one began."New value: +"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`." - removed
Input schema / properties / date / maxLengthRemoved value: -10 - removed
Input schema / properties / date / typeRemoved value: -"string" - added
Input schema / properties / end_date / anyOfAdded value: +[ + { + "maxLength": 10, + "type": "string" + }, + { + "additionalProperties": false, + "properties": { + "unknown": { + "const": true, + "type": "boolean" + } + }, + "required": [ + "unknown" + ], + "type": "object" + } +] - changed
Input schema / properties / end_date / descriptionPrevious value: -"With outranked \"end_date\": the day, month or year they ended (supersede: `date` unless given)."New value: +"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`." - removed
Input schema / properties / end_date / maxLengthRemoved value: -10 - removed
Input schema / properties / end_date / typeRemoved value: -"string" - changed
Input schema / properties / evidence / descriptionPrevious value: -"Required, except for a deprecation of kind `suppressed`, whose evidence the site writes."New value: +"Required, except for a deprecation of kind `suppressed` or `wrong_subject`, whose evidence the site writes." - changed
Input schema / properties / kind / descriptionPrevious value: -"`merge` with a merge, `suppressed` or `dead_account` with a deprecation; `superseded`, `duplicate` or `update` for a change you curate."New value: +"`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." - changed
Input schema / properties / kind / enumPrevious value: -[ - "pasted_address", - "wiki_markup", - "double_at", - "whitespace", - "bad_format", - "dead_account", - "renamed_account", - "vh_differs", - "superseded", - "duplicate", - "update", - "dead_image", - "suppressed", - "merge" -]New value: +[ + "pasted_address", + "wiki_markup", + "double_at", + "whitespace", + "bad_format", + "dead_account", + "renamed_account", + "vh_differs", + "superseded", + "duplicate", + "update", + "dead_image", + "suppressed", + "wrong_subject", + "merge" +] - changed
Input schema / properties / reason / descriptionPrevious value: -"deprecate, set_rank deprecated: the reason for the deprecated rank, an item id (e.g. Q113360982 \"unavailable account\")."New value: +"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." - added
Input schema / properties / reference / properties / archive_dateAdded value: +{ + "description": "With archive_url: the day it was archived, YYYY-MM-DD (P2960). Read from a web.archive.org or archive.today address when left out.", + "type": "string" +} - added
Input schema / properties / reference / properties / archive_urlAdded value: +{ + "description": "A web archive’s https copy of `url` (P1065): the site loads the copy instead, so an original that is gone (it may then be http) can still be cited.", + "maxLength": 500, + "type": "string" +} - added
Input schema / properties / refileAdded value: +{ + "description": "File it even though a person dismissed this same change before (refused 409 `dismissed` otherwise).", + "type": "boolean" +}
- Changed
wikidata_deleted_entries5 fields changed- changed
Input schema / properties / view / enumPrevious value: -[ - "review", - "deleted_entries", - "curated", - "never_existed", - "suspected", - "credit_gone" -]New value: +[ + "review", + "deleted_entries", + "curated", + "kept", + "never_existed", + "suspected", + "credit_gone" +] - added
Output schema / properties / counts / properties / keptAdded value: +{ + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" +} - changed
Output schema / properties / counts / requiredPrevious value: -[ - "review", - "deleted_entries", - "curated", - "never_existed", - "suspected", - "credit_gone" -]New value: +[ + "review", + "deleted_entries", + "curated", + "kept", + "never_existed", + "suspected", + "credit_gone" +] - 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" - }, - "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" - ], - "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": { + "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" + } +] - changed
Output schema / properties / view / enumPrevious value: -[ - "review", - "deleted_entries", - "curated", - "never_existed", - "suspected", - "credit_gone" -]New value: +[ + "review", + "deleted_entries", + "curated", + "kept", + "never_existed", + "suspected", + "credit_gone" +]
3 tool updates
- Changed
bulk_change_entries1 field changed- changed
Input schema / properties / setting / enumPrevious value: -[ - "blocked", - "edit_policy", - "propose_policy", - "protected", - "history_hidden", - "trending_hidden", - "verified", - "spotlight" -]New value: +[ + "blocked", + "edit_policy", + "propose_policy", + "protected", + "history_hidden", + "trending_hidden", + "verified", + "follow_links", + "spotlight" +]
- Changed
get_entry_admin6 fields changed- added
Output schema / properties / entity / properties / retry_atAdded value: +{ + "description": "When the sync tries again after its last fetch from Wikidata failed; null when it did not fail.", + "type": [ + "string", + "null" + ] +} - 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", - "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", + "edit_policy", + "propose_policy", + "claimed_by", + "custom_handle_order", + "updated_at" +] - added
Output schema / properties / heldBack / items / properties / value_normAdded value: +{ + "description": "Its key as the site stores it (letter case folded where the platform ignores it).", + "type": "string" +} - changed
Output schema / properties / heldBack / items / requiredPrevious value: -[ - "platform_id", - "value", - "name", - "removedAt", - "revisionId" -]New value: +[ + "platform_id", + "value", + "value_norm", + "name", + "removedAt", + "revisionId" +] - added
Output schema / properties / heldBackNotListed / items / properties / value_normAdded value: +{ + "description": "Its key as the site stores it (letter case folded where the platform ignores it).", + "type": "string" +} - changed
Output schema / properties / heldBackNotListed / items / requiredPrevious value: -[ - "platform_id", - "value", - "name", - "removedAt", - "revisionId" -]New value: +[ + "platform_id", + "value", + "value_norm", + "name", + "removedAt", + "revisionId" +]
- Changed
set_entry_setting1 field changed- changed
Input schema / properties / setting / enumPrevious value: -[ - "edit_policy", - "propose_policy", - "protected", - "history_hidden", - "trending_hidden", - "verified", - "spotlight" -]New value: +[ + "edit_policy", + "propose_policy", + "protected", + "history_hidden", + "trending_hidden", + "verified", + "follow_links", + "spotlight" +]
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.
Read public social media posts, comments, profiles and trends from 18 platforms. Pay per call.
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.1227 npmMIT
Glama MCP Gateway
Add one secure layer between your agents and this server.