curl --request POST \
--url https://api.hashlock.markets/v1/swaps/{id}/legs/{leg}/claim \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"secret": "<the 32-byte hex preimage of this swap hashlock>"
}
'import requests
url = "https://api.hashlock.markets/v1/swaps/{id}/legs/{leg}/claim"
payload = { "secret": "<the 32-byte hex preimage of this swap hashlock>" }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({secret: '<the 32-byte hex preimage of this swap hashlock>'})
};
fetch('https://api.hashlock.markets/v1/swaps/{id}/legs/{leg}/claim', 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.hashlock.markets/v1/swaps/{id}/legs/{leg}/claim",
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([
'secret' => '<the 32-byte hex preimage of this swap hashlock>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"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.hashlock.markets/v1/swaps/{id}/legs/{leg}/claim"
payload := strings.NewReader("{\n \"secret\": \"<the 32-byte hex preimage of this swap hashlock>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
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://api.hashlock.markets/v1/swaps/{id}/legs/{leg}/claim")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"secret\": \"<the 32-byte hex preimage of this swap hashlock>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.hashlock.markets/v1/swaps/{id}/legs/{leg}/claim")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"secret\": \"<the 32-byte hex preimage of this swap hashlock>\"\n}"
response = http.request(request)
puts response.read_body{
"chain": "<string>",
"family": "evm",
"sign": "evm-tx",
"note": "<string>",
"chainId": 123,
"from": "<string>",
"txs": [
{
"to": "<string>",
"data": "<string>",
"value": "<string>"
}
],
"payTo": "<string>",
"amountSats": "<string>",
"topUp": true,
"feePayTo": "<string>",
"feeAmountSats": "<string>",
"toAddress": "<string>",
"psbtBase64": "<string>",
"sighashHex": "<string>",
"sighashHexes": [
"<string>"
],
"feeSats": 123,
"preimageHex": "<string>",
"timelockUnix": 123,
"escrow": "<string>",
"transactionBase64": "<string>",
"blockhash": "<string>",
"lastValidBlockHeight": 123,
"transactions": [
{
"transaction": {},
"txID": "<string>"
}
]
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}Build UNSIGNED claim (reveals the secret) — body: { secret: 32-byte hex }
The secret travels to the server in this request, on every chain: the EVM, TRON and Solana claim transactions carry it, and on Bitcoin it comes back as preimageHex for the broadcast. Until then the server has only sha256(secret). Build the claim when you are about to send it: the transaction puts the secret on chain, where it is public. It is refused until both legs are funded, and a refused request has still carried the secret, so do not call it earlier.
curl --request POST \
--url https://api.hashlock.markets/v1/swaps/{id}/legs/{leg}/claim \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"secret": "<the 32-byte hex preimage of this swap hashlock>"
}
'import requests
url = "https://api.hashlock.markets/v1/swaps/{id}/legs/{leg}/claim"
payload = { "secret": "<the 32-byte hex preimage of this swap hashlock>" }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({secret: '<the 32-byte hex preimage of this swap hashlock>'})
};
fetch('https://api.hashlock.markets/v1/swaps/{id}/legs/{leg}/claim', 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.hashlock.markets/v1/swaps/{id}/legs/{leg}/claim",
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([
'secret' => '<the 32-byte hex preimage of this swap hashlock>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"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.hashlock.markets/v1/swaps/{id}/legs/{leg}/claim"
payload := strings.NewReader("{\n \"secret\": \"<the 32-byte hex preimage of this swap hashlock>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
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://api.hashlock.markets/v1/swaps/{id}/legs/{leg}/claim")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"secret\": \"<the 32-byte hex preimage of this swap hashlock>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.hashlock.markets/v1/swaps/{id}/legs/{leg}/claim")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"secret\": \"<the 32-byte hex preimage of this swap hashlock>\"\n}"
response = http.request(request)
puts response.read_body{
"chain": "<string>",
"family": "evm",
"sign": "evm-tx",
"note": "<string>",
"chainId": 123,
"from": "<string>",
"txs": [
{
"to": "<string>",
"data": "<string>",
"value": "<string>"
}
],
"payTo": "<string>",
"amountSats": "<string>",
"topUp": true,
"feePayTo": "<string>",
"feeAmountSats": "<string>",
"toAddress": "<string>",
"psbtBase64": "<string>",
"sighashHex": "<string>",
"sighashHexes": [
"<string>"
],
"feeSats": 123,
"preimageHex": "<string>",
"timelockUnix": 123,
"escrow": "<string>",
"transactionBase64": "<string>",
"blockhash": "<string>",
"lastValidBlockHeight": 123,
"transactions": [
{
"transaction": {},
"txID": "<string>"
}
]
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}Authorizations
Body
Response
signing material
What to sign, per chain family; sign says which shape it is. evm-tx: sign and send each of txs in order, from from when given. btc-payment (fund): pay amountSats to payTo (and feeAmountSats to feePayTo when present). btc-sighash (claim/refund): sign each of sighashHexes, then broadcast { psbtBase64, signaturesHex, preimageHex? }. solana-tx: sign transactionBase64 and broadcast it. tron-txid: sign each transactions[].txID and broadcast each signed transaction.