crossref module

crossref module API:

  • works
  • members
  • prefixes
  • funders
  • journals
  • types
  • licenses
  • registration_agency
  • random_dois

Example usage:

from habanero import Crossref
cr = Crossref()
cr.works()
cr.works(ids = '10.1371/journal.pone.0033693')
cr.works(query = "ecology")

crossref API

Crossref.works(ids=None, query=None, filter=None, offset=None, limit=None, sample=None, sort=None, order=None, facet=None, select=None, cursor=None, cursor_max=5000, **kwargs)[source]

Search Crossref works

Parameters:
  • ids – [Array] DOIs (digital object identifier) or other identifiers
  • query – [String] A query string
  • filter – [Hash] Filter options. See examples for usage. Accepts a dict, with filter names and their values. For repeating filter names pass in a list of the values to that filter name, e.g., {‘award_funder’: [‘10.13039/100004440’, ‘10.13039/100000861’]}. See https://github.com/CrossRef/rest-api-doc#filter-names for filter names and their descriptions and filter_names() and filter_details()
  • offset – [Fixnum] Number of record to start at, from 1 to 10000
  • limit – [Fixnum] Number of results to return. Not relavant when searching with specific dois. Default: 20. Max: 1000
  • sample – [Fixnum] Number of random results to return. when you use the sample parameter, the limit and offset parameters are ignored. Max: 100
  • sort – [String] Field to sort on. Note: If the API call includes a query, then the sort order will be by the relevance score. If no query is included, then the sort order will be by DOI update date. See sorting_ for possible values.
  • order – [String] Sort order, one of ‘asc’ or ‘desc’
  • facet – [Boolean/String] Set to true to include facet results (default: false). Optionally, pass a query string, e.g., facet=type-name:* or facet=license=*. See Facets_ for options.
  • select – [String/list(Strings)] Crossref metadata records can be quite large. Sometimes you just want a few elements from the schema. You can “select” a subset of elements to return. This can make your API calls much more efficient. Not clear yet which fields are allowed here.
  • cursor – [String] Cursor character string to do deep paging. Default is None. Pass in ‘*’ to start deep paging. Any combination of query, filters and facets may be used with deep paging cursors. While rows may be specified along with cursor, offset and sample cannot be used. See https://github.com/CrossRef/rest-api-doc/blob/master/rest_api.md#deep-paging-with-cursors
  • cursor_max – [Fixnum] Max records to retrieve. Only used when cursor param used. Because deep paging can result in continuous requests until all are retrieved, use this parameter to set a maximum number of records. Of course, if there are less records found than this value, you will get only those found.
  • kwargs – additional named arguments passed on to requests.get, e.g., field queries (see examples and FieldQueries_)
Returns:

A dict

Usage:

from habanero import Crossref
cr = Crossref()
cr.works()
cr.works(ids = '10.1371/journal.pone.0033693')
dois = ['10.1371/journal.pone.0033693', ]
cr.works(ids = dois)
x = cr.works(query = "ecology")
x['status']
x['message-type']
x['message-version']
x['message']
x['message']['total-results']
x['message']['items-per-page']
x['message']['query']
x['message']['items']

# Get full text links
x = cr.works(filter = {'has_full_text': True})
x

# Parse output to various data pieces
x = cr.works(filter = {'has_full_text': True})
## get doi for each item
[ z['DOI'] for z in x['message']['items'] ]
## get doi and url for each item
[ {"doi": z['DOI'], "url": z['URL']} for z in x['message']['items'] ]
### print every doi
for i in x['message']['items']:
     print i['DOI']

# filters - pass in as a dict
## see https://github.com/CrossRef/rest-api-doc#filter-names
cr.works(filter = {'has_full_text': True})
cr.works(filter = {'has_funder': True, 'has_full_text': True})
cr.works(filter = {'award_number': 'CBET-0756451', 'award_funder': '10.13039/100000001'})
## to repeat a filter name, pass in a list
x = cr.works(filter = {'award_funder': ['10.13039/100004440', '10.13039/100000861']}, limit = 100)
map(lambda z:z['funder'][0]['DOI'], x['message']['items'])

# Deep paging, using the cursor parameter
## this search should lead to only ~215 results
cr.works(query = "widget", cursor = "*", cursor_max = 100)
## this search should lead to only ~2500 results, in chunks of 500
res = cr.works(query = "octopus", cursor = "*", limit = 500)
sum([ len(z['message']['items']) for z in res ])
## about 167 results
res = cr.works(query = "extravagant", cursor = "*", limit = 50, cursor_max = 500)
sum([ len(z['message']['items']) for z in res ])
## cursor_max to get back only a maximum set of results
res = cr.works(query = "widget", cursor = "*", cursor_max = 100)
sum([ len(z['message']['items']) for z in res ])
## cursor_max - especially useful when a request could be very large
### e.g., "ecology" results in ~275K records, lets max at 10,000
###   with 1000 at a time
res = cr.works(query = "ecology", cursor = "*", cursor_max = 10000, limit = 1000)
sum([ len(z['message']['items']) for z in res ])
items = [ z['message']['items'] for z in res ]
items = [ item for sublist in items for item in sublist ]
[ z['DOI'] for z in items ][0:50]

# field queries
res = cr.works(query = "ecology", query_author = 'carl boettiger')
[ x['author'][0]['family'] for x in res['message']['items'] ]

# select certain fields to return
## as a comma separated string
cr.works(query = "ecology", select = "DOI,title")
## or as a list
cr.works(query = "ecology", select = ["DOI","title"])
Crossref.members(ids=None, query=None, filter=None, offset=None, limit=None, sample=None, sort=None, order=None, facet=None, works=False, select=None, cursor=None, cursor_max=5000, **kwargs)[source]

Search Crossref members

Parameters:
  • ids – [Array] DOIs (digital object identifier) or other identifiers
  • query – [String] A query string
  • filter – [Hash] Filter options. See examples for usage. Accepts a dict, with filter names and their values. For repeating filter names pass in a list of the values to that filter name, e.g., {‘award_funder’: [‘10.13039/100004440’, ‘10.13039/100000861’]}. See https://github.com/CrossRef/rest-api-doc#filter-names for filter names and their descriptions and filter_names() and filter_details()
  • offset – [Fixnum] Number of record to start at, from 1 to 10000
  • limit – [Fixnum] Number of results to return. Not relavant when searching with specific dois. Default: 20. Max: 1000
  • sample – [Fixnum] Number of random results to return. when you use the sample parameter, the limit and offset parameters are ignored. This parameter only used when works requested. Max: 100
  • sort – [String] Field to sort on. Note: If the API call includes a query, then the sort order will be by the relevance score. If no query is included, then the sort order will be by DOI update date. See sorting_ for possible values.
  • order – [String] Sort order, one of ‘asc’ or ‘desc’
  • facet – [Boolean/String] Set to true to include facet results (default: false). Optionally, pass a query string, e.g., facet=type-name:* or facet=license=* See Facets_ for options.
  • select – [String/list(Strings)] Crossref metadata records can be quite large. Sometimes you just want a few elements from the schema. You can “select” a subset of elements to return. This can make your API calls much more efficient. Not clear yet which fields are allowed here.
  • works – [Boolean] If true, works returned as well. Default: false
  • kwargs – additional named arguments passed on to requests.get, e.g., field queries (see examples and FieldQueries_)
Returns:

A dict

Usage:

from habanero import Crossref
cr = Crossref()
cr.members(ids = 98)

# get works
res = cr.members(ids = 98, works = True, limit = 3)
len(res['message']['items'])
[ z['DOI'] for z in res['message']['items'] ]

# cursor - deep paging
res = cr.members(ids = 98, works = True, cursor = "*")
sum([ len(z['message']['items']) for z in res ])
items = [ z['message']['items'] for z in res ]
items = [ item for sublist in items for item in sublist ]
[ z['DOI'] for z in items ][0:50]

# field queries
res = cr.members(ids = 98, works = True, query_author = 'carl boettiger', limit = 7)
[ x['author'][0]['family'] for x in res['message']['items'] ]
Crossref.prefixes(ids=None, filter=None, offset=None, limit=None, sample=None, sort=None, order=None, facet=None, works=False, select=None, cursor=None, cursor_max=5000, **kwargs)[source]

Search Crossref prefixes

Parameters:
  • ids – [Array] DOIs (digital object identifier) or other identifiers
  • filter – [Hash] Filter options. See examples for usage. Accepts a dict, with filter names and their values. For repeating filter names pass in a list of the values to that filter name, e.g., {‘award_funder’: [‘10.13039/100004440’, ‘10.13039/100000861’]}. See https://github.com/CrossRef/rest-api-doc#filter-names for filter names and their descriptions and filter_names() and filter_details()
  • offset – [Fixnum] Number of record to start at, from 1 to 10000
  • limit – [Fixnum] Number of results to return. Not relavant when searching with specific dois. Default: 20. Max: 1000
  • sample – [Fixnum] Number of random results to return. when you use the sample parameter, the limit and offset parameters are ignored. This parameter only used when works requested. Max: 100
  • sort – [String] Field to sort on. Note: If the API call includes a query, then the sort order will be by the relevance score. If no query is included, then the sort order will be by DOI update date. See sorting_ for possible values.
  • order – [String] Sort order, one of ‘asc’ or ‘desc’
  • facet – [Boolean/String] Set to true to include facet results (default: false). Optionally, pass a query string, e.g., facet=type-name:* or facet=license=* See Facets_ for options.
  • select – [String/list(Strings)] Crossref metadata records can be quite large. Sometimes you just want a few elements from the schema. You can “select” a subset of elements to return. This can make your API calls much more efficient. Not clear yet which fields are allowed here.
  • works – [Boolean] If true, works returned as well. Default: false
  • kwargs – additional named arguments passed on to requests.get, e.g., field queries (see examples and FieldQueries_)
Returns:

A dict

Usage:

from habanero import Crossref
cr = Crossref()
cr.prefixes(ids = "10.1016")
cr.prefixes(ids = ['10.1016','10.1371','10.1023','10.4176','10.1093'])

# get works
cr.prefixes(ids = "10.1016", works = True)

# Limit number of results
cr.prefixes(ids = "10.1016", works = True, limit = 3)

# Sort and order
cr.prefixes(ids = "10.1016", works = True, sort = "relevance", order = "asc")

# cursor - deep paging
res = cr.prefixes(ids = "10.1016", works = True, cursor = "*", limit = 200)
sum([ len(z['message']['items']) for z in res ])
items = [ z['message']['items'] for z in res ]
items = [ item for sublist in items for item in sublist ]
[ z['DOI'] for z in items ][0:50]

# field queries
res = cr.prefixes(ids = "10.1371", works = True, query_editor = 'cooper', filter = {'type': 'journal-article'})
eds = [ x.get('editor') for x in res['message']['items'] ]
[ z for z in eds if z is not None ]
Crossref.funders(ids=None, query=None, filter=None, offset=None, limit=None, sample=None, sort=None, order=None, facet=None, works=False, select=None, cursor=None, cursor_max=5000, **kwargs)[source]

Search Crossref funders

Note that funders without IDs don’t show up on the /funders route, that is, won’t show up in searches via this method

Parameters:
  • ids – [Array] DOIs (digital object identifier) or other identifiers
  • query – [String] A query string
  • filter – [Hash] Filter options. See examples for usage. Accepts a dict, with filter names and their values. For repeating filter names pass in a list of the values to that filter name, e.g., {‘award_funder’: [‘10.13039/100004440’, ‘10.13039/100000861’]}. See https://github.com/CrossRef/rest-api-doc#filter-names for filter names and their descriptions and filter_names() and filter_details()
  • offset – [Fixnum] Number of record to start at, from 1 to 10000
  • limit – [Fixnum] Number of results to return. Not relavant when searching with specific dois. Default: 20. Max: 1000
  • sample – [Fixnum] Number of random results to return. when you use the sample parameter, the limit and offset parameters are ignored. This parameter only used when works requested. Max: 100
  • sort – [String] Field to sort on. Note: If the API call includes a query, then the sort order will be by the relevance score. If no query is included, then the sort order will be by DOI update date. See sorting_ for possible values.
  • order – [String] Sort order, one of ‘asc’ or ‘desc’
  • facet – [Boolean/String] Set to true to include facet results (default: false). Optionally, pass a query string, e.g., facet=type-name:* or facet=license=* See Facets_ for options.
  • select – [String/list(Strings)] Crossref metadata records can be quite large. Sometimes you just want a few elements from the schema. You can “select” a subset of elements to return. This can make your API calls much more efficient. Not clear yet which fields are allowed here.
  • works – [Boolean] If true, works returned as well. Default: false
  • kwargs – additional named arguments passed on to requests.get, e.g., field queries (see examples and FieldQueries_)
Returns:

A dict

Usage:

from habanero import Crossref
cr = Crossref()
cr.funders(ids = '10.13039/100000001')
cr.funders(query = "NSF")

# get works
cr.funders(ids = '10.13039/100000001', works = True)

# cursor - deep paging
res = cr.funders(ids = '10.13039/100000001', works = True, cursor = "*", limit = 200)
sum([ len(z['message']['items']) for z in res ])
items = [ z['message']['items'] for z in res ]
items = [ item for sublist in items for item in sublist ]
[ z['DOI'] for z in items ][0:50]

# field queries
res = cr.funders(ids = "10.13039/100000001", works = True, query_container_title = 'engineering', filter = {'type': 'journal-article'})
eds = [ x.get('editor') for x in res['message']['items'] ]
[ z for z in eds if z is not None ]
Crossref.journals(ids=None, query=None, filter=None, offset=None, limit=None, sample=None, sort=None, order=None, facet=None, works=False, select=None, cursor=None, cursor_max=5000, **kwargs)[source]

Search Crossref journals

Parameters:
  • ids – [Array] DOIs (digital object identifier) or other identifiers
  • query – [String] A query string
  • filter – [Hash] Filter options. See examples for usage. Accepts a dict, with filter names and their values. For repeating filter names pass in a list of the values to that filter name, e.g., {‘award_funder’: [‘10.13039/100004440’, ‘10.13039/100000861’]}. See https://github.com/CrossRef/rest-api-doc#filter-names for filter names and their descriptions and filter_names() and filter_details()
  • offset – [Fixnum] Number of record to start at, from 1 to 10000
  • limit – [Fixnum] Number of results to return. Not relavant when searching with specific dois. Default: 20. Max: 1000
  • sample – [Fixnum] Number of random results to return. when you use the sample parameter, the limit and offset parameters are ignored. This parameter only used when works requested. Max: 100
  • sort – [String] Field to sort on. Note: If the API call includes a query, then the sort order will be by the relevance score. If no query is included, then the sort order will be by DOI update date. See sorting_ for possible values.
  • order – [String] Sort order, one of ‘asc’ or ‘desc’
  • facet – [Boolean/String] Set to true to include facet results (default: false). Optionally, pass a query string, e.g., facet=type-name:* or facet=license=*. See Facets_ for options.
  • select – [String/list(Strings)] Crossref metadata records can be quite large. Sometimes you just want a few elements from the schema. You can “select” a subset of elements to return. This can make your API calls much more efficient. Not clear yet which fields are allowed here.
  • works – [Boolean] If true, works returned as well. Default: false
  • kwargs – additional named arguments passed on to requests.get, e.g., field queries (see examples and FieldQueries_)
Returns:

A dict

Usage:

from habanero import Crossref
cr = Crossref()
cr.journals(ids = "2167-8359")
cr.journals()

# pass many ids
cr.journals(ids = ['1803-2427', '2326-4225'])

# search
cr.journals(query = "ecology")
cr.journals(query = "peerj")

# get works
cr.journals(ids = "2167-8359", works = True)
cr.journals(ids = "2167-8359", query = 'ecology', works = True, sort = 'score', order = "asc")
cr.journals(ids = "2167-8359", query = 'ecology', works = True, sort = 'score', order = "desc")
cr.journals(ids = "2167-8359", works = True, filter = {'from_pub_date': '2014-03-03'})
cr.journals(ids = '1803-2427', works = True)
cr.journals(ids = '1803-2427', works = True, sample = 1)
cr.journals(limit: 2)

# cursor - deep paging
res = cr.funders(ids = '10.13039/100000001', works = True, cursor = "*", limit = 200)
sum([ len(z['message']['items']) for z in res ])
items = [ z['message']['items'] for z in res ]
items = [ item for sublist in items for item in sublist ]
[ z['DOI'] for z in items ][0:50]

# field queries
res = cr.journals(ids = "2167-8359", works = True, query_title = 'fish', filter = {'type': 'journal-article'})
[ x.get('title') for x in res['message']['items'] ]
Crossref.types(ids=None, query=None, filter=None, offset=None, limit=None, sample=None, sort=None, order=None, facet=None, works=False, select=None, cursor=None, cursor_max=5000, **kwargs)[source]

Search Crossref types

Parameters:
  • ids – [Array] Type identifier, e.g., journal
  • query – [String] A query string
  • filter – [Hash] Filter options. See examples for usage. Accepts a dict, with filter names and their values. For repeating filter names pass in a list of the values to that filter name, e.g., {‘award_funder’: [‘10.13039/100004440’, ‘10.13039/100000861’]}. See https://github.com/CrossRef/rest-api-doc#filter-names for filter names and their descriptions and filter_names() and filter_details()
  • offset – [Fixnum] Number of record to start at, from 1 to 10000
  • limit – [Fixnum] Number of results to return. Not relavant when searching with specific dois. Default: 20. Max: 1000
  • sample – [Fixnum] Number of random results to return. when you use the sample parameter, the limit and offset parameters are ignored. This parameter only used when works requested. Max: 100
  • sort – [String] Field to sort on. Note: If the API call includes a query, then the sort order will be by the relevance score. If no query is included, then the sort order will be by DOI update date. See sorting_ for possible values.
  • order – [String] Sort order, one of ‘asc’ or ‘desc’
  • facet – [Boolean/String] Set to true to include facet results (default: false). Optionally, pass a query string, e.g., facet=type-name:* or facet=license=* See Facets_ for options.
  • select – [String/list(Strings)] Crossref metadata records can be quite large. Sometimes you just want a few elements from the schema. You can “select” a subset of elements to return. This can make your API calls much more efficient. Not clear yet which fields are allowed here.
  • works – [Boolean] If true, works returned as well. Default: false
  • kwargs – additional named arguments passed on to requests.get, e.g., field queries (see examples and FieldQueries_)
Returns:

A dict

Usage:

from habanero import Crossref
cr = Crossref()
cr.types()
cr.types(ids = "journal")
cr.types(ids = "journal-article")
cr.types(ids = "journal", works = True)

# field queries
res = cr.types(ids = "journal-article", works = True, query_title = 'gender', rows = 100)
[ x.get('title') for x in res['message']['items'] ]
Crossref.licenses(query=None, offset=None, limit=None, sample=None, sort=None, order=None, facet=None, **kwargs)[source]

Search Crossref licenses

Parameters:
  • query – [String] A query string
  • offset – [Fixnum] Number of record to start at, from 1 to 10000
  • limit – [Fixnum] Number of results to return. Not relavant when searching with specific dois. Default: 20. Max: 1000
  • sort – [String] Field to sort on. Note: If the API call includes a query, then the sort order will be by the relevance score. If no query is included, then the sort order will be by DOI update date. See sorting_ for possible values.
  • order – [String] Sort order, one of ‘asc’ or ‘desc’
  • facet – [Boolean/String] Set to true to include facet results (default: false). Optionally, pass a query string, e.g., facet=type-name:* or facet=license=* See Facets_ for options.
  • kwargs – additional named arguments passed on to requests.get, e.g., field queries (see examples and FieldQueries_)
Returns:

A dict

Usage:

from habanero import Crossref
cr = Crossref()
cr.licenses()
cr.licenses(query = "creative")
Crossref.registration_agency(ids, **kwargs)[source]

Determine registration agency for DOIs

Parameters:
  • ids – [Array] DOIs (digital object identifier) or other identifiers
  • kwargs – additional named arguments passed on to requests.get, e.g., field queries (see examples)
Returns:

list of DOI minting agencies

Usage:

from habanero import Crossref
cr = Crossref()
cr.registration_agency('10.1371/journal.pone.0033693')
cr.registration_agency(ids = ['10.1007/12080.1874-1746','10.1007/10452.1573-5125', '10.1111/(issn)1442-9993'])
Crossref.random_dois(sample=10, **kwargs)[source]

Get a random set of DOIs

Parameters:
  • sample – [Fixnum] Number of random DOIs to return. Default: 10. Max: 100
  • kwargs – additional named arguments passed on to requests.get, e.g., field queries (see examples)
Returns:

[Array] of DOIs

Usage:

from habanero import Crossref
cr = Crossref()
cr.random_dois(1)
cr.random_dois(10)
cr.random_dois(50)
cr.random_dois(100)