---
title: "API docs"
description: "Free JSON API for company search and company profiles, powered by Coragrid. No key required."
url: "https://companyregistryapi.com/api"
---

# Company data as JSON, no key required.

> Three read-only endpoints mirror the website. Responses use the same permanent IDs and the same field names as the Coragrid public API, so moving to a full Coragrid credential later needs no data migration.

## Basics

- **Base URL**: `https://api.companyregistryapi.com`. Each path below appends to it.
- **OpenAPI**: https://companyregistryapi.com/api/openapi.json, an OpenAPI 3.2 document of these endpoints.
- **Authentication**: None.
- **Rate limit**: 60 requests per minute per client address, with bursts up to the same number. Over the limit you receive `429` with a `Retry-After` header.
- **CORS**: Browser requests from any origin are allowed for GET.
- **Errors**: RFC 9457 problem documents with `Content-Type: application/problem+json` and a stable `code` field.
- **Attribution**: Show “Powered by Coragrid” wherever you display the data.

## Search

`GET /v1/search`

Matches the start of a company name or a business ID, in registry order; no relevance scores.

| Parameter | Required | Meaning |
| --- | --- | --- |
| `q` | yes | The start of a company name or a business ID, 3 to 64 characters. Results come in registry name order with no relevance score. |
| `country` | no | ISO 3166-1 alpha-2 code such as FI. Omit or pass all for every country. |
| `limit` | no | Results per page, 1 to 25. Defaults to 10. |
| `cursor` | no | Opaque next_cursor value from the previous page. Cursors expire; on 400 restart from the first page. |

```bash
curl "https://api.companyregistryapi.com/v1/search?q=example&country=FI&limit=5"
```

```javascript
const response = await fetch(
  "https://api.companyregistryapi.com/v1/search?q=example&country=FI&limit=5",
);
const page = await response.json();
```

```python
import requests

page = requests.get(
    "https://api.companyregistryapi.com/v1/search",
    params={"q": "example", "country": "FI", "limit": 5},
).json()
```

Response

```json
{
  "object": "list",
  "query": "example",
  "countries": ["FI"],
  "data": [
    {
      "id": "co_014d2pf2dbsqqg28t5cy4tqkff",
      "object": "company",
      "lifecycle": { "status": "active" },
      "name": "Example Robotics Oy",
      "country_code": "FI",
      "company_status": "active",
      "company_type": "private_limited_company"
    }
  ],
  "next_cursor": null,
  "attribution": "Powered by Coragrid"
}
```

## Company

`GET /v1/companies/{company_id}`

One company by permanent ID. Redirected records return the requested handle and the canonical ID in `lifecycle.canonical_id`; split records list `lifecycle.successor_ids`.

```bash
curl "https://api.companyregistryapi.com/v1/companies/<company_id>"
```

```javascript
const response = await fetch(
  "https://api.companyregistryapi.com/v1/companies/<company_id>",
);
const { data: company } = await response.json();
```

```python
import requests

company = requests.get("https://api.companyregistryapi.com/v1/companies/<company_id>").json()["data"]
```

## Officers

`GET /v1/companies/{company_id}/officers`

Current officers with source attribution: the publishing system, its URL when known, and the observation time.

```bash
curl "https://api.companyregistryapi.com/v1/companies/<company_id>/officers"
```

```javascript
const response = await fetch(
  "https://api.companyregistryapi.com/v1/companies/<company_id>/officers",
);
const { data: officers } = await response.json();
```

```python
import requests

officers = requests.get("https://api.companyregistryapi.com/v1/companies/<company_id>/officers").json()["data"]
```

## Problem codes

| Code | Status | Meaning |
| --- | --- | --- |
| `invalid_request` | 400 | A parameter is missing or malformed; detail names it. |
| `not_found` | 404 | No company is visible under that ID. |
| `rate_limited` | 429 | Retry after the number of seconds in Retry-After. |
| `upstream_error` | 502 | The company data service rejected the request; retryable. |
| `upstream_busy` | 503 | The company data service is busy; retry after the seconds in Retry-After. |
| `upstream_unavailable` | 503 | Company data is temporarily unavailable; retryable. |

## With a Coragrid key

A Coragrid API key reads the same companies, with the same IDs, from the Coragrid API: search by description, higher limits and the cgd command line. [How to get a key](https://companyregistryapi.com/api-key.md).

```bash
# With a Coragrid API key: cgd auth login
cgd --json companies search --query "example robotics" \
  --country FI --limit 5

# An id from the search results
id=<company_id>
cgd --json companies get $id
cgd --json companies officers $id
```

---

*This is a markdown version of [https://companyregistryapi.com/api](https://companyregistryapi.com/api) for AI/LLM consumption.*
