curl --request POST \
--url https://api.getoneprofile.ai/linkedin/agent/actions/next/ \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"lease_nonce": "<string>",
"checkpoint": true,
"claim_request_id": "<string>",
"extension_version": "",
"member_urn": "<string>",
"running_action_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"running_claimed_at": "2023-11-07T05:31:56Z",
"supported_kinds": [
"<string>"
],
"timezone": "<string>",
"unmetered_only": false
}
'import requests
url = "https://api.getoneprofile.ai/linkedin/agent/actions/next/"
payload = {
"lease_nonce": "<string>",
"checkpoint": True,
"claim_request_id": "<string>",
"extension_version": "",
"member_urn": "<string>",
"running_action_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"running_claimed_at": "2023-11-07T05:31:56Z",
"supported_kinds": ["<string>"],
"timezone": "<string>",
"unmetered_only": False
}
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({
lease_nonce: '<string>',
checkpoint: true,
claim_request_id: '<string>',
extension_version: '',
member_urn: '<string>',
running_action_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
running_claimed_at: '2023-11-07T05:31:56Z',
supported_kinds: ['<string>'],
timezone: '<string>',
unmetered_only: false
})
};
fetch('https://api.getoneprofile.ai/linkedin/agent/actions/next/', 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.getoneprofile.ai/linkedin/agent/actions/next/",
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([
'lease_nonce' => '<string>',
'checkpoint' => true,
'claim_request_id' => '<string>',
'extension_version' => '',
'member_urn' => '<string>',
'running_action_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'running_claimed_at' => '2023-11-07T05:31:56Z',
'supported_kinds' => [
'<string>'
],
'timezone' => '<string>',
'unmetered_only' => false
]),
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.getoneprofile.ai/linkedin/agent/actions/next/"
payload := strings.NewReader("{\n \"lease_nonce\": \"<string>\",\n \"checkpoint\": true,\n \"claim_request_id\": \"<string>\",\n \"extension_version\": \"\",\n \"member_urn\": \"<string>\",\n \"running_action_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"running_claimed_at\": \"2023-11-07T05:31:56Z\",\n \"supported_kinds\": [\n \"<string>\"\n ],\n \"timezone\": \"<string>\",\n \"unmetered_only\": false\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.getoneprofile.ai/linkedin/agent/actions/next/")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"lease_nonce\": \"<string>\",\n \"checkpoint\": true,\n \"claim_request_id\": \"<string>\",\n \"extension_version\": \"\",\n \"member_urn\": \"<string>\",\n \"running_action_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"running_claimed_at\": \"2023-11-07T05:31:56Z\",\n \"supported_kinds\": [\n \"<string>\"\n ],\n \"timezone\": \"<string>\",\n \"unmetered_only\": false\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.getoneprofile.ai/linkedin/agent/actions/next/")
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 \"lease_nonce\": \"<string>\",\n \"checkpoint\": true,\n \"claim_request_id\": \"<string>\",\n \"extension_version\": \"\",\n \"member_urn\": \"<string>\",\n \"running_action_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"running_claimed_at\": \"2023-11-07T05:31:56Z\",\n \"supported_kinds\": [\n \"<string>\"\n ],\n \"timezone\": \"<string>\",\n \"unmetered_only\": false\n}"
response = http.request(request)
puts response.read_body{
"action": {
"account_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"claimed_at": "2023-11-07T05:31:56Z",
"duration_ms": 123,
"error_code": "selector_missing",
"error_message": "<string>",
"finished_at": "2023-11-07T05:31:56Z",
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"kind": "profile_view",
"outcome": {
"already_connected": true,
"already_following": true,
"can_send_message": true,
"invitation_pending": true,
"kind": "profile_view",
"member_urn": "<string>",
"member_urns": [
"<string>"
],
"open_profile": true,
"page_loaded": true,
"profile_resolved": true,
"reason": "invitation_already_pending",
"vanity": "<string>"
},
"params": {
"profile_url": "<string>",
"kind": "profile_view",
"read_relationship": false
},
"queued_at": "2023-11-07T05:31:56Z",
"status": "queued",
"acted_at": "2023-11-07T05:31:56Z",
"approved_at": "2023-11-07T05:31:56Z",
"held": false,
"hold": "sequence_paused",
"metered": true,
"requires_approval": false
},
"deferred_reason": "<string>",
"earliest_next_action_at": "2023-11-07T05:31:56Z",
"queued_count": 123,
"verification": {
"commit_granted_at": "2023-11-07T05:31:56Z",
"mode": "verify_then_act"
}
}{
"detail": "<string>"
}{
"detail": "<string>"
}{
"detail": "<string>",
"issues": [
{
"input": "<string>",
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}{
"detail": "<string>"
}{
"detail": "<string>"
}{
"detail": "<string>"
}Claim the next permitted action
Hands out one action, if and only if the governor allows it: the account is active and not at a checkpoint, no other step is running, the last one was handed out long enough ago, the kind still has daily headroom, the rolling weekly invitation ceiling is not reached, and credit covers it. A step the Oneprofile team fired to test the sender goes first and waits for none of those but the first two; asked with unmetered_only, only such a step is handed out. A step whose browser stopped reporting is resolved first. When nothing is handed out the response says why, which is what lets the panel distinguish an empty queue from a paced one: in_flight, pacing (with when to ask again), daily_cap or weekly_cap (only while claimable work waits behind them), checkpoint, not_connected, insufficient_credits, or null for an empty queue.
curl --request POST \
--url https://api.getoneprofile.ai/linkedin/agent/actions/next/ \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"lease_nonce": "<string>",
"checkpoint": true,
"claim_request_id": "<string>",
"extension_version": "",
"member_urn": "<string>",
"running_action_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"running_claimed_at": "2023-11-07T05:31:56Z",
"supported_kinds": [
"<string>"
],
"timezone": "<string>",
"unmetered_only": false
}
'import requests
url = "https://api.getoneprofile.ai/linkedin/agent/actions/next/"
payload = {
"lease_nonce": "<string>",
"checkpoint": True,
"claim_request_id": "<string>",
"extension_version": "",
"member_urn": "<string>",
"running_action_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"running_claimed_at": "2023-11-07T05:31:56Z",
"supported_kinds": ["<string>"],
"timezone": "<string>",
"unmetered_only": False
}
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({
lease_nonce: '<string>',
checkpoint: true,
claim_request_id: '<string>',
extension_version: '',
member_urn: '<string>',
running_action_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
running_claimed_at: '2023-11-07T05:31:56Z',
supported_kinds: ['<string>'],
timezone: '<string>',
unmetered_only: false
})
};
fetch('https://api.getoneprofile.ai/linkedin/agent/actions/next/', 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.getoneprofile.ai/linkedin/agent/actions/next/",
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([
'lease_nonce' => '<string>',
'checkpoint' => true,
'claim_request_id' => '<string>',
'extension_version' => '',
'member_urn' => '<string>',
'running_action_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'running_claimed_at' => '2023-11-07T05:31:56Z',
'supported_kinds' => [
'<string>'
],
'timezone' => '<string>',
'unmetered_only' => false
]),
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.getoneprofile.ai/linkedin/agent/actions/next/"
payload := strings.NewReader("{\n \"lease_nonce\": \"<string>\",\n \"checkpoint\": true,\n \"claim_request_id\": \"<string>\",\n \"extension_version\": \"\",\n \"member_urn\": \"<string>\",\n \"running_action_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"running_claimed_at\": \"2023-11-07T05:31:56Z\",\n \"supported_kinds\": [\n \"<string>\"\n ],\n \"timezone\": \"<string>\",\n \"unmetered_only\": false\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.getoneprofile.ai/linkedin/agent/actions/next/")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"lease_nonce\": \"<string>\",\n \"checkpoint\": true,\n \"claim_request_id\": \"<string>\",\n \"extension_version\": \"\",\n \"member_urn\": \"<string>\",\n \"running_action_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"running_claimed_at\": \"2023-11-07T05:31:56Z\",\n \"supported_kinds\": [\n \"<string>\"\n ],\n \"timezone\": \"<string>\",\n \"unmetered_only\": false\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.getoneprofile.ai/linkedin/agent/actions/next/")
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 \"lease_nonce\": \"<string>\",\n \"checkpoint\": true,\n \"claim_request_id\": \"<string>\",\n \"extension_version\": \"\",\n \"member_urn\": \"<string>\",\n \"running_action_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"running_claimed_at\": \"2023-11-07T05:31:56Z\",\n \"supported_kinds\": [\n \"<string>\"\n ],\n \"timezone\": \"<string>\",\n \"unmetered_only\": false\n}"
response = http.request(request)
puts response.read_body{
"action": {
"account_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"claimed_at": "2023-11-07T05:31:56Z",
"duration_ms": 123,
"error_code": "selector_missing",
"error_message": "<string>",
"finished_at": "2023-11-07T05:31:56Z",
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"kind": "profile_view",
"outcome": {
"already_connected": true,
"already_following": true,
"can_send_message": true,
"invitation_pending": true,
"kind": "profile_view",
"member_urn": "<string>",
"member_urns": [
"<string>"
],
"open_profile": true,
"page_loaded": true,
"profile_resolved": true,
"reason": "invitation_already_pending",
"vanity": "<string>"
},
"params": {
"profile_url": "<string>",
"kind": "profile_view",
"read_relationship": false
},
"queued_at": "2023-11-07T05:31:56Z",
"status": "queued",
"acted_at": "2023-11-07T05:31:56Z",
"approved_at": "2023-11-07T05:31:56Z",
"held": false,
"hold": "sequence_paused",
"metered": true,
"requires_approval": false
},
"deferred_reason": "<string>",
"earliest_next_action_at": "2023-11-07T05:31:56Z",
"queued_count": 123,
"verification": {
"commit_granted_at": "2023-11-07T05:31:56Z",
"mode": "verify_then_act"
}
}{
"detail": "<string>"
}{
"detail": "<string>"
}{
"detail": "<string>",
"issues": [
{
"input": "<string>",
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}{
"detail": "<string>"
}{
"detail": "<string>"
}{
"detail": "<string>"
}Authorizations
Body
This browser's lease identity; only the holder is handed work.
8 - 64True when LinkedIn is challenging the account; no work is handed out while it stands. False clears it; null leaves it untouched.
This browser's name for this ask, kept until the answer is saved. Asked again under the same name, because the first answer never arrived, the browser gets the step it was handed rather than a second one beside it. Older builds leave it out.
8 - 64^[A-Za-z0-9_-]+$32Who the browser is currently signed in as, for the mismatch guard.
128The step this browser is running right now, sent on the check-ins it makes while it runs; with running_claimed_at it keeps that step's claim from lapsing under a browser still working on it, including one waking from sleep. Null between steps.
When the running step was claimed, as the claim handed it out.
How far the running step got, from a build that resumes steps (resume:v1). Accepted and not kept: the commit grant, not the phase, says whether anything may have changed on LinkedIn.
claimed, navigated, dispatched, committing, committed The step kinds this build can run, and the capabilities it has beyond them (such as profile_view:read_relationship). Nothing is handed to a browser that it cannot run. Leave it out (an older build) and the browser runs the kinds that existed before builds said. Sent on every check-in: a check-in without it reads as such a build.
641 - 64The browser's IANA timezone (Intl.DateTimeFormat().resolvedOptions().timeZone). It fills the sender's timezone when the sender has none: their daily limits reset at its midnight and sequences send in its hours. A timezone the sender has is never moved by it. Taken only from the browser driving the account.
64Hand out only a step that waits for no gap between steps (one the Oneprofile team fired to test the sender), or nothing: the ask a build makes inside its own gap when the check-in says one is waiting (unpaced_waiting). Older builds leave it out.
Response
Successful Response
One LinkedIn step, in the shape the dashboard and every extension build read.
A step is queued only once it may run (its approval, when one was asked
for, happened on Tasks before it was queued), so every step reads
approved_at as the moment it was queued and requires_approval
false: the extension's store builds draw "Approve tasks" from exactly
these two fields, and no step in the line waits for a person. hold is
kept for the same builds and is always null: whether a step is out of the
line is held.
Show child attributes
Show child attributes
Set when the step handed out may already have touched LinkedIn (it stopped and was put back, or a press was granted to an earlier attempt): look on LinkedIn before acting, and a change already there is the step done. Only builds that resume steps (resume:v1) are handed such a step.
Show child attributes
Show child attributes
Was this page helpful?