curl --request GET \
--url https://production-api.joinrings.com/v1/companies \
--header 'x-api-key: <api-key>'import requests
url = "https://production-api.joinrings.com/v1/companies"
headers = {"x-api-key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'x-api-key': '<api-key>'}};
fetch('https://production-api.joinrings.com/v1/companies', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://production-api.joinrings.com/v1/companies",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"x-api-key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://production-api.joinrings.com/v1/companies"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-api-key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://production-api.joinrings.com/v1/companies")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://production-api.joinrings.com/v1/companies")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["x-api-key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"items": [
{
"city": "<string>",
"country_code": "<string>",
"description": "<string>",
"last_activity_date": "<string>",
"logo_url": "<string>",
"name": "<string>",
"uuid": "<string>",
"website": "<string>",
"alternate_domain": "<string>",
"company_custom_fields": {},
"entity_lists": [
{
"name": "<string>",
"uuid": "<string>"
}
],
"external_ids": [
{
"id": "<string>",
"source": "<string>",
"url": "<string>"
}
],
"facebook_url": "<string>",
"headquarters_address": "<string>",
"investor_rings_ai_scores": {
"date_string": "<string>",
"investment_success": {
"delta": 123,
"score": 123
},
"overall_investor": {
"delta": 123,
"score": 123
},
"peer_group_name": "<string>",
"success_trend": {
"delta": 123,
"score": 123
},
"syndicate_quality": {
"delta": 123,
"score": 123
}
},
"last_contact_at": "<string>",
"linkedin_url": "<string>",
"my_next_meeting_at": "<string>",
"my_next_meeting_title": "<string>",
"next_meeting_at": "<string>",
"next_meeting_title": "<string>",
"next_meeting_with_user_uuid": "<string>",
"operating_rings_ai_scores": {
"date_string": "<string>",
"growth_efficiency": {
"delta": 123,
"score": 123
},
"investment_momentum": {
"delta": 123,
"score": 123
},
"investor_quality": {
"delta": 123,
"score": 123
},
"overall_company": {
"delta": 123,
"score": 123
},
"peer_group_name": "<string>"
},
"pathpower": {
"meta": {},
"score": 123,
"strength_label": "<string>"
},
"rings_industry_tags": [
"<string>"
],
"state": "<string>",
"strongest_relationships": [
{
"internal_user_person_uuid": "<string>",
"internal_user_uuid": "<string>",
"last_engaged_at": "<string>",
"name": "<string>",
"path_power_score": 123
}
],
"twitter_url": "<string>"
}
],
"page": 123,
"per_page": 123,
"total": 123,
"has_more": true,
"next_cursor": "<string>"
}List companies
Returns a paginated list of companies visible to the tenant. All filter parameters are optional — omitting all of them returns all companies. Filters compose with AND; comma-separated values within a single filter are OR-matched. See each parameter for exact semantics.
Filters cover identity (name, domain, linkedin_url, description,
social URLs), location (city, state, country), status
(operating_status, acquisition_status, ipo_status), industry tags,
investor and funding attributes, and numeric/date ranges (founding year,
employee count, Rings scores, investment dates).
Use uuids (comma-separated) to hydrate a known set of companies in one
call — this is the batched counterpart to GET /v1/companies/{uuid}.
To resolve a company you only know by domain or name, use
GET /v1/companies/lookup instead.
Sort parameters:
- sort_by: name | last_activity_date (default: unsorted)
- order: asc | desc (default: asc)
Pagination:
- page: Page number (default: 1)
- per_page: Results per page, max 50 (default: 10)
- after: Opaque cursor from a previous response’s
next_cursor. Resumes immediately after that response’s last record, so concurrent writes can’t shift rows between pages the waypageallows.totalis not computed on this path — usehas_more.
Every response carries next_cursor, including page-numbered ones, so a
caller can start with page and switch to cursors mid-scan.
curl --request GET \
--url https://production-api.joinrings.com/v1/companies \
--header 'x-api-key: <api-key>'import requests
url = "https://production-api.joinrings.com/v1/companies"
headers = {"x-api-key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'x-api-key': '<api-key>'}};
fetch('https://production-api.joinrings.com/v1/companies', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://production-api.joinrings.com/v1/companies",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"x-api-key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://production-api.joinrings.com/v1/companies"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-api-key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://production-api.joinrings.com/v1/companies")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://production-api.joinrings.com/v1/companies")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["x-api-key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"items": [
{
"city": "<string>",
"country_code": "<string>",
"description": "<string>",
"last_activity_date": "<string>",
"logo_url": "<string>",
"name": "<string>",
"uuid": "<string>",
"website": "<string>",
"alternate_domain": "<string>",
"company_custom_fields": {},
"entity_lists": [
{
"name": "<string>",
"uuid": "<string>"
}
],
"external_ids": [
{
"id": "<string>",
"source": "<string>",
"url": "<string>"
}
],
"facebook_url": "<string>",
"headquarters_address": "<string>",
"investor_rings_ai_scores": {
"date_string": "<string>",
"investment_success": {
"delta": 123,
"score": 123
},
"overall_investor": {
"delta": 123,
"score": 123
},
"peer_group_name": "<string>",
"success_trend": {
"delta": 123,
"score": 123
},
"syndicate_quality": {
"delta": 123,
"score": 123
}
},
"last_contact_at": "<string>",
"linkedin_url": "<string>",
"my_next_meeting_at": "<string>",
"my_next_meeting_title": "<string>",
"next_meeting_at": "<string>",
"next_meeting_title": "<string>",
"next_meeting_with_user_uuid": "<string>",
"operating_rings_ai_scores": {
"date_string": "<string>",
"growth_efficiency": {
"delta": 123,
"score": 123
},
"investment_momentum": {
"delta": 123,
"score": 123
},
"investor_quality": {
"delta": 123,
"score": 123
},
"overall_company": {
"delta": 123,
"score": 123
},
"peer_group_name": "<string>"
},
"pathpower": {
"meta": {},
"score": 123,
"strength_label": "<string>"
},
"rings_industry_tags": [
"<string>"
],
"state": "<string>",
"strongest_relationships": [
{
"internal_user_person_uuid": "<string>",
"internal_user_uuid": "<string>",
"last_engaged_at": "<string>",
"name": "<string>",
"path_power_score": 123
}
],
"twitter_url": "<string>"
}
],
"page": 123,
"per_page": 123,
"total": 123,
"has_more": true,
"next_cursor": "<string>"
}Authorizations
Query Parameters
Page number, 1-indexed. Clamped to >= 1.
Results per page (default 10). Clamped to the range 1-50 (values outside are silently capped, not rejected).
Opaque cursor from a previous response's next_cursor. When supplied, the page starts immediately after the last record of that response and page is ignored — unlike page, this cannot skip or repeat records when the data changes mid-scan. Filters and sort must stay identical for the whole scan; changing one is a 400. Not supported by every list endpoint — those that support it return next_cursor.
Case-insensitive substring match on company name.
Exact match on the company's LinkedIn URL.
Website domain to match (e.g. 'acme.com'), same semantics as the domain parameter on GET /v1/companies/lookup.
Return only companies modified at or after this ISO 8601 timestamp (e.g. '2025-01-01T00:00:00Z'). Tracks the last time Rings updated the record, from any source.
Field to sort by. Valid values: 'name', 'last_activity_date'. 'last_activity_date' also filters: it returns only companies with recorded activity, so leave sort_by unset when syncing with modified_since.
name, last_activity_date Sort order. Valid values: 'asc' (ascending) or 'desc' (descending)
asc, desc Case-insensitive substring match on description.
Case-insensitive substring match on facebook_url.
Case-insensitive substring match on twitter_url.
Case-insensitive substring on the company's city (e.g. 'Los Angeles'). Pass the full city name, not an abbreviation — 'LA' is matched as a substring and hits Dallas and Cleveland, not Los Angeles.
Company's state/region. A full name ('California') works on its own; a two-letter code ('CA', 'NY') is ISO 3166-2 and requires country, since unscoped 'CA' means Alberta. Returns 400 if it does not resolve.
Company's country, name or ISO code ('US', 'United States'). Required next to a two-letter state. Returns 400 if unrecognized.
Comma-separated operating statuses (OR-matched).
Comma-separated acquisition statuses (OR-matched).
Comma-separated IPO statuses (OR-matched).
Comma-separated investor types (OR-matched). Spaces are normalised to underscores to match stored values.
Comma-separated last funding-round investment types (OR-matched).
Comma-separated NPI investment types (OR-matched).
Comma-separated company UUIDs to restrict results to.
Comma-separated Rings industry tags. Combined per rings_industry_tags_operator (AND requires every tag, OR requires any).
Logical operator for rings_industry_tags. 'AND' (default) requires all tags; 'OR' requires any.
AND, OR Minimum founding year (inclusive).
Maximum founding year (inclusive).
Deprecated: company and investor scores are retired and will be removed. Minimum Rings score (inclusive).
Deprecated: company and investor scores are retired and will be removed. Maximum Rings score (inclusive).
Minimum employee count (inclusive).
Maximum employee count (inclusive).
Deprecated: company and investor scores are retired and will be removed. Minimum overall operating Rings AI score (inclusive).
Deprecated: company and investor scores are retired and will be removed. Maximum overall operating Rings AI score (inclusive).
Deprecated: company and investor scores are retired and will be removed. Minimum overall investor Rings AI score (inclusive).
Deprecated: company and investor scores are retired and will be removed. Maximum overall investor Rings AI score (inclusive).
Start of last funding-round investment date range (ISO 8601 date). Applied with last_investment_date_to.
End of last funding-round investment date range (ISO 8601 date). Applied with last_investment_date_from.
Start of NPI date range (ISO 8601 date). Applied with npi_date_to.
End of NPI date range (ISO 8601 date). Applied with npi_date_from.