Create an opportunity
Creates an opportunity in a pipeline and resolves related account, primary contact, additional contacts, owner, and stage from the supplied identifiers. 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. A duplicate answers 409.
curl --request POST \
--url https://api.octolane.com/v1/opportunities \
--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"
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', 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",
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"
payload := strings.NewReader("{\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}")
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")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\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}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.octolane.com/v1/opportunities")
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 \"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}"
response = http.request(request)
puts response.read_body{
"success": true,
"message": "<string>",
"data": "<unknown>"
}{
"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
}{
"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
Opportunity payload.
Was this page helpful?
curl --request POST \
--url https://api.octolane.com/v1/opportunities \
--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"
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', 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",
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"
payload := strings.NewReader("{\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}")
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")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\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}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.octolane.com/v1/opportunities")
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 \"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}"
response = http.request(request)
puts response.read_body{
"success": true,
"message": "<string>",
"data": "<unknown>"
}{
"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
}{
"success": false,
"message": "Validation failed",
"statusCode": 400
}