Bulk create opportunities
Creates up to 100 opportunities using the standard opportunity payload shape. Duplicate rule, shared by /v1/opportunities, /v1/opportunities/bulk and /v1/opportunities/fast-bulk: within a pipeline, an item duplicates an existing opportunity linked to the same account domain (compared as the root domain, so https://www.acme.com matches acme.com) or, when the item has no domain, one with the same name (case and whitespace insensitive). An item with neither is matched on the name it will be created with, derived from its primary contact’s email domain (alice@acme.com becomes Acme Deal); an item with no domain, name or contact is always created. A duplicate is never merged into the existing opportunity and none of its fields are applied; use PATCH /v1/opportunities/bulk to change the existing one. Concurrent creates of the same key are serialized across all three endpoints, so at most one opportunity is created. Duplicates of an existing opportunity, or of an earlier item in the same request, are skipped and listed in skipped with the opportunity they matched; the other items are created.
curl --request POST \
--url https://api.octolane.com/v1/opportunities/bulk \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
[
{
"pipeline_id": "018f13b3-8239-7ef8-a8f1-93ad10b76110",
"opportunity": {
"name": "<string>",
"stage_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"stage_name": "<string>",
"deal_size": 123,
"close_date": 123,
"next_action_date": 123,
"next_steps": "<string>",
"custom_attributes": {}
},
"related_objects": {
"account_domain": "acme.com",
"primary_contact_email": "jsmith@example.com",
"additional_contact_emails": [
"jsmith@example.com"
],
"owner_email": "jsmith@example.com",
"owner_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
}
]
'import requests
url = "https://api.octolane.com/v1/opportunities/bulk"
payload = [
{
"pipeline_id": "018f13b3-8239-7ef8-a8f1-93ad10b76110",
"opportunity": {
"name": "<string>",
"stage_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"stage_name": "<string>",
"deal_size": 123,
"close_date": 123,
"next_action_date": 123,
"next_steps": "<string>",
"custom_attributes": {}
},
"related_objects": {
"account_domain": "acme.com",
"primary_contact_email": "jsmith@example.com",
"additional_contact_emails": ["jsmith@example.com"],
"owner_email": "jsmith@example.com",
"owner_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
}
]
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([
{
pipeline_id: '018f13b3-8239-7ef8-a8f1-93ad10b76110',
opportunity: {
name: '<string>',
stage_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
stage_name: '<string>',
deal_size: 123,
close_date: 123,
next_action_date: 123,
next_steps: '<string>',
custom_attributes: {}
},
related_objects: {
account_domain: 'acme.com',
primary_contact_email: 'jsmith@example.com',
additional_contact_emails: ['jsmith@example.com'],
owner_email: 'jsmith@example.com',
owner_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a'
}
}
])
};
fetch('https://api.octolane.com/v1/opportunities/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://api.octolane.com/v1/opportunities/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([
[
'pipeline_id' => '018f13b3-8239-7ef8-a8f1-93ad10b76110',
'opportunity' => [
'name' => '<string>',
'stage_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'stage_name' => '<string>',
'deal_size' => 123,
'close_date' => 123,
'next_action_date' => 123,
'next_steps' => '<string>',
'custom_attributes' => [
]
],
'related_objects' => [
'account_domain' => 'acme.com',
'primary_contact_email' => 'jsmith@example.com',
'additional_contact_emails' => [
'jsmith@example.com'
],
'owner_email' => 'jsmith@example.com',
'owner_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a'
]
]
]),
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://api.octolane.com/v1/opportunities/bulk"
payload := strings.NewReader("[\n {\n \"pipeline_id\": \"018f13b3-8239-7ef8-a8f1-93ad10b76110\",\n \"opportunity\": {\n \"name\": \"<string>\",\n \"stage_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"stage_name\": \"<string>\",\n \"deal_size\": 123,\n \"close_date\": 123,\n \"next_action_date\": 123,\n \"next_steps\": \"<string>\",\n \"custom_attributes\": {}\n },\n \"related_objects\": {\n \"account_domain\": \"acme.com\",\n \"primary_contact_email\": \"jsmith@example.com\",\n \"additional_contact_emails\": [\n \"jsmith@example.com\"\n ],\n \"owner_email\": \"jsmith@example.com\",\n \"owner_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\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://api.octolane.com/v1/opportunities/bulk")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("[\n {\n \"pipeline_id\": \"018f13b3-8239-7ef8-a8f1-93ad10b76110\",\n \"opportunity\": {\n \"name\": \"<string>\",\n \"stage_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"stage_name\": \"<string>\",\n \"deal_size\": 123,\n \"close_date\": 123,\n \"next_action_date\": 123,\n \"next_steps\": \"<string>\",\n \"custom_attributes\": {}\n },\n \"related_objects\": {\n \"account_domain\": \"acme.com\",\n \"primary_contact_email\": \"jsmith@example.com\",\n \"additional_contact_emails\": [\n \"jsmith@example.com\"\n ],\n \"owner_email\": \"jsmith@example.com\",\n \"owner_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n }\n }\n]")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.octolane.com/v1/opportunities/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 {\n \"pipeline_id\": \"018f13b3-8239-7ef8-a8f1-93ad10b76110\",\n \"opportunity\": {\n \"name\": \"<string>\",\n \"stage_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"stage_name\": \"<string>\",\n \"deal_size\": 123,\n \"close_date\": 123,\n \"next_action_date\": 123,\n \"next_steps\": \"<string>\",\n \"custom_attributes\": {}\n },\n \"related_objects\": {\n \"account_domain\": \"acme.com\",\n \"primary_contact_email\": \"jsmith@example.com\",\n \"additional_contact_emails\": [\n \"jsmith@example.com\"\n ],\n \"owner_email\": \"jsmith@example.com\",\n \"owner_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n }\n }\n]"
response = http.request(request)
puts response.read_body{
"success": true,
"message": "<string>",
"data": {
"opportunities": [
{
"index": 123,
"opportunity_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
],
"skipped": [
{
"index": 123,
"pipeline_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"reason": "duplicate_in_database",
"existing_opportunity_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"duplicate_of_index": 123
}
],
"created_count": 123,
"skipped_count": 123
}
}{
"success": true,
"message": "<string>",
"data": "<unknown>"
}{
"success": false,
"message": "Validation failed",
"statusCode": 400
}{
"success": false,
"message": "Validation failed",
"statusCode": 400
}{
"success": false,
"message": "Validation failed",
"statusCode": 400
}Authorizations
Personal API key. Requests act as the workspace member who created the key, with that member's current access, and stop working when the key is disabled or its creator leaves the workspace.
Body
Array of opportunity payloads. Maximum 100 items.
Was this page helpful?
curl --request POST \
--url https://api.octolane.com/v1/opportunities/bulk \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
[
{
"pipeline_id": "018f13b3-8239-7ef8-a8f1-93ad10b76110",
"opportunity": {
"name": "<string>",
"stage_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"stage_name": "<string>",
"deal_size": 123,
"close_date": 123,
"next_action_date": 123,
"next_steps": "<string>",
"custom_attributes": {}
},
"related_objects": {
"account_domain": "acme.com",
"primary_contact_email": "jsmith@example.com",
"additional_contact_emails": [
"jsmith@example.com"
],
"owner_email": "jsmith@example.com",
"owner_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
}
]
'import requests
url = "https://api.octolane.com/v1/opportunities/bulk"
payload = [
{
"pipeline_id": "018f13b3-8239-7ef8-a8f1-93ad10b76110",
"opportunity": {
"name": "<string>",
"stage_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"stage_name": "<string>",
"deal_size": 123,
"close_date": 123,
"next_action_date": 123,
"next_steps": "<string>",
"custom_attributes": {}
},
"related_objects": {
"account_domain": "acme.com",
"primary_contact_email": "jsmith@example.com",
"additional_contact_emails": ["jsmith@example.com"],
"owner_email": "jsmith@example.com",
"owner_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
}
]
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([
{
pipeline_id: '018f13b3-8239-7ef8-a8f1-93ad10b76110',
opportunity: {
name: '<string>',
stage_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
stage_name: '<string>',
deal_size: 123,
close_date: 123,
next_action_date: 123,
next_steps: '<string>',
custom_attributes: {}
},
related_objects: {
account_domain: 'acme.com',
primary_contact_email: 'jsmith@example.com',
additional_contact_emails: ['jsmith@example.com'],
owner_email: 'jsmith@example.com',
owner_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a'
}
}
])
};
fetch('https://api.octolane.com/v1/opportunities/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://api.octolane.com/v1/opportunities/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([
[
'pipeline_id' => '018f13b3-8239-7ef8-a8f1-93ad10b76110',
'opportunity' => [
'name' => '<string>',
'stage_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'stage_name' => '<string>',
'deal_size' => 123,
'close_date' => 123,
'next_action_date' => 123,
'next_steps' => '<string>',
'custom_attributes' => [
]
],
'related_objects' => [
'account_domain' => 'acme.com',
'primary_contact_email' => 'jsmith@example.com',
'additional_contact_emails' => [
'jsmith@example.com'
],
'owner_email' => 'jsmith@example.com',
'owner_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a'
]
]
]),
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://api.octolane.com/v1/opportunities/bulk"
payload := strings.NewReader("[\n {\n \"pipeline_id\": \"018f13b3-8239-7ef8-a8f1-93ad10b76110\",\n \"opportunity\": {\n \"name\": \"<string>\",\n \"stage_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"stage_name\": \"<string>\",\n \"deal_size\": 123,\n \"close_date\": 123,\n \"next_action_date\": 123,\n \"next_steps\": \"<string>\",\n \"custom_attributes\": {}\n },\n \"related_objects\": {\n \"account_domain\": \"acme.com\",\n \"primary_contact_email\": \"jsmith@example.com\",\n \"additional_contact_emails\": [\n \"jsmith@example.com\"\n ],\n \"owner_email\": \"jsmith@example.com\",\n \"owner_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\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://api.octolane.com/v1/opportunities/bulk")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("[\n {\n \"pipeline_id\": \"018f13b3-8239-7ef8-a8f1-93ad10b76110\",\n \"opportunity\": {\n \"name\": \"<string>\",\n \"stage_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"stage_name\": \"<string>\",\n \"deal_size\": 123,\n \"close_date\": 123,\n \"next_action_date\": 123,\n \"next_steps\": \"<string>\",\n \"custom_attributes\": {}\n },\n \"related_objects\": {\n \"account_domain\": \"acme.com\",\n \"primary_contact_email\": \"jsmith@example.com\",\n \"additional_contact_emails\": [\n \"jsmith@example.com\"\n ],\n \"owner_email\": \"jsmith@example.com\",\n \"owner_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n }\n }\n]")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.octolane.com/v1/opportunities/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 {\n \"pipeline_id\": \"018f13b3-8239-7ef8-a8f1-93ad10b76110\",\n \"opportunity\": {\n \"name\": \"<string>\",\n \"stage_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"stage_name\": \"<string>\",\n \"deal_size\": 123,\n \"close_date\": 123,\n \"next_action_date\": 123,\n \"next_steps\": \"<string>\",\n \"custom_attributes\": {}\n },\n \"related_objects\": {\n \"account_domain\": \"acme.com\",\n \"primary_contact_email\": \"jsmith@example.com\",\n \"additional_contact_emails\": [\n \"jsmith@example.com\"\n ],\n \"owner_email\": \"jsmith@example.com\",\n \"owner_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n }\n }\n]"
response = http.request(request)
puts response.read_body{
"success": true,
"message": "<string>",
"data": {
"opportunities": [
{
"index": 123,
"opportunity_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
],
"skipped": [
{
"index": 123,
"pipeline_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"reason": "duplicate_in_database",
"existing_opportunity_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"duplicate_of_index": 123
}
],
"created_count": 123,
"skipped_count": 123
}
}{
"success": true,
"message": "<string>",
"data": "<unknown>"
}{
"success": false,
"message": "Validation failed",
"statusCode": 400
}{
"success": false,
"message": "Validation failed",
"statusCode": 400
}{
"success": false,
"message": "Validation failed",
"statusCode": 400
}