cURL
curl --request POST \
--url https://trails-api.sequence.app/rpc/Trails/ExecuteIntentEdge \
--header 'Content-Type: application/json' \
--data '
{
"intentId": "<string>"
}
'import requests
url = "https://trails-api.sequence.app/rpc/Trails/ExecuteIntentEdge"
payload = { "intentId": "<string>" }
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({intentId: '<string>'})
};
fetch('https://trails-api.sequence.app/rpc/Trails/ExecuteIntentEdge', 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://trails-api.sequence.app/rpc/Trails/ExecuteIntentEdge",
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([
'intentId' => '<string>'
]),
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://trails-api.sequence.app/rpc/Trails/ExecuteIntentEdge"
payload := strings.NewReader("{\n \"intentId\": \"<string>\"\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://trails-api.sequence.app/rpc/Trails/ExecuteIntentEdge")
.header("Content-Type", "application/json")
.body("{\n \"intentId\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://trails-api.sequence.app/rpc/Trails/ExecuteIntentEdge")
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 \"intentId\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"intentId": "<string>",
"intentStatus": "QUOTED"
}{
"error": "WebrpcEndpoint",
"code": 0,
"msg": "endpoint error",
"status": 400,
"cause": "<string>"
}{
"error": "WebrpcBadResponse",
"code": -5,
"msg": "bad response",
"status": 500,
"cause": "<string>"
}Intents
ExecuteIntentEdge
POST
/
rpc
/
Trails
/
ExecuteIntentEdge
cURL
curl --request POST \
--url https://trails-api.sequence.app/rpc/Trails/ExecuteIntentEdge \
--header 'Content-Type: application/json' \
--data '
{
"intentId": "<string>"
}
'import requests
url = "https://trails-api.sequence.app/rpc/Trails/ExecuteIntentEdge"
payload = { "intentId": "<string>" }
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({intentId: '<string>'})
};
fetch('https://trails-api.sequence.app/rpc/Trails/ExecuteIntentEdge', 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://trails-api.sequence.app/rpc/Trails/ExecuteIntentEdge",
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([
'intentId' => '<string>'
]),
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://trails-api.sequence.app/rpc/Trails/ExecuteIntentEdge"
payload := strings.NewReader("{\n \"intentId\": \"<string>\"\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://trails-api.sequence.app/rpc/Trails/ExecuteIntentEdge")
.header("Content-Type", "application/json")
.body("{\n \"intentId\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://trails-api.sequence.app/rpc/Trails/ExecuteIntentEdge")
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 \"intentId\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"intentId": "<string>",
"intentStatus": "QUOTED"
}{
"error": "WebrpcEndpoint",
"code": 0,
"msg": "endpoint error",
"status": 400,
"cause": "<string>"
}{
"error": "WebrpcBadResponse",
"code": -5,
"msg": "bad response",
"status": 500,
"cause": "<string>"
}Overview
ExecuteIntentEdge arms an origin-mode edge intent — one whose funding leg comes from a non-EVM edge rail (Solana or Tron) — so the edge monitor starts watching for the external bridge fill server-side. Call it on user “proceed” before the user pays on the edge chain; no deposit is attached because the fill hash is discovered server-side once funds arrive.
Use ExecuteIntent for EVM-only intents. Use ExecuteIntentEdge for intents quoted through QuoteIntentEdge with edge.mode = ORIGIN.
Destination-mode edge intents are armed atomically inside
ExecuteIntent and do not use this endpoint.Request Parameters
Required Fields
- intentId (string): The intent identifier returned from
QuoteIntentEdge(or fromCommitIntentif you took the two-step path).
edgeId is required.
Response
- intentId (string): The intent identifier.
- intentStatus (
IntentStatus): Current status of the intent. Arming does not itself change the intent’s status — the intent staysQUOTEDuntil the edge monitor observes the fill and completes execution server-side. Once the fill is observed, the intent transitions toEXECUTINGand then toSUCCEEDEDorFAILED.
Behavior
- Arming is idempotent — re-arming an already-armed intent succeeds without error.
- Arming is pre-funds by definition: the endpoint rejects with
QuoteExpiredif the quote has expired. - No
intent_receiptsorintent_transactionsrows are created at arm time. The edge monitor writes them as the fill and subsequent hops progress.
Example
// Step 1: Quote an origin-mode edge intent (e.g. Solana → Base USDC)
const quoteResponse = await fetch('https://trails-api.sequence.app/rpc/Trails/QuoteIntentEdge', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-Access-Key': 'YOUR_ACCESS_KEY',
},
body: JSON.stringify({
intent: {
ownerAddress: '0x0709CF2d5D4f3D38f5948d697fE64d7FB3639Eb1',
originChainId: 0,
destinationChainId: 8453,
destinationTokenAddress: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913',
destinationToAddress: '0x0709CF2d5D4f3D38f5948d697fE64d7FB3639Eb1',
destinationTokenAmount: 100000000,
},
edge: {
rail: 'SOLANA',
mode: 'ORIGIN',
originChainId: 1399811149,
originAddress: 'AbC...',
originTokenAddress: 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v',
},
}),
})
const { intent } = await quoteResponse.json()
// Step 2: Arm the intent so the edge monitor starts watching for the fill
const armResponse = await fetch('https://trails-api.sequence.app/rpc/Trails/ExecuteIntentEdge', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-Access-Key': 'YOUR_ACCESS_KEY',
},
body: JSON.stringify({
intentId: intent.id,
}),
})
const { intentStatus } = await armResponse.json()
// Step 3: Guide the user to pay on the edge chain to `edge.handoff`.
// Step 4: Poll GetIntentReceipt / WaitIntentReceipt for completion.
Timing Requirements
Arm the intent within the quote’s expiration window (15 minutes from
QuoteIntentEdge). After arming, the user must complete the edge deposit before the intent’s overall expiry, otherwise the intent refunds.Errors
| Error | When |
|---|---|
InvalidArgument | intentId missing, or the intent has no origin edge quote |
NotFound | No intent matches intentId |
IntentStatus | Intent is past its pre-execution states (already EXECUTING, SUCCEEDED, FAILED, etc.) |
QuoteExpired | The intent’s quote expired before it was armed |
IntentsDisabled | Intents are disabled on this deployment |
Next Steps
GetIntentReceipt
Poll for cross-chain execution status
WaitIntentReceipt
Long-poll for updates
Was this page helpful?