e-Faktura API
Full setup
The Quickstart gets you a signed-looking invoice in five minutes against Merot’s simulator, with no company, no certificate and no Bridge involved. This guide is the other path: your own company, a real signer identity, Merot Bridge installed and paired on your own machine, a real certificate, and a sandbox e-invoice that a human actually signs. Every step below was checked against the running system before being written down — where something is still incomplete or provisional, it says so.
Important
One thing to know before you start: Merot Bridge runs on Windows and macOS (Linux is planned but not shipped). Signup and sandbox company creation are both free — see step 1.
1. Create your account
Self-serve signup is real and live today, at developer.merot.com/console/signup. The form asks for an account kind, a company name, your e-mail and a password.
Developer — free, instant, sandbox-only. Submitting the form creates your account immediately
and shows you a sandbox key (mfk_test_...) once, in a reveal dialog — copy it now, it is never
shown again. No payment, no waiting. You can create one company with it — your own, to test
your own integration against (POST /v1/companies allows exactly one per Developer account; a
second is refused). That’s everything the rest of this guide needs. A Developer account can never
enable production on that company or get a production key — sandbox only, permanently.
Business or Vendor — for onboarding multiple client companies (the software-vendor use
case: building a product that issues e-Fakturas on behalf of many other businesses). Neither is
free: submitting the form creates a pending account and sends you to a Merot Billing checkout
(pay.merot.com) for a real subscription — the cheapest, Start, is 990 MKD/month — and nothing is
issued until it completes. You only need this if you’re managing more than one company; for this
guide, Developer is enough.
Note
You can jump straight to the plan you want with ?plan=business or ?plan=vendor on the
signup URL. A duplicate e-mail address gets the same “check your e-mail” screen either way — the
console never reveals whether an address already has an account.
For the rest of this guide, assume you signed up as Developer and have a sandbox key.
2. Create a company
POST /v1/companies onboards a client company by its ЕДБ (13-digit tax number, ISO name and VAT
number come from the UJP registry lookup, never from your request body). representative is
required by the request shape, but as of this writing nothing is actually sent to that address —
a mandate-acceptance e-mail step is still wired up on the backend, so newly created companies
stay reported as status: pending_mandate indefinitely. That’s cosmetic: nothing else in this
guide checks that status, so keep going.
You can also do this from the console’s Companies page (developer.merot.com/console) if you’d rather not call the API directly — same fields, same result.
curl -X POST "https://api.efaktura.merot.com/v1/companies" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Idempotency-Key: a-unique-key-per-request" \
-H "Content-Type: application/json" \
-d '{
"taxNumber": "4012009123456",
"externalRef": "acct_8841",
"signingMode": "bridge",
"representative": {
"name": "Ана Петровска",
"email": "ana@buyer.mk"
}
}' const response = await fetch("https://api.efaktura.merot.com/v1/companies", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Idempotency-Key": "a-unique-key-per-request",
"Content-Type": "application/json",
},
body: JSON.stringify({
"taxNumber": "4012009123456",
"externalRef": "acct_8841",
"signingMode": "bridge",
"representative": {
"name": "Ана Петровска",
"email": "ana@buyer.mk"
}
}),
});
const data = await response.json();
console.log(data); import requests
response = requests.post(
"https://api.efaktura.merot.com/v1/companies",
headers={
"Authorization": "Bearer YOUR_API_KEY",
"Idempotency-Key": "a-unique-key-per-request",
"Content-Type": "application/json",
},
json={
"taxNumber": "4012009123456",
"externalRef": "acct_8841",
"signingMode": "bridge",
"representative": {
"name": "Ана Петровска",
"email": "ana@buyer.mk"
}
},
)
print(response.json()) <?php
// composer require guzzlehttp/guzzle
require 'vendor/autoload.php';
$client = new GuzzleHttp\Client();
$response = $client->request('POST', 'https://api.efaktura.merot.com/v1/companies', [
'headers' => [
'Authorization' => 'Bearer YOUR_API_KEY',
'Idempotency-Key' => 'a-unique-key-per-request',
'Content-Type' => 'application/json',
],
'json' => [
'taxNumber' => '4012009123456',
'externalRef' => 'acct_8841',
'signingMode' => 'bridge',
'representative' => [
'name' => 'Ана Петровска',
'email' => 'ana@buyer.mk',
],
],
]);
echo $response->getBody(); using System.Net.Http;
using System.Text;
using var client = new HttpClient();
using var request = new HttpRequestMessage(HttpMethod.Post, "https://api.efaktura.merot.com/v1/companies");
request.Headers.Add("Authorization", "Bearer YOUR_API_KEY");
request.Headers.Add("Idempotency-Key", "a-unique-key-per-request");
var json = /* lang=json */ @"{
""taxNumber"": ""4012009123456"",
""externalRef"": ""acct_8841"",
""signingMode"": ""bridge"",
""representative"": {
""name"": ""Ана Петровска"",
""email"": ""ana@buyer.mk""
}
}";
request.Content = new StringContent(json, Encoding.UTF8, "application/json");
using var response = await client.SendAsync(request);
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body); import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.efaktura.merot.com/v1/companies"))
.headers("Authorization", "Bearer YOUR_API_KEY", "Idempotency-Key", "a-unique-key-per-request", "Content-Type", "application/json")
.method("POST", HttpRequest.BodyPublishers.ofString(/* JSON */ "{ \"taxNumber\": \"4012009123456\", \"externalRef\": \"acct_8841\", \"signingMode\": \"bridge\", \"representative\": { \"name\": \"Ана Петровска\", \"email\": \"ana@buyer.mk\" } }"))
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body()); 3. Create a signer identity
An e-invoice is signed by a person, not by a company — UJP identifies that person by an EUJP-ID (“Единствен идентификатор на корисникот (потписник)”). You get an EUJP-ID by registering directly with UJP as an e-Faktura user (through UJP’s own eFaktura portal) — Merot does not issue or assign it, it only records the one you already have and links it to your certificate and your company.
Create the signer (once per person), then link them to the company from step 2 as its default signer:
curl https://api.efaktura.merot.com/v1/signers \
-H "Authorization: Bearer mfk_test_..." \
-H "Content-Type: application/json" \
-d '{
"fullName": "Ана Петровска",
"eujpId": "AP123456"
}'curl https://api.efaktura.merot.com/v1/company-signers \
-H "Authorization: Bearer mfk_test_..." \
-H "Content-Type: application/json" \
-H "X-Company-Id: cmp_..." \
-d '{
"signerId": "sgn_...",
"isDefault": true
}'Once Bridge has bound a certificate (step 6), find its id and activate it:
curl https://api.efaktura.merot.com/v1/signers/sgn_.../certificates \
-H "Authorization: Bearer mfk_test_..."curl -X POST https://api.efaktura.merot.com/v1/signer-certificates/cert_.../activate \
-H "Authorization: Bearer mfk_test_..."Activating is a real trust decision, not a formality — it’s the point where Merot starts treating this specific certificate as authorized to sign for this signer. The console’s Signers page does the same thing with an Activate button, if you’d rather not call the API directly.
4. Download and install Merot Bridge
Merot Bridge is the desktop app that holds your certificate and signs on your behalf — see Signing: Mode A vs Mode B for why signing never happens on Merot’s servers. Download (development builds):
- Windows (64-bit): MerotBridgeSetup.msi
- macOS, Apple Silicon (M1, M2, M3, M4 and later): MerotBridge-macos-arm64.dmg
- macOS, Intel: MerotBridge-macos-x64.dmg
Important
Windows: this is an unsigned development build — there is no versioned, code-signed release yet. Running the installer will trigger Windows SmartScreen: “Windows protected your PC.” This is expected right now, not a mistake on your part. Click More info, then Run anyway. It installs per-user, no administrator rights needed. This warning goes away once Merot ships a code-signed release — it is not something you can or need to fix yourself today.
macOS: requires macOS 15 or later. The app is signed and notarized by Apple (“Merot, Inc.”), so it opens normally. Drag Merot Bridge into Applications and open it from there. Hardware tokens (Gemalto IDPrime / SafeNet, used by KIBS and Makedonski Telekom) need the SafeNet Authentication Client for Mac, version 10.8.29 or later (universal); Telekom’s older 10.2.100 download is Intel-only and does not work with the Apple Silicon build.
Once installed, Bridge runs in the background: as a tray icon on Windows, as a menu-bar icon (no Dock icon) on macOS.
5. Pair Bridge with your account
Before pairing, make sure two-factor authentication (an authenticator app) is enabled on your console account — pairing always asks for a fresh code as a step-up check, even if you’re already signed in.
- In the console, open Signers (developer.merot.com/console) and click Pairing code. It’s disabled until you have at least one company — go back to step 2 if it’s greyed out.
- A dialog asks you to confirm with your authenticator app (enter the current 6-digit code and
click Generate pairing code). The console then shows an 8-character pairing code in two
groups of four (e.g.
ABCD-EFGH), valid for 10 minutes and usable once. - In Bridge, right-click the tray icon and choose Pair (or, if the main window is open, click
Pair with Merot; or run
merot-bridge pairfrom the command line) and type the code in. - Bridge shows a confirmation dialog with your actual tenant and company names, read from the server — not a guess. Nothing is saved until you click confirm. Once you do, Bridge generates its own device key and stores it in Windows’ protected credential store (DPAPI); the agent is now listed as connected in the console’s Signers page.
6. Select and activate a certificate
In Bridge’s main window, choose Choose certificate… for the company you paired. The picker lists every signing-capable certificate Bridge found on your connected tokens or in your certificate store — subject, expiry, and how the key is protected (hardware token, platform TPM, or software) — each with an eligibility badge.
Eligibility means qualified for production: the certificate must carry QcCompliance (a real
qualified-certificate attestation from a trust service provider). A hardware token is not
required — an ordinary software-held personal qualified certificate, the kind KIBS or Telekom
issue by default, is eligible; that requirement (QcSSCD) was dropped as of this guide’s writing.
Note
For sandbox testing specifically, the eligibility check doesn’t block you — Bridge will let you bind and sign with a non-qualified test certificate, it just shows a warning. Production signing does enforce the qualified-certificate check strictly.
Pick a certificate, click Select, then confirm in the second dialog (Bind certificate) — again, nothing is saved until you explicitly confirm. Bridge now signs for that company with this certificate until you change it.
Separately, mark it active against the signer identity from step 3 — either the console’s
Activate button on this same certificate, or the GET .../certificates +
POST .../activate calls shown there. Nothing else in this guide’s signing flow works until
this step is done: an unactivated certificate is never picked, even if Bridge itself already
trusts it.
7. Issue and check a test e-invoice
This is the exact same call as Quickstart step 2 — the difference is what happens behind it. With a real signer and certificate bound, Merot no longer signs through the simulator: it opens a signing request and waits for your own Bridge to answer it.
Important
Watch your Windows machine right after this call: Bridge will pop up a signing confirmation dialog showing exactly what’s about to be signed — document type, number, buyer, amount — and it waits for you to click Accept. This is not automatic, and it is not a bug to script around: a qualified signature has to be a deliberate act by the certificate holder on their own device. Nothing reaches UJP until someone clicks it. (An account owner can opt a specific installation into unattended writes for automated pipelines — see Signing — but that’s a separate, explicit decision, not the default.)
Once you’ve clicked Accept in Bridge, poll for the result:
Once status reaches delivered, accepted or auto_accepted, you have a real UJP euid and
qrLink — the full path worked end to end.
curl -X POST "https://api.efaktura.merot.com/v1/einvoices" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Idempotency-Key: a-unique-key-per-request" \
-H "Content-Type: application/json" \
-d '{
"clientReference": "inv-2026-000481",
"documentType": "100",
"number": "000481",
"issueDate": "2026-10-08",
"turnoverDate": "2026-10-08",
"deliveryDate": null,
"periodStart": null,
"periodEnd": null,
"notes": null,
"header": null,
"footer": null,
"buyer": {
"country": "MK",
"taxNumber": "4012009123456",
"vatNumber": null,
"name": "Купувач ДОО",
"address": {
"street": "Илинденска",
"number": "1",
"postalCode": "1000",
"city": "Скопје"
},
"subsidiaryCode": null,
"subsidiaryName": null,
"contact": null,
"email": "faktura@buyer.mk"
},
"receiver": null,
"references": [],
"payment": {
"typeCode": "P12",
"currency": "MKD",
"dueDate": "2026-11-07",
"dueDays": 30,
"terms": null,
"note": null,
"exchangeRate": null,
"exchangeRateDate": null
},
"lines": [
{
"sku": null,
"description": "Консултантски услуги — септември 2026",
"unit": "услуга",
"quantity": "1",
"unitPrice": "10000.00",
"unitDiscount": "0",
"vatPercent": "18",
"taxIndicator": "DDV-A",
"domesticProduct": null
}
],
"advance": null,
"expectedTotals": {
"net": "10000.00",
"vat": "1800.00",
"gross": "11800.00"
}
}' const response = await fetch("https://api.efaktura.merot.com/v1/einvoices", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Idempotency-Key": "a-unique-key-per-request",
"Content-Type": "application/json",
},
body: JSON.stringify({
"clientReference": "inv-2026-000481",
"documentType": "100",
"number": "000481",
"issueDate": "2026-10-08",
"turnoverDate": "2026-10-08",
"deliveryDate": null,
"periodStart": null,
"periodEnd": null,
"notes": null,
"header": null,
"footer": null,
"buyer": {
"country": "MK",
"taxNumber": "4012009123456",
"vatNumber": null,
"name": "Купувач ДОО",
"address": {
"street": "Илинденска",
"number": "1",
"postalCode": "1000",
"city": "Скопје"
},
"subsidiaryCode": null,
"subsidiaryName": null,
"contact": null,
"email": "faktura@buyer.mk"
},
"receiver": null,
"references": [],
"payment": {
"typeCode": "P12",
"currency": "MKD",
"dueDate": "2026-11-07",
"dueDays": 30,
"terms": null,
"note": null,
"exchangeRate": null,
"exchangeRateDate": null
},
"lines": [
{
"sku": null,
"description": "Консултантски услуги — септември 2026",
"unit": "услуга",
"quantity": "1",
"unitPrice": "10000.00",
"unitDiscount": "0",
"vatPercent": "18",
"taxIndicator": "DDV-A",
"domesticProduct": null
}
],
"advance": null,
"expectedTotals": {
"net": "10000.00",
"vat": "1800.00",
"gross": "11800.00"
}
}),
});
const data = await response.json();
console.log(data); import requests
response = requests.post(
"https://api.efaktura.merot.com/v1/einvoices",
headers={
"Authorization": "Bearer YOUR_API_KEY",
"Idempotency-Key": "a-unique-key-per-request",
"Content-Type": "application/json",
},
json={
"clientReference": "inv-2026-000481",
"documentType": "100",
"number": "000481",
"issueDate": "2026-10-08",
"turnoverDate": "2026-10-08",
"deliveryDate": None,
"periodStart": None,
"periodEnd": None,
"notes": None,
"header": None,
"footer": None,
"buyer": {
"country": "MK",
"taxNumber": "4012009123456",
"vatNumber": None,
"name": "Купувач ДОО",
"address": {
"street": "Илинденска",
"number": "1",
"postalCode": "1000",
"city": "Скопје"
},
"subsidiaryCode": None,
"subsidiaryName": None,
"contact": None,
"email": "faktura@buyer.mk"
},
"receiver": None,
"references": [],
"payment": {
"typeCode": "P12",
"currency": "MKD",
"dueDate": "2026-11-07",
"dueDays": 30,
"terms": None,
"note": None,
"exchangeRate": None,
"exchangeRateDate": None
},
"lines": [
{
"sku": None,
"description": "Консултантски услуги — септември 2026",
"unit": "услуга",
"quantity": "1",
"unitPrice": "10000.00",
"unitDiscount": "0",
"vatPercent": "18",
"taxIndicator": "DDV-A",
"domesticProduct": None
}
],
"advance": None,
"expectedTotals": {
"net": "10000.00",
"vat": "1800.00",
"gross": "11800.00"
}
},
)
print(response.json()) <?php
// composer require guzzlehttp/guzzle
require 'vendor/autoload.php';
$client = new GuzzleHttp\Client();
$response = $client->request('POST', 'https://api.efaktura.merot.com/v1/einvoices', [
'headers' => [
'Authorization' => 'Bearer YOUR_API_KEY',
'Idempotency-Key' => 'a-unique-key-per-request',
'Content-Type' => 'application/json',
],
'json' => [
'clientReference' => 'inv-2026-000481',
'documentType' => '100',
'number' => '000481',
'issueDate' => '2026-10-08',
'turnoverDate' => '2026-10-08',
'deliveryDate' => null,
'periodStart' => null,
'periodEnd' => null,
'notes' => null,
'header' => null,
'footer' => null,
'buyer' => [
'country' => 'MK',
'taxNumber' => '4012009123456',
'vatNumber' => null,
'name' => 'Купувач ДОО',
'address' => [
'street' => 'Илинденска',
'number' => '1',
'postalCode' => '1000',
'city' => 'Скопје',
],
'subsidiaryCode' => null,
'subsidiaryName' => null,
'contact' => null,
'email' => 'faktura@buyer.mk',
],
'receiver' => null,
'references' => [],
'payment' => [
'typeCode' => 'P12',
'currency' => 'MKD',
'dueDate' => '2026-11-07',
'dueDays' => 30,
'terms' => null,
'note' => null,
'exchangeRate' => null,
'exchangeRateDate' => null,
],
'lines' => [
[
'sku' => null,
'description' => 'Консултантски услуги — септември 2026',
'unit' => 'услуга',
'quantity' => '1',
'unitPrice' => '10000.00',
'unitDiscount' => '0',
'vatPercent' => '18',
'taxIndicator' => 'DDV-A',
'domesticProduct' => null,
],
],
'advance' => null,
'expectedTotals' => [
'net' => '10000.00',
'vat' => '1800.00',
'gross' => '11800.00',
],
],
]);
echo $response->getBody(); using System.Net.Http;
using System.Text;
using var client = new HttpClient();
using var request = new HttpRequestMessage(HttpMethod.Post, "https://api.efaktura.merot.com/v1/einvoices");
request.Headers.Add("Authorization", "Bearer YOUR_API_KEY");
request.Headers.Add("Idempotency-Key", "a-unique-key-per-request");
var json = /* lang=json */ @"{
""clientReference"": ""inv-2026-000481"",
""documentType"": ""100"",
""number"": ""000481"",
""issueDate"": ""2026-10-08"",
""turnoverDate"": ""2026-10-08"",
""deliveryDate"": null,
""periodStart"": null,
""periodEnd"": null,
""notes"": null,
""header"": null,
""footer"": null,
""buyer"": {
""country"": ""MK"",
""taxNumber"": ""4012009123456"",
""vatNumber"": null,
""name"": ""Купувач ДОО"",
""address"": {
""street"": ""Илинденска"",
""number"": ""1"",
""postalCode"": ""1000"",
""city"": ""Скопје""
},
""subsidiaryCode"": null,
""subsidiaryName"": null,
""contact"": null,
""email"": ""faktura@buyer.mk""
},
""receiver"": null,
""references"": [],
""payment"": {
""typeCode"": ""P12"",
""currency"": ""MKD"",
""dueDate"": ""2026-11-07"",
""dueDays"": 30,
""terms"": null,
""note"": null,
""exchangeRate"": null,
""exchangeRateDate"": null
},
""lines"": [
{
""sku"": null,
""description"": ""Консултантски услуги — септември 2026"",
""unit"": ""услуга"",
""quantity"": ""1"",
""unitPrice"": ""10000.00"",
""unitDiscount"": ""0"",
""vatPercent"": ""18"",
""taxIndicator"": ""DDV-A"",
""domesticProduct"": null
}
],
""advance"": null,
""expectedTotals"": {
""net"": ""10000.00"",
""vat"": ""1800.00"",
""gross"": ""11800.00""
}
}";
request.Content = new StringContent(json, Encoding.UTF8, "application/json");
using var response = await client.SendAsync(request);
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body); import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.efaktura.merot.com/v1/einvoices"))
.headers("Authorization", "Bearer YOUR_API_KEY", "Idempotency-Key", "a-unique-key-per-request", "Content-Type", "application/json")
.method("POST", HttpRequest.BodyPublishers.ofString(/* JSON */ "{ \"clientReference\": \"inv-2026-000481\", \"documentType\": \"100\", \"number\": \"000481\", \"issueDate\": \"2026-10-08\", \"turnoverDate\": \"2026-10-08\", \"deliveryDate\": null, \"periodStart\": null, \"periodEnd\": null, \"notes\": null, \"header\": null, \"footer\": null, \"buyer\": { \"country\": \"MK\", \"taxNumber\": \"4012009123456\", \"vatNumber\": null, \"name\": \"Купувач ДОО\", \"address\": { \"street\": \"Илинденска\", \"number\": \"1\", \"postalCode\": \"1000\", \"city\": \"Скопје\" }, \"subsidiaryCode\": null, \"subsidiaryName\": null, \"contact\": null, \"email\": \"faktura@buyer.mk\" }, \"receiver\": null, \"references\": [], \"payment\": { \"typeCode\": \"P12\", \"currency\": \"MKD\", \"dueDate\": \"2026-11-07\", \"dueDays\": 30, \"terms\": null, \"note\": null, \"exchangeRate\": null, \"exchangeRateDate\": null }, \"lines\": [ { \"sku\": null, \"description\": \"Консултантски услуги — септември 2026\", \"unit\": \"услуга\", \"quantity\": \"1\", \"unitPrice\": \"10000.00\", \"unitDiscount\": \"0\", \"vatPercent\": \"18\", \"taxIndicator\": \"DDV-A\", \"domesticProduct\": null } ], \"advance\": null, \"expectedTotals\": { \"net\": \"10000.00\", \"vat\": \"1800.00\", \"gross\": \"11800.00\" } }"))
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body()); curl -X GET "https://api.efaktura.merot.com/v1/einvoices/einv_123" \
-H "Authorization: Bearer YOUR_API_KEY" const response = await fetch("https://api.efaktura.merot.com/v1/einvoices/einv_123", {
method: "GET",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
},
});
const data = await response.json();
console.log(data); import requests
response = requests.get(
"https://api.efaktura.merot.com/v1/einvoices/einv_123",
headers={
"Authorization": "Bearer YOUR_API_KEY",
},
)
print(response.json()) <?php
// composer require guzzlehttp/guzzle
require 'vendor/autoload.php';
$client = new GuzzleHttp\Client();
$response = $client->request('GET', 'https://api.efaktura.merot.com/v1/einvoices/einv_123', [
'headers' => [
'Authorization' => 'Bearer YOUR_API_KEY',
],
]);
echo $response->getBody(); using System.Net.Http;
using System.Text;
using var client = new HttpClient();
using var request = new HttpRequestMessage(HttpMethod.Get, "https://api.efaktura.merot.com/v1/einvoices/einv_123");
request.Headers.Add("Authorization", "Bearer YOUR_API_KEY");
using var response = await client.SendAsync(request);
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body); import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.efaktura.merot.com/v1/einvoices/einv_123"))
.headers("Authorization", "Bearer YOUR_API_KEY")
.method("GET", HttpRequest.BodyPublishers.noBody())
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body()); Next steps
- Signing: Mode A vs Mode B — how the signing-request protocol works, and unattended writes for automated pipelines.
- Merot Bridge — what Bridge does and how it’s distributed.
- Webhooks — get notified on status changes instead of polling.
- Postman collection — run every step of this guide from Postman.
- Sandbox — the simulator backend this guide’s companies aren’t using.
- Full API reference — every endpoint, field and error.