curl --request GET \
--url https://api.example.com/services/{service}/handlers/{handler}import requests
url = "https://api.example.com/services/{service}/handlers/{handler}"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.example.com/services/{service}/handlers/{handler}', 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/services/{service}/handlers/{handler}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.example.com/services/{service}/handlers/{handler}"
req, _ := http.NewRequest("GET", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.example.com/services/{service}/handlers/{handler}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/services/{service}/handlers/{handler}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_body{
"input_description": "<string>",
"name": "<string>",
"output_description": "<string>",
"abort_timeout": "<string>",
"documentation": "<string>",
"enable_lazy_state": true,
"idempotency_retention": "<string>",
"inactivity_timeout": "<string>",
"info": [
{
"message": "<string>",
"code": "<string>"
}
],
"input_json_schema": "<unknown>",
"journal_retention": "<string>",
"metadata": {},
"output_json_schema": "<unknown>",
"public": true,
"retry_policy": {
"exponentiation_factor": 123,
"initial_interval": "<string>",
"max_attempts": 2,
"max_interval": "<string>",
"on_max_attempts": "Pause"
},
"state_preload_policy": "All",
"ty": "Exclusive"
}{
"message": "<string>",
"restate_code": "<string>"
}{
"message": "<string>",
"restate_code": "<string>"
}{
"message": "<string>",
"restate_code": "<string>"
}{
"message": "<string>",
"restate_code": "<string>"
}{
"message": "<string>",
"restate_code": "<string>"
}Get service handler
Returns detailed metadata about a specific handler within a service, including its input/output types and handler type.
curl --request GET \
--url https://api.example.com/services/{service}/handlers/{handler}import requests
url = "https://api.example.com/services/{service}/handlers/{handler}"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.example.com/services/{service}/handlers/{handler}', 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/services/{service}/handlers/{handler}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.example.com/services/{service}/handlers/{handler}"
req, _ := http.NewRequest("GET", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.example.com/services/{service}/handlers/{handler}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/services/{service}/handlers/{handler}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_body{
"input_description": "<string>",
"name": "<string>",
"output_description": "<string>",
"abort_timeout": "<string>",
"documentation": "<string>",
"enable_lazy_state": true,
"idempotency_retention": "<string>",
"inactivity_timeout": "<string>",
"info": [
{
"message": "<string>",
"code": "<string>"
}
],
"input_json_schema": "<unknown>",
"journal_retention": "<string>",
"metadata": {},
"output_json_schema": "<unknown>",
"public": true,
"retry_policy": {
"exponentiation_factor": 123,
"initial_interval": "<string>",
"max_attempts": 2,
"max_interval": "<string>",
"on_max_attempts": "Pause"
},
"state_preload_policy": "All",
"ty": "Exclusive"
}{
"message": "<string>",
"restate_code": "<string>"
}{
"message": "<string>",
"restate_code": "<string>"
}{
"message": "<string>",
"restate_code": "<string>"
}{
"message": "<string>",
"restate_code": "<string>"
}{
"message": "<string>",
"restate_code": "<string>"
}Response
Handler metadata including input/output types and configuration
Handler metadata
Abort timeout
This timer guards against stalled service/handler invocations that are supposed to terminate. The abort timeout is started after the 'inactivity timeout' has expired and the service/handler invocation has been asked to gracefully terminate. Once the timer expires, it will abort the service/handler invocation.
This timer potentially interrupts user code. If the user code needs longer to gracefully terminate, then this value needs to be set accordingly.
Can be configured using the jiff::fmt::friendly format or ISO8601, for example 5 hours.
If set, it overrides the value set in the service.
Idempotency retention
The retention duration of idempotent requests for this handler. If set, it overrides the value set in the service.
Can be configured using the jiff::fmt::friendly format or ISO8601, for example 5 hours.
Inactivity timeout
This timer guards against stalled service/handler invocations. Once it expires, Restate triggers a graceful termination by asking the service invocation to suspend (which preserves intermediate progress).
The 'abort timeout' is used to abort the invocation, in case it doesn't react to the request to suspend.
Can be configured using the jiff::fmt::friendly format or ISO8601, for example 5 hours.
If set, it overrides the value set in the service.
Journal retention
The journal retention. When set, this applies to all requests to this handler.
In case the invocation has an idempotency key, the idempotency_retention caps the maximum journal_retention time.
In case this handler is a workflow handler, the workflow_completion_retention caps the maximum journal_retention time.
Can be configured using the jiff::fmt::friendly format or ISO8601, for example 5 hours.
If set, it overrides the value set in the service.
State preload policy
Which state is preloaded (sent eagerly) at the start of an invocation to this handler. This is relevant only for Workflows and Virtual Objects.
If set, it overrides the service-level policy.
"All" preloads all state eagerly; {"Partial": ["key", ...]} preloads only the listed
keys eagerly (an empty list means fully lazy state).
All