Introduction
This documentation covers the main API (the so-called REST API). The API provides all the information available on the OpenCorporates website as data. By default it returns data as JSON, but XML is also available.
Access to all the data is free for open data projects under the same open licence conditions as the rest of OpenCorporates. An API key is required in order to use the OpenCorporates API, and usage limits depend on your account type and plan.
If you are matching company names to legal entities from an existing dataset, you should investigate using Open Refine, software which allows data to be filtered and cleansed more easily and more quickly than any other tool we know of. OpenCorporates provides a highly popular reconciliation API for Open Refine, which allows matching company names to legal entities.
Getting started
The endpoint is api.opencorporates.com. We currently support both http and https, but are likely to move to https only in the near future, so all users are suggested to use the secure endpoint
The API by default returns JSON, a lightweight but powerful way of representing data that is natively understood by Javascript (and therefore perfect for widgets, etc), with excellent libraries for all programming languages. It's also fairly easy to understand for humans.
For example the response to
https://api.opencorporates.com/companies/nl/17087985
is
{
"api_version": "0.2",
"results": {
"company": {
"name": "Bover B.V.",
"company_number": "17087985",
"jurisdiction_code": "nl",
"incorporation_date": null,
"dissolution_date": null,
"company_type": "Besloten Vennootschap",
"registry_url": "https://server.db.kvk.nl/TST-BIN/FU/TSWS001@?BUTT=17087985",
"branch": null,
"branch_status": null,
"inactive": false,
"current_status": "Active",
"created_at": "2011-01-12T21:50:57+00:00",
"updated_at": "2012-02-02T10:36:46+00:00",
"retrieved_at": "2011-08-25T14:37:37+01:00",
"opencorporates_url": "https://opencorporates.com/companies/nl/17087985",
"previous_names": null,
"source": {
"publisher": "OpenKVK.nl",
"url": "https://www.openkvk.nl/17087985",
"retrieved_at": "2011-08-25T14:37:37+01:00"
},
"corporate_groupings": [],
"data": {
"most_recent": [
{
"datum": {
"id": 2457732,
"title": "SEC Edgar entry",
"data_type": "OfficialRegisterEntry",
"description": "register id: 1434782",
"opencorporates_url": "https://opencorporates.com/data/2457732"
}
},
{
"datum": {
"id": 2457731,
"title": "Company Address",
"data_type": "CompanyAddress",
"description": "BOKSHEIDE 20, EERSEL P7 5521 PM",
"opencorporates_url": "https://opencorporates.com/data/2457731"
}
}
],
"total_count": 2,
"url": "https://opencorporates.com/companies/nl/17087985/data"
},
"filings": [],
"officers": []
}
}
}
Best practices:
Always use the most up-to-date version, and set the version in your requests (that way if the default version changes your code will still work).
Use the https endpoint - this may become mandatory in the future, and ensures that your API key won't be stolen.
Use the GET /account_status call to keep an eye on your daily/monthly usage to ensure you don't run out of API calls. Daily usage refreshes at midnight UTC each day, and monthly usage refreshes at midnight UTC on the last day of the month.
Statements vs Data
At OpenCorporates we're obsessive about provenance of data – it not only gives confidence in the data by showing the source, and how fresh it is, it also allows errors to be tracked down and fixed, and provides essential context for the data, allowing it to be incorporated in all sorts of different models and uses. This is particularly critical when incorporating such tricky things as corporate relationships, and we think that in the future, 'black box' company data will become recognized as being highly problematic.
The underlying model for data items attached to companies in OpenCorporates (e.g. a telephone number) was the 'datum', but we have since improved this adding even more granularity and more detail to the provenance data. As part of this we have moved to a 'statement' data model rather than the 'datum' model. Over the next few months, we will be migrating all 'datum' items to 'statement' ones. After these migrations, calls to existing datum/[:id] endpoints will still continue to work for some time; however, the data will not be further updated.
Universal attributes/objects
Response
There are two parts to the response: the data that comprises the results, and this is wrapped inside a results object/tag; and meta data, including the api version that was used (useful if none was explicitly requested). XML responses are wrapped in a 'Response' root object.
All objects are returned as JSON by default. We also (as of version 0.2) can return XML if preferred. Simply add format=xml as a query parameter, e.g.
https://api.opencorporates.com/v0.4/companies/gb/00102498?format=xml
or
https://api.opencorporates.com/v0.4/companies/search?q=barclays+bank&format=xml
OpenCorporates URL
All objects are returned with their OpenCorporates URL. This has two benefits: it makes it easy to get the api URL for the given object, by just prefixing the url with 'api.' (e.g. from
https://opencorporates.com/companies/gb/00102498
to
https://api.opencorporates.com/companies/gb/00102498
and it allows the OpenCorporates URL for the object to be linked to, as attribution (remember, OpenCorporates' rights to the data are under the share-alike attribution Open Database Licence).
Pagination
Those calls returning a number of results (e.g. searches, or filings for a company) return a paginated response. By default 30 objects are returned, together with the current page number, and total number of pages. The number per page can be increased (to up to 100) by supplying a :per_page query parameter, and the page number is specified with the :page query parameter (the :page parameter is limited to 100 to ensure that the API is as fast as possible for all users).
The OpenCorporates provenance object
At OpenCorporates we're obsessive about provenance of data, and so we always make it clear when information came from (and when it was retrieved). The provenance object is gradually replacing the source object, and provides a greater granularity of data, as well as additional attributes such as confidence and, sometimes, log messages.
Provenances are attached to multiple objects in the OpenCorporates system, including statements and placeholders, but also the links between, for example, placeholders and companies, or between placeholders and statements. This blog post gives more detailed about the provenance model in OpenCorporates and we will be blogging about it further in the future.
The provenance object consists of the following:
source_url | this is url from which the data was obtained, or the OpenCorporates url for the user, if it was contributed by a user |
confidence | a confidence that the associated data object is correct (numeric value between 0 and 100). We will be publishing more about this value in the future |
source_type | the type of source. Possible values are 'external' (i.e. data from a public source, such as a company register, or government website), 'internal' (i.e. data within the OpenCorporates system), or 'induction' (for example where data has been reconciled to a company by OpenCorporates) |
actor_type | the type of the 'actor' that contributed the data. Possible values are 'bot' (an OpenCorporates Bot) or 'user' (in which case the source_url will contain a link to the user page on OpenCorporates) |
log_message | a note on the source, particularly if the data was added by a user (e.g. a corporate network relationship) |
created_at | the date the provenance was created (and thus the date we retrieved the data or made the match). Note we often regularly check statements are true, and therefore a statement may have many provenances, which act as timestamps for the statement |
The OpenCorporates source object
The detailed responses all include the provenance of the data as a source object, consisting of the following:
retrieved_at | a timestamp of when the information was retrieved from the source, or the data was created. |
source_type | this is either 'user' if the information was contributed by a user, or 'external' if the information was obtained from an external source. |
url | where the information was retrieved from. This may be the URL of a specific datum, or the download URL of a data_dump, or if this is not available the URL of the publisher. If the information was user-contributed it will be the OpenCorporates url of the user. |
publisher | If the information came from an external source, this is the original publisher of the information; if the information was user-contributed, this will be the user's name. |
terms | if we are aware that the external publisher of the data has applied an explicit licence to the data (e.g. in the UK it is often Crown Copyright, or sometimes the Open Government Licence). A Null value for this does *not* imply there is no underlying licence. |
Filter types
Date filter
Date filters can be supplied either as a specific date or as a date range. If a date range is given it should be in the form 2009-08-22:2012-01-08
. Either the start date or the end date may be omitted to make the date range unbounded at the start or end, e.g. :2012-01-08
would represent any date before 8 Jan 2012.
Term filter
Term filters can be supplied as a single term, a comma separated list (the record must match all terms; e.g. foo,bar,baz
), or a pipe separated list (the record need only match one term; e.g. foo|bar|baz
).
Method calls
GET versions
Description: This returns the current version of the API and supported versions. If a specific version has been requested it also returns the requested version.
Example:
https://api.opencorporates.com/v0.4/versions
{
"results": {
"versions": {
"current_version": "0.4",
"requested_version": "0.3",
"supported_versions": [
"0.3",
"0.4"
]
}
}
}
GET companies/:jurisdiction_code/:company_number
Description: This returns the core data for the given company. The jurisdiction code is the code for the jurisdiction which registered the company. If this is a country it is simply the two-letter ISO code for that country, e.g. Spain = es, United Kingdom = gb. If this is a state or province it is an underscore version of the ISO 3166-2 code for the jurisdiction, eg. Michigan in the US is us_mi.
Included in the response will be the core data on the company (incorporation date, company type, registered address, etc), a summary of other data held on the company (e.g. trademarks, payments from government, other addresses), including the most recently added data, and the most recent statutory filings, and parent company, if we have this information (see the company_network method call for more detailed hierarchy data). If you don't need the filings and the other data, or believe there are not likely to be such results, you can pass sparse=true as a query parameter, and this will be both quicker, and potentially a considerably smaller response.
name | the legal name of the company |
company_number | the identifier given to the company by the company register |
jurisdiction_code | the code for the jurisdiction in which the company is incorporated |
company_type | the type of company (e.g. LLC, Private Limited Company, GBMH) |
current_status | the given description of the filing |
incorporation_date | the date the company was incorporated |
dissolution_date | the date the company was dissolved |
inactive | a flag indicating if the company is 'inactive'. This is an OpenCorporates mapping from a number of different inactive company statuses, including dissolved, removed, liquidated, etc. Note that not all companies make company statuses available, so that it cannot be inferred that a company is active just because inactive is not true |
opencorporates_url | the url of the company on OpenCorporates |
previous_names | an array of previous name objects. Each previous name object has a company_name attribute and type attribute (e.g. 'trading', 'legal') and the following optional attributes: start_date, end_date, language as ISO-639 code (for example if it is an alternative legal name in another language) |
alternative_names | an array of alternative name objects. Each alternative name object will has a company_name attribute and an optional con_date attribute, which is the date the company's name changed from the previous name (and thus can be considered to be an end_date) |
alternate_registration_entities | newan array of alternate registration objects (the same company represented in another official registration e.g when more than one headquarters is registered). Each alternate registration object will have company_name, jurisdiction_code, company_number and opencorporates_url attributes. |
previous_registration_entities | newan array of previous registration objects. Previous or superseded registrations are registrations of the same company, which came earlier and have been superseded by the requested company. Each previous registration object will have company_name, jurisdiction_code, company_number and opencorporates_url attributes. |
subsequent_registration_entities | newan array of subsequent registration objects (a registration of the same company, which came later and supersedes the requested company). Each subsequent registration object will have company_name, jurisdiction_code, company_number and opencorporates_url attributes. |
registered_address_in_full | the registered address of the company, as a single string |
registered_address | the registered address of the company, as a structured object |
industry_codes | an array of industry_codes representing the industries the company operates in (see below for more on industry_codes). |
identifiers | an array of identifier objects, including the identifier system name and code, and the identifier uid. For example for Canadian business numbers the uid would be the business number (e.g. "800322042RC0001") and "ca_bn" for the identifier_system_code and "Canadian Business Number" for the identifier_system_name |
registry_url | the url of the companies page in the company register. Note, not all company registers provide persistent urls for the companies in the register |
controlling_entity | This is the controlling parent of the company in question, and is derived either from explicit subsidiary or parent data, or from a company having a majority equity stake in the company |
ultimate_beneficial_owners | These are the ultimate beneficial owners of the company in question, if we know them |
ultimate_controlling_company | This is the ultimate controlling parent of the company in question, if we know them. It is equivalent to the Controlling Company section on the Website. |
branch | a flag to indicate if a company is a 'branch'. If the flag is 'F' it indicates this the entry in the company register relates to an an out-of-jurisdiction company (sometimes called a 'foreign corporation' in the US). If it is 'L' it is a local office of a company (few company registers collect this information). If it is null value, it means either the company is not a branch, or the company register does not make the information available |
branch_status | a descriptive text version of the 'branch' flag |
home_company | when a company is a branch of an out-of-jurisdiction company, this is the 'home' company (if we know it), including the name, jurisdiction_code, company_number and opencorporates_url |
Note: We very very occasionally temporarily redact information on a company to allow the official record to be changed (see OpenCorporates Temporary Redaction for details). In this case, an error message with a 503 HTTP response code will be returned.
Example:
https://api.opencorporates.com/v0.4/companies/gb/00102498
https://api.opencorporates.com/v0.4/companies/gb/00102498?sparse=true
{
"api_version": "0.4",
"results": {
"company": {
"branch_status": null,
"company_number": "00102498",
"company_type": "Public Limited Company",
"corporate_groupings": [
{
"corporate_grouping": {
"name": "bp",
"opencorporates_url": "https://opencorporates.com/corporate_groupings/bp",
"updated_at": "2014-02-16T11:22:24+00:00",
"wikipedia_id": "BP"
}
}
],
"created_at": "2010-10-21T18:20:50+01:00",
"current_status": "Active",
"data": {
"most_recent": [
{
"datum": {
"data_type": "CompanyAddress",
"description": "1 St James's Square, London SW1Y 4PD, GB",
"id": 9788778,
"opencorporates_url": "https://opencorporates.com/data/9788778",
"title": "Company Address"
}
},
{
"datum": {
"data_type": "Website",
"description": "http://www.bp.com/sectiongenericarticle.do?categoryId=9021231&contentId=7039279",
"id": 8474113,
"opencorporates_url": "https://opencorporates.com/data/8474113",
"title": "Website"
}
},
{
"datum": {
"data_type": "OfficialRegisterEntry",
"description": "register id: 313807",
"id": 2452824,
"opencorporates_url": "https://opencorporates.com/data/2452824",
"title": "SEC Edgar entry"
}
}
],
"total_count": 125,
"url": "https://opencorporates.com/companies/gb/00102498/data"
},
"dissolution_date": null,
"filings": [
{
"filing": {
"date": "2014-02-13",
"id": 199825350,
"opencorporates_url": "https://opencorporates.com/filings/199825350",
"title": "Return of purchase of own shares",
"uid": "284acfeJxjZRd2YnXi4ohPyU9OSS1OBnHYQJzMFCdxfgMDA0djQy9/Cw8TUxMzAycuzvi0/KLcksqCVCdxlmAPA2MnLtb4lOTEEidxRguYMYklQFkOIwNDEwMjQ+MmNef83ILEvMzUYo/80uJUK6sIXx/3cCsrz9zE9FQo5Z1aSaQybgYGBkYgZgJiZiBmAWJWIGYDYnYg5gBiTiDmAmJuANC4NJA="
}
},
{
"filing": {
"date": "2014-02-13",
"id": 199825349,
"opencorporates_url": "https://opencorporates.com/filings/199825349",
"title": "Notice of cancellation of shares",
"uid": "771a5aeJxjZRd2YnXi4ohPyU9OSS1OBnHYQJzMFCdxfgMDA0djQy9/iwBXUxMzAycuzvi0/KLcksqCVCdxlmAPAzMnLtb4lOTEEidxRkuYMYklQFkOIwNDEwMjQ+MmNef83ILEvMzUYo/80uJUK6sIXx/3cCsrz9zE9FQo5Z1aSaQybgYGBkYgZgJiZiBmAWJWIGYDYnYg5gBiTiDmAmJuAOT2NK0="
}
}
],
"inactive": false,
"incorporation_date": "1909-04-14",
"industry_codes": [
{
"industry_code": {
"code": "70100",
"description": "Activities of head offices",
"code_scheme_id": "uk_sic_2007",
"code_scheme_name": "UK SIC Classification 2007"
}
}
],
"jurisdiction_code": "gb",
"name": "BP P.L.C.",
"officers": [
{
"officer": {
"end_date": null,
"id": 32609673,
"name": "DAVID JOHN JACKSON",
"opencorporates_url": "https://opencorporates.com/officers/32609673",
"position": "secretary",
"start_date": "2003-07-24",
"uid": null
}
},
{
"officer": {
"end_date": "2012-03-30",
"id": 32609674,
"name": "DAVID JOHN PEARL",
"opencorporates_url": "https://opencorporates.com/officers/32609674",
"position": "secretary",
"start_date": "2001-11-01",
"uid": null
}
},
{
"officer": {
"end_date": null,
"id": 32609675,
"name": "PAUL MILTON ANDERSON",
"opencorporates_url": "https://opencorporates.com/officers/32609675",
"position": "director",
"start_date": "2010-02-01",
"uid": null
}
},
{
"officer": {
"end_date": null,
"id": 32609676,
"name": "FRANK BOWMAN",
"opencorporates_url": "https://opencorporates.com/officers/32609676",
"position": "director",
"start_date": "2010-11-08",
"uid": null
}
}
],
"opencorporates_url": "https://opencorporates.com/companies/gb/00102498",
"previous_names": [
{
"company_name": "BP AMOCO P.L.C.",
"con_date": "2001-05-01"
},
{
"company_name": "THE BRITISH PETROLEUM COMPANY P.L.C.",
"con_date": "1998-12-31"
}
],
"alternate_registration_entities": [],
"previous_registration_entities": [],
"subsequent_registration_entities": [],
"registered_address_in_full": "1 ST JAMES'S SQUARE, LONDON, SW1Y 4PD",
"registry_url": "http://data.companieshouse.gov.uk/doc/company/00102498",
"retrieved_at": "2014-02-16T10:06:59+00:00",
"source": {
"publisher": "UK Companies House",
"retrieved_at": "2014-02-16T10:06:59+00:00",
"terms": "UK Crown Copyright",
"url": "http://xmlgw.companieshouse.gov.uk/"
},
"updated_at": "2014-02-16T10:07:06+00:00"
}
}
}
GET companies/search
Description: This returns a collection of companies whose name matches the given search term (submitted as :q in the query parameters). It's important to note that the search is deliberately quite loose, requiring the returned companies to have all the searched-for words (in any order), but allowing other words to be present too (so 'Bank Barclays' is the same as 'Barclays Bank').
The search is case-insensitive and returns companies with previous names matching the term as well as current name, and some normalisation of the company names is done, removing non-text characters (e.g. dashes, parentheses, commas), common 'stop words' (e.g. 'the', 'of'), and normalising common company types (e.g. Corp, Inc, Ltd, PLC) so that both the short and long versions can be used.
The companies are returned in alphabetic order by default but you can return ordered by score (as ranked by our ElasticSearch search index by passing the order=score query parameter. The response is paginated (see pagination).
From v0.4, the company information returns the registered address if known.
Use of the wildcard '*': You can also search for company names beginning with the given search term by ending the term with a '*', so that 'Barclays Bank*' will match 'Barclays Bank PLC' but not 'Barclays UK Bank', 'Barclays Big Bank' or 'Local Barclays Branch'.
Facet restrictions: You can restrict the results by a number of 'facets' to allow extremely powerful searching and exploring of the data, combining with company names or part of names.
jurisdiction_code Term filter | The companies searched for can be restricted to a given jurisdiction by passing a jurisdiction_code query parameter. |
country_code Term filter | The companies searched for can be restricted to a given country by passing a country_code query parameter. Note that in most cases the country and jurisdiction are the same, but for multi-jurisdiction country such as the US or Canada this can be very useful. |
company_type Term filter | The type of the company, as defined by the company register. |
current_status Term filter | The current status of the company, as defined by the company register. |
industry_codes Term filter | One or more industry codes representing the industries the company operates in. The codes can be those in the company's jurisdiction's native code scheme, or any mapped schemes, or any parent of those codes (when the schemes are hierarchical). The values submitted should be the industry_code uid, consisting of the industry_code :code_scheme_id and :code joined with a hyphen (see below for more on industry_codes). |
registered_address Term filter | The companies searched for can be restricted by passing in an address or parts of an address. This performs a similar search to the basic companies search, so searching for '52 London' will search for address with 52 and London in them, e.g. '52 Acacia Ave, London, NW1', or '52 London Road, St Albans' |
created_at Date filter | Companies added to OpenCorporates on the given date. |
incorporation_date Date filter | Companies incorporated on the given date |
dissolution_date Date filter | Companies dissolved on the given date |
created_before | DeprecatedRestrict to companies added to OpenCorporates before the given date (ISO 8601 format). Deprecated in favour of new created_at functionality. |
created_since | DeprecatedRestrict to companies added to OpenCorporates after the given date (ISO 8601 format). Deprecated in favour of new created_at functionality. |
incorporated_before | DeprecatedRestrict to companies with an incorporation_date before the given date (ISO 8601 format). Deprecated in favour of new incorporation_date functionality. |
incorporated_since | DeprecatedRestrict to companies with an incorporation_date after the given date (ISO 8601 format). Deprecated in favour of new incorporation_date functionality. |
dissolved_before | DeprecatedRestrict to companies with a dissolution_date before the given date (ISO 8601 format). Deprecated in favour of new dissolution_date functionality. |
dissolved_since | DeprecatedRestrict to companies with a dissolution_date after the given date (ISO 8601 format). Deprecated in favour of new dissolution_date functionality. |
exclude_inactive | DeprecatedRestrict to companies that are active/inactive. Deprecated in favour of new inactive functionality. |
inactive | Filter by inactive status (boolean). This replaces the exclude_inactive filter from previous versions. If true is supplied it will restrict to inactive companies. If false is supplied it will exclude inactive companies. If no value is supplied it will not filter by inactive status. |
branch | Filter by branch status (boolean). This replaces the exclude_branches filter from previous versions. If true is supplied it will restrict to branch companies. If false is supplied it will exclude branch companies. If no value is supplied it will not filter by branch status. |
nonprofit | Filter by nonprofit company type (boolean). If true is supplied it will restrict to entities that we have identified as being of nonprofit company type. If false is supplied it will exclude such companies. If no value is supplied it will not filter by nonprofit company type. |
identifier_uids Term filter | The companies searched for can be restricted to those with the given third-party identifier, such as business or charity numbers, tax identifiers, etc. |
fields | By default when searching with a term (e.g. 'Barclays Bank') it looks for a match in name, normalised_name, and previous_names fields. Using the fields parameter gives you more control over which fields to search in. This allows access to additional fields like company_number or postal_code and also gives the ability to exclude some of the default fields (e.g. when searching in previous names is not desired). Options are name, normalised_name, company_number, heavily_normalised_number (company number excluding leading zeroes, for example), native_company_number, previous_names, postal_codes, trademark_registration_mark_texts. |
normalise_company_name | Normalise company name before searching for it (boolean). Unlike the main OpenCorporates website, the API does not normalise the company name before searching for it (so that restrictions work effectively). If true is supplied, this will normalise the submitted company name before searching (so that Ltd will be normalised to Limited, Corp to Corporation etc). |
types_of_data_held Term filter | Filter results by companies that have the supplied types of related data. For valid options see the list visible when using the search feature on opencorporates.com. |
Additional sorting options (from v0.4): Users can also sort by 4 date fields (all in reverse order, i.e. newest first):
created_at | a timestamp of when the company was added to OpenCorporates. |
updated_at | the datetime the company was updated in any way. The company record will be considered to be updated in many circumstances, including when any associated data is changed. |
incorporation_date | the date of incorporation as given by the company register. Please note that not all company registries record and publish this date. |
dissolution_date | the date of dissolution as given by the company register. Please note that not all company registries record and publish this date. |
Example:
https://api.opencorporates.com/v0.4/companies/search?q=barclays+bank
https://api.opencorporates.com/v0.4/companies/search?q=barclays&per_page=50&page=2
https://api.opencorporates.com/v0.4/companies/search?q=barclays+bank&jurisdiction_code=gb
https://api.opencorporates.com/v0.4/companies/search?q=barclays+bank*&jurisdiction_code=gb
https://api.opencorporates.com/v0.4/companies/search?q=barclays+bank&jurisdiction_code=gb¤t_status=Active
https://api.opencorporates.com/v0.4/companies/search?q=bank+of+scotland
https://api.opencorporates.com/v0.4/companies/search?q=bank+of+scotland&order=score
https://api.opencorporates.com/v0.4/companies/search?q=bank+of+scotland&inactive=false
https://api.opencorporates.com/v0.4/companies/search?q=bank+of+scotland&order=incorporation_date
https://api.opencorporates.com/v0.4/companies/search?q=bank+of+scotland&order=incorporation_date&incorporation\date=2013-12-03:2014-05-22
https://api.opencorporates.com/v0.4/companies/search?q=bank+of+scotland&fields=name,previous_names
https://api.opencorporates.com/v0.4.1/companies/search?industry_codes=eu_nace_2-869,eu_nace_2-691
{
"api_version": "0.4",
"results": {
"companies": [
{
"company": {
"branch_status": null,
"company_number": "SC024750",
"company_type": null,
"created_at": "2011-04-24T11:14:25+01:00",
"current_status": "Dissolved",
"dissolution_date": null,
"inactive": true,
"incorporation_date": null,
"jurisdiction_code": "gb",
"name": "ABERDEEN BANK OF SCOTLAND NOMINEES LIMITED",
"opencorporates_url": "https://opencorporates.com/companies/gb/SC024750",
"previous_names": null,
"registry_url": "http://data.companieshouse.gov.uk/doc/company/SC024750",
"retrieved_at": null,
"source": {
"publisher": "UK Companies House",
"retrieved_at": null,
"terms": "UK Crown Copyright",
"url": "http://xmlgw.companieshouse.gov.uk/"
},
"updated_at": "2014-01-18T22:44:40+00:00",
"registered_address_in_full": null
}
},
{
"company": {
"branch": "F",
"branch_status": "branch of an out-of-jurisdiction company",
"company_number": "344214",
"company_type": "Alien Corporations (RICO) - Foreign",
"created_at": "2011-09-30T12:52:25+01:00",
"current_status": "Active/Compliance",
"dissolution_date": null,
"inactive": false,
"incorporation_date": "2005-03-28",
"jurisdiction_code": "us_ga",
"name": "BANK OF SCOTLAND",
"opencorporates_url": "https://opencorporates.com/companies/us_ga/344214",
"previous_names": [],
"registry_url": "http://corp.sos.state.ga.us/corp/soskb/Corp.asp?344214",
"retrieved_at": "2011-10-04T15:15:15+01:00",
"source": {
"publisher": "Georgia Secretary of State",
"retrieved_at": "2011-10-04T15:15:15+01:00",
"url": "http://corp.sos.state.ga.us/corp/soskb/Corp.asp?344214"
},
"updated_at": "2014-02-16T16:18:16+00:00",
"registered_address_in_full": "THE MOUND,EDINBURGH,EHI 1YZ, SCOTLAND ZF"
}
},
{
"company": {
"branch": "F",
"branch_status": "branch of an out-of-jurisdiction company",
"company_number": "601846892",
"company_type": "BNK",
"created_at": "2011-09-15T07:34:40+01:00",
"current_status": "Active",
"dissolution_date": null,
"inactive": false,
"incorporation_date": "1998-01-21",
"jurisdiction_code": "us_wa",
"name": "BANK OF SCOTLAND",
"opencorporates_url": "https://opencorporates.com/companies/us_wa/601846892",
"previous_names": null,
"registry_url": "http://www.sos.wa.gov/corps/search_detail.aspx?ubi=601846892",
"retrieved_at": "2013-03-06T16:59:21+00:00",
"source": {
"publisher": "Washington Secretary of State - Corporations Division",
"retrieved_at": "2013-03-06T16:59:21+00:00",
"url": "http://www.sos.wa.gov/corps/search_detail.aspx?ubi=601846892"
},
"updated_at": "2014-02-06T17:44:27+00:00",
"registered_address_in_full": null
}
}
],
"page": 1,
"per_page": 30,
"total_count": 190,
"total_pages": 7
}
}
GET companies/:jurisdiction_code/:company_number/filings
Description: This returns the statutory filings for the given company. Each filing will be returned with the date of filing, the OpenCorporates id and url for the filing, and one or many of the following
uid | the id given to the filing by the company registry |
title | this is either the given title of the filing, or the filing_type, or a generic field containing a human-friendly version of the date. This means that every filing can be relied upon to have a filing_title |
description | the given description of the filing |
url | the url of the filing. This may be a url of an HTML page, or of the document itself, for those more enlightened jurisdictions which make this available without charge |
filing_type_name | a human-readable name of the type of filing. This might have been computed from the filing_code |
filing_code | the code given by the company registry to this type of filing |
The response is paginated (see pagination).
Example:
https://api.opencorporates.com/v0.4/companies/gb/00102498/filings
https://api.opencorporates.com/v0.4/companies/gb/00102498/filings?page=2
{
"api_version": "0.4",
"results": {
"filings": [
{
"filing": {
"date": "2014-02-13",
"description": "RETURN OF PURCHASE OF OWN SHARES",
"filing_code": "SH03",
"filing_type": "Return of purchase of own shares",
"id": 199825350,
"opencorporates_url": "https://opencorporates.com/filings/199825350",
"title": "Return of purchase of own shares",
"uid": "284acfeJxjZRd2YnXi4ohPyU9OSS1OBnHYQJzMFCdxfgMDA0djQy9/Cw8TUxMzAycuzvi0/KLcksqCVCdxlmAPA2MnLtb4lOTEEidxRguYMYklQFkOIwNDEwMjQ+MmNef83ILEvMzUYo/80uJUK6sIXx/3cCsrz9zE9FQo5Z1aSaQybgYGBkYgZgJiZiBmAWJWIGYDYnYg5gBiTiDmAmJuANC4NJA=",
"url": null
}
},
{
"filing": {
"date": "2014-02-13",
"description": "13/02/14 STATEMENT OF CAPITAL GBP 12706252, 13/02/14 STATEMENT OF CAPITAL USD 5084797994.75",
"filing_code": "SH06",
"filing_type": "Notice of cancellation of shares",
"id": 199825349,
"opencorporates_url": "https://opencorporates.com/filings/199825349",
"title": "Notice of cancellation of shares",
"uid": "771a5aeJxjZRd2YnXi4ohPyU9OSS1OBnHYQJzMFCdxfgMDA0djQy9/iwBXUxMzAycuzvi0/KLcksqCVCdxlmAPAzMnLtb4lOTEEidxRkuYMYklQFkOIwNDEwMjQ+MmNef83ILEvMzUYo/80uJUK6sIXx/3cCsrz9zE9FQo5Z1aSaQybgYGBkYgZgJiZiBmAWJWIGYDYnYg5gBiTiDmAmJuAOT2NK0=",
"url": null
}
},
{
"filing": {
"date": "2014-02-13",
"description": "13/02/14 STATEMENT OF CAPITAL GBP 12706252, 13/02/14 STATEMENT OF CAPITAL USD 5086635494.75",
"filing_code": "SH06",
"filing_type": "Notice of cancellation of shares",
"id": 199825348,
"opencorporates_url": "https://opencorporates.com/filings/199825348",
"title": "Notice of cancellation of shares",
"uid": "6122e4eJxjZRd2YnXi4ohPyU9OSS1OBnHYQJzMFCdxfgMDA0djQy9/iwBfUxMzAycuzvi0/KLcksqCVCdxlmAPAzMnLtb4lOTEEidxRkuYMYklQFkOIwNDEwMjQ+MmNef83ILEvMzUYo/80uJUK6sIXx/3cCsrz9zE9FQo5Z1aSaQybgYGBkYgZgJiZiBmAWJWIGYDYnYg5gBiTiDmAmJuAOqmNLU=",
"url": null
}
} ],
"page": 1,
"per_page": 30,
"total_count": 676,
"total_pages": 23
}
}
GET companies/:jurisdiction_code/:company_number/network
Description: This returns the immediate 'computed corporate network' for the given company as a set of control relationships (i.e. one company is thought to control or influence another company). This is the same data you can see on a company's network page on the main OpenCorporates site.
A control relationship is a relationship of control from one company to another. The relationship type can be found in the api response. Relationships are directional and we use the terms 'parent' and 'child' to indicate the direction of the relationships. For example, if 'Company A' is a subsidiary of 'Company B', then the api response would read {parent_name: Company B, child_name: Company A, relationship_type: has_subsidiary"}
. Conversely, if 'Company B' is a subsidiary of 'Company A', then the api response would be {parent_name: Company A, child_name: Company B, relationship_type: has_subsidiary"}
These relationships are computed automatically from a number of relationship statements associated with each company, and the network will change as more statements are added, because for example new relationships are discovered, or statements are added which say that a previous statement is no longer true (see statements for more details), or even that our algorithms for calculating relationships are improved.
Each relationship is made of the following attributes:
relationship_type | the type of relationship, e.g. subsidiary, shareholding. A subsidiary relationship typically comes from statutory filings (e.g. SEC 10-K reports); shareholding information typically coms from company registers, and is more granular |
relationship_properties | any additional properties of the relationship, e.g. ownership percentage |
confidence | a computed confidence in the relationship based on the underlying statements |
parent_name | the name of the parent entity |
parent_type | the type of entity the parent is |
parent_opencorporates_url | the OpenCorporates URL of the parent entity |
child_name | the name of the child entity |
child_type | the type of entity the child is |
child_opencorporates_url | the OpenCorporates URL of the child entity |
The response is not paginated and can return no results (if we have no known relationships) or hundreds of relationships. It currently returns just a depth of 1 (i.e. just immediate parents and children). We are looking at adding greater levels of depth. Note the related entities may be companies, or placeholders. Placeholders are objects that we haven't yet matched to a company, either because we don't have the companies in that jurisdiction, or because we can't confidently match it to a company. To allow the network to be 'walked', you can also make network requests for placeholders, e.g. A Company controls B Placeholder controls C Company. Note that some networks are circular (A controls B, which controls C, which controls A), and you should allow for this when making repeated network calls so that you do not get stuck in an endless loop.
Filter options:
confidence | a computed confidence in the relationship based on the underlying statements (between 0 and 100). Only relationships above this confidence will be returned (the default value here is 60). You can also pass in 'all' here to get all relationships, irrespective of the confidence in the data |
dates | By default, the network data will be what we think to be true today (usually because the information on which it is based is recent enough to make that a reasonable assumption). However, if a date is passed in (in ISO 8601 format), it will be the network data we have that is believed to be current on that date. This is useful for data such as the US banks, for which we hold good data going back over 10 years. |
ownership_percentage | By default the API will return every control relationship we know about where the percentage control is greater or equal to 2%. However, this can be overridden by passing a numeric value here, for example 50 or even 0 (for every relationship, regardless of percentage). Note that this will not affect the results for control relationships where we do not know the percentage (e.g. many subsidiary relationships) |
Example:
https://api.opencorporates.com/v0.4/companies/gb/00102498/network
https://api.opencorporates.com/v0.4/companies/gb/00102498/network?confidence=80
GET companies/:jurisdiction_code/:company_number/statements
Description: This returns the statements associated with each company. A statement is a purported 'statement of fact' from a source (a public record or a user). For example, subsidiary statement may have been parsed from a filing at the US Securities And Exchange Commission, or a user may have made a statement that one company is a parent of another. For more details, see the statements section below
The response is paginated (see pagination).
Example:
https://api.opencorporates.com/v0.4/companies/gb/00102498/statements
https://api.opencorporates.com/v0.4/companies/gb/00102498/statements?page=2
GET companies/:jurisdiction_code/:company_number/data
Description: [Note the 'data' type is being deprecated in favour of statements, which has a number of benefits, including improved provenance, and, shortly, improved searchability] This returns the data held for the given company. In OpenCorporates a datum is a piece of information derived from a public record, or contributed by a user. Examples are a website, sales tax number, address, or entry in an official register (e.g. the UK Charity Register or US SEC register). Each datum will be returned with the OpenCorporates id, the OpenCorporates URL for the datum, timestamps indicating when they were created/updated and the following:
title | this is the title of the datum as displayed on OpenCorporates. It is computed internally depending on the data_type |
description | the given description of the datum as displayed on OpenCorporates. It is computed internally depending on the data_type. Together with the title this makes it easy to display a useful summary of the datum |
data_type | this is a string value denoting the type of data, e.g. 'CompanyAddress', 'OfficialRegisterEntry' |
The response is paginated (see pagination).
Example:
https://api.opencorporates.com/v0.4/companies/gb/00102498/data
GET companies/events
Description: This endpoint allows all company events to be queried and filtered. Each matched event will be returned with its OpenCorporates ID and a range of data attributes, described in more detail below.
What is an Event?
An Event may be defined as a "change" in the lifecycle of a particular corporate entity based on data retrieved from the jurisdiction's company register. Each "change" in the official company register triggers a "snapshot" (a point-in-time view of a company) to be created in the OpenCorporates database. A comparison of these snapshots over time allows us to infer and create different types of event. Events then describe a series of changes, from incorporation to dissolution, from the official register during a corporate entity’s lifecycle. Events may also be generated from a single piece of information that reflects a real-world event (such as a specific filing or gazette notice).
GET companies/:jurisdiction_code/events
Description: This endpoint allows all company events to be queried and filtered for a specified jurisdiction. Each matched event will be returned with its OpenCorporates ID and a range of data attributes, described below.
Filters, Sorting & Pagination
The above events
endpoints can be filtered using the following querystring parameters
Filter parameters | |
time_range Date filter | Filter by date range of when events could have occurred (see definition below). Given that these are whole dates, the event dates cover 00:00:00 to 23:59:59 on the specified date. GET /companies/events?time_range=2019-01-01:2019-01-05 |
created_at Date filter | Filter by date range of when the event was created (single date). E.g. GET /companies/events?created_at=2019-02-02 |
type Term filter | Filter by event type. Although this is a term filter, and therefore supports AND/OR type queries for multiple types, only OR will return results, as events can only be 1 type. See below for list of types. E.g. GET /companies/events?type=Event::Company::Incorporation |
categories | Filter by a category. E.g. GET /companies/events?categories=kyc |
jurisdiction_code | Filter by jurisdiction of company registration. E.g. GET /companies/events?jurisdiction_code=us_fl |
country_code | Filter by country code of company registration. E.g. GET /companies/events?country_code=us |
The following parameters allow sorting of data returned by the above endpoints.
Sort parameters | |
order | Sorting is possible by the following two attributes: created_at or time_range_ends_at . Currently only descending order is supported, however we will support ascending sort order in a future release. E.g. GET /companies/events?type=Event::Company::Incorporation&order=created_at
|
The above endpoints return a number of results, which are paginated. By default 30 objects are returned, together with the current page number, and the total number of pages. Returning results for a specific page is possible using the following parameters:
Pagination parameters | |
per_page | Integer. Number of results to be returned on each page. Default is 30, maximum is 100. E.g. GET /companies/events/gb?type=Event::Company::Incorporation&time_range=2019-01-01:2019-01-05&per_page=30
|
page | Integer. Number of the required page of results. Default is page 1. This parameter is limited to 100 to ensure that the API is as fast as possible for all users. E.g. GET /companies/events/gb?type=Event::Company::Incorporation&time_range=2019-01-01:2019-01-05&per_page=30&page=4
|
Total number of pages and number of results are included as part of the API response:
{
"api_version": "0.4.7",
"results": {
"events": [ ... ], // array of results
"page": 4,
"per_page": 30,
"total_pages": 5,
"total_count": 145
}
}
GET companies/:jurisdiction_code/:company_number/events
Description: This returns an array of events data for the given company. Each event will be returned with its OpenCorporates ID and a range of data attributes, described below.
The default response will be the most recent 30 events for a company based on time_range_ends_at
in descending sort order.
Attribute | Description |
id | The unique id of an event record. |
created_at | When this event record was created by Opencorporates (note this is not the same as the date of the event). Timestamp in ISO 8601 format. |
opencorporates_url | The url of the company event on OpenCorporates |
jurisdiction_code | The ISO-3166 alpha-2 code for the jurisdiction in which the company is incorporated. For the US, Canada & UAE, the country code is followed by the ISO-3166-2 region/state code Lower case, with country & region codes separated by underscore ("_") |
company_number | The identifier given to the company by the company register |
type | Enumerable representing the event type code:
|
categories |
A list of categories which apply to the event type:
The following categories are mapped to the event type:
|
time_range | The earliest date (if known) and the latest date on which this event could have occurred |
time_range.starts_at | Earliest date. Timestamp in ISO 8601 format |
time_range.ends_at | Latest date. Timestamp in ISO 8601 format |
description | A text description of what happened.
Pattern: ^(Became Inactive|No Longer Inactive|Incorporated|Change of status from '.+' to '.+'|Change of name from '.+' to '.+')$
Officer pattern: ^(New officer: '.+'|Removed officer: '.+')$
Gazette Notice pattern: ^(Gazette Notice|Gazette Notice: .+)$
|
provenance | An event is either calculated based on the difference between two snapshots of a company observed on different dates, or by a single piece of information that reflects a real-world event (such as a specific filing or gazette notice). We refer to this in the API as a "statement"
The provenance provides the date(s) on which the snapshots were taken (for those applicable event types), as well as more detailed provenance information relating to the sources where information for the event was taken (for example a specific filing or gazette notice). |
provenance.earlier_snapshot | Provenance information for the earlier snapshot object. Applies to events derived from one or more snapshots. |
provenance.earlier_snapshot.sample_date | Date on which the earlier snapshot of company data was observed. Timestamp in ISO 8601 format |
provenance.later_snapshot | Provenance information for the subsequent snapshot object. Applies to events derived from one or more snapshots. Some events are calculated based on the earlier snapshot only (for example, Incorporation), in which case this object might be null |
provenance.later_snapshot.sample_date | Date on which the later snapshot of company data was observed. Timestamp in ISO 8601 format |
provenance.id | The statement ID. Applicable only to events derived from statements |
provenance.type | Will be set to "statement". Applicable only to events derived from statements |
provenance.opencorporates_url | The URL to the statement on OpenCorporates. Applicable only to events derived from statements |
provenance.sample_date | Date on which the statement was observed. Date in ISO 8601 format. Applicable only to events derived from statements |
derived_from | Object containing structured source data from which the event was derived. Information from this used to calculate the event description.
Some event types will only have data in one of before or after
Change of status:
Change of name:
Company incorporation:
Company Became Inactive:
Company Is No Longer Inactive:
Addition/Removal of officer. The before section contains data relating to the new/removed officer (if present) from the snapshot of data taken prior to the event. The after section will reflect the officer data from the later snapshot.
Gazette Notice Publication. The before and after objects will be null, given that this is a single observation. The datum relating to the event will be in the payload object.
|
derived_from.before | See above |
derived_from.after | See above |
payload | Contains structured source data that relates to the real-world event.
For example, for a new or changed officer, given that the `derived_from` object contains the before and after picture of the officer, the payload object will contain details of the newly added or removed officer that triggered the event. For Gazette Notices, it will contain summary information about the gazette notice publication.
This object is populated only for the following event types: Addition of officer (see above for fields returned for officer):
Removal of officer (see above for fields returned for officer):
Gazette Notice Publication (note that different sources will contain varying levels of completion of the attributes described below):
|
Example:
https://api.opencorporates.com/companies/us_nj/0400549703/events
Example response
{
"api_version": "0.4.7",
"results": {
"events": [
{
"id": 986979731,
"created_at": "2019-05-28T20:43:44Z",
"opencorporates_url": "https://opencorporates.com/events/986979731",
"jurisdiction_code": "us_nj",
"company_number": "0400549703",
"type": "Event::Company::Incorporation",
"event_class": "company",
"categories": [
"existence",
"corporate"
],
"time_range": {
"starts_at": "2013-02-12T00:00:00Z",
"ends_at": "2013-02-13T00:00:00Z"
},
"description": "Incorporated",
"derived_from": {
"before": null,
"after": {
"incorporation_date": "2013-02-12"
}
},
"provenance": {
"type": "company",
"earlier_snapshot": null,
"later_snapshot": {
"sampled_at": "2019-01-23T07:58:05Z"
}
}
}
],
"page": 1,
"per_page": 30,
"total_pages": 0,
"total_count": 1
}
}
GET officers/search
This returns a collection of officers whose name matches the given search term (submitted as :q in the query parameters). It's important to note that the search is deliberately quite loose, requiring the returned officers to have all the searched-for words (in any order), but allowing other words to be present too (so 'John Smith' is the same as 'Smith John').
The search is case-insensitive.
The officers are returned in alphabetic order by default but you can return ordered by score (as ranked by our ElasticSearch search index by passing the order=score query parameter. The response is paginated (see pagination).
Facet restrictions: You can restrict the results by a number of 'facets' to allow extremely powerful searching and exploring of the data, combining with company names or part of names. Note: All dates should be given in ISO 8601 format.
jurisdiction_code Term filter | The officers searched for can be restricted to a given jurisdiction by passing a jurisdiction_code query parameter. |
date_of_birth Date filter | The companies searched for can be restricted by passing in an exact date of birth or date span (note we currently only have date of birth for UK company directors). |
position Term filter | The officers searched for can be restricted by passing a position (e.g. 'director', 'ceo', 'agent'). |
address Term filter | The officers searched for can be restricted by passing in an address or parts of an address. This performs a similar search to the basic companies search, so searching for '52 London' will search for address with 52 and London in them, e.g. '52 Acacia Ave, London, NW1', or '52 London Road, St Albans' |
inactive | Filter by inactive status (boolean). If true is supplied it will restrict to inactive officers (either where they are no longer directors of an active company, or where the company is inactive). If false is supplied it will exclude inactive officers. If no value is supplied it will not filter by inactive status. |
Example:
https://api.opencorporates.com/v0.4/officers/search?q=john+smith
https://api.opencorporates.com/v0.4/officers/search?q=john+smiths&per_page=50&page=2
https://api.opencorporates.com/v0.4/officers/search?q=john+smith&jurisdiction_code=gb
https://api.opencorporates.com/v0.4/officers/search?q=john+smith&order=score
GET officers/:id
Description: This returns information on a particular officer (a director or an agent for a company). Each officer will be returned with the name of the officer, the OpenCorporates id and url for the officer, the company it relates to, and one or more of the following:
position | the position held (e.g. director, secretary, CEO) |
uid | the id given to the officer by the company registry |
start_date | this is date on which the officership started |
end_date | this is date on which the officership ended |
address | the given address of the officer, if known |
date_of_birth | the date of birth of the officer, if known |
GET corporate_groupings/:name
Description: This returns information on a given CorporateGrouping. A CorporateGrouping is a user-curated collection of companies that belong to some human-understand concept of a corporation (which maps to the Wikipedia article about that corporation). See (https://blog.opencorporates.com/2011/06/01/introducing-corporategroupings-where-fuzzy-concepts-meet-legal-entities/). The name of the CorporateGrouping is case-insensitive Included in the response will be core information for the CorporateGrouping (:name, :wikipedia_url, :companies_count), together an array of membership of the CorporateGrouping (each membership will contain a company and an OpenCorporates Source Object), and an array of the users that are curating this CorporateGrouping
Example:
https://api.opencorporates.com/v0.4/corporate_groupings/capita
GET corporate_groupings/search
Description: This returns a collection of corporate_groupings whose name matches the given search term (submitted as :q in the query parameters). The search is case-insensitive, and is a stem-search, that is it searches for corporate_groupings whose name begins with the given characters.
The response is paginated (see pagination).
Example:
https://api.opencorporates.com/v0.4/corporate_groupings/search?q=bar
https://api.opencorporates.com/v0.4/corporate_groupings/search?q=ba&per_page=50&page=2
GET filings/:id
Description: This returns information on a statutory filing for the a company. Each filing will be returned with the date of filing, the OpenCorporates id and url for the filing, the company it relates to, and one or many of the following
uid | the id given to the filing by the company registry |
title | this is either the given title of the filing, or the filing_type, or a generic field containing a human-friendly version of the date. This means that every filing can be relied upon to have a filing_title |
description | the given description of the filing |
url | the url of the filing. This may be a url of an HTML page, or of the document itself, for those more enlightened jurisdictions which make this available without charge |
filing_type_name | a human-readable name of the type of filing. This might have been computed from the filing_code |
filing_code | the code given by the company registry to this type of filing |
GET data/:id
Description: [Note the 'data' type is being deprecated in favour of statements, which has a number of benefits, including improved provenance, and, shortly, improved searchability] This returns information on a given datum. In OpenCorporates a datum is a piece of information derived from a public record, or contributed by a user. Examples are a website, sales tax number, address, or entry in an official register (e.g. the UK Charity Register or US SEC register). Note that a datum can relate to more than one company (e.g. an official notice of a merger between two companies), and so an array of companies is returned, each including the company name, jurisdiction_code, company_number and OpenCorporates url.
The datum will also return the datatype, title, and description, as described in GET companies/:jurisdictioncode/:companynumber/data above. In addition the detailed attributes of the datum are returned as 'attributes' – these vary depending on the datatype.
Finally the source of the data will be returned as an OpenCorporates source object
Example:
https://api.opencorporates.com/v0.4/data/2601371
GET statements/subsequent_registrations/search
Returns all subsequent registrations matching the given search term.
Results are ordered by created_at, the date the subsequent registration was created in OpenCorporates
The response is paginated (see pagination)
Example:
https://api.opencorporates.com/v0.4/statements/subsequent_registrations/search
GET statements/alternate_registrations/search
Returns all alternate registrations matching the given search term.
Results are ordered by created_at, the date the alternate registration was created in OpenCorporates
The response is paginated (see pagination)
Example:
https://api.opencorporates.com/v0.4/statements/alternate_registrations/search
GET statements/gazette_notices/search
This returns a collection of gazette notices that match the given search term (submitted as :q in the query parameters). It's important to note that the search is deliberately quite loose, but requires the returned gazette notices to have all the searched-for words (in any order).
The search is case-insensitive.
The gazette notices are by default ordered by date published in reverse order (newest first), but you can return ordered by score (as ranked by our ElasticSearch search index) by passing the order=score query parameter.
The response is paginated (see pagination)
Facet restrictions: You can restrict the results by a number of 'facets' to allow extremely powerful searching and exploring of the data. Note: All dates should be given in ISO 8601 format.
jurisdiction_code Term filter | The gazette notices searched for can be restricted to a given jurisdiction by passing a jurisdiction_code query parameter. |
publication_title Term filter | The publication the gazette notice is published in |
normalised_classification_level_1 Term filter | The type of gazette notice |
Example:
https://api.opencorporates.com/v0.4/statements/gazette_notices/search?q=bar
GET statements/control_statements/search
This returns a collection of control statements that match the given search terms.
The control statements are by default ordered by date created in reverse order (newest first), but you can return ordered by score (as ranked by our ElasticSearch search index) by passing the order=score query parameter.
The response is paginated (see pagination).
Facet restrictions: You can restrict the results by a number of 'facets' to allow extremely powerful searching and exploring of the data. Note: All dates should be given in ISO 8601 format.
is_ultimate_beneficial_owner | whether the controlling entities are the "ultimate beneficial owners" of the controlled entity |
has_controlling_entities | whether any controlling entities are present in the statement |
control_mechanisms_mechanism_type Term filter | the types of control (e.g. share ownership, voting rights). See the schema for the range of values |
controlling_entities_entity_type Term filter | the types of controlling entities (e.g. company, person). See the schema for the range of values |
created_at Date filter | when the control statement was created in the OpenCorporates system |
controlled_entity_name Term filter | the name of the controlled entity |
controlling_entities_name Term filter | the name of the controlling entities |
Example:
https://api.opencorporates.com/v0.4/statements/control_statements/search
GET statements/trademark_registrations/search
Returns all trademark registrations matching the given search term.
Parameters:
q | The search term, matching the trademark mark text. |
order |
|
Example:
https://api.opencorporates.com/v0.4/statements/trademark_registrations/search?q=bar&order=expiry_date
GET statements/:id
Description: This returns a 'statement' in the OpenCorporates system. A statement is a purported 'statement of fact' from a source (a public record or a user). For example, subsidiary statement may have been parsed from a filing at the US Securities And Exchange Commission, or a user may have made a statement that one company is a parent of another.
All statements have the following attributes:
data_type | the type of statement, e.g. subsidiary, shareholding, branch_relationship |
properties | the core of what is being said, for example for a licence, the regulator that has issued the licence, the type of licence (e.g. 'Bank') etc |
provenances | one or more provenances for the statement. A provenance is made up of a datetime, a source_url, an actor which created the statement, and a confidence that the statement is true |
Example:
https://api.opencorporates.com/v0.4/statements/11499887
GET events/:id
Description:
This returns the details for a given event id
. The attributes returned are the same as for GET companies/:jurisdictioncode/:companynumber/events
described above.
Example:
https://api.opencorporates.com/events/986979731
Example response:
{
"api_version": "0.4.7",
"results": {
"event": {
"id": 986979731,
"created_at": "2019-05-28T20:43:44Z",
"opencorporates_url": "https://opencorporates.com/events/986979731",
"jurisdiction_code": "us_nj",
"company_number": "0400549703",
"type": "Event::Company::Incorporation",
"event_class": "company",
"categories": [
"existence",
"corporate"
],
"time_range": {
"starts_at": "2013-02-12T00:00:00Z",
"ends_at": "2013-02-13T00:00:00Z"
},
"description": "Incorporated",
"derived_from": {
"before": null,
"after": {
"incorporation_date": "2013-02-12"
}
},
"provenance": {
"type": "company",
"earlier_snapshot": null,
"later_snapshot": {
"sampled_at": "2019-01-23T07:58:05Z"
}
}
}
}
}
GET placeholders/:id
Description: A placeholder is what we call something we believe is probably a company. We use placeholders as the intermediate link between statements and companies, or, if we can't match the statement to a company (for example because for example we don't have companies in the given jurisdiction) as, well, placeholders for when we can match to a company For more information see our the 4th part in our series of blog posts on corporate networks
Each placeholder will be returned with the source and one or many of the following:
name | the name of the entity |
jurisdiction_string | A plain text representation for the jurisdiction in which the placeholder is believed to be incorporated - this may be the name of a jurisdiction, of a country, or possibly an ISO 3166-2 code. |
jurisdiction_code | the code for the jurisdiction in which the placeholder is believed to be incorporated (see [GET company](#get-companies/:id)). This is inferred by OpenCorporates from the jurisdiction_string. |
identifier | an identifier that is associated with the placeholder, for example an SEC CIK code. |
opencorporates_url | the url of the placeholder. |
company | if the placeholder has been matched to a company, the company will be included, together with basic information for the company. |
GET placeholders/:id/network
Description: This returns the immediate 'computed corporate network' for the given company as a set of control relationships (i.e. one company is thought to control or influence another company). This is the same data you can see on a company's network page on the main OpenCorporates site.
A control relationship is a relationship of control from one company to another. The relationship type can be found in the api response. Relationships are directional and we use the terms 'parent' and 'child' to indicate the direction of the relationships. For example, if 'Company A' is a subsidiary of 'Company B', then the api response would read {parent_name: Company B, child_name: Company A, relationship_type: has_subsidiary"}
. Conversely, if 'Company B' is a subsidiary of 'Company A', then the api response would be {parent_name: Company A, child_name: Company B, relationship_type: has_subsidiary"}
These relationships are computed automatically from a number of relationship statements associated with each company, and the network will change as more statements are added, because for example new relationships are discovered, or statements are added which say that a previous statement is no longer true (see statements for more details), or even that our algorithms for calculating relationships are improved.
Each relationship is made of the following attributes:
relationship_type | the type of relationship, e.g. subsidiary, shareholding. A subsidiary relationship typically comes from statutory filings (e.g. SEC 10-K reports); shareholding information typically coms from company registers, and is more granular |
relationship_properties | any additional properties of the relationship, e.g. control percentage |
confidence | a computed confidence in the relationship based on the underlying statements |
parent_name | the name of the parent entity |
parent_type | the type of entity the parent is |
parent_opencorporates_url | the OpenCorporates URL of the parent entity |
child_name | the name of the child entity |
child_type | the type of entity the child is |
child_opencorporates_url | the OpenCorporates URL of the child entity |
The response is not paginated and can return no results (if we have no known relationships) or hundreds of relationships. It currently returns just a depth of 1 (i.e. just immediate parents and children). We are looking at adding greater levels of depth. Note the related entities may be companies, or placeholders. Placeholders are objects that we haven't yet matched to a company, either because we don't have the companies in that jurisdiction, or because we can't confidently match it to a company. Note that some networks are circular (A controls B, which controls C, which controls A), and you should allow for this when making repeated network calls so that you do not get stuck in an endless loop.
Filter options:
confidence | a computed confidence in the relationship based on the underlying statements (between 0 and 100). Only relationships above this confidence will be returned (the default value here is 60). You can also pass in 'all' here to get all relationships, irrespective of the confidence in the data |
dates | By default, the network data will be what we think to be true today (usually because the information on which it is based is recent enough to make that a reasonable assumption). However, if a date is passed in (in ISO 8601 format), it will be the network data we have that is believed to be current on that date. This is useful for data such as the US banks, for which we hold good data going back over 10 years. |
ownership_percentage | By default the API will return every control relationship we know about where the percentage control is greater or equal to 2%. However, this can be overridden by passing a numeric value here, for example 50 or even 0 (for every relationship, regardless of percentage). Note that this will not affect the results for control relationships where we do not know the percentage (e.g. many subsidiary relationships) |
Example:
https://api.opencorporates.com/v0.4/placeholders/645258/network
https://api.opencorporates.com/v0.4/placeholders/645258/network?confidence=80
GET placeholders/:id/statements
Description: This returns the statements associated with a given placeholder. A statement is a purported 'statement of fact' from a source (a public record or a user). For example, subsidiary statement may have been parsed from a filing at the US Securities And Exchange Commission, or a user may have made a statement that one company is a parent of another. For more details, see the statements section below
A maximum of 30 statements are returned per request, and response is paginated, enabling you to get further results
Example:
https://api.opencorporates.com/v0.4/placeholders/645258/statements
https://api.opencorporates.com/v0.4/placeholders/645258/statements?page=2
GET jurisdictions
Description: This returns the list of all the jurisdictions we know about (not all of which we have companies for), as well as the jurisdiction_code for the jurisdiction
Example:
https://api.opencorporates.com/v0.4/jurisdictions
GET jurisdictions/match
Description: This matches the name of a jurisdiction to the jurisdiction. It tries to be highly accurate but accepts a wide variety of formats. For example, "GB", "G.B.", "United Kingdom", "Great Britain" all return the jurisdiction for the UK. "Delaware, USA", "Delaware (USA)", "DELAWARE", "DE (US)" all return the jurisdiction of the US state of Delaware.
You can also supply an optional :related_jurisdiction_code to help the matcher disambiguate between say "Georgia" the US State and Georgia, the Eastern European country, or between "PA" (the US state of Pennsylvania) and PA (for Panama).
Example:
https://api.opencorporates.com/v0.4/jurisdictions/match?q=The+Netherlands
https://api.opencorporates.com/v0.4/jurisdictions/match?q=PA&related_jurisdiction_code=us
GET industry_codes
Description: From v0.4 OpenCorporates has moved to a new way of representing industry codes (previously we only catered for UK SIC codes), and we can now handle a wide variety of different industry codes, including US NAICS codes and EU NACE codes (and their derivatives). Where a company register makes available the industry codes, we now store that code, together with the code scheme which it belongs to, e.g. For this Belgian company, the industry code consists of the code scheme (in this case be_nace_2008, which represents the NACE-BEL 2008 code scheme) and the code 66191 (which in NACE-BEL 2008 is the code for 'Agenten en makelaars in bankdiensten'). This can be represented as a uid (in this case 'be_nace_2008-66191') to make searching by industry codes consistent and straightforward.
We also map different code schemes to each other, and for those code schemes that can be mapped (such as ones derived from the EU NACE 2 scheme) you can also use the mapped schemes. So, in the above example you can search companies by the industry_code uid of 'eu_nace_2-66191' as well as 'be_nace_2008-66191'. You can get information on individual industry codes and their mapped equivalents at the industry_codes/:code_scheme_id/:code call.
This call returns all the code schemes we know about, including links to the official pages for the code scheme. See industry_codes/:code_scheme_id to get a list of the codes associated with each code scheme.
Example:
https://api.opencorporates.com/v0.4/industry_codes
GET industry_codes/:code_scheme_id
Description: This call returns further details about the code_scheme, together with the list of industry codes associated with it
Example:
https://api.opencorporates.com/v0.4/industry_codes/be_nace_2008
GET industry_codes/:code_scheme_id/:code
Description: This call returns the details of a specific code.
Example:
https://api.opencorporates.com/v0.4/industry_codes/be_nace_2008/66191
GET account_status
Description: This returns the status of your API Account (this information may also be retrieved at https://OpenCorporates.com/users/account)
Note this only works for valid API Accounts. To get an API Account go to https://OpenCorporates.com/api_accounts/new
The following values will be returned:
plan | the type of plan that you are on. |
expiry_date | when the api_plan runs out. If you are on a regular payment plan, this will be the date of the expiry of the current payment period. |
status | status of the API account. |
usage | this has two subvalues - today and this_month. |
calls_remaining | this has two subvalues - today and this_month. |
Example:
https://api.opencorporates.com/v0.4/account_status?api_token=yourapitokengoeshere
{
"results": {
"account_status": {
"calls_remaining": {
"this_month": 49997,
"today": 9998
},
"expiry_date": "2015-01-27",
"plan": "open_data",
"status": "approved",
"usage": {
"this_month": 3,
"today": 2
}
}
}
}
Usage limits
By default you're allowed up to 200 requests per month, and 50 requests per day, but usage limits depend on your account type and plan.
API accounts
An API key is required in order to use the OpenCorporates API.
API accounts are free if you are going to be using the data in an open data project or product, i.e. the product or database in which the data is incorporated is also be released under an open licence (specifically share-alike attribution, with attribution to OpenCorporates as detailed at the OpenCorporates licence page).
We also have paid-for API Accounts, which remove the OpenCorporates share-alike restrictions (on the rights acquired by OpenCorporates in assembling and cleaning up the data, particularly database rights).
To get an API key (or token) simply follow the instructions at our new API Account page.
Authentication
Authentication is through a simple API token at present (see API accounts, below), and this should be submitted with each request in the query parameters. This token is available from your account page on OpenCorporates. Please keep your API key safe.
Please note that example requests provided elsewhere in this document do not include an API key and will return a 503 error unless an API key is appended as a query paramter. For example, the authenticated version of the GET request to get information on BP PLC, for example is:
https://api.opencorporates.com/companies/gb/00102498?api_token=ab123cd45
where ab123cd45 is the value of your token.
Stability/Versioning
The OpenCorporates API uses a versioning system. This means that when we introduce changes to the API we can change the version number, so that queries to the previous version will still behave in the same way. If you supply a version number to the API that version will be used, provided it is still supported. If no version number is supplied, the current version will be used. See Versions for details of changes and current version. The v0.1 form of the GET request to get information on BP PLC, for example, is:
https://api.opencorporates.com/v0.1/companies/gb/00102498
The unversioned form is:
https://api.opencorporates.com/companies/gb/00102498
Error/HTTP response codes
- 200 OK: Success!
- 304 Not Modified: There was no new data to return.
- 400 Bad Request: The request was invalid. An accompanying error message will explain why.
- 401 Unauthorized: Authentication credentials were incorrect.
- 403 Forbidden: The request is understood, but it has been refused. This is the status code will be returned during rate limiting
- 404 Not Found: The URI requested is invalid or the resource requested, such as a company, does not exists.
- 500 Internal Server Error: Something is broken. Please contact us if the situation continues and your request is valid
- 502 Bad Gateway: OpenCorporates is down or being upgraded.
- 503 Service Unavailable: The OpenCorporates servers are up, but overloaded with requests. This is also the response code returned if a company's details have been temporarily redacted