Submit an integrator fee claim
curl --request POST \
--url https://demo-api.mobula.io/api/2/bridge/integrator-fees/claims/{claimId} \
--header 'Content-Type: application/json' \
--data '
{
"signature": "<string>"
}
'import requests
url = "https://demo-api.mobula.io/api/2/bridge/integrator-fees/claims/{claimId}"
payload = { "signature": "<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({signature: '<string>'})
};
fetch('https://demo-api.mobula.io/api/2/bridge/integrator-fees/claims/{claimId}', 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://demo-api.mobula.io/api/2/bridge/integrator-fees/claims/{claimId}",
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([
'signature' => '<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://demo-api.mobula.io/api/2/bridge/integrator-fees/claims/{claimId}"
payload := strings.NewReader("{\n \"signature\": \"<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://demo-api.mobula.io/api/2/bridge/integrator-fees/claims/{claimId}")
.header("Content-Type", "application/json")
.body("{\n \"signature\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://demo-api.mobula.io/api/2/bridge/integrator-fees/claims/{claimId}")
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 \"signature\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"claimId": "<string>",
"status": "pending",
"chainId": "<string>",
"recipient": "<string>",
"amountUsd": 123,
"networkFeeUsd": 123,
"receiveAmount": "<string>",
"txHash": "<string>",
"error": "<string>",
"createdAt": "<string>",
"updatedAt": "<string>"
}
}{
"message": "<string>"
}{
"message": "<string>"
}Bridge Integrator Fee Claim Submit
[Alpha Preview] Submit the fee wallet’s signature for a prepared claim; Mobula then pays it in USDC.
POST
/
2
/
bridge
/
integrator-fees
/
claims
/
{claimId}
Submit an integrator fee claim
curl --request POST \
--url https://demo-api.mobula.io/api/2/bridge/integrator-fees/claims/{claimId} \
--header 'Content-Type: application/json' \
--data '
{
"signature": "<string>"
}
'import requests
url = "https://demo-api.mobula.io/api/2/bridge/integrator-fees/claims/{claimId}"
payload = { "signature": "<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({signature: '<string>'})
};
fetch('https://demo-api.mobula.io/api/2/bridge/integrator-fees/claims/{claimId}', 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://demo-api.mobula.io/api/2/bridge/integrator-fees/claims/{claimId}",
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([
'signature' => '<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://demo-api.mobula.io/api/2/bridge/integrator-fees/claims/{claimId}"
payload := strings.NewReader("{\n \"signature\": \"<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://demo-api.mobula.io/api/2/bridge/integrator-fees/claims/{claimId}")
.header("Content-Type", "application/json")
.body("{\n \"signature\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://demo-api.mobula.io/api/2/bridge/integrator-fees/claims/{claimId}")
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 \"signature\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"claimId": "<string>",
"status": "pending",
"chainId": "<string>",
"recipient": "<string>",
"amountUsd": 123,
"networkFeeUsd": 123,
"receiveAmount": "<string>",
"txHash": "<string>",
"error": "<string>",
"createdAt": "<string>",
"updatedAt": "<string>"
}
}{
"message": "<string>"
}{
"message": "<string>"
}Alpha Preview — Endpoints and response shape may change without notice.
POST /api/2/bridge/integrator-fees/claims/{claimId} verifies the fee wallet’s
signature over the prepared
message, debits the claim from the balance, and queues the USDC payout.
- The balance is checked again at submit, one claim at a time per wallet, so two claims can never spend the same balance.
- Submitting a claim that is already booked returns it unchanged, so retrying is safe.
Path parameter
| Name | Notes |
|---|---|
claimId | The claimId returned by prepare. |
Request body
{ "signature": "0x…" }
signature is 0x… hex on EVM and base58 on Solana. See Signing.
Response
The booked claim, in the same shape as the balanceclaims[]:
{
"data": {
"claimId": "6f1c2a9e-4b7d-4c1e-9a53-2d8f0e7b1c44",
"status": "pending",
"chainId": "evm:8453",
"recipient": "0xYourFeeWallet",
"amountUsd": 120.5,
"networkFeeUsd": 0.0041,
"receiveAmount": "120.4959",
"txHash": null,
"error": null,
"createdAt": "2026-10-20T09:14:40.000Z",
"updatedAt": "2026-10-20T09:14:40.000Z"
}
}
Claim statuses
Follow the claim withGET /integrator-fees/{address}.
| Status | Meaning |
|---|---|
pending | Booked, waiting to be sent. |
sending | Payout being sent; txHash appears once it is broadcast. |
paid | USDC delivered. Final. |
failed | Nothing was paid. error says why, and the amount is back in availableUsd. Final. |
chainId.
On EVM the payout comes from the Mobula bridge contract; on Solana it is a USDC
transfer from the solver wallet with the memo claim:<claimId>.
Errors
| HTTP | message |
|---|---|
400 | Signature is not …'s over the prepared message |
400 | Claim expired — prepare a new one |
400 | Balance no longer covers this claim — prepare a new one |
404 | Unknown or expired claim — prepare a new one |