History Forward
curl --request POST \
--url https://api.example.com/browser/sessions/{id}/forward \
--header 'Content-Type: application/json' \
--data '
{
"waitUntil": "<string>",
"timeout": 123
}
'import requests
url = "https://api.example.com/browser/sessions/{id}/forward"
payload = {
"waitUntil": "<string>",
"timeout": 123
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({waitUntil: '<string>', timeout: 123})
};
fetch('https://api.example.com/browser/sessions/{id}/forward', 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.example.com/browser/sessions/{id}/forward",
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([
'waitUntil' => '<string>',
'timeout' => 123
]),
CURLOPT_HTTPHEADER => [
"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.example.com/browser/sessions/{id}/forward"
payload := strings.NewReader("{\n \"waitUntil\": \"<string>\",\n \"timeout\": 123\n}")
req, _ := http.NewRequest("POST", url, payload)
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.example.com/browser/sessions/{id}/forward")
.header("Content-Type", "application/json")
.body("{\n \"waitUntil\": \"<string>\",\n \"timeout\": 123\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/browser/sessions/{id}/forward")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"waitUntil\": \"<string>\",\n \"timeout\": 123\n}"
response = http.request(request)
puts response.read_body{
"url": "<string>",
"pageId": "<string>"
}Browser Sessions
History Forward
Navigate forward in the active tab’s history.
POST
/
browser
/
sessions
/
{id}
/
forward
History Forward
curl --request POST \
--url https://api.example.com/browser/sessions/{id}/forward \
--header 'Content-Type: application/json' \
--data '
{
"waitUntil": "<string>",
"timeout": 123
}
'import requests
url = "https://api.example.com/browser/sessions/{id}/forward"
payload = {
"waitUntil": "<string>",
"timeout": 123
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({waitUntil: '<string>', timeout: 123})
};
fetch('https://api.example.com/browser/sessions/{id}/forward', 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.example.com/browser/sessions/{id}/forward",
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([
'waitUntil' => '<string>',
'timeout' => 123
]),
CURLOPT_HTTPHEADER => [
"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.example.com/browser/sessions/{id}/forward"
payload := strings.NewReader("{\n \"waitUntil\": \"<string>\",\n \"timeout\": 123\n}")
req, _ := http.NewRequest("POST", url, payload)
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.example.com/browser/sessions/{id}/forward")
.header("Content-Type", "application/json")
.body("{\n \"waitUntil\": \"<string>\",\n \"timeout\": 123\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/browser/sessions/{id}/forward")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"waitUntil\": \"<string>\",\n \"timeout\": 123\n}"
response = http.request(request)
puts response.read_body{
"url": "<string>",
"pageId": "<string>"
}Overview
The/browser/sessions/{id}/forward endpoint moves the active tab one step forwards in its history stack, equivalent to clicking the browser’s forward button. The call blocks until the configured wait condition is met or the timeout elapses.
When the browser’s back-forward cache is warm, this returns almost instantly. If there is no next history entry the endpoint returns 409 Conflict.
Path Parameters
string
required
Browser session ID (UUID). Create via
POST /browser/sessions.Body
All body fields are optional — the request body may be omitted entirely.string
default:"load"
When to consider the navigation finished. One of
load, domcontentloaded, networkidle.integer
default:"30000"
Maximum time (ms) to wait for navigation. Range
0–120000.Example Request
curl -X POST "https://api.scrapengine.io/api/v1/browser/sessions/0f2b1f6a-88ac-4d25-bc58-67a6f4b4a001/forward" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{}'
curl -X POST "https://api.scrapengine.io/api/v1/browser/sessions/0f2b1f6a-88ac-4d25-bc58-67a6f4b4a001/forward" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"waitUntil": "networkidle",
"timeout": 20000
}'
const response = await fetch(
"https://api.scrapengine.io/api/v1/browser/sessions/0f2b1f6a-88ac-4d25-bc58-67a6f4b4a001/forward",
{
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({ waitUntil: "networkidle" }),
},
);
const data = await response.json();
import requests
url = "https://api.scrapengine.io/api/v1/browser/sessions/0f2b1f6a-88ac-4d25-bc58-67a6f4b4a001/forward"
headers = {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
}
payload = {"waitUntil": "networkidle"}
response = requests.post(url, headers=headers, json=payload)
data = response.json()
Response
Success Response (200)
string
Effective URL of the active tab after moving forwards.
string
CDP target identifier of the tab the operation applied to.
{
"url": "https://example.com/products",
"pageId": "EA5E9AA71C7A91C467F8CDBB266EE5E0"
}
Error Responses
| Status | Description |
|---|---|
401 | Unauthorized — invalid or missing API key. |
404 | Session not found or not owned by the caller. |
408 | Navigation did not complete before timeout elapsed. |
409 | No next history entry — the active tab is already at the newest entry. |
503 | The browser session is temporarily unreachable. |
Notes
- Returns almost immediately when the browser’s back-forward cache (
bfcache) is warm. - A
409 Conflictmeans there is nothing to go forward to — typically this happens after a fresh navigation, which wipes the forward stack.
Was this page helpful?