SnapPact Business — Dokumentation

Vertrag erzeugen und als QR-Code anzeigen — z.B. auf einem Tablet im Shop, oder per API aus eurem eigenen System.

Inhalt
  1. Wie es funktioniert
  2. Anwendungsfälle
  3. Authentifizierung
  4. Vertrag erstellen
  5. QR-Code anzeigen
  6. Status abfragen
  7. Webhook
  8. Code-Beispiele
  9. Fehlercodes
  10. Verfügbare Vorlagen
  11. Vorlagen über die API befüllen (je Feldtyp)
  12. Einstellungen im Detail
  13. Web-Weg verstehen

Wie es funktioniert

Ihr erzeugt einen Vertrag über die Business-API und bekommt sofort einen QR-Code zurück. Eure Kundschaft scannt ihn mit der normalen SnapPact-App und unterschreibt dort ganz regulär — Face ID/Touch ID/Fingerabdruck, echte fortgeschrittene elektronische Signatur (FES). Ihr müsst selbst nichts signieren oder prüfen, das übernimmt SnapPact komplett.

1
Vertrag erzeugenPOST /business/contracts mit Vorlage + euren Angaben
2
QR-Code anzeigenfertiges PNG einbetten oder qrValue selbst rendern — 5 Minuten gültig
3
Kundschaft scannt & signiertläuft komplett in der SnapPact-App, ihr müsst nichts tun
4
Status abfragen oder WebhookGET /business/contracts/:id pollen, oder Webhook-URL hinterlegen und benachrichtigt werden

Anwendungsfälle

🏪
Ladengeschäft / KassensystemDieses Portal auf einem Tablet an der Kasse offen lassen — Vorlage wählen, QR zeigen, fertig. Kein eigener Code nötig.
🖥️
Eigenes POS/KassensystemDirekter API-Call bei Vertragsabschluss, QR-Code auf dem eigenen Bildschirm/Bondrucker anzeigen statt dieses Portal zu nutzen.
🛒
Webshop-CheckoutBei Bestellabschluss automatisch einen Vertrag erzeugen (z.B. AGB-Zusatzvereinbarung, Ratenkauf) und den QR-Code oder Link per E-Mail an die Kundschaft schicken.
📊
Buchhaltung/HR-SystemFreelancer-Werkverträge oder NDAs automatisch aus eurem bestehenden System heraus erzeugen, sobald ein neuer Auftrag angelegt wird.

Authentifizierung

Jeder Aufruf braucht den Header X-Business-Key mit eurem Schlüssel (erstellbar hier im Business-Portal unter "API-Zugriff" oder in der SnapPact-App unter Profil → Business → API-Zugriff — beides verwaltet dieselben Schlüssel). Schlüssel niemals im Frontend/Client-seitigen Code eurer eigenen Website verwenden — nur serverseitig aufrufen.

1. Vertrag erstellen

curl -X POST https://api.snappact.ortino.tech/business/contracts \
  -H "X-Business-Key: sk_business_..." \
  -H "Content-Type: application/json" \
  -d '{
    "templateId": "tpl-goods-sale",
    "initiatorName": "Muster GmbH",
    "values": {
      "item_description": "iPhone 14 Pro, 256GB, Space Schwarz",
      "price": "1500",
      "known_defects": "Keine bekannten Mängel"
    }
  }'
{
  "contractId": "ctr_...",
  "qrValue": "snappact://handshake/<token>",
  "qrImageUrl": "/business/contracts/ctr_.../qr.png",
  "sessionToken": "<token>",
  "expiresAt": "2026-09-22T18:35:00.000Z"
}

qrValue zeigt auf snappact://handshake/<token> (App-Scan) ODER auf eine Web-Adresse (https://sign.snappact.ortino.tech/h/<token>, scannbar mit der normalen Handy-Kamera, kein App-Download nötig) — je nachdem, ob der Web-Weg für dieses Konto wirksam ist ("Web-Weg"-Einstellung in diesem Portal). Welcher der beiden Fälle gerade gilt, steht nicht in dieser Antwort, aber ihr müsst nichts unterscheiden: beide Werte sind gültige, direkt scannbare QR-Inhalte, die zum selben Vertrag führen.

values ist nur für Felder optional, die laut Vorlage NICHT euch (der initiierenden Seite) als Pflichtfeld zugewiesen sind. Ist ein Feld für euch Pflicht (assignedTo: 'initiator', required: true — bei den meisten Vorlagen der Fall, siehe Beispiel oben mit drei Pflichtfeldern — oder assignedTo: 'either', required: true, siehe unten), lehnt der Server die Anfrage ohne diesen Wert mit 400 required_fields_missing ab (welche Feld-IDs fehlen, steht im Feld fields der Fehlerantwort). Felder, die ausdrücklich der Gegenpartei zugewiesen sind, dürft ihr dagegen nicht vorbefüllen (der Server lehnt das mit 409 value_not_assigned_to_you ab) — die trägt die Gegenpartei selbst in der App ein. Welche Felder eine Vorlage hat und wem sie zugewiesen sind, liefert GET /templates bzw. GET /business/templates mit (siehe "Verfügbare Vorlagen" unten).

Felder mit assignedTo: 'either' gehören bei Business-Verträgen euch. Ihr unterschreibt selbst nie — die Gegenpartei schliesst allein ab. Damit sie eure Bedingungen (z.B. "Weitere Vereinbarungen") vor ihrer Unterschrift nicht umschreiben kann, sind 'either'-Felder mit dem Anlegen fixiert: nur ihr setzt sie, und zwar in diesem Aufruf (ein 'either'-Feld mit required: true müsst ihr deshalb schon hier mitschicken). Was ihr leer lasst, bleibt leer — die Gegenpartei kann es weder in der App noch im Web nachtragen oder ändern (value_not_assigned_to_you). Ebenso stellt nur ihr neue QR-Codes aus (POST /business/contracts/:id/session); die Gegenpartei kann keine weiteren Personen einladen.

2. QR-Code anzeigen

Zwei Wege — beide zeigen denselben Code, beide laufen serverseitig (der Business-Key bleibt dabei dort, nie im Browser eurer Endkund:innen):

3. Status abfragen

curl https://api.snappact.ortino.tech/business/contracts/ctr_... \
  -H "X-Business-Key: sk_business_..."
Jeder Schlüssel sieht nur seine eigenen Verträge. Status, QR-Bild, neue QR-Session, Reservierungen aufheben und die Liste GET /business/contracts?recent=… gelten nur für Verträge, die mit genau diesem Schlüssel erzeugt wurden — einen Vertrag eines anderen Schlüssels desselben Kontos beantwortet die API mit 404. Tauscht ihr einen Schlüssel aus (Widerruf, Ablauf), sind die mit dem alten Schlüssel erzeugten Verträge über die API also nicht mehr abrufbar; im Business-Portal unter "Verträge" seht ihr als Kontoinhaber:in weiterhin alle Verträge des Kontos.
StatusBedeutung
awaiting_counterpartyNoch keine Unterschrift. Achtung: der Status bleibt auch NACH dem Scannen bzw. Beitritt der Gegenpartei unverändert, bis die erste Unterschrift vorliegt — ob schon jemand beigetreten ist, zeigt partyCount in derselben Antwort (ab 2 ist die Gegenpartei beigetreten), ob schon unterschrieben wurde, signatureCount
ready_to_signAlle nötigen Unterschriften liegen vor, Versiegelung steht noch aus — der häufigste Zwischenzustand bei Business-Verträgen
partially_signedGegenpartei beigetreten, unterschreibt gerade (nur, wenn mehrere Unterschriften nötig sind)
sealedFertig — rechtsverbindlich signiert und versiegelt
declinedGegenpartei hat abgelehnt — Endzustand, der Vertrag kommt nicht mehr zustande
cancelledVertrag wurde storniert — Endzustand

4. Webhook (optional, spart das Pollen)

Beim Erstellen eines API-Schlüssels eine Webhook-URL hinterlegen — SnapPact schickt dann automatisch einen POST mit { contractId, status, sealedAt, documentHash }, sobald der Vertrag versiegelt ist. Die Benachrichtigung geht an die URL genau des Schlüssels, mit dem der Vertrag erzeugt wurde.

Die URL muss https sein, auf ein öffentlich erreichbares Ziel zeigen und darf keine Zugangsdaten enthalten (https://benutzer:passwort@… wird mit 400 invalid_webhook_url abgelehnt — für eine Absicherung stattdessen die Signatur unten prüfen oder ein Geheimnis in den Pfad legen). Weiterleitungen (30x) werden nicht verfolgt, und nach 5 Sekunden ohne Antwort bricht SnapPact ab.

Signatur prüfen (empfohlen) — jede Zustellung trägt den Header X-SnapPact-Signature: sha256=<hex>. Das ist ein HMAC-SHA256 über den rohen Request-Body (die Bytes genau so, wie sie ankommen — nicht über ein neu serialisiertes JSON-Objekt). Als Geheimnis dient der SHA-256-Hex-Hash eures eigenen Business-Schlüssels: secret = sha256("sk_business_…"). SnapPact gibt dafür bewusst kein zusätzliches Secret aus: diesen Wert könnt ihr aus dem Schlüssel, den ihr ohnehin habt, jederzeit selbst berechnen, während er nirgends über die API ausgeliefert wird.

import crypto from 'node:crypto';

// WICHTIG: den ROHEN Body verwenden, z.B. express.raw({ type: 'application/json' })
app.post('/snappact-webhook', express.raw({ type: 'application/json' }), (req, res) => {
  const secret = crypto.createHash('sha256').update(process.env.SNAPPACT_BUSINESS_KEY).digest('hex');
  const erwartet = 'sha256=' + crypto.createHmac('sha256', secret).update(req.body).digest('hex');
  const erhalten = req.get('X-SnapPact-Signature') || '';

  const a = Buffer.from(erwartet);
  const b = Buffer.from(erhalten);
  if (a.length !== b.length || !crypto.timingSafeEqual(a, b)) return res.sendStatus(401);

  const { contractId, status, sealedAt, documentHash } = JSON.parse(req.body.toString('utf8'));
  res.sendStatus(204);
});

Ohne diese Prüfung kann jede und jeder, der die Webhook-URL kennt (z.B. aus einem Proxy-Log), gefälschte Benachrichtigungen schicken, die aussehen wie von SnapPact. Widerruft ihr einen Schlüssel und legt einen neuen an, ändert sich damit auch das Signatur-Geheimnis.

Code-Beispiele

Node.js

const res = await fetch('https://api.snappact.ortino.tech/business/contracts', {
  method: 'POST',
  headers: {
    'X-Business-Key': process.env.SNAPPACT_BUSINESS_KEY,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    templateId: 'tpl-goods-sale',
    initiatorName: 'Muster GmbH',
    values: {
      item_description: 'iPhone 14 Pro, 256GB, Space Schwarz',
      price: '1500',
      known_defects: 'Keine bekannten Mängel',
    },
  }),
});
const { contractId, qrImageUrl } = await res.json();

Python

import requests

res = requests.post(
    "https://api.snappact.ortino.tech/business/contracts",
    headers={"X-Business-Key": SNAPPACT_BUSINESS_KEY},
    json={
        "templateId": "tpl-goods-sale",
        "initiatorName": "Muster GmbH",
        "values": {
            "item_description": "iPhone 14 Pro, 256GB, Space Schwarz",
            "price": "1500",
            "known_defects": "Keine bekannten Mängel",
        },
    },
)
contract = res.json()

Fehlercodes

StatusBedeutung
400Ungültige Anfrage — z.B. invalid_request (Schema), unknown_field, required_fields_missing, reserved_display_name, value_too_long (ein Positionsfeld-Wert überschreitet die Längengrenze) oder invalid_line_items (Positionsliste strukturell ungültig, z.B. mehr als 30 Positionen oder eine fehlende Pflichtangabe je Position)
401Business-Key fehlt oder ungültig (missing_business_key, invalid_business_key, business_key_expired)
402purchase_required — kostenpflichtige Vorlage, für dieses Konto noch nicht freigeschaltet
403Abo nicht aktiv (subscription_inactive), Konto gesperrt (account_suspended), AGB nicht zugestimmt (terms_not_accepted), zu niedrige Vertrauensstufe (trust_level_required) oder fremder Vertrag (forbidden)
404Vorlage oder Vertrag nicht gefunden — auch für eine Vorlage, die für Business-Verträge nicht nutzbar ist (z.B. eine fremde Community-Vorlage, siehe "Verfügbare Vorlagen"), und für einen Vertrag, den ein anderer Schlüssel eures Kontos erzeugt hat (siehe "Status abfragen")
409 contract_full (max. Anzahl Parteien erreicht), contract_closed (abgelehnt/storniert/versiegelt) oder contract_locked_by_signature (ab der ersten Unterschrift ist die Parteienliste eingefroren) — alle drei endgültig für diesen Vertrag.
value_not_assigned_to_you: ein Wert in values gehört laut Vorlage der Gegenpartei (assignedTo: 'counterparty') — siehe Hinweis bei Schritt 1 oben, dieses Feld leer lassen.
no_active_session: für diesen Vertrag läuft gerade keine QR-Session — per POST /business/contracts/:id/session eine neue erzeugen.
audit_trail_full: die Ereignis-Obergrenze dieses Vertrags ist erreicht (Schutz gegen unbegrenztes Wachstum bei wiederholtem Erneuern). Hier hilft nur ein neuer Vertrag — POST /business/contracts/:id/session nicht in einer Schleife aufrufen, sondern erst, wenn wirklich jemand einen neuen QR-Code braucht.
offer_expired: das Angebot dieses Vertrags ist abgelaufen (sein Gültigkeitsdatum ist überschritten) — für diesen Vertrag lässt sich kein neuer QR-Code mehr erzeugen, endgültig. Hier hilft nur ein neuer Vertrag.
session_token_collision: sehr seltener, vorübergehender Konflikt beim Erzeugen des QR-Codes (POST /business/contracts oder POST /business/contracts/:id/session). Es wurde nichts angelegt oder geändert — dieselbe Anfrage einfach unverändert wiederholen.
410session_expired — der QR-Code ist älter als 5 Minuten. Per POST /business/contracts/:id/session eine neue Session erzeugen, statt einen neuen Vertrag anzulegen
429rate_limited — zu viele Anfragen, kurz warten

Verfügbare Vorlagen

Alle öffentlichen Vorlagen samt ID über GET /templates abrufbar (keine Authentifizierung nötig). Nicht jede davon ist für Business-Verträge nutzbar: Community-Vorlagen (badge: 'community') kann ihre Autor:in jederzeit umschreiben — da ihr selbst nie unterschreibt und die Gegenpartei allein abschliesst, würde sie so an einen Text gebunden, den weder ihr noch SnapPact geprüft habt. POST /business/contracts lehnt Community-Vorlagen deshalb mit 404 template_not_found ab, ausser es sind eure eigenen. Nutzbar sind SnapPact-eigene, geprüfte Vorlagen, "business-only"-Vorlagen und eure eigenen Vorlagen. Genau diese Menge liefert die Business-Liste (GET /business/templates, siehe unten), die auch das QR-Code-Werkzeug im Portal anbietet. Jede Vorlage enthält fields mit id, label, type, required und assignedTo ('initiator'/'counterparty'/'either') — genau diese Liste bestimmt, welche Werte ihr in values mitschicken müsst bzw. dürft (siehe Schritt 1 oben; 'either' gehört bei Business-Verträgen euch).

curl https://api.snappact.ortino.tech/business/templates \
  -H "X-Business-Key: sk_business_..."

GET /business/templates (mit eurem X-Business-Key) liefert genau die Vorlagen, aus denen ihr Verträge anlegen könnt — auch eure eigenen, noch nicht veröffentlichten Vorlagen-Entwürfe sowie kuratierte "business-only"-Vorlagen (für jedes Business-Konto nutzbar, im öffentlichen Marktplatz nicht sichtbar), aber keine fremden Community-Vorlagen. Nützlich, um die Feldliste einer Vorlage programmatisch abzufragen, statt sie hier in der Doku nachzuschlagen. Das Feld origin sagt, woher eine Vorlage stammt: 'snappact' (SnapPact-eigene, geprüfte Vorlage), 'business_only' (kuratierte Business-Vorlage) oder 'own' (eure eigene Vorlage, Entwurf oder selbst veröffentlicht); badge enthält zusätzlich die Kennzeichnung der Vorlage selbst.

Vorlagen über die API befüllen (je Feldtyp)

Jedes Feld einer Vorlage (aus GET /templates bzw. GET /business/templates) hat ein type — das bestimmt, welche Art von Wert in values[fieldId] erwartet wird. Wichtig zu wissen: in Contract.values ist jeder Wert technisch ein String (auch eine Zahl oder ein Datum) — der Server prüft die meisten Typen NICHT auf ein bestimmtes Format (nur Länge und ob sie zur richtigen Seite gehören, siehe "Vertrag erstellen" oben). Die untenstehenden Formate sind deshalb Empfehlungen, damit euer Wert in der SnapPact-App genauso aussieht, wie es eure Kundschaft erwartet — mit einer einzigen Ausnahme, die wirklich streng geprüft wird: lineItems.

TypErwarteter Wert
textBeliebiger kurzer Text, z.B. "Muster GmbH".
longtextLängerer Fliesstext, z.B. eine Leistungsbeschreibung. Zeilenumbrüche sind erlaubt (\n im JSON).
numberZahl als String, z.B. "12". Kein Tausendertrennzeichen, Punkt statt Komma für Nachkommastellen.
currencyGeldbetrag als String ohne Währungssymbol, z.B. "1500" oder "1500.50". Die Währung selbst steht auf der Vorlage (contractCurrency), nicht im Feldwert.
percentZahl als String ohne %-Zeichen, z.B. "7.7" für 7,7%.
dateEmpfohlen: ISO-Format "2026-09-29" (JJJJ-MM-TT) — die App zeigt es unabhängig vom Eingabeformat in der App-Sprache an, ein eindeutiges Format vermeidet Verwechslungen zwischen Tag und Monat.
emailEine E-Mail-Adresse, z.B. "kundin@example.ch". Wird nicht auf Gültigkeit geprüft — eine offensichtlich falsche Adresse lehnt der Server nicht ab, sie erscheint einfach so im Dokument.
phoneTelefonnummer als Text, z.B. "+41 79 123 45 67". Empfohlen: mit Ländervorwahl, damit sie unabhängig vom Land eurer Kundschaft eindeutig bleibt.
ibanIBAN als Text, mit oder ohne Leerzeichen, z.B. "CH93 0076 2011 6238 5295 7".
addressAdresse als ein einzelner Text (kein strukturiertes Objekt mit Strasse/PLZ/Ort getrennt), z.B. "Bahnhofstrasse 1, 8001 Zürich".
checkboxGenau der String "true" für angehakt, oder ein leerer String "" für nicht angehakt — kein echter JSON-Boolean (true/false ohne Anführungszeichen wird abgelehnt, da values als reine String-Map definiert ist).
lineItems Einzige strukturell geprüfte Ausnahme. Der Wert ist selbst wieder ein JSON-String (ein String, dessen Inhalt gültiges JSON ist), der zu einem Array aus Objekten wird:
values: {
  positions: JSON.stringify([
    { description: "Beratung", quantity: 2, unit: "Std.", unitPrice: 150 },
    { description: "Material", quantity: 1, unitPrice: 45.50 },
  ])
}
description (Pflicht, max. 120 Zeichen), quantity (Pflicht, positive Zahl), unit (optional, max. 20 Zeichen, z.B. "Std.", "m²", "Stk."), unitPrice (Pflicht, nie negativ, max. 2 Nachkommastellen — 85.126 wird mit 400 invalid_line_items abgelehnt statt auf 85.13 gerundet, damit nie ein anderer Betrag im unterschriebenen Dokument steht als eingegeben). Höchstens 30 Positionen. Die Gesamtsumme berechnet SnapPact automatisch, sie gehört nicht in den Wert.
Welche Felder eine konkrete Vorlage tatsächlich hat und mit welchem Typ, verrät immer nur GET /templates/<id> bzw. die Feldliste in GET /business/templates — die Tabelle oben ist eine Formatreferenz, keine Liste, welche Felder es gibt.

Einstellungen im Detail

Jede Einstellung im Portal — was sie bewirkt, wann ihr sie ändern solltet, und warum sie so und nicht anders funktioniert.

Eine Portal-Anmeldung bleibt 12 Stunden gültig (z.B. für ein Tablet an der Kasse). Dauerhafte Änderungen am Konto — API-Schlüssel erstellen oder widerrufen, Firmenname, Akzentfarbe, Web-Weg-Schalter, Logo — sowie der Export aller Verträge (CSV/JSON/ZIP, enthält alle Kundendaten) verlangen aber eine Anmeldung, die höchstens 30 Minuten zurückliegt. Ist sie älter, fordert das Portal zur erneuten Anmeldung bei ortino.AUTH auf; QR-Codes erzeugen und Verträge einzeln ansehen geht ohne. Ob ortino.AUTH dabei das Passwort erneut abfragt oder bei einer dort noch offenen Sitzung eine Bestätigung genügt, entscheidet ortino.AUTH — meldet euch am geteilten Tablet deshalb nach getaner Arbeit auch bei ortino.AUTH ab.

API-Schlüssel — Bezeichnung

Was: Ein frei gewählter Name für euren Schlüssel (z.B. "Kassensystem Filiale Zürich").

Wann ändern: Beim Erstellen festlegen — hilfreich, sobald ihr mehr als einen Schlüssel habt (z.B. einen je Filiale oder System), damit ihr in der Liste seht, welcher welcher ist.

Warum: Rein zu eurer eigenen Orientierung. SnapPact wertet den Namen nicht aus — er hat keine Funktion ausser der Anzeige in der Liste.

API-Schlüssel — Gültigkeit

Was: Ein hier im Portal erstellter Schlüssel läuft nach 90 Tagen automatisch ab (danach antwortet die API mit 401 business_key_expired); das Ablaufdatum steht in der Schlüsselliste. Ein in der SnapPact-App erstellter Schlüssel ist unbefristet.

Wann beachten: Wenn eine dauerhafte Integration (Kassensystem, Webshop) mit einem Portal-Schlüssel läuft — rechtzeitig einen neuen erstellen und austauschen, oder den Schlüssel gleich in der App anlegen.

Warum: Das Portal ist auch für ein geteiltes Tablet an der Kasse gedacht, an dem im Laufe des Tages andere Personen die offene Seite bedienen können. Ein dort unbemerkt erstellter Schlüssel soll nicht für immer gültig bleiben. Zusätzlich schickt SnapPact bei jeder Schlüssel-Erstellung im Portal eine Mitteilung an die SnapPact-App des Kontos (lässt sich nicht abbestellen) — kommt sie unerwartet, den Schlüssel unter "API-Zugriff" widerrufen.

Bei jeder Anmeldung prüfen: Die Mitteilung erreicht nur Geräte, auf denen die SnapPact-App mit diesem Konto angemeldet ist — wer nur im Portal arbeitet (z.B. am Tablet an der Kasse), bekommt sie nicht, und auch sonst ist die Zustellung einer Mitteilung nie garantiert. Prüft deshalb nach jeder Anmeldung unter "API-Zugriff" die Schlüsselliste auf Schlüssel, die seit eurer letzten Anmeldung im Portal erzeugt wurden (Datum "Erstellt"), und widerruft jeden, den ihr nicht selbst erstellt habt.

API-Schlüssel — Webhook-URL

Was: Eine Adresse eures eigenen Systems, an die SnapPact automatisch meldet, sobald ein mit diesem Schlüssel erzeugter Vertrag versiegelt wird.

Wann setzen: Wenn euer System den Abschluss eines Vertrags SOFORT mitbekommen soll (z.B. um eine Bestellung freizugeben), ohne selbst wiederholt nachzufragen (Pollen). Wann leer lassen: Wenn ihr stattdessen selbst per GET /business/contracts/:id abfragt, oder nur das Portal nutzt (das QR-Werkzeug braucht keinen Webhook).

Warum diese Regeln: Muss https sein (kein http, sonst könnte die Meldung unterwegs mitgelesen/verändert werden) und darf keine Zugangsdaten in der URL enthalten (https://user:pass@… wird abgelehnt) — dafür gibt es die Signaturprüfung (siehe Abschnitt "Webhook" oben), sicherer als ein Passwort in der URL, das z.B. in einem Proxy-Log landen könnte.

API-Schlüssel — Web-Weg-Übersteuerung

Was: Erzwingt für Verträge, die mit GENAU DIESEM Schlüssel erzeugt werden, den Web-Weg an oder aus — unabhängig vom Konto-Schalter (siehe "Web-Weg verstehen" unten).

Wichtig

Diese Einstellung könnt ihr nicht selbst setzen — sie wird von SnapPact auf Anfrage konfiguriert (z.B. für eine Integration, die den Web-Weg bewusst nie nutzen soll, unabhängig davon, was später am Konto-Schalter geändert wird). Ihr seht den aktuellen Stand im Portal unter "API-Zugriff", könnt ihn dort aber nicht ändern.

Warum: Ein Konto kann mehrere Schlüssel für unterschiedliche Zwecke haben (z.B. eine externe Integration UND das eigene Portal-Konto) — die Übersteuerung erlaubt, den Web-Weg für EINEN bestimmten Zweck fest ein- oder auszuschalten, ohne dass eine spätere Konto-weite Änderung das versehentlich mit umstellt.

Branding — Firmenname

Was: Der Name, der eurer Kundschaft auf der Web-Vorstufe eures Vertrags angezeigt wird (siehe "Web-Weg verstehen" unten), statt eines generischen Platzhalters.

Wann ändern: Einmalig beim Einrichten, danach nur bei einer echten Namensänderung (z.B. Umfirmierung).

Warum die Prüfung: SnapPact prüft jeden Namen von Hand, bevor er live geht — verhindert, dass sich jemand fälschlich als andere Firma ausgibt. Eine Namensänderung löst die Prüfung erneut aus und wirkt sofort: bis SnapPact den neuen Namen freigegeben hat, ist der Web-Weg für euer Konto gesperrt. Bereits laufende Web-Abschlüsse (geöffnete Links, Reservierungen) werden dabei abgebrochen, und der bisherige Name wird nicht weiter angezeigt — wo ein Absender erscheint, steht bis zur Freigabe der neutrale Platzhalter "Business-Partner". QR-Codes funktionieren in dieser Zeit weiter über die SnapPact-App. Ändert den Namen deshalb nur, wenn es wirklich nötig ist.

Branding — Akzentfarbe

Was: Eine Farbe für die Kopfzeile der Web-Vorstufe (rein optisch, kein Bestandteil des Vertragsinhalts).

Wann ändern: Frei nach eurem Geschmack, jederzeit — anders als der Name braucht eine Farbänderung KEINE erneute Prüfung.

Warum: Wiedererkennbarkeit für eure Kundschaft, ohne dass SnapPact jede Farbe einzeln freigeben müsste (anders als beim Namen gibt es hier kein Missbrauchsrisiko).

Branding — Logo

Was: Euer Firmenlogo, erscheint neben dem Namen auf der Web-Vorstufe.

Wann hochladen: Optional, jederzeit. PNG, JPEG oder WebP, maximal 2 MB.

Warum eine eigene Prüfung, getrennt vom Namen: Ein neues Logo setzt NICHT die Freigabe des Namens zurück (und umgekehrt) — ihr könnt z.B. ein neues Logo hochladen, ohne dass der bereits freigegebene Name erneut geprüft werden muss. Jedes neue oder ersetzte Logo braucht aber selbst wieder eine Freigabe.

Branding — "Web-Weg für dieses Konto aktivieren"

Was: Der Konto-weite Hauptschalter für den Web-Weg (siehe nächster Abschnitt) — gilt für alle eure Schlüssel, ausser eine Schlüssel-Übersteuerung (siehe oben) sagt für einen bestimmten Schlüssel ausdrücklich etwas anderes.

Wann aktivieren: Erst NACHDEM der Firmenname freigegeben wurde — vorher hat der Schalter keine Wirkung ("Wird erst wirksam, sobald der Name freigegeben ist").

Warum getrennt vom Namen: Ihr könnt euren Namen schon vorbereiten und prüfen lassen, ohne den Web-Weg sofort für alle laufenden Verträge zu aktivieren — zwei unabhängige Schritte statt eines einzigen "Alles an"-Knopfs.

Web-Weg verstehen

Der "Web-Weg" ist SnapPacts Bezeichnung dafür, dass eure Kundschaft einen Vertrag im Browser ansehen und (nach Anmeldung) ausfüllen kann, ohne vorher die SnapPact-App installiert zu haben — gedacht für den Fall, dass jemand euren QR-Code scannt und die App noch gar nicht kennt.

Wichtig zu wissen: Die eigentliche Unterschrift findet aus rechtlichen Gründen IMMER in der SnapPact-App statt (echte biometrische Signatur, Face ID/Touch ID/Fingerabdruck) — der Web-Weg ersetzt das nie, er überbrückt nur den Weg dorthin: ansehen, sich anmelden, Felder ausfüllen, dann Übergabe an die App für die Unterschrift selbst.

Ob der Web-Weg für einen konkreten Vertrag wirksam ist, hängt von einer einzigen, klaren Regel ab:

Ohne Web-Weg (z.B. Name noch nicht freigegeben, oder Schalter aus) landet eure Kundschaft beim Scannen des QR-Codes direkt in der SnapPact-App (sofern installiert) — der bisherige, unveränderte Weg.

Diese Funktion wird schrittweise freigeschaltet. Meldet euch bei SnapPact, wenn ihr den Web-Weg für euer Konto nutzen möchtet.