curl --request GET \
--url https://production-api.joinrings.com/v1/opportunities/{opportunity_uuid} \
--header 'x-api-key: <api-key>'import requests
url = "https://production-api.joinrings.com/v1/opportunities/{opportunity_uuid}"
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/opportunities/{opportunity_uuid}', 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/opportunities/{opportunity_uuid}",
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/opportunities/{opportunity_uuid}"
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/opportunities/{opportunity_uuid}")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://production-api.joinrings.com/v1/opportunities/{opportunity_uuid}")
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{
"uuid": "<string>",
"associations": [
{
"association_type": "<string>",
"context": "<string>",
"created_at": 123,
"entity_type": "PERSON",
"entity_uuid": "<string>",
"last_activity_date": "<string>",
"updated_at": 123,
"uuid": "<string>",
"activity": {
"kind": "<string>",
"object_id": "<string>",
"title": "<string>",
"end_date": "<string>",
"start_date": "<string>"
},
"company": {
"last_activity_date": "<string>",
"logo_url": "<string>",
"name": "<string>",
"type": "<string>",
"uuid": "<string>",
"city": "<string>",
"country": "<string>",
"state": "<string>"
},
"opportunity": {
"is_sub_opportunity": true,
"name": "<string>",
"uuid": "<string>",
"stage": {
"uuid": "<string>",
"name": "<string>"
},
"type": {
"label": "<string>",
"label_plural": "<string>",
"sub_label": "<string>",
"sub_label_plural": "<string>",
"uuid": "<string>",
"is_hidden": true
}
},
"person": {
"email": "<string>",
"last_activity_date": "<string>",
"logo_url": "<string>",
"name": "<string>",
"type": "<string>",
"uuid": "<string>",
"city": "<string>",
"country": "<string>",
"state": "<string>"
}
}
],
"children_metadata": {
"count": 123,
"probability_sum": 123,
"value_sum": 123,
"weighted_value_sum": 123
},
"close_date": "<string>",
"company_last_activity_date": "<string>",
"created_at": 123,
"created_by": {
"uuid": "<string>",
"logo_url": "<string>",
"name": "<string>",
"type": "<string>"
},
"custom_field_mapping": {
"fields": [
{
"key": "<string>",
"name": "<string>",
"type": "<string>",
"uuid": "<string>",
"choices": [
"<string>"
]
}
],
"standard_key_to_uuid": {},
"unresolved_keys": [
"<string>"
]
},
"custom_fields": [
{
"key": "<string>",
"name": "<string>",
"type": "<string>",
"uuid": "<string>",
"float_value": 123,
"string_value": "<string>"
}
],
"days_in_stage": 123,
"details": "<string>",
"intro_date": "<string>",
"intro_person": {
"uuid": "<string>",
"logo_url": "<string>",
"name": "<string>",
"type": "<string>"
},
"last_activity_date": "<string>",
"name": "<string>",
"next_meeting_at": "<string>",
"next_step": "<string>",
"notes_and_files_count": 123,
"owner": {
"uuid": "<string>",
"logo_url": "<string>",
"name": "<string>",
"type": "<string>"
},
"parent_name": "<string>",
"parent_uuid": "<string>",
"person_last_activity_date": "<string>",
"probability": 123,
"source_date": "<string>",
"stage": {
"uuid": "<string>",
"name": "<string>"
},
"type": {
"label": "<string>",
"label_plural": "<string>",
"sub_label": "<string>",
"sub_label_plural": "<string>",
"uuid": "<string>",
"is_hidden": true
},
"updated_at": 123,
"updated_by": {
"uuid": "<string>",
"logo_url": "<string>",
"name": "<string>",
"type": "<string>"
},
"value": 123,
"weighted_value": 123
}Get an opportunity
Returns the complete opportunity including stage, type, owner, intro person, associated persons and companies, custom fields, days in current stage, notes/files count, and activity dates. Returns 404 if the opportunity is not visible in the tenant’s ring.
Each associated person/company carries city, state and country, so
an opportunity’s geography can be read off the record itself instead of
looking every association up individually.
curl --request GET \
--url https://production-api.joinrings.com/v1/opportunities/{opportunity_uuid} \
--header 'x-api-key: <api-key>'import requests
url = "https://production-api.joinrings.com/v1/opportunities/{opportunity_uuid}"
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/opportunities/{opportunity_uuid}', 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/opportunities/{opportunity_uuid}",
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/opportunities/{opportunity_uuid}"
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/opportunities/{opportunity_uuid}")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://production-api.joinrings.com/v1/opportunities/{opportunity_uuid}")
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{
"uuid": "<string>",
"associations": [
{
"association_type": "<string>",
"context": "<string>",
"created_at": 123,
"entity_type": "PERSON",
"entity_uuid": "<string>",
"last_activity_date": "<string>",
"updated_at": 123,
"uuid": "<string>",
"activity": {
"kind": "<string>",
"object_id": "<string>",
"title": "<string>",
"end_date": "<string>",
"start_date": "<string>"
},
"company": {
"last_activity_date": "<string>",
"logo_url": "<string>",
"name": "<string>",
"type": "<string>",
"uuid": "<string>",
"city": "<string>",
"country": "<string>",
"state": "<string>"
},
"opportunity": {
"is_sub_opportunity": true,
"name": "<string>",
"uuid": "<string>",
"stage": {
"uuid": "<string>",
"name": "<string>"
},
"type": {
"label": "<string>",
"label_plural": "<string>",
"sub_label": "<string>",
"sub_label_plural": "<string>",
"uuid": "<string>",
"is_hidden": true
}
},
"person": {
"email": "<string>",
"last_activity_date": "<string>",
"logo_url": "<string>",
"name": "<string>",
"type": "<string>",
"uuid": "<string>",
"city": "<string>",
"country": "<string>",
"state": "<string>"
}
}
],
"children_metadata": {
"count": 123,
"probability_sum": 123,
"value_sum": 123,
"weighted_value_sum": 123
},
"close_date": "<string>",
"company_last_activity_date": "<string>",
"created_at": 123,
"created_by": {
"uuid": "<string>",
"logo_url": "<string>",
"name": "<string>",
"type": "<string>"
},
"custom_field_mapping": {
"fields": [
{
"key": "<string>",
"name": "<string>",
"type": "<string>",
"uuid": "<string>",
"choices": [
"<string>"
]
}
],
"standard_key_to_uuid": {},
"unresolved_keys": [
"<string>"
]
},
"custom_fields": [
{
"key": "<string>",
"name": "<string>",
"type": "<string>",
"uuid": "<string>",
"float_value": 123,
"string_value": "<string>"
}
],
"days_in_stage": 123,
"details": "<string>",
"intro_date": "<string>",
"intro_person": {
"uuid": "<string>",
"logo_url": "<string>",
"name": "<string>",
"type": "<string>"
},
"last_activity_date": "<string>",
"name": "<string>",
"next_meeting_at": "<string>",
"next_step": "<string>",
"notes_and_files_count": 123,
"owner": {
"uuid": "<string>",
"logo_url": "<string>",
"name": "<string>",
"type": "<string>"
},
"parent_name": "<string>",
"parent_uuid": "<string>",
"person_last_activity_date": "<string>",
"probability": 123,
"source_date": "<string>",
"stage": {
"uuid": "<string>",
"name": "<string>"
},
"type": {
"label": "<string>",
"label_plural": "<string>",
"sub_label": "<string>",
"sub_label_plural": "<string>",
"uuid": "<string>",
"is_hidden": true
},
"updated_at": 123,
"updated_by": {
"uuid": "<string>",
"logo_url": "<string>",
"name": "<string>",
"type": "<string>"
},
"value": 123,
"weighted_value": 123
}Authorizations
Path Parameters
Query Parameters
Set false to leave the deprecated custom_field_mapping schema off the response. Get it from GET /v1/opportunities/custom-fields instead. Defaults to true for backwards compatibility.
Response
Single-opportunity response (GET /v1/opportunities/{uuid}).
Extends OpportunityResponse with the tenant's custom-field schema,
which is only computed once per response here — list responses instead
carry it once at the top level (OpportunityListResponse.custom_field_mapping)
rather than repeating it on every item.
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Deprecated: fetch the schema once from GET /v1/opportunities/custom-fields instead, and pass include_custom_field_mapping=false to leave it off this response. Each custom_fields entry already carries its field's name and type. Null when excluded.
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes