curl --request POST \
--url https://openapi.enginy.ai/v1/companies/bulk \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"companies": [
{
"name": "Analytical Engines",
"domain": "analytical-engines.com",
"industry": "Software"
},
{
"companyLinkedInUrl": "https://www.linkedin.com/company/acme",
"mergeWithExisting": true,
"listId": 42
}
]
}
'import requests
url = "https://openapi.enginy.ai/v1/companies/bulk"
payload = { "companies": [
{
"name": "Analytical Engines",
"domain": "analytical-engines.com",
"industry": "Software"
},
{
"companyLinkedInUrl": "https://www.linkedin.com/company/acme",
"mergeWithExisting": True,
"listId": 42
}
] }
headers = {
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
companies: [
{
name: 'Analytical Engines',
domain: 'analytical-engines.com',
industry: 'Software'
},
{
companyLinkedInUrl: 'https://www.linkedin.com/company/acme',
mergeWithExisting: true,
listId: 42
}
]
})
};
fetch('https://openapi.enginy.ai/v1/companies/bulk', 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://openapi.enginy.ai/v1/companies/bulk",
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([
'companies' => [
[
'name' => 'Analytical Engines',
'domain' => 'analytical-engines.com',
'industry' => 'Software'
],
[
'companyLinkedInUrl' => 'https://www.linkedin.com/company/acme',
'mergeWithExisting' => true,
'listId' => 42
]
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"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"
"strings"
"net/http"
"io"
)
func main() {
url := "https://openapi.enginy.ai/v1/companies/bulk"
payload := strings.NewReader("{\n \"companies\": [\n {\n \"name\": \"Analytical Engines\",\n \"domain\": \"analytical-engines.com\",\n \"industry\": \"Software\"\n },\n {\n \"companyLinkedInUrl\": \"https://www.linkedin.com/company/acme\",\n \"mergeWithExisting\": true,\n \"listId\": 42\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-api-key", "<api-key>")
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://openapi.enginy.ai/v1/companies/bulk")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"companies\": [\n {\n \"name\": \"Analytical Engines\",\n \"domain\": \"analytical-engines.com\",\n \"industry\": \"Software\"\n },\n {\n \"companyLinkedInUrl\": \"https://www.linkedin.com/company/acme\",\n \"mergeWithExisting\": true,\n \"listId\": 42\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://openapi.enginy.ai/v1/companies/bulk")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"companies\": [\n {\n \"name\": \"Analytical Engines\",\n \"domain\": \"analytical-engines.com\",\n \"industry\": \"Software\"\n },\n {\n \"companyLinkedInUrl\": \"https://www.linkedin.com/company/acme\",\n \"mergeWithExisting\": true,\n \"listId\": 42\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"status": "success",
"message": "<string>",
"data": {
"results": [
{
"index": 123,
"success": true,
"company": {
"id": 123,
"appUrl": "<string>",
"name": "<string>",
"domain": "<string>",
"companyLinkedInUrl": "<string>",
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z",
"warnings": [
"<string>"
]
},
"error": {
"message": "<string>",
"details": {}
}
}
],
"summary": {
"total": 123,
"created": 123,
"merged": 123,
"failed": 123
}
}
}Bulk create companies
Create up to 100 companies in a single request. Each item behaves exactly like POST /v1/company (including per-item mergeWithExisting, listId, and custom/AI fields). Items are processed independently: the request succeeds with a per-item results array and a summary, so one invalid company does not roll back the rest.
Responses include direct Enginy app URLs when available. Each successful result includes an appUrl field for the company. MCP agents should return those URLs to users whenever they are present in the response.
Required scope:
COMPANIES_WRITERate limit: 30 requests per minute
curl --request POST \
--url https://openapi.enginy.ai/v1/companies/bulk \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"companies": [
{
"name": "Analytical Engines",
"domain": "analytical-engines.com",
"industry": "Software"
},
{
"companyLinkedInUrl": "https://www.linkedin.com/company/acme",
"mergeWithExisting": true,
"listId": 42
}
]
}
'import requests
url = "https://openapi.enginy.ai/v1/companies/bulk"
payload = { "companies": [
{
"name": "Analytical Engines",
"domain": "analytical-engines.com",
"industry": "Software"
},
{
"companyLinkedInUrl": "https://www.linkedin.com/company/acme",
"mergeWithExisting": True,
"listId": 42
}
] }
headers = {
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
companies: [
{
name: 'Analytical Engines',
domain: 'analytical-engines.com',
industry: 'Software'
},
{
companyLinkedInUrl: 'https://www.linkedin.com/company/acme',
mergeWithExisting: true,
listId: 42
}
]
})
};
fetch('https://openapi.enginy.ai/v1/companies/bulk', 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://openapi.enginy.ai/v1/companies/bulk",
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([
'companies' => [
[
'name' => 'Analytical Engines',
'domain' => 'analytical-engines.com',
'industry' => 'Software'
],
[
'companyLinkedInUrl' => 'https://www.linkedin.com/company/acme',
'mergeWithExisting' => true,
'listId' => 42
]
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"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"
"strings"
"net/http"
"io"
)
func main() {
url := "https://openapi.enginy.ai/v1/companies/bulk"
payload := strings.NewReader("{\n \"companies\": [\n {\n \"name\": \"Analytical Engines\",\n \"domain\": \"analytical-engines.com\",\n \"industry\": \"Software\"\n },\n {\n \"companyLinkedInUrl\": \"https://www.linkedin.com/company/acme\",\n \"mergeWithExisting\": true,\n \"listId\": 42\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-api-key", "<api-key>")
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://openapi.enginy.ai/v1/companies/bulk")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"companies\": [\n {\n \"name\": \"Analytical Engines\",\n \"domain\": \"analytical-engines.com\",\n \"industry\": \"Software\"\n },\n {\n \"companyLinkedInUrl\": \"https://www.linkedin.com/company/acme\",\n \"mergeWithExisting\": true,\n \"listId\": 42\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://openapi.enginy.ai/v1/companies/bulk")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"companies\": [\n {\n \"name\": \"Analytical Engines\",\n \"domain\": \"analytical-engines.com\",\n \"industry\": \"Software\"\n },\n {\n \"companyLinkedInUrl\": \"https://www.linkedin.com/company/acme\",\n \"mergeWithExisting\": true,\n \"listId\": 42\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"status": "success",
"message": "<string>",
"data": {
"results": [
{
"index": 123,
"success": true,
"company": {
"id": 123,
"appUrl": "<string>",
"name": "<string>",
"domain": "<string>",
"companyLinkedInUrl": "<string>",
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z",
"warnings": [
"<string>"
]
},
"error": {
"message": "<string>",
"details": {}
}
}
],
"summary": {
"total": 123,
"created": 123,
"merged": 123,
"failed": 123
}
}
}Authorizations
Body
Companies to create in a single request (1-100). Each item accepts the same fields as POST /v1/company, including per-item listId, mergeWithExisting, and custom/AI fields by name.
1 - 100 elementsShow child attributes
Show child attributes