curl --request POST \
--url https://api.enrichloops.com/v1/companies/enrich \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"domain": "stripe.com",
"linkedinUrl": "https://www.linkedin.com/company/stripe",
"loop_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
'import requests
url = "https://api.enrichloops.com/v1/companies/enrich"
payload = {
"domain": "stripe.com",
"linkedinUrl": "https://www.linkedin.com/company/stripe",
"loop_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
domain: 'stripe.com',
linkedinUrl: 'https://www.linkedin.com/company/stripe',
loop_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a'
})
};
fetch('https://api.enrichloops.com/v1/companies/enrich', 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://api.enrichloops.com/v1/companies/enrich",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'domain' => 'stripe.com',
'linkedinUrl' => 'https://www.linkedin.com/company/stripe',
'loop_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.enrichloops.com/v1/companies/enrich"
payload := strings.NewReader("{\n \"domain\": \"stripe.com\",\n \"linkedinUrl\": \"https://www.linkedin.com/company/stripe\",\n \"loop_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.enrichloops.com/v1/companies/enrich")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"domain\": \"stripe.com\",\n \"linkedinUrl\": \"https://www.linkedin.com/company/stripe\",\n \"loop_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.enrichloops.com/v1/companies/enrich")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"domain\": \"stripe.com\",\n \"linkedinUrl\": \"https://www.linkedin.com/company/stripe\",\n \"loop_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n}"
response = http.request(request)
puts response.read_body{
"task": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"object_type": "company",
"operation": "enrich",
"status": "queued",
"target": "<string>",
"credits_charged": 123,
"created_at": "2023-11-07T05:31:56Z",
"input": {},
"loop_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"idempotency_key": "<string>",
"queued_at": "2023-11-07T05:31:56Z",
"started_at": "2023-11-07T05:31:56Z",
"finished_at": "2023-11-07T05:31:56Z",
"expires_at": "2023-11-07T05:31:56Z"
},
"error": {
"code": "not_found",
"message": "<string>",
"candidates": 123,
"hintsAccepted": [
"<string>"
]
}
}{
"task": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"object_type": "company",
"operation": "enrich",
"status": "queued",
"target": "<string>",
"credits_charged": 123,
"created_at": "2023-11-07T05:31:56Z",
"input": {},
"loop_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"idempotency_key": "<string>",
"queued_at": "2023-11-07T05:31:56Z",
"started_at": "2023-11-07T05:31:56Z",
"finished_at": "2023-11-07T05:31:56Z",
"expires_at": "2023-11-07T05:31:56Z"
},
"error": {
"code": "not_found",
"message": "<string>",
"candidates": 123,
"hintsAccepted": [
"<string>"
]
}
}{
"error": "<string>"
}"Unauthorized"{
"error": "<string>",
"code": "credits_expired",
"creditsRemaining": 123
}{
"error": "<string>",
"code": "idempotency_key_reused"
}{
"error": "<string>",
"code": "queue_full",
"queuedTasks": 123
}{
"error": "<string>",
"requestId": "<string>"
}Enrich a company
Enqueues an enrichment for a company, identified by domain or LinkedIn
company URL. Provide exactly one of domain or linkedinUrl.
Responds 200 if the task settled inside the request (a company we
already hold, the common case once a company has been seen), or 202
if it was queued. Both responses share the same shape. The body never
carries the enrichment result, only the task. Poll GET /v1/tasks/{id}
or supply loop_id to get the result delivered to a Loop’s webhook.
Freshness. A stored company older than 30 days is not served as-is.
The request is queued (202) and the company is re-fetched from source
before the task settles. A company inside the 30-day window is served
from storage in the same request. Refreshing costs the same as any
other request.
If a refresh cannot complete (a source is unavailable, or the company’s LinkedIn page has been removed), the task still succeeds and returns the stored record. You are never left without data you would otherwise have received.
curl --request POST \
--url https://api.enrichloops.com/v1/companies/enrich \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"domain": "stripe.com",
"linkedinUrl": "https://www.linkedin.com/company/stripe",
"loop_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
'import requests
url = "https://api.enrichloops.com/v1/companies/enrich"
payload = {
"domain": "stripe.com",
"linkedinUrl": "https://www.linkedin.com/company/stripe",
"loop_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
domain: 'stripe.com',
linkedinUrl: 'https://www.linkedin.com/company/stripe',
loop_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a'
})
};
fetch('https://api.enrichloops.com/v1/companies/enrich', 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://api.enrichloops.com/v1/companies/enrich",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'domain' => 'stripe.com',
'linkedinUrl' => 'https://www.linkedin.com/company/stripe',
'loop_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.enrichloops.com/v1/companies/enrich"
payload := strings.NewReader("{\n \"domain\": \"stripe.com\",\n \"linkedinUrl\": \"https://www.linkedin.com/company/stripe\",\n \"loop_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.enrichloops.com/v1/companies/enrich")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"domain\": \"stripe.com\",\n \"linkedinUrl\": \"https://www.linkedin.com/company/stripe\",\n \"loop_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.enrichloops.com/v1/companies/enrich")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"domain\": \"stripe.com\",\n \"linkedinUrl\": \"https://www.linkedin.com/company/stripe\",\n \"loop_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n}"
response = http.request(request)
puts response.read_body{
"task": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"object_type": "company",
"operation": "enrich",
"status": "queued",
"target": "<string>",
"credits_charged": 123,
"created_at": "2023-11-07T05:31:56Z",
"input": {},
"loop_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"idempotency_key": "<string>",
"queued_at": "2023-11-07T05:31:56Z",
"started_at": "2023-11-07T05:31:56Z",
"finished_at": "2023-11-07T05:31:56Z",
"expires_at": "2023-11-07T05:31:56Z"
},
"error": {
"code": "not_found",
"message": "<string>",
"candidates": 123,
"hintsAccepted": [
"<string>"
]
}
}{
"task": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"object_type": "company",
"operation": "enrich",
"status": "queued",
"target": "<string>",
"credits_charged": 123,
"created_at": "2023-11-07T05:31:56Z",
"input": {},
"loop_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"idempotency_key": "<string>",
"queued_at": "2023-11-07T05:31:56Z",
"started_at": "2023-11-07T05:31:56Z",
"finished_at": "2023-11-07T05:31:56Z",
"expires_at": "2023-11-07T05:31:56Z"
},
"error": {
"code": "not_found",
"message": "<string>",
"candidates": 123,
"hintsAccepted": [
"<string>"
]
}
}{
"error": "<string>"
}"Unauthorized"{
"error": "<string>",
"code": "credits_expired",
"creditsRemaining": 123
}{
"error": "<string>",
"code": "idempotency_key_reused"
}{
"error": "<string>",
"code": "queue_full",
"queuedTasks": 123
}{
"error": "<string>",
"requestId": "<string>"
}Authorizations
Pass your API key as a bearer token: Authorization: Bearer YOUR_API_KEY. Generate and manage keys from your dashboard under
Settings → API Keys.
Headers
Reusing the same key returns the original task instead of creating and charging a new one. Use it to retry a request whose response you never received.
A key is bound to the body it was first sent with. Reusing it with
a different body is rejected with 422. Maximum 255 characters.
255Body
A company's domain, e.g. "stripe.com".
"stripe.com"
A LinkedIn company page URL, as an alternative to domain.
"https://www.linkedin.com/company/stripe"
Deliver the result to this Loop's webhook once it's ready, in addition to polling this task directly.
Response
The task settled inside the request (a record we already hold, or an idempotent replay).
Never carries data. Carries error only if the task already failed
inside the request. Fetch the result from GET /v1/tasks/{id} or a
Loop webhook.