curl --request POST \
--url https://laso.finance/signup \
--header 'Content-Type: application/json' \
--data '
{
"agent_name": "Ada",
"label": "ada-prod"
}
'import requests
url = "https://laso.finance/signup"
payload = {
"agent_name": "Ada",
"label": "ada-prod"
}
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({agent_name: 'Ada', label: 'ada-prod'})
};
fetch('https://laso.finance/signup', 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://laso.finance/signup",
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([
'agent_name' => 'Ada',
'label' => 'ada-prod'
]),
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://laso.finance/signup"
payload := strings.NewReader("{\n \"agent_name\": \"Ada\",\n \"label\": \"ada-prod\"\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://laso.finance/signup")
.header("Content-Type", "application/json")
.body("{\n \"agent_name\": \"Ada\",\n \"label\": \"ada-prod\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://laso.finance/signup")
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 \"agent_name\": \"Ada\",\n \"label\": \"ada-prod\"\n}"
response = http.request(request)
puts response.read_body{
"claim_url": "https://laso.finance/agent/dashboard/claim?code=K7MPQ-W3XZ9",
"claim_code": "K7MPQ-W3XZ9",
"claim_token": "lasoclaim_...",
"expires_at": 123,
"expires_in": 86400,
"message_for_human": "<string>",
"agent_terms_url": "https://laso.finance/agent-terms.md",
"next_steps": [
"<string>"
]
}{
"error": "Too many signups from this address. Try again later.",
"code": "rate_limited",
"retry_after_seconds": 1800,
"hint": "Signups are limited per IP address, with a short burst window on top of an hourly cap. Wait retry_after_seconds and try once more. If you already started a signup, poll GET /signup-status with its claim_token instead of starting another."
}Start a signup for a human with no Laso account
Begins account creation for a human who does not have a Laso account yet. Requires no authentication, because the caller has no account.
This does not create the account. An agent cannot: the account is created in the human’s own browser when they sign in, so it belongs to them and not to their agent. What this returns is a claim_url to hand over.
Give your human the claim_url verbatim in your very next reply (send message_for_human if unsure what to say), and do not open it yourself. Then poll GET /signup-status, which holds the connection open until they finish and hands you your lasoak_ API key.
Rate limited per IP.
curl --request POST \
--url https://laso.finance/signup \
--header 'Content-Type: application/json' \
--data '
{
"agent_name": "Ada",
"label": "ada-prod"
}
'import requests
url = "https://laso.finance/signup"
payload = {
"agent_name": "Ada",
"label": "ada-prod"
}
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({agent_name: 'Ada', label: 'ada-prod'})
};
fetch('https://laso.finance/signup', 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://laso.finance/signup",
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([
'agent_name' => 'Ada',
'label' => 'ada-prod'
]),
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://laso.finance/signup"
payload := strings.NewReader("{\n \"agent_name\": \"Ada\",\n \"label\": \"ada-prod\"\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://laso.finance/signup")
.header("Content-Type", "application/json")
.body("{\n \"agent_name\": \"Ada\",\n \"label\": \"ada-prod\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://laso.finance/signup")
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 \"agent_name\": \"Ada\",\n \"label\": \"ada-prod\"\n}"
response = http.request(request)
puts response.read_body{
"claim_url": "https://laso.finance/agent/dashboard/claim?code=K7MPQ-W3XZ9",
"claim_code": "K7MPQ-W3XZ9",
"claim_token": "lasoclaim_...",
"expires_at": 123,
"expires_in": 86400,
"message_for_human": "<string>",
"agent_terms_url": "https://laso.finance/agent-terms.md",
"next_steps": [
"<string>"
]
}{
"error": "Too many signups from this address. Try again later.",
"code": "rate_limited",
"retry_after_seconds": 1800,
"hint": "Signups are limited per IP address, with a short burst window on top of an hourly cap. Wait retry_after_seconds and try once more. If you already started a signup, poll GET /signup-status with its claim_token instead of starting another."
}Body
Response
Signup started
Give this to your human verbatim. Never open it yourself.
"https://laso.finance/agent/dashboard/claim?code=K7MPQ-W3XZ9"
The code inside claim_url. Pass it back to /signup-status alongside claim_token.
"K7MPQ-W3XZ9"
Your receipt for this signup. Shown once; store it. Exchanged at /signup-status for your API key.
"lasoclaim_..."
Epoch ms when the claim link expires.
Seconds until the claim link expires (86400).
86400
A ready-to-send reply containing the link. Send this as your next message.
The Agent Terms your human accepts by finishing the claim link, as plain text. You act for them under these terms.
"https://laso.finance/agent-terms.md"
Was this page helpful?