Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Single-Release Escrow is a type in which all your funds are released only once, either with the resolution of a dispute or by completing all the milestones defined for it.
The Deploy endpoints allow users to deploy escrows efficiently. These endpoints provide the way to initialize escrows in the Stellar's Blockchain.
Key Components
Initial Fund Lockup: Upon contract initiation, the escrow amoun plus the platform fee (“platformFee”) is deposited into an escrow account.
Flags: The escrow status is interpreted by means of these flags: (approved, dispute
releasedresolvedPrimary Roles:
Service Provider: Delivers the deliverable corresponding to each milestone.
Approver: Verifies and approves a milestone before authorizing the release of funds.
Dispute Resolver: Intervenes in case of disagreement and decides whether to release or refund the locked amount.
Receiver: The final recipient of the funds if different from the Service Provider.
Brief Workflow
An escrow is initialized by defining all the necessary escrow properties.
The Service Provider completes a milestone and requests approval.
The approver reviews the deliverable; if approved, signs a transaction that releases the amount allocated as escrow reward (minus the platform and Trustless Work fee).
The Stellar network executes the transaction and transfers the payment to the Service Provider or the configured Receiver.
If a dispute arises, the Dispute Resolver evaluates the evidence and, upon signing their decision, marks the escrow as resolved to release or refund the corresponding funds.
This model protects all parties: the client knows that funds are available but cannot be released without validation, and the service provider receives payment upon completion of all milestones and the milestones themselves being approved by the approver, leveraging Stellar's transparency and immutability.
This endpoint returns the transaction unsigned so that the transaction can be signed by means of a customer wallet.
Content-Type
application/json
x-api-key
<token>
The Trustless Work REST API is a developer interface for creating and managing decentralized escrow contracts on the Stellar blockchain using Soroban smart contracts. It simplifies the escrow lifecycle and integrates seamlessly into any platform that needs conditional payments or trust-minimized fund release.
Deploy Smart Escrows: Initialize smart contracts with defined roles, milestones, and conditions.
Fund Escrows: Lock funds into escrow accounts with Stellar-native assets (e.g., USDC).
Update & Approve Milestones: Collaborate on progress tracking and delivery verification.
Dispute Handling: Programmatically raise or resolve disputes.
Single-Release Escrow
One-time fund release after milestone approval or dispute resolution.
Roles: Service Provider, Approver, Receiver, Dispute Resolver.
Multi-Release Escrow
/deployer/single-release
/deployer/multi-release
/escrow/{type}/fund-escrow
/escrow/{type}/approve-milestone
/escrow/{type}/change-milestone-status
/escrow/{type}/release-funds (single)
/escrow/{type}/release-milestone-funds (multi)
/escrow/{type}/dispute-escrow
/escrow/{type}/resolve-dispute
/escrow/{type}/dispute-milestone (multi)
/escrow/{type}/update-escrow
/escrow/get-multiple-escrow-balance
/helper/get-escrows-by-signer
/helper/get-escrows-by-role
/helper/set-trustline: Set trustline to receive specific tokens like USDC.
/helper/send-transaction: Submit signed XDR transactions to Stellar.
/helper/get-multiple-escrow-balance: Batch query of escrow balances.
Unsigned Transactions: All operations return unsigned XDRs requiring client-side signing.
Role-Based Permissions: Specific actions (e.g., approve, dispute) require the correct role.
Rate Limits: 50 requests/minute per client.
Fee Model: A 0.3% mainnet fee is taken by Trustless Work, with platforms able to add their own fee.
Freelance platforms
High-value e-commerce
SaaS billing
Cross-border real estate
Dev Map:
Swagger:
GitHub:
Allows users to deposit funds into an existing escrow contract, securing them until the agreed conditions are met.
Resolves escrow disputes by distributing funds to the approver and service provider as determined by the dispute resolver.
Responsible for initiating a dispute in an escrow. Change the value of the flag “disputed” from “disputed” to true.
import axios from "axios";
const http = axios.create({
baseURL: "https://dev.api.trustlesswork.com",
timeout: 10000,
headers: {
"Content-Type": "application/json",
"x-api-key": your_api_key,
},
});
export const useExample = async () => {
// Get the signer address
const { address } = await kit.getAddress();
const response = await http.post(
"/escrow/single-release/release-funds",
{
// body requested for the endpoint
},
);
// Get the unsigned transaction hash
const { unsignedTransaction } = response.data;
// Sign the transaction by wallet
const { signedTxXdr } = await signTransaction(unsignedTransaction, {
address,
networkPassphrase: WalletNetwork.TESTNET,
});
// Send the transaction to Stellar Network
const tx = await http.post("/helper/send-transaction", {
signedXdr: signedTxXdr,
});
const { data } = tx;
return data;
}Release Funds: Release escrowed amounts only when predefined conditions are fulfilled.
Real-Time Status Tracking: Query escrow status, milestones, and balances.
Cross-Chain Compatibility: USDC support via Circle’s cross-chain transfer protocol.
Multiple milestone-based payouts.
Each milestone is independently approved and released.
/escrow/{type}/resolve-milestone-dispute (multi)Crowdfunding and grants
Security deposits
This endpoint returns the transaction unsigned so that the transaction can be signed by means of a customer wallet.
Content-Type
application/json
x-api-key
<token>
<token>

<token>

<token>


Responsible for changing the milestone status of an escrow through the service provider.
This guide is your all-in-one resource to integrate, deploy, and extend Trustless Work. Whether you’re a developer, a product team, or seeding an AI agent — this page gives you everything.
Hello! This page is optimized to be exported and loaded to your AI Agent of choice! you can also use ours in the Search Bar!
Trustless Work is an Escrow-as-a-Service (EaaS) platform designed for the stablecoin economy. It lets you securely hold funds in non-custodial smart contracts until milestones are completed and approved.
These endpoints provide a way to receive tokens through Trustline and send any transactions to the Stellar Blockchain.
import axios from "axios";
const http = axios.create({
baseURL: "https://dev.api.trustlesswork.com",
timeout: 10000,
headers: {
"Content-Type": "application/json",
"x-api-key": your_api_key,
},
});
export const useExample = async () => {
// Get the signer address
const { address } = await kit.getAddress();
const response = await http.post(
"/escrow/single-release/approve-milestone",
{
// body requested for the endpoint
},
);
// Get the unsigned transaction hash
const { unsignedTransaction } = response.data;
// Sign the transaction by wallet
const { signedTxXdr } = await signTransaction(unsignedTransaction, {
address,
networkPassphrase: WalletNetwork.TESTNET,
});
// Send the transaction to Stellar Network
const tx = await http.post("/helper/send-transaction", {
signedXdr: signedTxXdr,
});
const { data } = tx;
return data;
}import axios from "axios";
const http = axios.create({
baseURL: "https://dev.api.trustlesswork.com",
timeout: 10000,
headers: {
"Content-Type": "application/json",
"x-api-key": your_api_key,
},
});
export const useExample = async () => {
// Get the signer address
const { address } = await kit.getAddress();
const response = await http.post(
"/escrow/single-release/fund-escrow",
{
// body requested for the endpoint
},
);
// Get the unsigned transaction hash
const { unsignedTransaction } = response.data;
// Sign the transaction by wallet
const { signedTxXdr } = await signTransaction(unsignedTransaction, {
address,
networkPassphrase: WalletNetwork.TESTNET,
});
// Send the transaction to Stellar Network
const tx = await http.post("/helper/send-transaction", {
signedXdr: signedTxXdr,
});
const { data } = tx;
return data;
}import axios from "axios";
const http = axios.create({
baseURL: "https://dev.api.trustlesswork.com",
timeout: 10000,
headers: {
"Content-Type": "application/json",
"x-api-key": your_api_key,
},
});
export const useExample = async () => {
// Get the signer address
const { address } = await kit.getAddress();
const response = await http.post(
"/escrow/single-release/resolve-dispute",
{
// body requested for the endpoint
},
);
// Get the unsigned transaction hash
const { unsignedTransaction } = response.data;
// Sign the transaction by wallet
const { signedTxXdr } = await signTransaction(unsignedTransaction, {
address,
networkPassphrase: WalletNetwork.TESTNET,
});
// Send the transaction to Stellar Network
const tx = await http.post("/helper/send-transaction", {
signedXdr: signedTxXdr,
});
const { data } = tx;
return data;
}import axios from "axios";
const http = axios.create({
baseURL: "https://dev.api.trustlesswork.com",
timeout: 10000,
headers: {
"Content-Type": "application/json",
"x-api-key": your_api_key,
},
});
export const useExample = async () => {
// Get the signer address
const { address } = await kit.getAddress();
// Execute the endpoint
const response = await http.post(
"/escrow/single-release/dispute-escrow",
{
// body requested for the endpoint
},
);
// Get the unsigned transaction hash
const { unsignedTransaction } = response.data;
// Sign the transaction by wallet
const { signedTxXdr } = await signTransaction(unsignedTransaction, {
address,
networkPassphrase: WalletNetwork.TESTNET,
});
// Send the transaction to Stellar Network
const tx = await http.post("/helper/send-transaction", {
signedXdr: signedTxXdr,
});
const { data } = tx;
return data;
}Helper endpoints offer several benefits that enhance both development efficiency and user satisfaction.
Set Trustline: Allows the user to interact with some tokens.
Send Transaction: Send the transaction to Stellar Network with the signed hash.
Get Multiple Escrow Balance: This endpoint allows users to retrieve the balances of multiple escrow accounts simultaneously.
These endpoints ensure secure transactions by leveraging Stellar's infrastructure, guaranteeing transparency and reliability.
Use it to:
Lock funds with programmable milestone logic
Enable transparent fund releases for services, grants, rentals, etc.
Automate fund flows using signer-based roles
▶ Try the Demo — No code required
Freighter wallet
Testnet USDC + XLM (Get test tokens)
Open the demo app
Fill in escrow details (roles, milestones)
Click deploy → sign the transaction
Send testmet USDC to the escrow contract address
Mark, approve, and release milestones from the UI
Before deploying, define:
Who can mark milestones as done
Who must approve work
Who can release funds
Who can resolve disputes
Get your API key in our dApp: Request API Key
The Trustless Work API is your gateway to deploy and manage decentralized smart escrows on the Stellar blockchain using Soroban smart contracts. All interactions return unsigned XDRs, which must be signed client-side using the wallet associated with the correct role.
📘 Base URL: https://api.trustlesswork.com
POST
/deployer/single-release
Deploys a single-release escrow
POST
/deployer/multi-release
Deploys a multi-release escrow
POST
/escrow/{type}/fund-escrow
Returns XDR to fund an escrow
POST
/escrow/{type}/approve-milestone
Approve a milestone
POST
/escrow/{type}/change-milestone-status
Mark a milestone as complete/incomplete
POST
/escrow/{type}/release-funds
Release all funds (single)
POST
/escrow/{type}/release-milestone-funds
Release one milestone (multi)
POST
/escrow/{type}/dispute-escrow
Raise a dispute on a single escrow
POST
/escrow/{type}/resolve-dispute
Resolve a single-release escrow dispute
POST
/escrow/{type}/dispute-milestone
Raise dispute on a milestone
POST
/escrow/{type}/resolve-milestone-dispute
Resolve milestone dispute (multi)
POST
/escrow/{type}/update-escrow
Update escrow metadata/config
GET
/escrow/get-multiple-escrow-balance
Batch balances for many escrows
GET
/helper/get-escrows-by-signer
Query escrows associated with a signer
GET
/helper/get-escrows-by-role
Query escrows by role assignment
POST
/helper/set-trustline
Enable escrow wallet to accept a token
POST
/helper/send-transaction
Submit signed XDR to Stellar
📌 For full Swagger documentation, visit: https://dev.api.trustlesswork.com/docs
All write actions must be signed by the wallet that holds the corresponding escrow role (marker, approver, releaser, resolver).
Once wrapped, you can use the SDK's escrow hooks and mutation functions across your app.
Every role (marker, approver, releaser, etc.) needs a Stellar-Soroban compatible wallet.
Supported wallets:
Passkey Wallets (biometric, contract-based)
Initiation – Define roles, asset, and milestones
Funding – Deposit stablecoins (USDC) into the contract
Milestone Marked – Provider marks progress
Approval – Client or approver signs off
Release – Funds are released
Dispute – Optional: Resolver steps in
Each action requires a signature from the assigned wallet address.
Marker
Marks milestones as completed
Approver
Approves milestone completion
Releaser
Signs off final release of funds
Resolver
Can override flow in case of dispute
Receiver
Gets the released funds
Platform Address
Receives a fee (optional, % of each release)
engagementId
string
Unique identifier for the escrow
title
string
Name of the escrow
description
string
Description of the escrow's function
roles
object
Role assignments: marker, approver, etc.
description
string
What the milestone represents
status
string
Status: approved, in_dispute, etc.
amount
number
Amount released upon approval
evidence
string
(Optional) Supporting proof
address
string
Token issuer or address
🧵 Twitter/X: @trustlesswork
🌐 Docs Hub: docs.trustlesswork.com
Built for the stablecoin economy. Open-source. Developer-first.
Let us know what you’re building!
<token>


Deploy the escrow contract and define the escrow properties.
Content-Type
application/json
x-api-key
<token>
This endpoint returns the transaction unsigned so that the transaction can be signed by means of a customer wallet.
A Multi-Release Contract is an escrow agreement on the Stellar blockchain that divides the total payment of a project into multiple deliveries (“milestones”). Each milestone is released only upon verification of its completion, ensuring that funds remain secure until the associated work is validated.
Key Components
Initial Fund Lockup: Upon contract initiation, the total of all milestone amounts plus the platform fee (“platformFee”) is deposited into an escrow account.
Milestones: Each stage includes a description, a specific amount, and status flags (approved, dispute
This endpoint facilitates the recovery and proper storage in Firebase of escrow-related information submitted to the Stellar Blockchain via external applications, bypassing the standard application.
npm i @trustless-work/escrow
import {
TrustlessWorkConfig,
development, // or mainNet
} from "@trustless-work/escrow";
export function TrustlessWorkProvider({ children }) {
const apiKey = process.env.NEXT_PUBLIC_API_KEY || "";
return (
<TrustlessWorkConfig baseURL={development} apiKey={apiKey}>
{children}
</TrustlessWorkConfig>
);
}
export default function RootLayout({ children }) {
return (
<html lang="en">
<body>
<TrustlessWorkProvider>
{children}
</TrustlessWorkProvider>
</body>
</html>
);
}
import axios from "axios";
const http = axios.create({
baseURL: "https://dev.api.trustlesswork.com",
timeout: 10000,
headers: {
"Content-Type": "application/json",
"x-api-key": your_api_key,
},
});
export const useExample = async () => {
// Get the signer address
const { address } = await kit.getAddress();
const response = await http.post(
"/escrow/single-release/change-milestone-status",
{
// body requested for the endpoint
},
);
// Get the unsigned transaction hash
const { unsignedTransaction } = response.data;
// Sign the transaction by wallet
const { signedTxXdr } = await signTransaction(unsignedTransaction, {
address,
networkPassphrase: WalletNetwork.TESTNET,
});
// Send the transaction to Stellar Network
const tx = await http.post("/helper/send-transaction", {
signedXdr: signedTxXdr,
});
const { data } = tx;
return data;
}releasedresolvedPrimary Roles:
Service Provider: Delivers the deliverable corresponding to each milestone.
Approver: Verifies and approves a milestone before authorizing the release of funds.
Dispute Resolver: Intervenes in case of disagreement and decides whether to release or refund the locked amount.
Receiver: The final recipient of the funds if different from the Service Provider.
Brief Workflow
The Service Provider completes a milestone and requests approval.
The Approver reviews the deliverable; if approved, they sign a transaction that releases only the amount allocated to that milestone (minus the platform and Trustless Work fee).
The Stellar network executes the transaction and transfers the payment to the Service Provider or the configured Receiver.
If a dispute arises, the Dispute Resolver evaluates the evidence and, upon signing their decision, marks the milestone as resolved to release or refund the corresponding funds.
This model protects all parties: the client knows that funds are available but cannot be released without validation, and the Service Provider receives payment for each verified delivery—leveraging Stellar’s transparency and immutability.
platformFee
number
% fee for the platform
trustline
object
Token type (e.g., USDC, XLM) and decimals
flags
object
Includes disputed, resolved, approved
disputeResolver
string
Address in charge of resolving disputes within the escrow.
receiver
string
Address where escrow proceeds will be sent to
description
string
Text describing the function of the milestone
status
string (Default value: "peding")
Milestone status. Ex: Approved, In dispute, etc...
approved
boolean (Default value: false)
Flag indicating whether a milestone has been approved by the approver
approver
string
Address of the entity requiring the service.
serviceProvider
string
Address of the entity providing the service.
plataformAddress
string
Address of the entity that owns the escrow
releaseSigner
string
Address of the user in charge of releasing the escrow funds to the service provider.
address
string
Public address establishing permission to accept and use a specific token.
symbol
string
Official abbreviation representing the token in wallets, exchanges, and documentation.

This endpoint returns the transaction unsigned so that the transaction can be signed by means of a customer wallet.
Content-Type
application/json
x-api-key
<token>
This endpoint returns the transaction unsigned so that the transaction can be signed by means of a customer wallet.
Content-Type
application/json
x-api-key
<token>
txHash).Firebase Storage: Once retrieved from the internal queue, the information is permanently stored in Firebase.
External Application: Signs and sends the XDR without using the standard endpoint (helper/send-transaction).
Indexer: Responsible for retrieving information from the internal queue and storing it in Firebase upon receiving the transaction hash (txHash).
The XDR is obtained from any transaction (not signed) generated with any of the endpoints of our REST API.
The generated XDR is signed and sent externally (without using helper/send-transaction).
The external application provides the corresponding txHash.
The txHash is sent to indexer/update-from-txHash.
The endpoint retrieves information stored in the internal queue and saves it in Firebase.
Request:
Response:
The information associated with the provided txHash is successfully stored in Firebase, ensuring the integrity of the generated escrow.
Enables external integrations while maintaining information consistency.
Prevents data loss when bypassing the standard workflow.
Ensures secure and accurate storage in Firebase using the transaction hash.
This endpoint enhances the system's flexibility and robustness, ensuring all transactions, regardless of the method used, are adequately recorded in Firebase.
Content-Type
application/json
x-api-key
<token>
import axios from "axios";
const http = axios.create({
baseURL: "https://dev.api.trustlesswork.com",
timeout: 10000,
headers: {
"Content-Type": "application/json",
"x-api-key": your_api_key,
},
});
export const useExample = async () => {
const data = await http.get(
"/escrow/single-release/get-escrows-by-role?role=approver?roleAddress=GPUACN...." 👈🏼 // All required parameters are passed at the query level.
);
return data;
}This endpoint returns the transaction unsigned so that the transaction can be signed by means of a customer wallet.
Content-Type
application/json
x-api-key
<token>
Content-Type
application/json
x-api-key
<token>
Content-Type
application/json
x-api-key
<token>
import axios from "axios";
const http = axios.create({
baseURL: "https://dev.api.trustlesswork.com",
timeout: 10000,
headers: {
"Content-Type": "application/json",
"x-api-key": your_api_key,
},
});
export const useExample = async (addresses: string[]) => {
const response = await http.get("/helper/get-multiple-escrow-balance", {
params: { addresses },
});
return response;
};
This endpoint allows you to change the properties of an escrow as long as a series of requirements are met, which will be mentioned in this section.
Only the entity with the platform role has permissions to execute this endpoint
If an escrow has funds, the only thing the platform can do is add more milestones. The other properties cannot be modified under any circumstances.
This endpoint returns the transaction unsigned so that the transaction can be signed by means of a customer wallet.
This function is used to withdraw funds that are stuck in escrow and cannot be withdrawn due to the way multi-release escrow works, since disputes in this case are handled at the milestone level.
In single-release escrow accounts, this endpoint is not necessary because disputes are handled at the escrow account level, so if there is any remaining balance in the contract, a dispute is opened and the remaining balance is withdrawn.
This endpoint returns the transaction unsigned so that the transaction can be signed by means of a customer wallet.
Responsible for modifying the "flag" property of a specific milestone in the escrow to approve that milestone.
You release the milestone escrow funds to the service provider through the approver.
This endpoint allows you to change the properties of an escrow as long as a series of requirements are met, which will be mentioned in this section.
You must have the valid txHash generated from a transaction sent directly to the Stellar network.
The escrow data associated with this txHash must already exist in the internal queue.
The XDR is obtained from any transaction (not signed) generated with any of the endpoints of our REST API.
An unsigned XDR is generated and returned.
The XDR is signed externally and sent directly to Stellar.
The resulting txHash is retrieved.
Responsible for setting the milestone in dispute state. Changes the value of the milestone's "flags.disputed" property to true.
import axios from "axios";
const http = axios.create({
baseURL: "https://dev.api.trustlesswork.com",
timeout: 10000,
headers: {
"Content-Type": "application/json",
"x-api-key": your_api_key,
},
});
export const useExample = async () => {
// Get the signer address
const { address } = await kit.getAddress();
// Execute the endpoint
const response = await http.post(
"/deployer/single-release",
{
// body requested for the endpoint
},
);
// Get the unsigned transaction hash
const { unsignedTransaction } = response.data;
// Sign the transaction by wallet
const { signedTxXdr } = await signTransaction(unsignedTransaction, {
address,
networkPassphrase: WalletNetwork.TESTNET,
});
// Send the transaction to Stellar Network
const tx = await http.post("/helper/send-transaction", {
signedXdr: signedTxXdr,
});
const { data } = tx;
return data;
}import axios from "axios";
const http = axios.create({
baseURL: "https://dev.api.trustlesswork.com",
timeout: 10000,
headers: {
"Content-Type": "application/json",
"x-api-key": your_api_key,
},
});
export const useExample = async () => {
// Get the signer address
const { address } = await kit.getAddress();
const response = await http.post(
"/escrow/multi-release/fund-escrow",
{
// body requested for the endpoint
},
);
// Get the unsigned transaction hash
const { unsignedTransaction } = response.data;
// Sign the transaction by wallet
const { signedTxXdr } = await signTransaction(unsignedTransaction, {
address,
networkPassphrase: WalletNetwork.TESTNET,
});
// Send the transaction to Stellar Network
const tx = await http.post("/helper/send-transaction", {
signedXdr: signedTxXdr,
});
const { data } = tx;
return data;
}import axios from "axios";
const http = axios.create({
baseURL: "https://dev.api.trustlesswork.com",
timeout: 10000,
headers: {
"Content-Type": "application/json",
"x-api-key": your_api_key,
},
});
export const useExample = async () => {
// Get the signer address
const { address } = await kit.getAddress();
const response = await http.post(
"/escrow/multi-release/resolve-milestone-dispute",
{
// body requested for the endpoint
},
);
// Get the unsigned transaction hash
const { unsignedTransaction } = response.data;
// Sign the transaction by wallet
const { signedTxXdr } = await signTransaction(unsignedTransaction, {
address,
networkPassphrase: WalletNetwork.TESTNET,
});
// Send the transaction to Stellar Network
const tx = await http.post("/helper/send-transaction", {
signedXdr: signedTxXdr,
});
const { data } = tx;
return data;
}{
"txHash": "your-txHash-value"
}import axios from "axios";
const http = axios.create({
baseURL: "https://dev.api.trustlesswork.com",
timeout: 10000,
headers: {
"Content-Type": "application/json",
"x-api-key": your_api_key,
},
});
export const useExample = async () => {
// Get the signer address
const { address } = await kit.getAddress();
const response = await http.post(
"/escrow/multi-release/change-milestone-status",
{
// body requested for the endpoint
},
);
// Get the unsigned transaction hash
const { unsignedTransaction } = response.data;
// Sign the transaction by wallet
const { signedTxXdr } = await signTransaction(unsignedTransaction, {
address,
networkPassphrase: WalletNetwork.TESTNET,
});
// Send the transaction to Stellar Network
const tx = await http.post("/helper/send-transaction", {
signedXdr: signedTxXdr,
});
const { data } = tx;
return data;
}import axios from "axios";
const http = axios.create({
baseURL: "https://dev.api.trustlesswork.com",
timeout: 10000,
headers: {
"Content-Type": "application/json",
"x-api-key": your_api_key,
},
});
export const useExample = async () => {
const contractIds = [
"CCR6HLU3LQMXOESNA6TOS2RZKGEBWQG3EN5FMZNC43RVXZWTTDCZ...",
"CCA7WTCVCQ5JPKNIFSHPSJLJ3FJ3GKPNEVAIHP6T..."
];
const validateOnChain = true;
const params = new URLSearchParams();
contractIds.forEach(id => params.append("contractIds[]", id));
params.append("signer", signer);
params.append("validateOnChain", validateOnChain.toString());
const response = await http.get(`/helper/get-escrow-by-contract-ids?${params.toString()}`);
return response;
}
disputeResolver
string
Address in charge of resolving disputes within the escrow.
receiver
string
Address where escrow proceeds will be sent to
Content-Type
application/json
x-api-key
<token>
approver
string
Address of the entity requiring the service.
serviceProvider
string
Address of the entity providing the service.
platformAddress
string
Address of the entity that owns the escrow
releaseSigner
string
Address of the user in charge of releasing the escrow funds to the service provider.
description
string
Text describing the function of the milestone.
status
string
Milestone status. Ex: Approved, In dispute, etc...
approved
boolean
Flag indicating whether a milestone has been approved by the approver.
disputed
boolean
Flag indicating that an escrow is in dispute.
released
boolean
Flag indicating that escrow funds have already been released.
resolved
boolean
Flag indicating that a disputed escrow has already been resolved.
address
string
Public address establishing permission to accept and use a specific token.

The txHash is sent to /indexer/update-from-txHash.
The escrow information is retrieved from the internal queue and stored in Firebase.
Content-Type
application/json
x-api-key
<token>
Content-Type
application/json
x-api-key
<token>

<token>

<token>

<token>
import axios from "axios";
const http = axios.create({
baseURL: "https://dev.api.trustlesswork.com",
timeout: 10000,
headers: {
"Content-Type": "application/json",
"x-api-key": your_api_key,
},
});
export const useExample = async () => {
const data = await http.get(
"/escrow/single-release/get-escrows-by-signer?signer=GPUACN...." 👈🏼 // All required parameters are passed at the query level.
);
return data;
}<token>




Deploy the escrow contract and define the escrow properties.
Content-Type
application/json
x-api-key
<token>
This endpoint returns the transaction unsigned so that the transaction can be signed by means of a customer wallet.
This endpoint allows you to change the properties of an escrow as long as a series of requirements are met, which will be mentioned in this section.
Only the entity with the platform role has permissions to execute this endpoint
If an escrow has funds, the only thing the platform can do is add more milestones. The other properties cannot be modified under any circumstances.
This endpoint returns the transaction unsigned so that the transaction can be signed by means of a customer wallet.
import axios from "axios";
const http = axios.create({
baseURL: "https://dev.api.trustlesswork.com",
timeout: 10000,
headers: {
"Content-Type": "application/json",
"x-api-key": your_api_key,
},
});
export const useExample = async () => {
// Get the signer address
const { address } = await kit.getAddress();
const response = await http.put(
"/escrow/single-release/update-escrow",
{
// body requested for the endpoint
},
);
// Get the unsigned transaction hash
const { unsignedTransaction } = response.data;
// Sign the transaction by wallet
const { signedTxXdr } = await signTransaction(unsignedTransaction, {
address,
networkPassphrase: WalletNetwork.TESTNET,
});
// Send the transaction to Stellar Network
const tx = await http.post("/helper/send-transaction", {
signedXdr: signedTxXdr,
});
const { data } = tx;
return data;
}import axios from "axios";
const http = axios.create({
baseURL: "https://dev.api.trustlesswork.com",
timeout: 10000,
headers: {
"Content-Type": "application/json",
"x-api-key": your_api_key,
},
});
export const updateEscrowFromTxHash = async (txHash) => {
const response = await http.post("/indexer/update-from-txHash", { txHash });
return response.data;
};import axios from "axios";
const http = axios.create({
baseURL: "https://dev.api.trustlesswork.com",
timeout: 10000,
headers: {
"Content-Type": "application/json",
"x-api-key": your_api_key,
},
});
export const useExample = async () => {
// Get the signer address
const { address } = await kit.getAddress();
const response = await http.post(
"/escrow/multi-release/withdraw-remaining-funds",
{
// body requested for the endpoint
},
);
// Get the unsigned transaction hash
const { unsignedTransaction } = response.data;
// Sign the transaction by wallet
const { signedTxXdr } = await signTransaction(unsignedTransaction, {
address,
networkPassphrase: WalletNetwork.TESTNET,
});
// Send the transaction to Stellar Network
const tx = await http.post("/helper/send-transaction", {
signedXdr: signedTxXdr,
});
const { data } = tx;
return data;
}import axios from "axios";
const http = axios.create({
baseURL: "https://dev.api.trustlesswork.com",
timeout: 10000,
headers: {
"Content-Type": "application/json",
"x-api-key": your_api_key,
},
});
export const useExample = async () => {
// Get the signer address
const { address } = await kit.getAddress();
const response = await http.post(
"/escrow/multi-release/approve-milestone",
{
// body requested for the endpoint
},
);
// Get the unsigned transaction hash
const { unsignedTransaction } = response.data;
// Sign the transaction by wallet
const { signedTxXdr } = await signTransaction(unsignedTransaction, {
address,
networkPassphrase: WalletNetwork.TESTNET,
});
// Send the transaction to Stellar Network
const tx = await http.post("/helper/send-transaction", {
signedXdr: signedTxXdr,
});
const { data } = tx;
return data;
}import axios from "axios";
const http = axios.create({
baseURL: "https://dev.api.trustlesswork.com",
timeout: 10000,
headers: {
"Content-Type": "application/json",
"x-api-key": your_api_key,
},
});
export const useExample = async () => {
// Get the signer address
const { address } = await kit.getAddress();
const response = await http.post(
"/any-endpoint",
{
// body requested for the endpoint
},
);
// Get the unsigned transaction hash
const { unsignedTransaction } = response.data;
// Sign the transaction by wallet
const { signedTxXdr } = await signTransaction(unsignedTransaction, {
address,
networkPassphrase: WalletNetwork.TESTNET,
});
// Send the transaction to Stellar Network <--------------- THIS
const tx = await http.post("/helper/send-transaction", {
signedXdr: signedTxXdr,
});
const { data } = tx;
return data;
}import axios from "axios";
const http = axios.create({
baseURL: "https://dev.api.trustlesswork.com",
timeout: 10000,
headers: {
"Content-Type": "application/json",
"x-api-key": your_api_key,
},
});
export const useExample = async () => {
// Get the signer address
const { address } = await kit.getAddress();
const response = await http.post(
"/escrow/multi-release/release-milestone-funds",
{
// body requested for the endpoint
},
);
// Get the unsigned transaction hash
const { unsignedTransaction } = response.data;
// Sign the transaction by wallet
const { signedTxXdr } = await signTransaction(unsignedTransaction, {
address,
networkPassphrase: WalletNetwork.TESTNET,
});
// Send the transaction to Stellar Network
const tx = await http.post("/helper/send-transaction", {
signedXdr: signedTxXdr,
});
const { data } = tx;
return data;
}import axios from "axios";
const http = axios.create({
baseURL: "https://dev.api.trustlesswork.com",
timeout: 10000,
headers: {
"Content-Type": "application/json",
"x-api-key": your_api_key,
},
});
export const useExample = async () => {
// Get the signer address
const { address } = await kit.getAddress();
// Execute the endpoint
const response = await http.post(
"/escrow/multi-release/dispute-milestone",
{
// body requested for the endpoint
},
);
// Get the unsigned transaction hash
const { unsignedTransaction } = response.data;
// Sign the transaction by wallet
const { signedTxXdr } = await signTransaction(unsignedTransaction, {
address,
networkPassphrase: WalletNetwork.TESTNET,
});
// Send the transaction to Stellar Network
const tx = await http.post("/helper/send-transaction", {
signedXdr: signedTxXdr,
});
const { data } = tx;
return data;
}receiver
string
Address where escrow proceeds will be sent to
disputeResolver
string
Address in charge of resolving disputes within the escrow.
description
string
Text describing the function of the milestone
status
string (Default value: "peding")
Milestone status. Ex: Approved, In dispute, etc...
approved
boolean (Default value: false)
Flag indicating whether a milestone has been approved by the approver
amount
string
Amount of the milestone
approver
string
Address of the entity requiring the service.
serviceProvider
string
Address of the entity providing the service.
plataformAddress
string
Address of the entity that owns the escrow
releaseSigner
string
Address of the user in charge of releasing the escrow funds to the service provider.
address
string
Public address establishing permission to accept and use a specific token.
symbol
string
Official abbreviation representing the token in wallets, exchanges, and documentation.

disputeResolver
string
Address in charge of resolving disputes within the escrow.
receiver
string
Address where escrow proceeds will be sent to
Content-Type
application/json
x-api-key
<token>
approver
string
Address of the entity requiring the service.
serviceProvider
string
Address of the entity providing the service.
platformAddress
string
Address of the entity that owns the escrow
releaseSigner
string
Address of the user in charge of releasing the escrow funds to the service provider.
description
string
Text describing the function of the milestone.
status
string
Milestone status. Ex: Approved, In dispute, etc...
amount
boolean
Amount of the milestone
address
string
Public address establishing permission to accept and use a specific token.

import axios from "axios";
const http = axios.create({
baseURL: "https://dev.api.trustlesswork.com",
timeout: 10000,
headers: {
"Content-Type": "application/json",
"x-api-key": your_api_key,
},
});
export const useExample = async () => {
// Get the signer address
const { address } = await kit.getAddress();
// Execute the endpoint
const response = await http.post(
"/deployer/multi-release",
{
// body requested for the endpoint
},
);
// Get the unsigned transaction hash
const { unsignedTransaction } = response.data;
// Sign the transaction by wallet
const { signedTxXdr } = await signTransaction(unsignedTransaction, {
address,
networkPassphrase: WalletNetwork.TESTNET,
});
// Send the transaction to Stellar Network
const tx = await http.post("/helper/send-transaction", {
signedXdr: signedTxXdr,
});
const { data } = tx;
return data;
}import axios from "axios";
const http = axios.create({
baseURL: "https://dev.api.trustlesswork.com",
timeout: 10000,
headers: {
"Content-Type": "application/json",
"x-api-key": your_api_key,
},
});
export const useExample = async () => {
// Get the signer address
const { address } = await kit.getAddress();
const response = await http.put(
"/escrow/multi-release/update-escrow",
{
// body requested for the endpoint
},
);
// Get the unsigned transaction hash
const { unsignedTransaction } = response.data;
// Sign the transaction by wallet
const { signedTxXdr } = await signTransaction(unsignedTransaction, {
address,
networkPassphrase: WalletNetwork.TESTNET,
});
// Send the transaction to Stellar Network
const tx = await http.post("/helper/send-transaction", {
signedXdr: signedTxXdr,
});
const { data } = tx;
return data;
}ID (address) that identifies the escrow contract
CAZ6UQX7...Address of the user in charge of releasing the escrow funds to the receiver
GREL...XYZThis endpoint returns an unsigned transaction in XDR format. This XDR is then used to sign the transaction using the “/helper/send-transaction” endpoint.
Bad request
Unauthorized access
Too Many Requests
Possible errors:
ID (address) that identifies the escrow contract
ENG12345Entity that signs the transaction that deploys and initializes the escrow
GSIGN...XYZAmount to transfer to the escrow contract
100This endpoint returns an unsigned transaction in XDR format. This XDR is then used to sign the transaction using the “/helper/send-transaction” endpoint.
Bad request
Unauthorized access
Too Many Requests
Possible errors:
ID (address) that identifies the escrow contract
CAZ6UQX7...Address of the user defined to resolve disputes in an escrow
GDISPUTE...XYZThis endpoint returns an unsigned transaction in XDR format. This XDR is then used to sign the transaction using the “/helper/send-transaction” endpoint.
Bad request
Unauthorized access
Too Many Requests
Possible errors:
ID (address) that identifies the escrow contract
CAZ6UQX7...Entity that signs the transaction that deploys and initializes the escrow
GSIGN...XYZThis endpoint returns an unsigned transaction in XDR format. This XDR is then used to sign the transaction using the “/helper/send-transaction” endpoint.
Bad request
Unauthorized access
Too Many Requests
Possible errors:
ID (address) that identifies the escrow contract
CAZ6UQX7...Position that identifies the milestone within the group of milestones in the escrow
1Address of the entity requiring the service
GCLIENT...XYZThis endpoint returns an unsigned transaction in XDR format. This XDR is then used to sign the transaction using the “/helper/send-transaction” endpoint.
Bad request
Unauthorized access
Too Many Requests
Possible errors:
ID (address) that identifies the escrow contract
CAZ6UQX7...milestone within the group of milestones in the escrow
1New value for the evidence property within the escrow milestone
EvidenceNew value for the status property within the escrow milestone
CompletedAddress of the entity providing the service
CompletedThis endpoint returns an unsigned transaction in XDR format. This XDR is then used to sign the transaction using the “/helper/send-transaction” endpoint.
Bad request
Unauthorized access
Too Many Requests
Possible errors:
Entity that signs the transaction that deploys and initializes the escrow
GABC...XYZUnique identifier for the escrow
ENG12345Name of the escrow
Escrow TestText describing the function of the escrow
Escrow Test descriptionRoles that make up the escrow structure
Amount to be transferred upon completion of escrow milestones
1000Commission that the platform will receive when the escrow is completed
5Objectives to be completed to define the escrow as completed. (In this case it is not necessary to send the properties “approvedFlag” and “status” inside the objects of these milestones)
Information on the trustline that will manage the movement of funds in escrow
This endpoint returns an unsigned transaction in XDR format. This XDR is then used to sign the transaction using the “/helper/send-transaction” endpoint.
Bad request
Unauthorized access
Too Many Requests
Possible errors:
ID (address) that identifies the escrow contract
ENG12345Entity that signs the transaction that deploys and initializes the escrow
GSIGN...XYZAmount to transfer to the escrow contract
100This endpoint returns an unsigned transaction in XDR format. This XDR is then used to sign the transaction using the “/helper/send-transaction” endpoint.
Bad request
Unauthorized access
Too Many Requests
Possible errors:
ID (address) that identifies the escrow contract
CAZ6UQX7...Address of the user defined to resolve disputes in an escrow
GDISPUTE...XYZPosition that identifies the milestone within the group of milestones in the escrow
1This endpoint returns an unsigned transaction in XDR format. This XDR is then used to sign the transaction using the “/helper/send-transaction” endpoint.
Bad request
Unauthorized access
Too Many Requests
Possible errors:
Address of the user who signed the transaction to create escrow
GXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXRole in escrow
approverAddress of the user in the specified role
GXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXStatus of the escrow
pendingType of the escrow
single_release | multi_releasePossible values: Engagement ID of the escrow
ENG-001Title of the escrow
Website redesignIs the escrow active
When set to true, the endpoint will verify each escrow’s data against the blockchain to ensure accuracy and integrity. Enabling this adds an extra security layer but may increase the response time slightly due to the additional validation step
Starting date range for filtering
2023-06-20 (YYYY-MM-DD)Minimum amount for filtering
100Maximum amount for filtering
1000Field to order the results by
createdAtExample: createdAt | updatedAt | amountPossible values: Direction to order the results
descExample: asc | descPossible values: Page number for pagination
1Number of items per page
8Example: 8Contract Id of the deployed escrow
CBHEQBV...Ending date range for filtering
2023-06-22 (YYYY-MM-DD)Collection of data containing information from different scans requested by a signatory, role or contract id.
Bad request
Unauthorized access
Too Many Requests
ID (address) that identifies the escrow contract
CAZ6UQX7...milestone within the group of milestones in the escrow
1New value for the evidence property within the escrow milestone
EvidenceNew value for the status property within the escrow milestone
CompletedAddress of the entity providing the service
CompletedThis endpoint returns an unsigned transaction in XDR format. This XDR is then used to sign the transaction using the “/helper/send-transaction” endpoint.
Bad request
Unauthorized access
Too Many Requests
Possible errors:
Array of contract IDs to query
[CB25FW...,CBHEQBV...]Is the escrow active
When set to true, the endpoint will verify each escrow’s data against the blockchain to ensure accuracy and integrity. Enabling this adds an extra security layer but may increase the response time slightly due to the additional validation step
Collection of data containing information from different scans requested by a signatory, role or contract ids.
Bad request
Unauthorized access
Too Many Requests
Collection of objects containing information on the balance of the requested addresses
Bad request
Unauthorized access
Too Many Requests
Entity that signs the transaction that deploys and initializes the escrow
GSIGN...XYZID (address) that identifies the escrow contract
CAZ6UQX7...Escrow data to update
This endpoint returns an unsigned transaction in XDR format. This XDR is then used to sign the transaction using the “/helper/send-transaction” endpoint.
Bad request
Unauthorized access
Too Many Requests
Possible errors:
ID (address) that identifies the escrow contract
CAZ6UQX7...Address of the user defined to resolve disputes in an escrow
GDISPUTE...XYZThis endpoint returns an unsigned transaction in XDR format. This XDR is then used to sign the transaction using the “/helper/send-transaction” endpoint.
Bad request
Unauthorized access
Too Many Requests
Possible errors:
ID (address) that identifies the escrow contract
CAZ6UQX7...Position that identifies the milestone within the group of milestones in the escrow
1Address of the entity requiring the service
GCLIENT...XYZThis endpoint returns an unsigned transaction in XDR format. This XDR is then used to sign the transaction using the “/helper/send-transaction” endpoint.
Bad request
Unauthorized access
Too Many Requests
Possible errors:
The sign's hash. This come from the wallet
AAAAAgAAAAB...The transaction has been successfully sent to the Stellar network
Bad request
Unauthorized access
Too Many Requests
ID (address) that identifies the escrow contract
CAZ6UQX7...Address of the user in charge of releasing the escrow funds to the receiver
GAPPROVER1234567890...Position that identifies the milestone within the group of milestones in the escrow
1This endpoint returns an unsigned transaction in XDR format. This XDR is then used to sign the transaction using the “/helper/send-transaction” endpoint.
Bad request
Unauthorized access
Too Many Requests
Possible errors:
Address of the user who signed the transaction to create escrow
GXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXRole in escrow
approverAddress of the user in the specified role
GXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXStatus of the escrow
pendingType of the escrow
single_release | multi_releasePossible values: Engagement ID of the escrow
ENG-001Title of the escrow
Website redesignIs the escrow active
When set to true, the endpoint will verify each escrow’s data against the blockchain to ensure accuracy and integrity. Enabling this adds an extra security layer but may increase the response time slightly due to the additional validation step
Starting date range for filtering
2023-06-20 (YYYY-MM-DD)Minimum amount for filtering
100Maximum amount for filtering
1000Field to order the results by
createdAtExample: createdAt | updatedAt | amountPossible values: Direction to order the results
descExample: asc | descPossible values: Page number for pagination
1Number of items per page
8Example: 8Contract Id of the deployed escrow
CBHEQBV...Ending date range for filtering
2023-06-22 (YYYY-MM-DD)Collection of data containing information from different scans requested by a signatory, role or contract id.
Bad request
Unauthorized access
Too Many Requests
Transaction hash
b0e61d4...f1cb2d29Returns the escrow object that was just saved/updated in the indexer and the success or failure of the response.
Bad request
Unauthorized access
Too Many Requests
ID (address) that identifies the escrow contract
CAZ6UQX7...Position that identifies the milestone within the group of milestones in the escrow
1Entity that signs the transaction that deploys and initializes the escrow
GSIGN...XYZThis endpoint returns an unsigned transaction in XDR format. This XDR is then used to sign the transaction using the “/helper/send-transaction” endpoint.
Bad request
Unauthorized access
Too Many Requests
Possible errors:
Entity that signs the transaction that deploys and initializes the escrow
GABC...XYZUnique identifier for the escrow
ENG12345Name of the escrow
Escrow TestText describing the function of the escrow
Escrow Test descriptionRoles that make up the escrow structure
Commission that the platform will receive when the escrow is completed
5Objectives to be completed to define the escrow as completed. (In this case it is not necessary to send the properties “approvedFlag” and “status” inside the objects of these milestones)
Information on the trustline that will manage the movement of funds in escrow
This endpoint returns an unsigned transaction in XDR format. This XDR is then used to sign the transaction using the “/helper/send-transaction” endpoint.
Bad request
Unauthorized access
Too Many Requests
Possible errors:
Entity that signs the transaction that deploys and initializes the escrow
GSIGN...XYZID (address) that identifies the escrow contract
CAZ6UQX7...Escrow data to update
This endpoint returns an unsigned transaction in XDR format. This XDR is then used to sign the transaction using the “/helper/send-transaction” endpoint.
Bad request
Unauthorized access
Too Many Requests
Possible errors:
POST /escrow/single-release/release-funds HTTP/1.1
Host:
Content-Type: application/json
Accept: */*
Content-Length: 69
{
"contractId": "CAZ6UQX7...",
"releaseSigner": "GAPPROVER1234567890..."
}{
"status": "SUCCESS",
"unsignedTransaction": "AAAAAgAAAAAtWsgedQ...."
}POST /escrow/single-release/fund-escrow HTTP/1.1
Host:
Content-Type: application/json
Accept: */*
Content-Length: 76
{
"contractId": "CAZ6UQX7...",
"signer": "GAPPROVER1234567890...",
"amount": "10"
}{
"status": "SUCCESS",
"unsignedTransaction": "AAAAAgAAAAAtWsgedQ...."
}POST /escrow/single-release/resolve-dispute HTTP/1.1
Host:
Content-Type: application/json
Accept: */*
Content-Length: 188
{
"contractId": "CAZ6UQX7...",
"disputeResolver": "GAPPROVER1234567890...",
"distributions": [
{
"address": "GAPPROVER1234567890...",
"amount": 20
},
{
"address": "GRECIPIENT1234567890...",
"amount": 30
}
]
}{
"status": "SUCCESS",
"unsignedTransaction": "AAAAAgAAAAAtWsgedQ...."
}POST /escrow/single-release/dispute-escrow HTTP/1.1
Host:
Content-Type: application/json
Accept: */*
Content-Length: 62
{
"contractId": "CAZ6UQX7...",
"signer": "GAPPROVER1234567890..."
}{
"status": "SUCCESS",
"unsignedTransaction": "AAAAAgAAAAAtWsgedQ...."
}POST /escrow/single-release/approve-milestone HTTP/1.1
Host:
Content-Type: application/json
Accept: */*
Content-Length: 85
{
"contractId": "CAZ6UQX7...",
"milestoneIndex": "1",
"approver": "GAPPROVER1234567890..."
}{
"status": "SUCCESS",
"unsignedTransaction": "AAAAAgAAAAAtWsgedQ...."
}POST /escrow/single-release/change-milestone-status HTTP/1.1
Host:
Content-Type: application/json
Accept: */*
Content-Length: 177
{
"contractId": "CAZ6UQX7...",
"milestoneIndex": "1",
"newEvidence": "Any evidence that the milestone is completed",
"newStatus": "Completed",
"serviceProvider": "GAPPROVER1234567890..."
}{
"status": "SUCCESS",
"unsignedTransaction": "AAAAAgAAAAAtWsgedQ...."
}POST /deployer/single-release HTTP/1.1
Host:
Content-Type: application/json
Accept: */*
Content-Length: 603
{
"signer": "GAPPROVER1234567890...",
"engagementId": "ENG12345",
"title": "Project Title",
"description": "This is a detailed description of the project.",
"roles": {
"approver": "GAPPROVER1234567890...",
"serviceProvider": "GAPPROVER1234567890...",
"platformAddress": "GAPPROVER1234567890...",
"releaseSigner": "GAPPROVER1234567890...",
"disputeResolver": "GAPPROVER1234567890...",
"receiver": "GAPPROVER1234567890..."
},
"amount": 1000,
"platformFee": 50,
"milestones": [
{
"description": "Initial phase of the project"
},
{
"description": "Completion of design work"
}
],
"trusline": {
"symbol": "USDC",
"address": "GBBD47IF6LWK7P7MDEVSC..."
}
}{
"status": "SUCCESS",
"unsignedTransaction": "AAAAAgAAAAAtWsgedQ...."
}POST /escrow/multi-release/fund-escrow HTTP/1.1
Host:
Content-Type: application/json
Accept: */*
Content-Length: 76
{
"contractId": "CAZ6UQX7...",
"signer": "GAPPROVER1234567890...",
"amount": "10"
}{
"status": "SUCCESS",
"unsignedTransaction": "AAAAAgAAAAAtWsgedQ...."
}POST /escrow/multi-release/resolve-milestone-dispute HTTP/1.1
Host:
Content-Type: application/json
Accept: */*
Content-Length: 210
{
"contractId": "CAZ6UQX7...",
"disputeResolver": "GAPPROVER1234567890...",
"milestoneIndex": "1",
"distributions": [
{
"address": "GAPPROVER1234567890...",
"amount": 300
},
{
"address": "GRECEIVER1234567890...",
"amount": 700
}
]
}{
"status": "SUCCESS",
"unsignedTransaction": "AAAAAgAAAAAtWsgedQ...."
}POST /escrow/multi-release/change-milestone-status HTTP/1.1
Host:
Content-Type: application/json
Accept: */*
Content-Length: 177
{
"contractId": "CAZ6UQX7...",
"milestoneIndex": "1",
"newEvidence": "Any evidence that the milestone is completed",
"newStatus": "Completed",
"serviceProvider": "GAPPROVER1234567890..."
}{
"status": "SUCCESS",
"unsignedTransaction": "AAAAAgAAAAAtWsgedQ...."
}GET /helper/get-escrow-by-contract-ids?contractIds=[CB25FW...%2CCBHEQBV...] HTTP/1.1
Host:
Accept: */*
[
{
"contractId": "CB25FW....",
"signer": "GBPUA....",
"type": "multi-release",
"engagementId": "ENG-003",
"title": "Title of the Escrow",
"description": "Description of the Escrow",
"milestones": [
{
"description": "Initial payment",
"amount": 2,
"status": "pending",
"flags": {
"disputed": false,
"released": false,
"resolved": false,
"approved": false
}
},
{
"description": "Final payment",
"amount": 5,
"status": "pending",
"flags": {
"disputed": false,
"released": false,
"resolved": false,
"approved": false
}
}
],
"platformFee": 5,
"receiverMemo": 0,
"roles": {
"approver": "GBPUACN....",
"serviceProvider": "GA2RRI....",
"platformAddress": "GBPA2LO....",
"releaseSigner": "GCPZUO....",
"disputeResolver": "GDBMRV...",
"receiver": "GA2RRI...",
"issuer": "GBPUAC..."
},
"trustline": {
"address": "CBIELT...",
"name": "USDC"
},
"isActive": true,
"updatedAt": {
"_seconds": 1750698602,
"_nanoseconds": 356000000
},
"createdAt": {
"_seconds": 1750698602,
"_nanoseconds": 356000000
},
"balance": 0
},
{
"contractId": "CF35XW....",
"signer": "GBPUA....",
"type": "single-release",
"engagementId": "ENG-003",
"title": "Title of the Escrow",
"description": "Description of the Escrow",
"milestones": [
{
"description": "Initial payment",
"amount": 5,
"status": "pending",
"flags": {
"disputed": false,
"released": false,
"resolved": false,
"approved": false
}
},
{
"description": "Final payment",
"amount": 3,
"status": "pending",
"flags": {
"disputed": false,
"released": false,
"resolved": false,
"approved": false
}
}
],
"platformFee": 3,
"receiverMemo": 0,
"roles": {
"approver": "GBPUACN....",
"serviceProvider": "GA2RRI....",
"platformAddress": "GBPA2LO....",
"releaseSigner": "GCPZUO....",
"disputeResolver": "GDBMRV...",
"receiver": "GA2RRI...",
"issuer": "GBPUAC..."
},
"trustline": {
"address": "CBIELT...",
"name": "USDC"
},
"isActive": true,
"updatedAt": {
"_seconds": 1750698602,
"_nanoseconds": 356000000
},
"createdAt": {
"_seconds": 1750698602,
"_nanoseconds": 356000000
},
"balance": 3
}
]GET /helper/get-multiple-escrow-balance?addresses=undefined HTTP/1.1
Host:
Accept: */*
[
{
"address": "GAWVVSA..",
"balance": 30
},
{
"address": "GAWVCG3..",
"balance": 10
}
]PUT /escrow/single-release/update-escrow HTTP/1.1
Host:
Content-Type: application/json
Accept: */*
Content-Length: 846
{
"signer": "GAPPROVER1234567890...",
"contractId": "CAZ6UQX7...",
"isActive": true,
"escrow": {
"signer": "GAPPROVER1234567890...",
"engagementId": "ENG12345",
"title": "Project Title",
"description": "This is a detailed description of the project.",
"roles": {
"approver": "GAPPROVER1234567890...",
"serviceProvider": "GAPPROVER1234567890...",
"platformAddress": "GAPPROVER1234567890...",
"releaseSigner": "GAPPROVER1234567890...",
"disputeResolver": "GAPPROVER1234567890...",
"receiver": "GAPPROVER1234567890..."
},
"amount": 1000,
"platformFee": 50,
"milestones": [
{
"description": "test1",
"status": "pending",
"evidence": "Any evidence that the milestone is completed"
},
{
"description": "test2",
"status": "pending",
"evidence": "Any evidence that the milestone is completed"
}
],
"flags": {
"disputed": false,
"released": false,
"resolved": false
},
"trustline": {
"address": "GAPPROVER1234567890..."
}
}
}{
"status": "SUCCESS",
"unsignedTransaction": "AAAAAgAAAAAtWsgedQ...."
}POST /escrow/multi-release/withdraw-remaining-funds HTTP/1.1
Host:
Content-Type: application/json
Accept: */*
Content-Length: 188
{
"contractId": "CAZ6UQX7...",
"disputeResolver": "GDISPUTE1234567890...",
"distributions": [
{
"address": "GAPPROVER1234567890...",
"amount": 150
},
{
"address": "GRECEIVER1234567890...",
"amount": 850
}
]
}{
"status": "SUCCESS",
"unsignedTransaction": "AAAAAgAAAAAtWsgedQ...."
}POST /escrow/multi-release/approve-milestone HTTP/1.1
Host:
Content-Type: application/json
Accept: */*
Content-Length: 85
{
"contractId": "CAZ6UQX7...",
"milestoneIndex": "1",
"approver": "GAPPROVER1234567890..."
}{
"status": "SUCCESS",
"unsignedTransaction": "AAAAAgAAAAAtWsgedQ...."
}POST /helper/send-transaction HTTP/1.1
Host:
Content-Type: application/json
Accept: */*
Content-Length: 30
{
"signedXdr": "AAAAAgAAAAB..."
}{
"status": "SUCCESS",
"message": "The transaction has been successfully sent to the Stellar network.",
"contractId": "CAATN5D...",
"escrow": {
"amount": 50,
"roles": {
"approver": "GAWVVSA...",
"serviceProvider": "GAWVVSA6...",
"disputeResolver": "GAWVVSA...",
"receiver": "GAWVVSA...",
"platformAddress": "GAWVVSA...",
"releaseSigner": "GAWVVSA..."
},
"flags": {
"disputed": false,
"released": false,
"resolved": false
},
"description": "This is a sample TW escrow for testing purposes",
"engagementId": "ENG12345",
"milestones": [
{
"approved": false,
"description": "Initial milestone",
"evidence": "",
"status": "pending"
},
{
"approved": false,
"description": "Second milestone",
"evidence": "",
"status": "pending"
}
],
"platformFee": 5,
"title": "Sample TW Escrow",
"trustline": {
"address": "CBIELTK...",
"name": "USDC"
},
"receiverMemo": 90909090
}
}POST /escrow/multi-release/release-milestone-funds HTTP/1.1
Host:
Content-Type: application/json
Accept: */*
Content-Length: 91
{
"contractId": "CAZ6UQX7...",
"releaseSigner": "GAPPPROVER1234567890...",
"milestoneIndex": "1"
}{
"status": "SUCCESS",
"unsignedTransaction": "AAAAAgAAAAAtWsgedQ...."
}PUT /indexer/update-from-txhash HTTP/1.1
Host:
Content-Type: application/json
Accept: */*
Content-Length: 31
{
"txHash": "b0e61d4...f1cb2d29"
}{
"status": "SUCCESS",
"message": "Escrow saved successfully / The escrow has been correctly indexed in our database.",
"savedEscrow": {
"contractId": "CB25FW....",
"signer": "GBPUA....",
"type": "multi-release",
"engagementId": "ENG-003",
"title": "Title of the Escrow",
"description": "Description of the Escrow",
"milestones": [
{
"description": "Initial payment",
"amount": 2,
"status": "pending",
"flags": {
"disputed": false,
"released": false,
"resolved": false,
"approved": false
}
},
{
"description": "Final payment",
"amount": 5,
"status": "pending",
"flags": {
"disputed": false,
"released": false,
"resolved": false,
"approved": false
}
}
],
"platformFee": 5,
"receiverMemo": 0,
"roles": {
"approver": "GBPUACN....",
"serviceProvider": "GA2RRI....",
"platformAddress": "GBPA2LO....",
"releaseSigner": "GCPZUO....",
"disputeResolver": "GDBMRV...",
"receiver": "GA2RRI...",
"issuer": "GBPUAC..."
},
"trustline": {
"address": "CBIELT...",
"name": "USDC"
},
"isActive": true,
"updatedAt": {
"_seconds": 1750698602,
"_nanoseconds": 356000000
},
"createdAt": {
"_seconds": 1750698602,
"_nanoseconds": 356000000
},
"balance": 0
}
}POST /escrow/multi-release/dispute-milestone HTTP/1.1
Host:
Content-Type: application/json
Accept: */*
Content-Length: 83
{
"contractId": "CAZ6UQX7...",
"milestoneIndex": "1",
"signer": "GAPPROVER1234567890..."
}{
"status": "SUCCESS",
"unsignedTransaction": "AAAAAgAAAAAtWsgedQ...."
}POST /deployer/multi-release HTTP/1.1
Host:
Content-Type: application/json
Accept: */*
Content-Length: 648
{
"signer": "GAPPROVER1234567890...",
"engagementId": "ENG12345",
"title": "Project Title",
"description": "This is a detailed description of the project.",
"roles": {
"approver": "GAPPROVER1234567890...",
"serviceProvider": "GAPPROVER1234567890...",
"platformAddress": "GAPPROVER1234567890...",
"releaseSigner": "GAPPROVER1234567890...",
"disputeResolver": "GAPPROVER1234567890..."
},
"platformFee": 50,
"milestones": [
{
"description": "Initial phase of the project",
"amount": 5,
"receiver": "GAPPROVER1234567890..."
},
{
"description": "Completion of design work",
"amount": 5,
"receiver": "GAPPROVER1234567890..."
}
],
"trustline": {
"symbol": "USDC",
"address": "GBBD47IF6LWK7P7MDEVSC..."
}
}{
"status": "SUCCESS",
"unsignedTransaction": "AAAAAgAAAAAtWsgedQ...."
}PUT /escrow/multi-release/update-escrow HTTP/1.1
Host:
Content-Type: application/json
Accept: */*
Content-Length: 878
{
"signer": "GAPPROVER1234567890...",
"contractId": "CAZ6UQX7...",
"isActive": true,
"escrow": {
"engagementId": "ENG12345",
"title": "Project Title",
"description": "This is a detailed description of the project.",
"roles": {
"approver": "GAPPROVER1234567890...",
"serviceProvider": "GAPPROVER1234567890...",
"platformAddress": "GAPPROVER1234567890...",
"releaseSigner": "GAPPROVER1234567890...",
"disputeResolver": "GAPPROVER1234567890..."
},
"platformFee": 1,
"milestones": [
{
"description": "test1",
"status": "pending",
"evidence": "Any evidence that the milestone is completed",
"amount": 1000,
"receiver": "GAPPROVER1234567890..."
},
{
"description": "test2",
"status": "pending",
"evidence": "Any evidence that the milestone is completed",
"amount": 1000,
"receiver": "GAPPROVER1234567890..."
}
],
"flags": {
"disputed": false,
"released": false,
"resolved": false,
"approved": false
},
"trustline": {
"address": "GAPPROVER1234567890..."
}
}
}{
"status": "SUCCESS",
"unsignedTransaction": "AAAAAgAAAAAtWsgedQ...."
}[
{
"contractId": "CB25FW....",
"signer": "GBPUA....",
"type": "multi-release",
"engagementId": "ENG-003",
"title": "Title of the Escrow",
"description": "Description of the Escrow",
"milestones": [
{
"description": "Initial payment",
"amount": 2,
"status": "pending",
"flags": {
"disputed": false,
"released": false,
"resolved": false,
"approved": false
}
},
{
"description": "Final payment",
"amount": 5,
"status": "pending",
"flags": {
"disputed": false,
"released": false,
"resolved": false,
"approved": false
}
}
],
"platformFee": 5,
"receiverMemo": 0,
"roles": {
"approver": "GBPUACN....",
"serviceProvider": "GA2RRI....",
"platformAddress": "GBPA2LO....",
"releaseSigner": "GCPZUO....",
"disputeResolver": "GDBMRV...",
"receiver": "GA2RRI...",
"issuer": "GBPUAC..."
},
"trustline": {
"address": "CBIELT...",
"name": "USDC"
},
"isActive": true,
"updatedAt": {
"_seconds": 1750698602,
"_nanoseconds": 356000000
},
"createdAt": {
"_seconds": 1750698602,
"_nanoseconds": 356000000
},
"balance": 0
}
]GET /helper/get-escrows-by-role HTTP/1.1
Host:
Accept: */*
[
{
"contractId": "CB25FW....",
"signer": "GBPUA....",
"type": "multi-release",
"engagementId": "ENG-003",
"title": "Title of the Escrow",
"description": "Description of the Escrow",
"milestones": [
{
"description": "Initial payment",
"amount": 2,
"status": "pending",
"flags": {
"disputed": false,
"released": false,
"resolved": false,
"approved": false
}
},
{
"description": "Final payment",
"amount": 5,
"status": "pending",
"flags": {
"disputed": false,
"released": false,
"resolved": false,
"approved": false
}
}
],
"platformFee": 5,
"receiverMemo": 0,
"roles": {
"approver": "GBPUACN....",
"serviceProvider": "GA2RRI....",
"platformAddress": "GBPA2LO....",
"releaseSigner": "GCPZUO....",
"disputeResolver": "GDBMRV...",
"receiver": "GA2RRI...",
"issuer": "GBPUAC..."
},
"trustline": {
"address": "CBIELT...",
"name": "USDC"
},
"isActive": true,
"updatedAt": {
"_seconds": 1750698602,
"_nanoseconds": 356000000
},
"createdAt": {
"_seconds": 1750698602,
"_nanoseconds": 356000000
},
"balance": 0
}
]GET /helper/get-escrows-by-signer HTTP/1.1
Host:
Accept: */*