curl --request PUT \
--url https://api.hq.zone/v1/api/business-profile \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"brand_palette": "<unknown>",
"business_domain": "<string>",
"fonts": "<unknown>",
"logo_url": "<string>",
"summary": "<string>"
}
'import requests
url = "https://api.hq.zone/v1/api/business-profile"
payload = {
"brand_palette": "<unknown>",
"business_domain": "<string>",
"fonts": "<unknown>",
"logo_url": "<string>",
"summary": "<string>"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
brand_palette: '<unknown>',
business_domain: '<string>',
fonts: '<unknown>',
logo_url: '<string>',
summary: '<string>'
})
};
fetch('https://api.hq.zone/v1/api/business-profile', 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.hq.zone/v1/api/business-profile",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'brand_palette' => '<unknown>',
'business_domain' => '<string>',
'fonts' => '<unknown>',
'logo_url' => '<string>',
'summary' => '<string>'
]),
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.hq.zone/v1/api/business-profile"
payload := strings.NewReader("{\n \"brand_palette\": \"<unknown>\",\n \"business_domain\": \"<string>\",\n \"fonts\": \"<unknown>\",\n \"logo_url\": \"<string>\",\n \"summary\": \"<string>\"\n}")
req, _ := http.NewRequest("PUT", 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.put("https://api.hq.zone/v1/api/business-profile")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"brand_palette\": \"<unknown>\",\n \"business_domain\": \"<string>\",\n \"fonts\": \"<unknown>\",\n \"logo_url\": \"<string>\",\n \"summary\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.hq.zone/v1/api/business-profile")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"brand_palette\": \"<unknown>\",\n \"business_domain\": \"<string>\",\n \"fonts\": \"<unknown>\",\n \"logo_url\": \"<string>\",\n \"summary\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"detected": [
{
"signal_type": "<string>",
"value": "<string>"
}
],
"overridden": [
"<string>"
],
"brand_palette": "<unknown>",
"business_domain": "<string>",
"crawl_domain": "<string>",
"crawl_status": "<string>",
"dm_sent_at": "2023-11-07T05:31:56Z",
"enrichment": {
"enriched_at": "2023-11-07T05:31:56Z",
"industry": "<string>",
"segment": "<string>",
"size_hint": "<string>"
},
"fetched_at": "2023-11-07T05:31:56Z",
"fonts": "<unknown>",
"last_error": "<string>",
"logo_artifact_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"logo_url": "<string>",
"pages_crawled": 123,
"summary": "<string>",
"summary_confidence": 123
}Update business profile
Updates the workspace’s business profile and returns the refreshed profile in the same shape as the GET endpoint. Admin only. Each field may be set, cleared (to re-expose the auto-discovered value), or left untouched; manual overrides persist across future automatic refreshes. Changing the domain to a new value normalizes it, rejects bare IP addresses with a 400, and triggers an immediate re-crawl.
curl --request PUT \
--url https://api.hq.zone/v1/api/business-profile \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"brand_palette": "<unknown>",
"business_domain": "<string>",
"fonts": "<unknown>",
"logo_url": "<string>",
"summary": "<string>"
}
'import requests
url = "https://api.hq.zone/v1/api/business-profile"
payload = {
"brand_palette": "<unknown>",
"business_domain": "<string>",
"fonts": "<unknown>",
"logo_url": "<string>",
"summary": "<string>"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
brand_palette: '<unknown>',
business_domain: '<string>',
fonts: '<unknown>',
logo_url: '<string>',
summary: '<string>'
})
};
fetch('https://api.hq.zone/v1/api/business-profile', 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.hq.zone/v1/api/business-profile",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'brand_palette' => '<unknown>',
'business_domain' => '<string>',
'fonts' => '<unknown>',
'logo_url' => '<string>',
'summary' => '<string>'
]),
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.hq.zone/v1/api/business-profile"
payload := strings.NewReader("{\n \"brand_palette\": \"<unknown>\",\n \"business_domain\": \"<string>\",\n \"fonts\": \"<unknown>\",\n \"logo_url\": \"<string>\",\n \"summary\": \"<string>\"\n}")
req, _ := http.NewRequest("PUT", 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.put("https://api.hq.zone/v1/api/business-profile")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"brand_palette\": \"<unknown>\",\n \"business_domain\": \"<string>\",\n \"fonts\": \"<unknown>\",\n \"logo_url\": \"<string>\",\n \"summary\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.hq.zone/v1/api/business-profile")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"brand_palette\": \"<unknown>\",\n \"business_domain\": \"<string>\",\n \"fonts\": \"<unknown>\",\n \"logo_url\": \"<string>\",\n \"summary\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"detected": [
{
"signal_type": "<string>",
"value": "<string>"
}
],
"overridden": [
"<string>"
],
"brand_palette": "<unknown>",
"business_domain": "<string>",
"crawl_domain": "<string>",
"crawl_status": "<string>",
"dm_sent_at": "2023-11-07T05:31:56Z",
"enrichment": {
"enriched_at": "2023-11-07T05:31:56Z",
"industry": "<string>",
"segment": "<string>",
"size_hint": "<string>"
},
"fetched_at": "2023-11-07T05:31:56Z",
"fonts": "<unknown>",
"last_error": "<string>",
"logo_artifact_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"logo_url": "<string>",
"pages_crawled": 123,
"summary": "<string>",
"summary_confidence": 123
}Authorizations
Personal Access Token. Send as Authorization: Bearer hq_pat_....
Body
Set or clear the crawled domain. Setting to a different value than current also enqueues an immediate refresh; this is the admin-edit-domain path.
Admin-supplied summary override. When set, the next agent turn reads this instead of the crawler's output.
Response
Updated profile
Technology signals detected for the tenant, highest-confidence first. Powers the read-only "Detected technology" section.
Show child attributes
Show child attributes
Which fields are currently admin-overridden. Powers the "Use auto" affordance in the UI - only the overridden fields get a reset-button.
Currently-set domain on the tenants row. May differ from
crawl.domain if the admin changed it after the last crawl.
Company enrichment learned by profiling (migration 0155).
None when none of industry/segment/size_hint are set.
Show child attributes
Show child attributes