import cobo_waas2
from cobo_waas2.models.signature_challenge import SignatureChallenge
from cobo_waas2.rest import ApiException
from pprint import pprint
# See configuration.py for a list of all supported configurations.
configuration = cobo_waas2.Configuration(
# Replace `<YOUR_PRIVATE_KEY>` with your private key
api_private_key="<YOUR_PRIVATE_KEY>",
# Select the development environment. To use the production environment, change the URL to https://api.cobo.com/v2.
host="https://api.dev.cobo.com/v2",
)
# Enter a context with an instance of the API client
with cobo_waas2.ApiClient(configuration) as api_client:
# Create an instance of the API class
api_instance = cobo_waas2.TravelRuleApi(api_client)
transaction_type = "DEPOSIT"
transaction_id = "123e4567-e89b-12d3-a456-426614174000"
try:
# Get self-custody signature challenge
api_response = api_instance.get_signature_challenge(
transaction_type, transaction_id
)
print("The response of TravelRuleApi->get_signature_challenge:\n")
pprint(api_response)
except Exception as e:
print("Exception when calling TravelRuleApi->get_signature_challenge: %s\n" % e)
// Import classes:
import com.cobo.waas2.ApiClient;
import com.cobo.waas2.ApiException;
import com.cobo.waas2.Configuration;
import com.cobo.waas2.Env;
import com.cobo.waas2.api.TravelRuleApi;
import com.cobo.waas2.model.*;
public class Example {
public static void main(String[] args) {
ApiClient defaultClient = Configuration.getDefaultApiClient();
// Select the development environment. To use the production environment, replace `Env.DEV` with
// `Env.PROD
defaultClient.setEnv(Env.DEV);
// Replace `<YOUR_PRIVATE_KEY>` with your private key
defaultClient.setPrivKey("<YOUR_PRIVATE_KEY>");
TravelRuleApi apiInstance = new TravelRuleApi();
String transactionType = "DEPOSIT";
UUID transactionId = UUID.fromString("123e4567-e89b-12d3-a456-426614174000");
try {
SignatureChallenge result = apiInstance.getSignatureChallenge(transactionType, transactionId);
System.out.println(result);
} catch (ApiException e) {
System.err.println("Exception when calling TravelRuleApi#getSignatureChallenge");
System.err.println("Status code: " + e.getCode());
System.err.println("Reason: " + e.getResponseBody());
System.err.println("Response headers: " + e.getResponseHeaders());
e.printStackTrace();
}
}
}
package main
import (
"context"
"fmt"
coboWaas2 "github.com/CoboGlobal/cobo-waas2-go-sdk/cobo_waas2"
"github.com/CoboGlobal/cobo-waas2-go-sdk/cobo_waas2/crypto"
"os"
)
func main() {
transactionType := "DEPOSIT"
transactionId := "123e4567-e89b-12d3-a456-426614174000"
configuration := coboWaas2.NewConfiguration()
// Initialize the API client
apiClient := coboWaas2.NewAPIClient(configuration)
ctx := context.Background()
// Select the development environment. To use the production environment, replace coboWaas2.DevEnv with coboWaas2.ProdEnv
ctx = context.WithValue(ctx, coboWaas2.ContextEnv, coboWaas2.DevEnv)
// Replace `<YOUR_PRIVATE_KEY>` with your private key
ctx = context.WithValue(ctx, coboWaas2.ContextPortalSigner, crypto.Ed25519Signer{
Secret: "<YOUR_PRIVATE_KEY>",
})
resp, r, err := apiClient.TravelRuleAPI.GetSignatureChallenge(ctx).
TransactionType(transactionType).
TransactionId(transactionId).
Execute()
if err != nil {
fmt.Fprintf(
os.Stderr,
"Error when calling `TravelRuleAPI.GetSignatureChallenge``: %v\n",
err,
)
fmt.Fprintf(os.Stderr, "Full HTTP response: %v\n", r)
}
// response from `GetSignatureChallenge`: SignatureChallenge
fmt.Fprintf(os.Stdout, "Response from `TravelRuleAPI.GetSignatureChallenge`: %v\n", resp)
}
const CoboWaas2 = require("@cobo/cobo-waas2");
// Initialize the API client
const apiClient = CoboWaas2.ApiClient.instance;
// Select the development environment. To use the production environment, replace `Env.DEV` with `Env.PROD`
apiClient.setEnv(CoboWaas2.Env.DEV);
// Replace `<YOUR_PRIVATE_KEY>` with your private key
apiClient.setPrivateKey("<YOUR_PRIVATE_KEY>");
// Call the API
const apiInstance = new CoboWaas2.TravelRuleApi();
const transaction_type = "DEPOSIT";
const transaction_id = "123e4567-e89b-12d3-a456-426614174000";
apiInstance.getSignatureChallenge(transaction_type, transaction_id).then(
(data) => {
console.log("API called successfully. Returned data: " + data);
},
(error) => {
console.error(error);
},
);
{
"address": "0x1234567890abcdef1234567890abcdef12345678",
"challenge": "Hi, please sign this message to confirm that you are the owner of this wallet address.\nThe transfer can only proceed after signing.\n- Address: 0x1234567890abcdef1234567890abcdef12345678\n- Nonce: b2860f5c9f201a81bc76f33e991c1f24\n- Timestamp: 1732523887\n",
"expires_in": 30
}{
"error_code": 123,
"error_message": "<string>",
"error_id": "0b6ddf19083c4bd1a9ca01bec44b24dd"
}{
"error_code": 123,
"error_message": "<string>",
"error_id": "0b6ddf19083c4bd1a9ca01bec44b24dd"
}Get self-custody signature challenge
This operation issues a one-time, time-bounded message for a self-custody wallet address to sign, in order to prove wallet ownership. The signature is then submitted via Submit Travel Rule information for deposits or withdrawals.
Use this endpoint when you want to verify the counterparty’s self-custody address via off-chain signature. For address verification via on-chain micro-deposit, use the Satoshi Test endpoints (/travel_rule/satoshi_test/...) instead.
The challenge is valid for a short window (returned as expires_in, currently 30 seconds). Calling this endpoint again for the same transaction rotates the challenge — only the latest issued value will verify.
import cobo_waas2
from cobo_waas2.models.signature_challenge import SignatureChallenge
from cobo_waas2.rest import ApiException
from pprint import pprint
# See configuration.py for a list of all supported configurations.
configuration = cobo_waas2.Configuration(
# Replace `<YOUR_PRIVATE_KEY>` with your private key
api_private_key="<YOUR_PRIVATE_KEY>",
# Select the development environment. To use the production environment, change the URL to https://api.cobo.com/v2.
host="https://api.dev.cobo.com/v2",
)
# Enter a context with an instance of the API client
with cobo_waas2.ApiClient(configuration) as api_client:
# Create an instance of the API class
api_instance = cobo_waas2.TravelRuleApi(api_client)
transaction_type = "DEPOSIT"
transaction_id = "123e4567-e89b-12d3-a456-426614174000"
try:
# Get self-custody signature challenge
api_response = api_instance.get_signature_challenge(
transaction_type, transaction_id
)
print("The response of TravelRuleApi->get_signature_challenge:\n")
pprint(api_response)
except Exception as e:
print("Exception when calling TravelRuleApi->get_signature_challenge: %s\n" % e)
// Import classes:
import com.cobo.waas2.ApiClient;
import com.cobo.waas2.ApiException;
import com.cobo.waas2.Configuration;
import com.cobo.waas2.Env;
import com.cobo.waas2.api.TravelRuleApi;
import com.cobo.waas2.model.*;
public class Example {
public static void main(String[] args) {
ApiClient defaultClient = Configuration.getDefaultApiClient();
// Select the development environment. To use the production environment, replace `Env.DEV` with
// `Env.PROD
defaultClient.setEnv(Env.DEV);
// Replace `<YOUR_PRIVATE_KEY>` with your private key
defaultClient.setPrivKey("<YOUR_PRIVATE_KEY>");
TravelRuleApi apiInstance = new TravelRuleApi();
String transactionType = "DEPOSIT";
UUID transactionId = UUID.fromString("123e4567-e89b-12d3-a456-426614174000");
try {
SignatureChallenge result = apiInstance.getSignatureChallenge(transactionType, transactionId);
System.out.println(result);
} catch (ApiException e) {
System.err.println("Exception when calling TravelRuleApi#getSignatureChallenge");
System.err.println("Status code: " + e.getCode());
System.err.println("Reason: " + e.getResponseBody());
System.err.println("Response headers: " + e.getResponseHeaders());
e.printStackTrace();
}
}
}
package main
import (
"context"
"fmt"
coboWaas2 "github.com/CoboGlobal/cobo-waas2-go-sdk/cobo_waas2"
"github.com/CoboGlobal/cobo-waas2-go-sdk/cobo_waas2/crypto"
"os"
)
func main() {
transactionType := "DEPOSIT"
transactionId := "123e4567-e89b-12d3-a456-426614174000"
configuration := coboWaas2.NewConfiguration()
// Initialize the API client
apiClient := coboWaas2.NewAPIClient(configuration)
ctx := context.Background()
// Select the development environment. To use the production environment, replace coboWaas2.DevEnv with coboWaas2.ProdEnv
ctx = context.WithValue(ctx, coboWaas2.ContextEnv, coboWaas2.DevEnv)
// Replace `<YOUR_PRIVATE_KEY>` with your private key
ctx = context.WithValue(ctx, coboWaas2.ContextPortalSigner, crypto.Ed25519Signer{
Secret: "<YOUR_PRIVATE_KEY>",
})
resp, r, err := apiClient.TravelRuleAPI.GetSignatureChallenge(ctx).
TransactionType(transactionType).
TransactionId(transactionId).
Execute()
if err != nil {
fmt.Fprintf(
os.Stderr,
"Error when calling `TravelRuleAPI.GetSignatureChallenge``: %v\n",
err,
)
fmt.Fprintf(os.Stderr, "Full HTTP response: %v\n", r)
}
// response from `GetSignatureChallenge`: SignatureChallenge
fmt.Fprintf(os.Stdout, "Response from `TravelRuleAPI.GetSignatureChallenge`: %v\n", resp)
}
const CoboWaas2 = require("@cobo/cobo-waas2");
// Initialize the API client
const apiClient = CoboWaas2.ApiClient.instance;
// Select the development environment. To use the production environment, replace `Env.DEV` with `Env.PROD`
apiClient.setEnv(CoboWaas2.Env.DEV);
// Replace `<YOUR_PRIVATE_KEY>` with your private key
apiClient.setPrivateKey("<YOUR_PRIVATE_KEY>");
// Call the API
const apiInstance = new CoboWaas2.TravelRuleApi();
const transaction_type = "DEPOSIT";
const transaction_id = "123e4567-e89b-12d3-a456-426614174000";
apiInstance.getSignatureChallenge(transaction_type, transaction_id).then(
(data) => {
console.log("API called successfully. Returned data: " + data);
},
(error) => {
console.error(error);
},
);
{
"address": "0x1234567890abcdef1234567890abcdef12345678",
"challenge": "Hi, please sign this message to confirm that you are the owner of this wallet address.\nThe transfer can only proceed after signing.\n- Address: 0x1234567890abcdef1234567890abcdef12345678\n- Nonce: b2860f5c9f201a81bc76f33e991c1f24\n- Timestamp: 1732523887\n",
"expires_in": 30
}{
"error_code": 123,
"error_message": "<string>",
"error_id": "0b6ddf19083c4bd1a9ca01bec44b24dd"
}{
"error_code": 123,
"error_message": "<string>",
"error_id": "0b6ddf19083c4bd1a9ca01bec44b24dd"
}import cobo_waas2
from cobo_waas2.models.signature_challenge import SignatureChallenge
from cobo_waas2.rest import ApiException
from pprint import pprint
# See configuration.py for a list of all supported configurations.
configuration = cobo_waas2.Configuration(
# Replace `<YOUR_PRIVATE_KEY>` with your private key
api_private_key="<YOUR_PRIVATE_KEY>",
# Select the development environment. To use the production environment, change the URL to https://api.cobo.com/v2.
host="https://api.dev.cobo.com/v2",
)
# Enter a context with an instance of the API client
with cobo_waas2.ApiClient(configuration) as api_client:
# Create an instance of the API class
api_instance = cobo_waas2.TravelRuleApi(api_client)
transaction_type = "DEPOSIT"
transaction_id = "123e4567-e89b-12d3-a456-426614174000"
try:
# Get self-custody signature challenge
api_response = api_instance.get_signature_challenge(
transaction_type, transaction_id
)
print("The response of TravelRuleApi->get_signature_challenge:\n")
pprint(api_response)
except Exception as e:
print("Exception when calling TravelRuleApi->get_signature_challenge: %s\n" % e)
// Import classes:
import com.cobo.waas2.ApiClient;
import com.cobo.waas2.ApiException;
import com.cobo.waas2.Configuration;
import com.cobo.waas2.Env;
import com.cobo.waas2.api.TravelRuleApi;
import com.cobo.waas2.model.*;
public class Example {
public static void main(String[] args) {
ApiClient defaultClient = Configuration.getDefaultApiClient();
// Select the development environment. To use the production environment, replace `Env.DEV` with
// `Env.PROD
defaultClient.setEnv(Env.DEV);
// Replace `<YOUR_PRIVATE_KEY>` with your private key
defaultClient.setPrivKey("<YOUR_PRIVATE_KEY>");
TravelRuleApi apiInstance = new TravelRuleApi();
String transactionType = "DEPOSIT";
UUID transactionId = UUID.fromString("123e4567-e89b-12d3-a456-426614174000");
try {
SignatureChallenge result = apiInstance.getSignatureChallenge(transactionType, transactionId);
System.out.println(result);
} catch (ApiException e) {
System.err.println("Exception when calling TravelRuleApi#getSignatureChallenge");
System.err.println("Status code: " + e.getCode());
System.err.println("Reason: " + e.getResponseBody());
System.err.println("Response headers: " + e.getResponseHeaders());
e.printStackTrace();
}
}
}
package main
import (
"context"
"fmt"
coboWaas2 "github.com/CoboGlobal/cobo-waas2-go-sdk/cobo_waas2"
"github.com/CoboGlobal/cobo-waas2-go-sdk/cobo_waas2/crypto"
"os"
)
func main() {
transactionType := "DEPOSIT"
transactionId := "123e4567-e89b-12d3-a456-426614174000"
configuration := coboWaas2.NewConfiguration()
// Initialize the API client
apiClient := coboWaas2.NewAPIClient(configuration)
ctx := context.Background()
// Select the development environment. To use the production environment, replace coboWaas2.DevEnv with coboWaas2.ProdEnv
ctx = context.WithValue(ctx, coboWaas2.ContextEnv, coboWaas2.DevEnv)
// Replace `<YOUR_PRIVATE_KEY>` with your private key
ctx = context.WithValue(ctx, coboWaas2.ContextPortalSigner, crypto.Ed25519Signer{
Secret: "<YOUR_PRIVATE_KEY>",
})
resp, r, err := apiClient.TravelRuleAPI.GetSignatureChallenge(ctx).
TransactionType(transactionType).
TransactionId(transactionId).
Execute()
if err != nil {
fmt.Fprintf(
os.Stderr,
"Error when calling `TravelRuleAPI.GetSignatureChallenge``: %v\n",
err,
)
fmt.Fprintf(os.Stderr, "Full HTTP response: %v\n", r)
}
// response from `GetSignatureChallenge`: SignatureChallenge
fmt.Fprintf(os.Stdout, "Response from `TravelRuleAPI.GetSignatureChallenge`: %v\n", resp)
}
const CoboWaas2 = require("@cobo/cobo-waas2");
// Initialize the API client
const apiClient = CoboWaas2.ApiClient.instance;
// Select the development environment. To use the production environment, replace `Env.DEV` with `Env.PROD`
apiClient.setEnv(CoboWaas2.Env.DEV);
// Replace `<YOUR_PRIVATE_KEY>` with your private key
apiClient.setPrivateKey("<YOUR_PRIVATE_KEY>");
// Call the API
const apiInstance = new CoboWaas2.TravelRuleApi();
const transaction_type = "DEPOSIT";
const transaction_id = "123e4567-e89b-12d3-a456-426614174000";
apiInstance.getSignatureChallenge(transaction_type, transaction_id).then(
(data) => {
console.log("API called successfully. Returned data: " + data);
},
(error) => {
console.error(error);
},
);
Authorizations
The API key. For more details, refer to API key.
In the API playground, enter your API secret, and your API key will be accordingly calculated.
Query Parameters
The transaction type. Possible values include:
DEPOSIT: A deposit transaction.WITHDRAW: A withdrawal transaction.
DEPOSIT, WITHDRAW The transaction ID.
"123e4567-e89b-12d3-a456-426614174000"
Response
The signature challenge was issued successfully.
A signature challenge for self-custody wallet verification. The wallet owner must sign the challenge string with the wallet associated with address and submit the signature via Submit Travel Rule information for deposits or withdrawals. The challenge is time-bounded — each call rotates the challenge and only the most recently-issued value will verify.
The self-custody wallet address that must sign this challenge. This is the counterparty address for the transaction: for deposits it is the sender's wallet, and for withdrawals it is the recipient's wallet.
"0x1234567890abcdef1234567890abcdef12345678"
The human-readable, time-sensitive message to sign. Contains the wallet address, a unique nonce, and a timestamp.
"Hi, please sign this message to confirm that you are the owner of this wallet address.\nThe transfer can only proceed after signing.\n- Address: 0x1234567890abcdef1234567890abcdef12345678\n- Nonce: b2860f5c9f201a81bc76f33e991c1f24\n- Timestamp: 1732523887\n"
Number of seconds before the challenge expires. The signature must be submitted within this window.
30
Was this page helpful?
