Wikidata:Creating a bot

Other languages:
Bahasa Indonesia • ‎British English • ‎Bân-lâm-gú • ‎Deutsch • ‎English • ‎Esperanto • ‎Frysk • ‎Nederlands • ‎Ripoarisch • ‎Zazaki • ‎català • ‎dansk • ‎español • ‎français • ‎italiano • ‎latviešu • ‎lietuvių • ‎magyar • ‎occitan • ‎polski • ‎português • ‎português do Brasil • ‎suomi • ‎svenska • ‎čeština • ‎Ελληνικά • ‎български • ‎русский • ‎українська • ‎հայերեն • ‎العربية • ‎فارسی • ‎ગુજરાતી • ‎தமிழ் • ‎తెలుగు • ‎മലയാളം • ‎ไทย • ‎中文 • ‎日本語 • ‎粵語 • ‎한국어

This page explains how to create bots for Wikidata. Please, consider sharing your code, add new examples and any improvements you want.


To create bots you need:

  • Some coding skills (Python, Perl, PHP...)
  • A framework (one of the frameworks below) and some code to run to complete a task
  • A bot account (and approved)
  • A source code editor (Notepad++, Geany, vim, emacs)


In the next sections you learn how to install, configure and login using pywikibot. You only need to do these first three steps once. Also, there are some basic examples to learn the basics about bot programming.


For further details about pywikibot installation, see mw:Manual:Pywikibot/Installation and Wikidata:Pywikibot - Python 3 Tutorial/Setting up Shop
To use pywikibot without installation, see mw:Manual:Pywikibot/PAWS

To install pywikibot:


For further details about pywikibot configuration, see mw:Manual:Pywikibot/

You must configure file with the bot username, family project and language. For Wikidata both family and language parameters are the same, wikidata.

You can reduce the delay between edits adding: put_throttle = 1


After you configure the file, login as follows:


It will ask you for the bots password, type it and press enter. If you did it correctly, you should be logged in now.

Example 1: Get dataEdit

This example gets data for the page refering to Douglas Adams. Save the following source code in a file and execute it with python

item.get() connects to Wikidata and fetches the data. The output is (reformatted for clarity):

    u'claims': {
        u'P646': [< instance at 0x7f1880188b48>],
        u'P800': [< instance at 0x7f1880188488>, < instance at 0x7f1880188368>]
    u'labels': {
        u'gu': u'\u0aa1\u0a97\u0acd\u0ab2\u0abe\u0ab8 \u0a8f\u0aa1\u0aae\u0acd\u0ab8',
        u'scn': u'Douglas Adams',
    u'sitelinks': {
        u'fiwiki': u'Douglas Adams',
        u'fawiki': u'\u062f\u0627\u06af\u0644\u0627\u0633 \u0622\u062f\u0627\u0645\u0632',
        u'elwikiquote': u'\u039d\u03c4\u03ac\u03b3\u03ba\u03bb\u03b1\u03c2 \u0386\u03bd\u03c4\u03b1\u03bc\u03c2',
    u'descriptions': {
        u'eo': u'angla a\u016dtoro de sciencfikcio-romanoj kaj humoristo',
        u'en': u'English writer and humorist',
    u'aliases': {
        u'ru': [u'\u0410\u0434\u0430\u043c\u0441, \u0414\u0443\u0433\u043b\u0430\u0441'],
        u'fr': [u'Douglas Noel Adams', u'Douglas No\xebl Adams'],
['claims', 'labels', 'sitelinks', 'descriptions', 'aliases']

It prints a dictionary with keys for

  • the set of claims in the page: Property:P646 is the Freebase identifier, Property:P800 is "notable work", etc.
  • the label of the item in many languages
  • the sitelinks for the item, not just Wikipedias in many languages, but also Wikiquote in many languages
  • the item description in many languages
  • the aliases for the item in many languages

Then a list with all the keys for the key-values pairs in the dictionary. Finally, you can see that the Wikidata item about Douglas Adams is Q42.


The example above gets the ItemPage using the en wikipedia article. Alternatively, we can also get the ItemPage directly:

Example 2: Get interwiki linksEdit

After item.get(), for example the sitelinks can be accessed. These are links to all Wikipedias that have the article.

The output is:

{u'fiwiki': u'Douglas Adams', u'eowiki': u'Douglas Adams', u'dewiki': u'Douglas Adams', ...

With item.iterlinks(), an iterator over all these sitelinks is returned, where each article is given not as plain text as above but already as a Page object for further treatment (e.g., edit the text in the corresponding Wikipedia articles).

Example 4: Set a descriptionEdit

This example sets an English and a German description for the item about Douglas Adams.

Setting labels and aliases works accordingly.

Example 6: Set a sitelinkEdit

To set a sitelink, we can either create a corresponding dict corresponding to Example 4 or use Page objects:

Example 7: Set a statementEdit

Statements are set using the Claim class. In the following, we set for Douglas Adams place of birth (P19): Cambridge (Q350).

For other datatypes, this works similar. In the following, we add claims with string (IMDb ID (P345) and coordinate (coordinate location (P625)) datatypes (URL is the same as string):

Example 8: Add a qualifierEdit

Qualifiers are also represented by the Claim class. In the following, we add the qualifier incertae sedis (P678): family (Q35409) to the Claim "claim". Make sure you add the item before adding the qualifier.

Example 9: Add a sourceEdit

Also, sources are represented by the Claim class. Unlike for qualifiers, a source may contain more than one Claim. In the following, we add stated in (P248): Integrated Taxonomic Information System (Q82575) with retrieved (P813) March 20, 2014 as source to the Claim "claim". The claim has to be either retrieved from Wikidata or added to an itempage beforehand.

Example 10: Page generatorsEdit

Example 11: Get values of sub-propertiesEdit

In the following, we get values of sub-properties from branch described by source (P1343) -> Great Soviet Encyclopedia (1969–1978) (Q17378135) -> properties reference URL (P854) and title (P1476).

More examplesEdit

Some users share their source codes. Learn more in the next links:

Wikidata IntegratorEdit

WikidataIntegrator is a library for reading and writing to Wikidata/Wikibase. We created it for populating Wikidata with content from authoritative resources on Genes, Proteins, Diseases, Drugs and others. Details on the different tasks can be found on the bot's Wikidata page.

Pywikibot is an existing framework for interacting with the MediaWiki API. The reason why we came up with our own solution is that we need a high integration with the Wikidata SPARQL endpoint in order to ensure data consistency (duplicate checks, consistency checks, correct item selection, etc.). Compared to Pywikibot, WikidataIntegrator currently is not a full Python wrapper for the MediaWiki API but is solely focused on providing an easy means to generate Python based Wikidata bots.

For more information, documentation, download & installation instructions, see here:

Example NotebookEdit

An example notebook demonstrating an example bot to add therapeutic areas to drug items, including using fastrun mode, checking references, and removing old statements:

Wikibase.NET (Deprecated)Edit

Wikibase.NET is the api that replaces the now deprecated DotNetDataBot. Api client for the MediaWiki extension Wikibase. They aren't compatible because Wikibase.NET does no longer need the DotNetWikiBot framework.

Download & InstallationEdit

The framework can be downloaded from GitHub here. Just follow the instructions on that page.

Known issuesEdit


Coming not soon...

DotNetDataBot (Deprecated)Edit



After unpacking the package you can see a file called DotNetDataBot.dll and one called DotNetDataBot.xml. The xml document is only for documentation. To use it you have to create a new refer in your project. Then you can write using DotNetDataBot; to import the framework.


To login you have to create a new Site object with the url of the wiki, your bot's username and it's password.

Example 1: Get id using wiki pageEdit

You can access the id of an item by searching for using the site and the title of the connected page.

Example 2: Get interwiki linksEdit

You can get the interwiki links of an item by loading the content and accessing the links field of the object.

Example 3: Set a descriptionEdit

To set a description, you must call the setDescription function.

Example 4: Set a labelEdit

It works the same way for setting a label. Just call setLabel.

Example 5: Get interwiki links for 100 pagesEdit

This feature is not supported. Just iterate over the list.

Wikibase api for PHPEdit

This is an api client for Wikibase written in PHP. It can be downloaded from here.

Example 1: Basic exampleEdit

Take a look at the source comments to understand how it works.

Example 2: Creating claimsEdit

Take a look at the source comments to understand how it works.


Framework for Wikidata and Wikipedia. Read and write on Wikidata and other Wikimedia project and have a useful list generator to generate list of Wikipedia page and Wikidata entity. Can read also JSON dump of Wikidata.


Bot to read and edit Wikidata and Wikipedia.

  • License: CC0 1.0
  • Language C#
  • Can read and write entities with all datatype on Wikidata
  • Can read and write pages on all Wiki project
  • Can read parameter from template on wiki pages
  • Can read JSON dump
  • Can create lists using:
  • Tested with Visual Studio Express 2013 for Windows Desktop.
    • Is necessary to have Newtonsoft.Json. You can install it with NuGet inside Visual Studio
    • Is necessary to add manually a reference to System.Web for "HttpUtility.UrlEncode"


The framework can be downloaded from GitHub here.


Example 1Edit

Update en label for all items with instance of (P31): short film (Q24862) that have director (P57) and that have publication date (P577) in 1908. (Use of Wikidata query)

LexData (Python; for Lexicographical data)Edit

LexData is an easy to use python libary to create and edit Lexemes, Senses and Forms.


You can install LexData via pip:

$ pip install LexData


For all operations you need a WikidataSession. You can create it with your credentials, a bot password or an Edit Token (for example to edit via OAUTH):

Retrieve a LexemeEdit

You can open existing Lexemes and read their content.

Searching and creating LexemesEdit

If you don't know the L-Id of an lexeme you can search for it. And if it doesn't exist you can create it.

Adding informationEdit

You can easily create forms or senses, with or without additional claims:

Using Wikidata's API directlyEdit

The other sections describe how to use bot frameworks to access and update Wikidata information. You can also directly interact with the Wikibase API that Wikidata provides. You need to do this if you're developing your own framework or if you need to do something that a framework doesn't support. The documentation for the Wikibase API can be found at You can also play around with it at Special:ApiSandbox, try action=wbgetentities.

Wikibase provides its API as a set of modules for MediaWiki's "action" API. You access this by making HTTP requests to /w/api.php. The default response format is JSON. So for your language of choice, you only need a library to perform HTTP requests and a JSON or XML library to parse the responses.

Example 1: Get Q numberEdit

This example gets the item Q number for the English Wikipedia article about Andromeda Galaxy. The Wikibase API's main "workhorse" module action=wbgetentities provides this information. The HTTP request (using jsonfm format for human-readable JSON output) is simply

Try following the link. This requests no additional information about the entity; remove &props= from the URL to see much more information about it. See the generated help for wbgetentities for more parameters you can specify.


The output is:


Example 2: Get list of items without particular interwikiEdit

...coming soon...

See alsoEdit

External linksEdit