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
string
required
The
profile_id returned by Initiate upload.Request body
string
required
Human-readable label for the profile.
string
required
Browser the profile was captured with (for example
chromium, firefox, webkit, or
selenium). Validated against the set of supported browsers.string
required
Browser version string the profile was captured with (for example
131).string
Optional free-text description.
object
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