curl --request POST \
--url https://{host}/Agent/Legal/SignContract \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Referer: <referer>' \
--data '
{
"keyId": "<string>",
"legalId": "<string>",
"contractId": "<string>",
"role": "<string>",
"nonce": "<string>",
"keySignature": "<string>",
"requestSignature": "<string>"
}
'import requests
url = "https://{host}/Agent/Legal/SignContract"
payload = {
"keyId": "<string>",
"legalId": "<string>",
"contractId": "<string>",
"role": "<string>",
"nonce": "<string>",
"keySignature": "<string>",
"requestSignature": "<string>"
}
headers = {
"Referer": "<referer>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
Referer: '<referer>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
keyId: '<string>',
legalId: '<string>',
contractId: '<string>',
role: '<string>',
nonce: '<string>',
keySignature: '<string>',
requestSignature: '<string>'
})
};
fetch('https://{host}/Agent/Legal/SignContract', 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://{host}/Agent/Legal/SignContract",
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([
'keyId' => '<string>',
'legalId' => '<string>',
'contractId' => '<string>',
'role' => '<string>',
'nonce' => '<string>',
'keySignature' => '<string>',
'requestSignature' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"Referer: <referer>"
],
]);
$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://{host}/Agent/Legal/SignContract"
payload := strings.NewReader("{\n \"keyId\": \"<string>\",\n \"legalId\": \"<string>\",\n \"contractId\": \"<string>\",\n \"role\": \"<string>\",\n \"nonce\": \"<string>\",\n \"keySignature\": \"<string>\",\n \"requestSignature\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Referer", "<referer>")
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://{host}/Agent/Legal/SignContract")
.header("Referer", "<referer>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"keyId\": \"<string>\",\n \"legalId\": \"<string>\",\n \"contractId\": \"<string>\",\n \"role\": \"<string>\",\n \"nonce\": \"<string>\",\n \"keySignature\": \"<string>\",\n \"requestSignature\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://{host}/Agent/Legal/SignContract")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Referer"] = '<referer>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"keyId\": \"<string>\",\n \"legalId\": \"<string>\",\n \"contractId\": \"<string>\",\n \"role\": \"<string>\",\n \"nonce\": \"<string>\",\n \"keySignature\": \"<string>\",\n \"requestSignature\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"Contract": {}
}Sign Contract
Allows the client to sign a smart contract. Note: Neurons are federated.
curl --request POST \
--url https://{host}/Agent/Legal/SignContract \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Referer: <referer>' \
--data '
{
"keyId": "<string>",
"legalId": "<string>",
"contractId": "<string>",
"role": "<string>",
"nonce": "<string>",
"keySignature": "<string>",
"requestSignature": "<string>"
}
'import requests
url = "https://{host}/Agent/Legal/SignContract"
payload = {
"keyId": "<string>",
"legalId": "<string>",
"contractId": "<string>",
"role": "<string>",
"nonce": "<string>",
"keySignature": "<string>",
"requestSignature": "<string>"
}
headers = {
"Referer": "<referer>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
Referer: '<referer>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
keyId: '<string>',
legalId: '<string>',
contractId: '<string>',
role: '<string>',
nonce: '<string>',
keySignature: '<string>',
requestSignature: '<string>'
})
};
fetch('https://{host}/Agent/Legal/SignContract', 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://{host}/Agent/Legal/SignContract",
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([
'keyId' => '<string>',
'legalId' => '<string>',
'contractId' => '<string>',
'role' => '<string>',
'nonce' => '<string>',
'keySignature' => '<string>',
'requestSignature' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"Referer: <referer>"
],
]);
$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://{host}/Agent/Legal/SignContract"
payload := strings.NewReader("{\n \"keyId\": \"<string>\",\n \"legalId\": \"<string>\",\n \"contractId\": \"<string>\",\n \"role\": \"<string>\",\n \"nonce\": \"<string>\",\n \"keySignature\": \"<string>\",\n \"requestSignature\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Referer", "<referer>")
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://{host}/Agent/Legal/SignContract")
.header("Referer", "<referer>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"keyId\": \"<string>\",\n \"legalId\": \"<string>\",\n \"contractId\": \"<string>\",\n \"role\": \"<string>\",\n \"nonce\": \"<string>\",\n \"keySignature\": \"<string>\",\n \"requestSignature\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://{host}/Agent/Legal/SignContract")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Referer"] = '<referer>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"keyId\": \"<string>\",\n \"legalId\": \"<string>\",\n \"contractId\": \"<string>\",\n \"role\": \"<string>\",\n \"nonce\": \"<string>\",\n \"keySignature\": \"<string>\",\n \"requestSignature\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"Contract": {}
}Signature construction
Lets1 = username + ":" + HTTP-Host + ":" + localName + ":" + namespace + ":" + keyId, using the algorithm stored with the key.
keySignature = Base64(HMAC-SHA256(UTF8(keyPassword), UTF8(s1)))- Generate at least 32 random bytes and Base64-encode them as
nonce. - Let
s2 = s1 + ":" + keySignature + ":" + nonce + ":" + legalId + ":" + contractId + ":" + role. requestSignature = Base64(HMAC-SHA256(UTF8(accountPassword), UTF8(s2)))
Host header value, including a non-default port. Preserve the documented field order and exact casing. Never reuse a nonce.
The Neuron then decrypts the stored private key, signs the normalized contract bytes, and returns the updated Contract object. See the contract lifecycle guide for a JavaScript implementation.Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Headers
Your application's HTTPS URL, for example https://app.example.com/. Include this header on every Agent API request, including backend calls, login, and account creation. Browser clients must use a referrer policy that sends the application origin. See /neuron-api/api-basics#required-referer-header.
Body
The caller-chosen id submitted to CreateKey and associated with this approved Legal Identity.
Approved Legal Identity owned by the authenticated account.
Contract to sign.
Exact role name assigned to this Legal Identity in the contract.
Unique random string of at least 32 characters. The maintained client uses Base64 of 32 random bytes.
32Base64-encoded HMAC-SHA256 over the documented key message, keyed by the key password.
Base64-encoded HMAC-SHA256 over the documented contract-signing request message, keyed by the account password.
Response
Success