Estimate Fees
curl --request POST \
--url https://api.signa.so/v1/fees/estimate \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.signa.so/v1/fees/estimate"
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, headers=headers)
print(response.text)const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.signa.so/v1/fees/estimate', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.signa.so/v1/fees/estimate",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.signa.so/v1/fees/estimate"
req, _ := http.NewRequest("POST", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.signa.so/v1/fees/estimate")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.signa.so/v1/fees/estimate")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_bodyFees
Estimate Fees
Estimate official fees for one transaction and identify unresolved components
POST
/
v1
/
fees
/
estimate
Estimate Fees
curl --request POST \
--url https://api.signa.so/v1/fees/estimate \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.signa.so/v1/fees/estimate"
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, headers=headers)
print(response.text)const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.signa.so/v1/fees/estimate', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.signa.so/v1/fees/estimate",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.signa.so/v1/fees/estimate"
req, _ := http.NewRequest("POST", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.signa.so/v1/fees/estimate")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.signa.so/v1/fees/estimate")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_bodySubmit one transaction per request. The response is a
The verified dataset does not currently include individual designation fee amounts. This example therefore returns a partial subtotal for verified components, unresolved designation lines, and a null total. Do not treat the Madrid basic fee as the full application cost.
fee_estimate object at the top level, with no data wrapper. Requires trademarks:read, costs one check unit per request, and does not require an Idempotency-Key. The endpoint does not persist a filing or take payment.
const estimate = await signa.fees.estimate({
office: 'US',
route: 'direct',
action: 'filing',
classes: [9, 42],
});
console.log(estimate.complete, estimate.total_minor, estimate.currency);
classes accepts an integer count from 1 to 45 or a unique list of Nice class numbers from 1 to 45. Duplicate classes, unknown fields, invalid calendar dates, and batch envelopes are rejected.
All amounts are native currency minor units, without currency conversion. subtotal_minor sums included components. total_minor is null unless the estimate is complete. Read lines[], omissions[], and assumptions[] before using the amount. A successful HTTP response can contain unsupported offices, unsupported actions, missing inputs, unsupported dates, or unverified components; these are explicit line statuses rather than guessed charges or zeros.
Each included line identifies its fee rule and schedule, effective and verification dates, and source citations with snapshot paths and SHA-256 checksums. dataset_version identifies the compiled dataset, and as_of is the selected payment_date, defaulting to the server’s UTC calculation date. The response uses private, no-store caching.
Madrid requests
Useoffice: 'WO' (or the WIPO alias) and identify designated offices separately:
const estimate = await signa.fees.estimate({
office: 'WO',
route: 'madrid',
action: 'filing',
classes: [9, 42],
designations: ['EM', 'GB'],
colour: false,
applicant: { ldc_eligible: false },
});
designations is valid only for WO Madrid filing, renewal, or subsequent designation requests. colour and applicant are valid only for WO Madrid filing. Set applicant.ldc_eligible: true only when the caller attests that all predicates in the WIPO least-developed-country reduction footnote hold for every applicant. This is an eligibility attestation, not a country-code shortcut.
Dates and transition rules
Usepayment_date to supply the payment date; omission uses the server calculation date. GB renewal requests can supply renewal_due_date. GB filing requests can supply application_date and application_in_payment_grace. Missing facts needed to select a schedule are reported explicitly. Dates older than verified applicability coverage return unsupported components rather than extrapolated fees. late requests a supported late-payment calculation where the dataset contains verified rules.
const estimate = await signa.fees.estimate({
office: 'GB',
route: 'direct',
action: 'renewal',
classes: 2,
payment_date: '2026-03-31',
renewal_due_date: '2026-04-01',
});