Skip to main content
A Verified Closing Room is one shareable page per transaction that bundles the deal’s orders — documents, signers, notarization, shipping — with live status and verifiable evidence links. You create the room with your partner key, attach the orders whose public codes you hold, and hand every party the same link. Statuses are read live from the order records on every view, never replayed from events.
The room link is a bearer credential. One link grants deal-wide visibility: every attached document’s status, masked signer progress, evidence badges, tracking, and drill-down into each order page. Share it with the parties to the deal and no one else; never post or embed it anywhere public. If a link leaks, rotate it — the old link stops working immediately.
All partner routes below require your key (Authorization: Bearer sss_pk_...) and share the partner-write limit of 60 requests per minute per key. The public room view is rate limited at 30 requests per minute per IP. See authentication.

Create a room

POST /api/rooms Room creation enforces your tier’s active-room quota (trial and PartnerLink: 5 open rooms; ProOffice: 25; ClosingDesk: unlimited).
name
string
required
Display name for the room, 1–200 characters. Shown to every party who opens the link — a property address or matter name works well.
reference
string
Your internal file number, at most 200 characters. Displayed on the room page.
curl -X POST https://signsealship.com/api/rooms \
  -H "Authorization: Bearer sss_pk_your_key" \
  -H "Content-Type: application/json" \
  -d '{ "name": "1428 Maple St — Refinance", "reference": "TC-88412" }'
const res = await fetch("https://signsealship.com/api/rooms", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.SSS_PARTNER_KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    name: "1428 Maple St — Refinance",
    reference: "TC-88412",
  }),
});
const room = await res.json();
console.log(`https://signsealship.com${room.roomUrl}`);
import os
import requests

res = requests.post(
    "https://signsealship.com/api/rooms",
    headers={"Authorization": f"Bearer {os.environ['SSS_PARTNER_KEY']}"},
    json={"name": "1428 Maple St — Refinance", "reference": "TC-88412"},
)
room = res.json()
print(f"https://signsealship.com{room['roomUrl']}")
roomCode
string
The room’s bearer code — 40 lowercase hex characters, minted from a CSPRNG. This is the credential in the room link.
roomUrl
string
Root-relative path to the shareable page, /rooms/{roomCode}. Prefix it with https://signsealship.com before sharing.
name
string
The room name, as stored.
reference
string
Your reference, or null.
status
string
"open" on creation.
createdAt
string
ISO 8601 creation time.
200 OK
{
  "roomCode": "3f1c9a7e5b2d8c4a6e0f9b1d3a5c7e9f2b4d6a8c",
  "roomUrl": "/rooms/3f1c9a7e5b2d8c4a6e0f9b1d3a5c7e9f2b4d6a8c",
  "name": "1428 Maple St — Refinance",
  "reference": "TC-88412",
  "status": "open",
  "createdAt": "2026-07-12T18:04:11+00:00"
}
Errors: 400 with {"error": "A room name (1–200 chars) is required."} for a missing or oversized name, or a quota message such as "Active-room quota reached (5 open rooms on the None tier). Close a room or upgrade your plan to create more."

List your rooms

GET /api/rooms Returns your own rooms only, newest first.
curl https://signsealship.com/api/rooms \
  -H "Authorization: Bearer sss_pk_your_key"
const res = await fetch("https://signsealship.com/api/rooms", {
  headers: { Authorization: `Bearer ${process.env.SSS_PARTNER_KEY}` },
});
const { rooms } = await res.json();
import os
import requests

rooms = requests.get(
    "https://signsealship.com/api/rooms",
    headers={"Authorization": f"Bearer {os.environ['SSS_PARTNER_KEY']}"},
).json()["rooms"]
rooms
array
One summary per room.

Attach an order

POST /api/rooms/{roomCode}/orders Attach authorization is possession of the order’s public code: a partner who holds the code may bind that order to their room. Attaching is idempotent — re-attaching an already attached order succeeds with alreadyAttached: true. A room holds at most 50 orders.
roomCode
string
required
Your room’s code.
orderCode
string
required
The order’s public code, 24–64 characters.
label
string
A display label for the document card (for example “Seller deed package”).
curl -X POST https://signsealship.com/api/rooms/{roomCode}/orders \
  -H "Authorization: Bearer sss_pk_your_key" \
  -H "Content-Type: application/json" \
  -d '{ "orderCode": "the-orders-public-code", "label": "Seller deed package" }'
const res = await fetch(
  `https://signsealship.com/api/rooms/${roomCode}/orders`,
  {
    method: "POST",
    headers: {
      Authorization: `Bearer ${process.env.SSS_PARTNER_KEY}`,
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
      orderCode: "the-orders-public-code",
      label: "Seller deed package",
    }),
  },
);
import os
import requests

res = requests.post(
    f"https://signsealship.com/api/rooms/{room_code}/orders",
    headers={"Authorization": f"Bearer {os.environ['SSS_PARTNER_KEY']}"},
    json={"orderCode": "the-orders-public-code", "label": "Seller deed package"},
)
ok
boolean
true on success.
alreadyAttached
boolean
true when the order was already in the room (the call is a no-op).
Errors: 400 {"error": "A valid orderCode is required."} (bad length), 400 {"error": "A room holds at most 50 orders."}, 404 {"error": "Room not found."} or {"error": "Order not found."} — unknown codes read as a generic not-found.

Detach an order

DELETE /api/rooms/{roomCode}/orders/{orderCode}
roomCode
string
required
Your room’s code.
orderCode
string
required
The attached order’s public code.
curl
curl -X DELETE https://signsealship.com/api/rooms/{roomCode}/orders/{orderCode} \
  -H "Authorization: Bearer sss_pk_your_key"
Returns {"ok": true}, or 404 with {"error": "Room not found."}, {"error": "Order not found."}, or {"error": "That order is not in this room."}. POST /api/rooms/{roomCode}/rotate Reissues the room’s bearer code. Every previously shared room link dies instantly — this is the mitigation for a leaked or over-shared link. The public view is served with Cache-Control: no-store, so a rotated code dies at every cache layer too.
roomCode
string
required
The room’s current code. It stops working the moment this call returns.
curl -X POST https://signsealship.com/api/rooms/{roomCode}/rotate \
  -H "Authorization: Bearer sss_pk_your_key"
const res = await fetch(
  `https://signsealship.com/api/rooms/${roomCode}/rotate`,
  {
    method: "POST",
    headers: { Authorization: `Bearer ${process.env.SSS_PARTNER_KEY}` },
  },
);
const { roomCode: newCode, roomUrl } = await res.json();
import os
import requests

res = requests.post(
    f"https://signsealship.com/api/rooms/{room_code}/rotate",
    headers={"Authorization": f"Bearer {os.environ['SSS_PARTNER_KEY']}"},
)
new_code = res.json()["roomCode"]
roomCode
string
The new bearer code. Update every place you shared the old link.
roomUrl
string
Root-relative path with the new code, /rooms/{roomCode}.
Returns 404 {"error": "Room not found."} for a code that is not one of your rooms.
Per-party scoped links (separate credentials per participant) are on the roadmap; today one room has one link.

Read the room (public)

GET /api/rooms/{roomCode} Public read by possession of the room code — no API key, no account. This is the same live JSON the room page at /rooms/{roomCode} renders, for your own systems. Codes outside the 24–64 character gate and unknown codes both return an empty 404. Responses are Cache-Control: no-store. Statuses are database truth read at request time. Evidence badges never claim more than the record holds.
roomCode
string
required
The room’s bearer code, 24–64 characters.
curl https://signsealship.com/api/rooms/{roomCode}
const res = await fetch(`https://signsealship.com/api/rooms/${roomCode}`);
if (res.ok) {
  const room = await res.json();
  console.log(room.progress); // { total, signed, sealed, delivered }
}
import requests

res = requests.get(f"https://signsealship.com/api/rooms/{room_code}")
if res.ok:
    room = res.json()
    print(room["progress"])

Response shape

roomCode
string
The room’s bearer code.
name
string
Room name.
reference
string
The partner’s file reference, or null.
status
string
Room status, "open" by default.
partnerName
string
The name of the partner firm that owns the room.
branding
object
The partner’s public branding, or null when none is set. Rendered as attribution (“Presented by …”) beside the permanent SignSealShip mark — never replacing it.
progress
object
The progress strip, counted from the order cards below.
orders
array
One card per attached order, in attach order.
activity
array
Merged timeline across all attached orders — up to 100 items, newest first, derived from an explicit allowlist of audit actions: order.created, order.transition, order.claimed, order.cancelled, signing_link.issued, room.order_attached. No recipient identifiers or actor details are ever included.
passport
object
The room’s latest Closing Passport, or null until one is sealed. This is only a pointer — verification always goes through the public verify surface, which recomputes the chain.
createdAt
string
ISO 8601 room creation time.
updatedAt
string
ISO 8601 time of the last room change.
200 OK (abridged)
{
  "roomCode": "3f1c9a7e5b2d8c4a6e0f9b1d3a5c7e9f2b4d6a8c",
  "name": "1428 Maple St — Refinance",
  "reference": "TC-88412",
  "status": "open",
  "partnerName": "Maple Title Co.",
  "branding": {
    "brandName": "Maple Title",
    "accentColor": "#16285a",
    "logoUrl": "https://storage.googleapis.com/.../branding/.../logo.png"
  },
  "progress": { "total": 2, "signed": 1, "sealed": 1, "delivered": 0 },
  "orders": [
    {
      "orderCode": "an-order-public-code",
      "label": "Seller deed package",
      "status": "NotarizationComplete",
      "statusGroup": "notarized",
      "services": { "sign": true, "notarize": true, "ship": true },
      "signers": [
        { "email": "d***@m***.com", "name": "Dana Reyes", "routingOrder": 1, "signed": true }
      ],
      "evidenceBadge": "sealed",
      "verifyCode": "abcdefghijklmnopqrstuvwxyz",
      "trackingNumber": null,
      "carrier": null,
      "attachedAt": "2026-07-12T18:10:02+00:00"
    }
  ],
  "activity": [
    {
      "orderCode": "an-order-public-code",
      "action": "order.transition",
      "fromStatus": "NotarizationPending",
      "toStatus": "NotarizationComplete",
      "occurredAt": "2026-07-12T19:22:40+00:00"
    }
  ],
  "passport": {
    "version": 1,
    "verifyCode": "zyxwvutsrqponmlkjihgfedcba",
    "createdAt": "2026-07-12T20:01:00+00:00"
  },
  "createdAt": "2026-07-12T18:04:11+00:00",
  "updatedAt": "2026-07-12T19:22:40+00:00"
}