| Server IP : 202.61.199.114 / Your IP : 216.73.217.139 Web Server : nginx/1.22.1 System : Linux de.arni-solutions.de 6.1.0-49-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.174-1 (2026-05-26) x86_64 User : web20 ( 1018) PHP Version : 8.4.23 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : ON | Pkexec : ON Directory : /proc/self/root/tmp/ |
Upload File : |
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>PaCIM API – Dokumentation</title>
<style>
:root{ --bg:#f5f7fb; --card:#fff; --ink:#1e2633; --muted:#7e8896; --line:#e6eef4; --primary:#0b4677; --accent:#1a6bb0; --get:#1d9a4f; --post:#2563c9; --code:#0f1b2d; }
*{box-sizing:border-box}
body{margin:0;background:var(--bg);color:var(--ink);font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Helvetica,Arial,sans-serif;font-size:15px;line-height:1.6}
a{color:var(--accent);text-decoration:none}
code,kbd{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace}
.topbar{background:linear-gradient(135deg,#0b4677,#1a6bb0);color:#fff;padding:34px 28px}
.topbar .wrap{max-width:1180px;margin:0 auto}
.topbar h1{margin:0 0 6px;font-size:26px;font-weight:700}
.topbar p{margin:0;opacity:.92}
.topbar .base{display:inline-flex;align-items:center;gap:8px;margin-top:14px;background:rgba(255,255,255,.14);border:1px solid rgba(255,255,255,.25);border-radius:8px;padding:8px 12px;font-family:ui-monospace,monospace;font-size:13px}
.layout{max-width:1180px;margin:0 auto;display:grid;grid-template-columns:240px 1fr;gap:28px;padding:28px}
.nav{position:sticky;top:20px;align-self:start;max-height:calc(100vh - 40px);overflow:auto}
.nav .grp{font-size:11px;text-transform:uppercase;letter-spacing:.5px;color:var(--muted);margin:16px 0 6px;font-weight:700}
.nav a{display:flex;align-items:center;gap:8px;padding:5px 8px;border-radius:7px;color:var(--ink);font-size:13.5px}
.nav a:hover{background:#eaf1f8}
.badge{display:inline-flex;align-items:center;justify-content:center;font-size:10px;font-weight:700;border-radius:5px;padding:2px 6px;color:#fff;min-width:38px}
.badge.GET{background:var(--get)} .badge.POST{background:var(--post)}
.intro,.endpoint{background:var(--card);border:1px solid var(--line);border-radius:14px;padding:22px 24px;margin-bottom:18px;box-shadow:0 1px 2px rgba(16,32,56,.04)}
.intro h2{margin:0 0 10px;font-size:19px}
.intro h3{margin:18px 0 8px;font-size:15px}
.intro p{margin:6px 0}
.scopes{width:100%;border-collapse:collapse;margin-top:6px}
.scopes td{padding:7px 10px;border-bottom:1px solid var(--line);vertical-align:top;font-size:14px}
.scopes tr:last-child td{border-bottom:0}
.scopes code{background:#eef3f9;color:var(--primary);padding:2px 7px;border-radius:6px;font-size:12.5px;white-space:nowrap}
.grp-title{font-size:13px;text-transform:uppercase;letter-spacing:.6px;color:var(--muted);font-weight:700;margin:26px 0 10px}
.endpoint{scroll-margin-top:20px}
.ep-head{display:flex;align-items:center;gap:12px;flex-wrap:wrap}
.ep-path{font-family:ui-monospace,monospace;font-size:14px;font-weight:600;color:var(--ink)}
.ep-scope{margin-left:auto;font-size:11.5px;background:#eef3f9;color:var(--primary);border:1px solid #d9e4f0;border-radius:999px;padding:3px 11px;font-weight:600;white-space:nowrap}
.ep-desc{color:#3a4a5e;margin:12px 0 6px}
.params{width:100%;border-collapse:collapse;margin:10px 0 4px;font-size:13.5px}
.params th{text-align:left;color:var(--muted);font-weight:600;font-size:12px;text-transform:uppercase;letter-spacing:.3px;padding:6px 10px;border-bottom:2px solid var(--line)}
.params td{padding:7px 10px;border-bottom:1px solid var(--line);vertical-align:top}
.params td:first-child{font-family:ui-monospace,monospace;color:var(--primary);white-space:nowrap}
.params .req{color:#b5294a;font-weight:700} .params .opt{color:var(--muted)}
.codeblk{position:relative;background:var(--code);color:#e6edf6;border-radius:10px;padding:14px 16px;overflow:auto;font-family:ui-monospace,monospace;font-size:12.5px;line-height:1.55;margin:8px 0}
.codeblk .lbl{position:absolute;top:8px;right:12px;font-size:10px;letter-spacing:.5px;text-transform:uppercase;color:#7d93ad}
.codeblk pre{margin:0;white-space:pre}
.cols{display:grid;grid-template-columns:1fr 1fr;gap:14px;margin-top:6px}
@media(max-width:880px){.layout{grid-template-columns:1fr}.nav{display:none}.cols{grid-template-columns:1fr}}
.foot{max-width:1180px;margin:0 auto;padding:10px 28px 40px;color:var(--muted);font-size:13px}
</style>
</head>
<body>
<div class="topbar"><div class="wrap">
<h1>PaCIM API</h1>
<p>Schlüsselbasierte REST-API für Buchungen, Schiffe/Termine und Produkte/Preise.</p>
<div class="base">Basis-URL: <strong>https://seaside.pacim.de/api.php</strong></div>
</div></div>
<div class="layout">
<nav class="nav">
<div class="grp">Einführung</div>
<a href="#auth"><span>Authentifizierung</span></a>
<a href="#scopes"><span>Berechtigungen</span></a>
<a href="#errors"><span>Antworten & Fehler</span></a>
<div class="grp">Buchungen</div>
<a href="#booking-get"><span class="badge GET">GET</span> <span>booking/get</span></a>
<a href="#booking-file"><span class="badge GET">GET</span> <span>booking/file</span></a>
<a href="#booking-create"><span class="badge POST">POST</span> <span>booking/create</span></a>
<a href="#booking-update"><span class="badge POST">POST</span> <span>booking/update</span></a>
<div class="grp">Schiffe & Termine</div>
<a href="#event-ships"><span class="badge GET">GET</span> <span>event/ships</span></a>
<a href="#event-list"><span class="badge GET">GET</span> <span>event/list</span></a>
<a href="#event-get"><span class="badge GET">GET</span> <span>event/get</span></a>
<a href="#event-save"><span class="badge POST">POST</span> <span>event/save</span></a>
<div class="grp">Produkte & Preise</div>
<a href="#product-list"><span class="badge GET">GET</span> <span>product/list</span></a>
<a href="#product-price"><span class="badge GET">GET</span> <span>product/price</span></a>
<a href="#product-save"><span class="badge POST">POST</span> <span>product/save</span></a>
</nav>
<main>
<section class="intro" id="auth">
<h2>Authentifizierung</h2>
<p>Jede Anfrage benötigt einen API-Schlüssel. Verwalte Schlüssel im Backend unter <strong>Einstellungen → API</strong>. Der Klartext-Schlüssel wird nur einmal bei der Erstellung angezeigt.</p>
<p>Übergib den Schlüssel per Header (empfohlen):</p>
<div class="codeblk"><span class="lbl">Header</span><pre>Authorization: Bearer pak_xxxxxxxxxxxxxxxxxxxxxxxx</pre></div>
<p>Alternativ: Header <code>X-API-Key: pak_…</code> oder Query-Parameter <code>?api_key=pak_…</code>.</p>
</section>
<section class="intro" id="scopes">
<h2>Berechtigungen (Scopes)</h2>
<p>Jeder Schlüssel besitzt eine oder mehrere Berechtigungen. Fehlt die nötige Berechtigung, antwortet die API mit <code>403</code>.</p>
<table class="scopes">
<tr><td><code>read_booking</code></td><td>Buchungen lesen (Daten, Buchungsbestätigung & Rechnung als PDF)</td></tr>
<tr><td><code>edit_booking</code></td><td>Buchungen anlegen & bearbeiten (Buchung, Kunde, Rechnung, Positionen)</td></tr>
<tr><td><code>read_event</code></td><td>Schiffe & Termine lesen</td></tr>
<tr><td><code>edit_event</code></td><td>Schiffe & Termine anlegen & bearbeiten</td></tr>
<tr><td><code>read_product</code></td><td>Produkte lesen & Preise berechnen</td></tr>
<tr><td><code>edit_product</code></td><td>Produkte & Preise bearbeiten</td></tr>
</table>
</section>
<section class="intro" id="errors">
<h2>Antworten & Fehler</h2>
<p>Antworten sind JSON und enthalten stets ein <code>ok</code>-Flag (Ausnahme: <code>booking/file</code> liefert ein PDF). Fehler enthalten zusätzlich <code>error</code>.</p>
<div class="cols">
<div class="codeblk"><span class="lbl">Erfolg</span><pre>{ "ok": true, … }</pre></div>
<div class="codeblk"><span class="lbl">Fehler</span><pre>{ "ok": false, "error": "…" }</pre></div>
</div>
<table class="params" style="margin-top:14px">
<tr><th>Status</th><th>Bedeutung</th></tr>
<tr><td>200</td><td>OK</td></tr>
<tr><td>400</td><td>Ungültige/fehlende Parameter</td></tr>
<tr><td>401</td><td>Schlüssel fehlt oder ungültig</td></tr>
<tr><td>403</td><td>Fehlende Berechtigung (Scope)</td></tr>
<tr><td>404</td><td>Ressource/Aktion nicht gefunden</td></tr>
<tr><td>405</td><td>Falsche HTTP-Methode</td></tr>
<tr><td>422</td><td>Verarbeitung fehlgeschlagen (z. B. Validierung)</td></tr>
</table>
</section>
<div class="grp-title">Buchungen</div>
<section class="endpoint" id="booking-get">
<div class="ep-head">
<span class="badge GET">GET</span>
<span class="ep-path">/api.php?resource=booking&action=get</span>
<span class="ep-scope">read_booking</span>
</div>
<p class="ep-desc">Buchung samt Kunde, Rechnung und Positionen abrufen.</p>
<table class="params">
<tr><th>Parameter</th><th>Typ</th><th>Pflicht</th><th>Beschreibung</th></tr>
<tr>
<td>invoice_id</td>
<td>integer</td>
<td class="req">ja</td>
<td>Rechnungs-ID</td>
</tr>
</table>
<div class="cols">
<div class="codeblk"><span class="lbl">Beispiel-Anfrage</span><pre>curl -H "Authorization: Bearer pak_…" \
"https://seaside.pacim.de/api.php?resource=booking&action=get&invoice_id=12"</pre></div>
<div class="codeblk"><span class="lbl">Antwort</span><pre>{
"ok": true,
"invoice": { "invoice_id": 12, "invoice_no": "PAS128", "invoice_price": "60.00", … },
"customer": { "customer_id": 12, "customer_lastname": "…", "customer_email": "…", … },
"bookings": [ { "booking_id": 31, "booking_no": "26-…", "booking_begin": "…", … } ],
"positions": [ { "product_id": 1, "invoice_pos_title": "Hallenparkplatz", "invoice_pos_price": "…", "invoice_pos_quantity": 1 } ],
"files": {
"booking_confirmation": "https://seaside.pacim.de/api.php?resource=booking&action=file&type=booking&invoice_id=12",
"invoice": "https://seaside.pacim.de/api.php?resource=booking&action=file&type=invoice&invoice_id=12"
}
}</pre></div>
</div>
</section>
<section class="endpoint" id="booking-file">
<div class="ep-head">
<span class="badge GET">GET</span>
<span class="ep-path">/api.php?resource=booking&action=file</span>
<span class="ep-scope">read_booking</span>
</div>
<p class="ep-desc">Buchungsbestätigung oder Rechnung als PDF (wird als Datei gestreamt).</p>
<table class="params">
<tr><th>Parameter</th><th>Typ</th><th>Pflicht</th><th>Beschreibung</th></tr>
<tr>
<td>invoice_id</td>
<td>integer</td>
<td class="req">ja</td>
<td>Rechnungs-ID</td>
</tr>
<tr>
<td>type</td>
<td>string</td>
<td class="opt">nein</td>
<td>booking (Standard) oder invoice</td>
</tr>
<tr>
<td>download</td>
<td>integer</td>
<td class="opt">nein</td>
<td>1 = als Anhang herunterladen</td>
</tr>
</table>
<div class="cols">
<div class="codeblk"><span class="lbl">Beispiel-Anfrage</span><pre>curl -H "Authorization: Bearer pak_…" \
"https://seaside.pacim.de/api.php?resource=booking&action=file&type=invoice&invoice_id=12" -o rechnung.pdf</pre></div>
<div class="codeblk"><span class="lbl">Antwort</span><pre>Content-Type: application/pdf (Binärdaten)</pre></div>
</div>
</section>
<section class="endpoint" id="booking-create">
<div class="ep-head">
<span class="badge POST">POST</span>
<span class="ep-path">/api.php?resource=booking&action=create</span>
<span class="ep-scope">edit_booking</span>
</div>
<p class="ep-desc">Neue Buchung anlegen – legt Kunde, Rechnung und Positionen in einer Transaktion an. Preise werden automatisch berechnet (optional per „price“ überschreibbar, netto).</p>
<table class="params">
<tr><th>Parameter</th><th>Typ</th><th>Pflicht</th><th>Beschreibung</th></tr>
<tr>
<td>customer</td>
<td>object</td>
<td class="req">ja</td>
<td>{ gender(1|2), firstname, lastname | company, street, zipcode, city, country, phone, email }</td>
</tr>
<tr>
<td>begin</td>
<td>date</td>
<td class="req">ja</td>
<td>Reisebeginn YYYY-MM-DD</td>
</tr>
<tr>
<td>end</td>
<td>date</td>
<td class="req">ja</td>
<td>Reiseende YYYY-MM-DD</td>
</tr>
<tr>
<td>type</td>
<td>integer</td>
<td class="req">ja</td>
<td>1 = Halle, 2 = Außen</td>
</tr>
<tr>
<td>plate</td>
<td>string</td>
<td class="opt">nein</td>
<td>Kfz-Kennzeichen</td>
</tr>
<tr>
<td>event</td>
<td>string</td>
<td class="opt">nein</td>
<td>Schiff/Event-Name</td>
</tr>
<tr>
<td>event_id</td>
<td>integer</td>
<td class="opt">nein</td>
<td>Termin-ID (event_calendar_id)</td>
</tr>
<tr>
<td>products</td>
<td>array</td>
<td class="opt">nein</td>
<td>Zusatzprodukt-IDs (≥ 3)</td>
</tr>
<tr>
<td>guests</td>
<td>integer</td>
<td class="opt">nein</td>
<td>Anzahl Gäste</td>
</tr>
<tr>
<td>price</td>
<td>number</td>
<td class="opt">nein</td>
<td>Manueller Brutto-Preis (überschreibt Berechnung)</td>
</tr>
<tr>
<td>notify</td>
<td>boolean</td>
<td class="opt">nein</td>
<td>E-Mail-Regeln auslösen (Standard: true)</td>
</tr>
</table>
<div class="cols">
<div class="codeblk"><span class="lbl">Beispiel-Anfrage</span><pre>curl -X POST -H "Authorization: Bearer pak_…" -H "Content-Type: application/json" \
"https://seaside.pacim.de/api.php?resource=booking&action=create" -d '{
"customer": { "firstname": "Max", "lastname": "Mustermann", "email": "max@example.com", "city": "Rostock" },
"begin": "2026-08-01", "end": "2026-08-05", "type": 1,
"plate": "HRO-AB123", "event": "AIDAmar", "guests": 2
}'</pre></div>
<div class="codeblk"><span class="lbl">Antwort</span><pre>{ "ok": true, "invoice_id": 122661, "booking_id": 114690, "booking_no": "26-17359" }</pre></div>
</div>
</section>
<section class="endpoint" id="booking-update">
<div class="ep-head">
<span class="badge POST">POST</span>
<span class="ep-path">/api.php?resource=booking&action=update</span>
<span class="ep-scope">edit_booking</span>
</div>
<p class="ep-desc">Bestehende Buchung aktualisieren (nur übergebene Felder). Zahlungsstatus & Preis der Rechnung sowie Kundendaten möglich.</p>
<table class="params">
<tr><th>Parameter</th><th>Typ</th><th>Pflicht</th><th>Beschreibung</th></tr>
<tr>
<td>booking_id</td>
<td>integer</td>
<td class="req">ja</td>
<td>Buchungs-ID</td>
</tr>
<tr>
<td>begin / end</td>
<td>date</td>
<td class="opt">nein</td>
<td>Reisezeitraum</td>
</tr>
<tr>
<td>plate / event / event_id / type / guests</td>
<td>—</td>
<td class="opt">nein</td>
<td>Buchungsfelder</td>
</tr>
<tr>
<td>customer</td>
<td>object</td>
<td class="opt">nein</td>
<td>Kundenfelder (s. create)</td>
</tr>
<tr>
<td>paid</td>
<td>boolean</td>
<td class="opt">nein</td>
<td>Zahlung als erhalten markieren</td>
</tr>
<tr>
<td>price</td>
<td>number</td>
<td class="opt">nein</td>
<td>Rechnungsbetrag (brutto)</td>
</tr>
</table>
<div class="cols">
<div class="codeblk"><span class="lbl">Beispiel-Anfrage</span><pre>curl -X POST -H "Authorization: Bearer pak_…" -H "Content-Type: application/json" \
"https://seaside.pacim.de/api.php?resource=booking&action=update" -d '{ "booking_id": 114690, "guests": 3, "paid": true }'</pre></div>
<div class="codeblk"><span class="lbl">Antwort</span><pre>{ "ok": true, "booking_id": 114690 }</pre></div>
</div>
</section>
<div class="grp-title">Schiffe & Termine</div>
<section class="endpoint" id="event-ships">
<div class="ep-head">
<span class="badge GET">GET</span>
<span class="ep-path">/api.php?resource=event&action=ships</span>
<span class="ep-scope">read_event</span>
</div>
<p class="ep-desc">Liste aller Schiffe (eindeutige Namen) mit Anzahl Termine.</p>
<div class="cols">
<div class="codeblk"><span class="lbl">Beispiel-Anfrage</span><pre>curl -H "Authorization: Bearer pak_…" "https://seaside.pacim.de/api.php?resource=event&action=ships"</pre></div>
<div class="codeblk"><span class="lbl">Antwort</span><pre>{ "ok": true, "ships": [ { "ship": "AIDAmar", "cruise_id": null, "dates": 12 }, … ] }</pre></div>
</div>
</section>
<section class="endpoint" id="event-list">
<div class="ep-head">
<span class="badge GET">GET</span>
<span class="ep-path">/api.php?resource=event&action=list</span>
<span class="ep-scope">read_event</span>
</div>
<p class="ep-desc">Termine auflisten – optional je Schiff und/oder Zeitraum.</p>
<table class="params">
<tr><th>Parameter</th><th>Typ</th><th>Pflicht</th><th>Beschreibung</th></tr>
<tr>
<td>ship</td>
<td>string</td>
<td class="opt">nein</td>
<td>Schiffsname (exakt)</td>
</tr>
<tr>
<td>from</td>
<td>date</td>
<td class="opt">nein</td>
<td>ab Datum YYYY-MM-DD</td>
</tr>
<tr>
<td>to</td>
<td>date</td>
<td class="opt">nein</td>
<td>bis Datum YYYY-MM-DD</td>
</tr>
<tr>
<td>active</td>
<td>integer</td>
<td class="opt">nein</td>
<td>1 = nur aktive</td>
</tr>
</table>
<div class="cols">
<div class="codeblk"><span class="lbl">Beispiel-Anfrage</span><pre>curl -H "Authorization: Bearer pak_…" \
"https://seaside.pacim.de/api.php?resource=event&action=list&ship=AIDAmar&from=2026-06-15&active=1"</pre></div>
<div class="codeblk"><span class="lbl">Antwort</span><pre>{ "ok": true, "events": [ { "id": 1149, "ship": "AIDAmar", "organizer": "AIDA Cruises", "begin": "2026-06-16 10:30:00", "end": "…", "indoor": 5, "outdoor": 30, "valet": 5, "active": 1 }, … ] }</pre></div>
</div>
</section>
<section class="endpoint" id="event-get">
<div class="ep-head">
<span class="badge GET">GET</span>
<span class="ep-path">/api.php?resource=event&action=get</span>
<span class="ep-scope">read_event</span>
</div>
<p class="ep-desc">Einzelnen Termin abrufen.</p>
<table class="params">
<tr><th>Parameter</th><th>Typ</th><th>Pflicht</th><th>Beschreibung</th></tr>
<tr>
<td>id</td>
<td>integer</td>
<td class="req">ja</td>
<td>Termin-ID</td>
</tr>
</table>
<div class="cols">
<div class="codeblk"><span class="lbl">Beispiel-Anfrage</span><pre>curl -H "Authorization: Bearer pak_…" "https://seaside.pacim.de/api.php?resource=event&action=get&id=1149"</pre></div>
<div class="codeblk"><span class="lbl">Antwort</span><pre>{ "ok": true, "event": { "event_calendar_id": 1149, "event_calendar_title": "AIDAmar", … } }</pre></div>
</div>
</section>
<section class="endpoint" id="event-save">
<div class="ep-head">
<span class="badge POST">POST</span>
<span class="ep-path">/api.php?resource=event&action=save</span>
<span class="ep-scope">edit_event</span>
</div>
<p class="ep-desc">Termin anlegen (ohne id) oder aktualisieren (mit id).</p>
<table class="params">
<tr><th>Parameter</th><th>Typ</th><th>Pflicht</th><th>Beschreibung</th></tr>
<tr>
<td>id</td>
<td>integer</td>
<td class="opt">nein</td>
<td>vorhanden = Update</td>
</tr>
<tr>
<td>ship</td>
<td>string</td>
<td class="req">ja*</td>
<td>Schiffsname (*bei Anlage)</td>
</tr>
<tr>
<td>begin</td>
<td>datetime</td>
<td class="req">ja*</td>
<td>Beginn (*bei Anlage)</td>
</tr>
<tr>
<td>end</td>
<td>datetime</td>
<td class="opt">nein</td>
<td>Ende</td>
</tr>
<tr>
<td>cruise_id</td>
<td>string</td>
<td class="opt">nein</td>
<td>Cruise-ID</td>
</tr>
<tr>
<td>indoor / outdoor / valet</td>
<td>integer</td>
<td class="opt">nein</td>
<td>Stellplätze</td>
</tr>
<tr>
<td>organizer_id</td>
<td>integer</td>
<td class="opt">nein</td>
<td>Veranstalter-ID</td>
</tr>
<tr>
<td>active</td>
<td>boolean</td>
<td class="opt">nein</td>
<td>aktiv</td>
</tr>
</table>
<div class="cols">
<div class="codeblk"><span class="lbl">Beispiel-Anfrage</span><pre>curl -X POST -H "Authorization: Bearer pak_…" -H "Content-Type: application/json" \
"https://seaside.pacim.de/api.php?resource=event&action=save" -d '{ "ship": "AIDAmar", "begin": "2026-09-01 08:00:00", "indoor": 10, "outdoor": 40 }'</pre></div>
<div class="codeblk"><span class="lbl">Antwort</span><pre>{ "ok": true, "id": 1250 }</pre></div>
</div>
</section>
<div class="grp-title">Produkte & Preise</div>
<section class="endpoint" id="product-list">
<div class="ep-head">
<span class="badge GET">GET</span>
<span class="ep-path">/api.php?resource=product&action=list</span>
<span class="ep-scope">read_product</span>
</div>
<p class="ep-desc">Verfügbare Produkte mit Basispreis (netto) und Steuersatz.</p>
<div class="cols">
<div class="codeblk"><span class="lbl">Beispiel-Anfrage</span><pre>curl -H "Authorization: Bearer pak_…" "https://seaside.pacim.de/api.php?resource=product&action=list"</pre></div>
<div class="codeblk"><span class="lbl">Antwort</span><pre>{ "ok": true, "products": [ { "product_id": 1, "product_title": "Hallenparkplatz", "product_price": "…", "product_tax": 19 }, … ] }</pre></div>
</div>
</section>
<section class="endpoint" id="product-price">
<div class="ep-head">
<span class="badge GET">GET</span>
<span class="ep-path">/api.php?resource=product&action=price</span>
<span class="ep-scope">read_product</span>
</div>
<p class="ep-desc">Preis für einen Zeitraum berechnen (Parkplatz + optionale Zusatzprodukte). Liefert Netto/Brutto, Dauer, Positionen und ggf. Provision.</p>
<table class="params">
<tr><th>Parameter</th><th>Typ</th><th>Pflicht</th><th>Beschreibung</th></tr>
<tr>
<td>begin</td>
<td>date</td>
<td class="req">ja</td>
<td>von YYYY-MM-DD</td>
</tr>
<tr>
<td>end</td>
<td>date</td>
<td class="req">ja</td>
<td>bis YYYY-MM-DD</td>
</tr>
<tr>
<td>type</td>
<td>integer</td>
<td class="opt">nein</td>
<td>1 = Halle (Standard), 2 = Außen</td>
</tr>
<tr>
<td>products</td>
<td>array/csv</td>
<td class="opt">nein</td>
<td>Zusatzprodukt-IDs</td>
</tr>
<tr>
<td>broker_id</td>
<td>integer</td>
<td class="opt">nein</td>
<td>für Provisionsberechnung</td>
</tr>
</table>
<div class="cols">
<div class="codeblk"><span class="lbl">Beispiel-Anfrage</span><pre>curl -H "Authorization: Bearer pak_…" \
"https://seaside.pacim.de/api.php?resource=product&action=price&type=1&begin=2026-07-01&end=2026-07-08"</pre></div>
<div class="codeblk"><span class="lbl">Antwort</span><pre>{
"ok": true,
"quote": {
"duration": 7,
"positions": [ { "product_id": 1, "title": "Hallenparkplatz", "net": 105.04, "qty": 1 } ],
"net": 105.04, "gross": 125.00,
"park_gross": 125.00, "addon_gross": 0,
"rate": 10, "addon_rate": 5, "commission": 12.50
}
}</pre></div>
</div>
</section>
<section class="endpoint" id="product-save">
<div class="ep-head">
<span class="badge POST">POST</span>
<span class="ep-path">/api.php?resource=product&action=save</span>
<span class="ep-scope">edit_product</span>
</div>
<p class="ep-desc">Produkt/Preis aktualisieren. Mit „year“ wird ein jahresspezifischer Preis gesetzt.</p>
<table class="params">
<tr><th>Parameter</th><th>Typ</th><th>Pflicht</th><th>Beschreibung</th></tr>
<tr>
<td>product_id</td>
<td>integer</td>
<td class="req">ja</td>
<td>Produkt-ID</td>
</tr>
<tr>
<td>title</td>
<td>string</td>
<td class="opt">nein</td>
<td>Bezeichnung</td>
</tr>
<tr>
<td>price</td>
<td>number</td>
<td class="opt">nein</td>
<td>Preis (netto)</td>
</tr>
<tr>
<td>tax</td>
<td>integer</td>
<td class="opt">nein</td>
<td>Steuersatz %</td>
</tr>
<tr>
<td>year</td>
<td>integer</td>
<td class="opt">nein</td>
<td>Jahr für jahresspezifischen Preis</td>
</tr>
</table>
<div class="cols">
<div class="codeblk"><span class="lbl">Beispiel-Anfrage</span><pre>curl -X POST -H "Authorization: Bearer pak_…" -H "Content-Type: application/json" \
"https://seaside.pacim.de/api.php?resource=product&action=save" -d '{ "product_id": 3, "price": 25.00, "year": 2026 }'</pre></div>
<div class="codeblk"><span class="lbl">Antwort</span><pre>{ "ok": true, "product_id": 3 }</pre></div>
</div>
</section>
</main>
</div>
<div class="foot">PaCIM · seaside.pacim.de · API-Dokumentation</div>
</body>
</html>