Complete a profile upload
curl --request POST \
--url https://agp.eu.hcompany.ai/api/v2/browser-profiles/{profile_id}/complete-upload \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"browser_name": "<string>",
"browser_version": "<string>",
"description": "<string>",
"labels": {}
}
'import requests
url = "https://agp.eu.hcompany.ai/api/v2/browser-profiles/{profile_id}/complete-upload"
payload = {
"name": "<string>",
"browser_name": "<string>",
"browser_version": "<string>",
"description": "<string>",
"labels": {}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: '<string>',
browser_name: '<string>',
browser_version: '<string>',
description: '<string>',
labels: {}
})
};
fetch('https://agp.eu.hcompany.ai/api/v2/browser-profiles/{profile_id}/complete-upload', 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://agp.eu.hcompany.ai/api/v2/browser-profiles/{profile_id}/complete-upload",
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([
'name' => '<string>',
'browser_name' => '<string>',
'browser_version' => '<string>',
'description' => '<string>',
'labels' => [
]
]),
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://agp.eu.hcompany.ai/api/v2/browser-profiles/{profile_id}/complete-upload"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"browser_name\": \"<string>\",\n \"browser_version\": \"<string>\",\n \"description\": \"<string>\",\n \"labels\": {}\n}")
req, _ := http.NewRequest("POST", 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.post("https://agp.eu.hcompany.ai/api/v2/browser-profiles/{profile_id}/complete-upload")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"browser_name\": \"<string>\",\n \"browser_version\": \"<string>\",\n \"description\": \"<string>\",\n \"labels\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://agp.eu.hcompany.ai/api/v2/browser-profiles/{profile_id}/complete-upload")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"<string>\",\n \"browser_name\": \"<string>\",\n \"browser_version\": \"<string>\",\n \"description\": \"<string>\",\n \"labels\": {}\n}"
response = http.request(request)
puts response.read_bodyBrowser Profiles
Complete a profile upload
Finalize a browser profile after its archive is uploaded.
POST
/
api
/
v2
/
browser-profiles
/
{profile_id}
/
complete-upload
Complete a profile upload
curl --request POST \
--url https://agp.eu.hcompany.ai/api/v2/browser-profiles/{profile_id}/complete-upload \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"browser_name": "<string>",
"browser_version": "<string>",
"description": "<string>",
"labels": {}
}
'import requests
url = "https://agp.eu.hcompany.ai/api/v2/browser-profiles/{profile_id}/complete-upload"
payload = {
"name": "<string>",
"browser_name": "<string>",
"browser_version": "<string>",
"description": "<string>",
"labels": {}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: '<string>',
browser_name: '<string>',
browser_version: '<string>',
description: '<string>',
labels: {}
})
};
fetch('https://agp.eu.hcompany.ai/api/v2/browser-profiles/{profile_id}/complete-upload', 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://agp.eu.hcompany.ai/api/v2/browser-profiles/{profile_id}/complete-upload",
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([
'name' => '<string>',
'browser_name' => '<string>',
'browser_version' => '<string>',
'description' => '<string>',
'labels' => [
]
]),
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://agp.eu.hcompany.ai/api/v2/browser-profiles/{profile_id}/complete-upload"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"browser_name\": \"<string>\",\n \"browser_version\": \"<string>\",\n \"description\": \"<string>\",\n \"labels\": {}\n}")
req, _ := http.NewRequest("POST", 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.post("https://agp.eu.hcompany.ai/api/v2/browser-profiles/{profile_id}/complete-upload")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"browser_name\": \"<string>\",\n \"browser_version\": \"<string>\",\n \"description\": \"<string>\",\n \"labels\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://agp.eu.hcompany.ai/api/v2/browser-profiles/{profile_id}/complete-upload")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"<string>\",\n \"browser_name\": \"<string>\",\n \"browser_version\": \"<string>\",\n \"description\": \"<string>\",\n \"labels\": {}\n}"
response = http.request(request)
puts response.read_bodyFinalizes a profile after you have uploaded its archive to the presigned target from
Initiate upload. The platform verifies the
uploaded archive and records the profile metadata.
Returns
201 with the created profile object (see
Retrieve for the full field list).
Path parameters
The
profile_id returned by Initiate upload.Request body
Human-readable label for the profile.
Browser the profile was captured with (for example
chromium, firefox, webkit, or
selenium). Validated against the set of supported browsers.Browser version string the profile was captured with (for example
131).Optional free-text description.
Optional key-value metadata for your own bookkeeping.
Examples
curl -X POST "https://agp.eu.hcompany.ai/api/v2/browser-profiles/a1b2c3d4-5678-90ab-cdef-1234567890ab/complete-upload" \
-H "Authorization: Bearer $HAI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "acme-prod-login",
"browser_name": "chromium",
"browser_version": "131",
"labels": {"team": "qa"}
}'
from hai_agents import Client
client = Client()
profile = client.browser_profiles.complete_browser_profile_upload(
profile_id="a1b2c3d4-5678-90ab-cdef-1234567890ab",
name="acme-prod-login",
browser_name="chromium",
browser_version="131",
labels={"team": "qa"},
)
print(profile.id)
import { HaiAgentsClient } from "hai-agents";
const client = new HaiAgentsClient();
const profile = await client.browserProfiles.completeBrowserProfileUpload({
profileId: "a1b2c3d4-5678-90ab-cdef-1234567890ab",
name: "acme-prod-login",
browserName: "chromium",
browserVersion: "131",
labels: { team: "qa" },
});
console.log(profile.id);
Response
{
"id": "a1b2c3d4-5678-90ab-cdef-1234567890ab",
"name": "acme-prod-login",
"description": null,
"browser_name": "chromium",
"browser_version": "131",
"s3_path": "browser-profiles/finished/org_123/a1b2c3d4-5678-90ab-cdef-1234567890ab/profile.zip",
"file_size_bytes": 102400,
"checksum": "9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08",
"usage_count": 0,
"last_used_at": null,
"labels": {"team": "qa"},
"is_default": false,
"created_at": "2026-06-16T14:30:00Z",
"updated_at": "2026-06-16T14:30:00Z"
}
Errors
| Status | Cause |
|---|---|
404 | No pending upload found for this profile_id, or you don’t have access. |
422 | Body failed validation (for example an unsupported browser_name), or the archive was not found in storage. |
Was this page helpful?
⌘I