[{"data":1,"prerenderedAt":1606},["ShallowReactive",2],{"docs-navigation":3,"doc-\u002Fapi\u002Fphp":463},[4,22,104,157,194,211,224,265,306,339,368,384,409,426,446],{"title":5,"path":6,"stem":7,"children":8,"page":21},"Erste Schritte","\u002Fgetting-started","01.getting-started",[9,13,17],{"title":10,"path":11,"stem":12},"Was ist LIVCK Cloud?","\u002Fgetting-started\u002Fwhat-is-livck","01.getting-started\u002F01.what-is-livck",{"title":14,"path":15,"stem":16},"Schnellstart","\u002Fgetting-started\u002Fquickstart","01.getting-started\u002F02.quickstart",{"title":18,"path":19,"stem":20},"Das Dashboard","\u002Fgetting-started\u002Fdashboard","01.getting-started\u002F03.dashboard",false,{"title":23,"path":24,"stem":25,"children":26,"page":21},"Monitoring","\u002Fmonitoring","02.monitoring",[27,31,64,68,72,76,80,84,88,92,96,100],{"title":28,"path":29,"stem":30},"Services verwalten","\u002Fmonitoring\u002Fservices","02.monitoring\u002F01.services",{"title":32,"path":33,"stem":34,"children":35,"page":21},"Check-Typen","\u002Fmonitoring\u002Fchecks","02.monitoring\u002F02.checks",[36,40,44,48,52,56,60],{"title":37,"path":38,"stem":39},"HTTP\u002FHTTPS-Checks","\u002Fmonitoring\u002Fchecks\u002Fhttp","02.monitoring\u002F02.checks\u002F01.http",{"title":41,"path":42,"stem":43},"TCP-Port-Checks","\u002Fmonitoring\u002Fchecks\u002Ftcp","02.monitoring\u002F02.checks\u002F02.tcp",{"title":45,"path":46,"stem":47},"DNS-Checks","\u002Fmonitoring\u002Fchecks\u002Fdns","02.monitoring\u002F02.checks\u002F03.dns",{"title":49,"path":50,"stem":51},"Ping-Checks (ICMP)","\u002Fmonitoring\u002Fchecks\u002Ficmp","02.monitoring\u002F02.checks\u002F04.icmp",{"title":53,"path":54,"stem":55},"SSL-Zertifikat-Checks","\u002Fmonitoring\u002Fchecks\u002Fssl","02.monitoring\u002F02.checks\u002F05.ssl",{"title":57,"path":58,"stem":59},"Heartbeat-Checks (Push-Monitoring)","\u002Fmonitoring\u002Fchecks\u002Fheartbeat","02.monitoring\u002F02.checks\u002F06.heartbeat",{"title":61,"path":62,"stem":63},"Manuelle Services","\u002Fmonitoring\u002Fchecks\u002Fmanual","02.monitoring\u002F02.checks\u002F07.manual",{"title":65,"path":66,"stem":67},"Check-Einstellungen","\u002Fmonitoring\u002Fcheck-settings","02.monitoring\u002F03.check-settings",{"title":69,"path":70,"stem":71},"Bedingungen","\u002Fmonitoring\u002Fconditions","02.monitoring\u002F04.conditions",{"title":73,"path":74,"stem":75},"Monitoring-Standorte","\u002Fmonitoring\u002Flocations","02.monitoring\u002F05.locations",{"title":77,"path":78,"stem":79},"Service-Detailseite","\u002Fmonitoring\u002Fservice-detail","02.monitoring\u002F06.service-detail",{"title":81,"path":82,"stem":83},"Artifacts","\u002Fmonitoring\u002Fartifacts","02.monitoring\u002F07.artifacts",{"title":85,"path":86,"stem":87},"Status überschreiben","\u002Fmonitoring\u002Fstatus-override","02.monitoring\u002F08.status-override",{"title":89,"path":90,"stem":91},"Eigene Zertifikate (mTLS & private CAs)","\u002Fmonitoring\u002Fcertificates","02.monitoring\u002F09.certificates",{"title":93,"path":94,"stem":95},"Tags","\u002Fmonitoring\u002Ftags","02.monitoring\u002F10.tags",{"title":97,"path":98,"stem":99},"Sync-Quellen","\u002Fmonitoring\u002Fsync-sources","02.monitoring\u002F11.sync-sources",{"title":101,"path":102,"stem":103},"CDN & WAF-Integration","\u002Fmonitoring\u002Fcdn-waf-integration","02.monitoring\u002F12.cdn-waf-integration",{"title":105,"path":106,"stem":107,"children":108,"page":21},"Server-Monitoring","\u002Fserver-monitoring","03.server-monitoring",[109,113,117,121,125,129,133,137,141,145,149,153],{"title":110,"path":111,"stem":112},"Überblick","\u002Fserver-monitoring\u002Foverview","03.server-monitoring\u002F01.overview",{"title":114,"path":115,"stem":116},"Agent installieren","\u002Fserver-monitoring\u002Finstallation","03.server-monitoring\u002F02.installation",{"title":118,"path":119,"stem":120},"Sicherheit & Transparenz","\u002Fserver-monitoring\u002Fsecurity","03.server-monitoring\u002F03.security",{"title":122,"path":123,"stem":124},"Was gemessen wird","\u002Fserver-monitoring\u002Fmetrics","03.server-monitoring\u002F04.metrics",{"title":126,"path":127,"stem":128},"Serverliste & Detailansicht","\u002Fserver-monitoring\u002Fservers","03.server-monitoring\u002F05.servers",{"title":130,"path":131,"stem":132},"Alarm-Regeln","\u002Fserver-monitoring\u002Falert-rules","03.server-monitoring\u002F06.alert-rules",{"title":134,"path":135,"stem":136},"Ereignisse & Benachrichtigungen","\u002Fserver-monitoring\u002Fevents","03.server-monitoring\u002F07.events",{"title":138,"path":139,"stem":140},"Erreichbarkeits-Prüfungen","\u002Fserver-monitoring\u002Freachability","03.server-monitoring\u002F08.reachability",{"title":142,"path":143,"stem":144},"Agent-Updates","\u002Fserver-monitoring\u002Fupdates","03.server-monitoring\u002F09.updates",{"title":146,"path":147,"stem":148},"Auf der Statuspage zeigen","\u002Fserver-monitoring\u002Fstatuspage","03.server-monitoring\u002F10.statuspage",{"title":150,"path":151,"stem":152},"Grenzen & Pläne","\u002Fserver-monitoring\u002Flimits","03.server-monitoring\u002F11.limits",{"title":154,"path":155,"stem":156},"Fehlerbehebung","\u002Fserver-monitoring\u002Ftroubleshooting","03.server-monitoring\u002F12.troubleshooting",{"title":158,"path":159,"stem":160,"children":161,"page":21},"Incidents","\u002Fincidents","04.incidents",[162,166,170,174,178,182,186,190],{"title":163,"path":164,"stem":165},"Incidents verstehen","\u002Fincidents\u002Foverview","04.incidents\u002F01.overview",{"title":167,"path":168,"stem":169},"Incident erstellen","\u002Fincidents\u002Fcreate-incident","04.incidents\u002F02.create-incident",{"title":171,"path":172,"stem":173},"Incident verwalten","\u002Fincidents\u002Fmanage-incident","04.incidents\u002F03.manage-incident",{"title":175,"path":176,"stem":177},"Automatische Erkennung","\u002Fincidents\u002Fauto-detection","04.incidents\u002F04.auto-detection",{"title":179,"path":180,"stem":181},"Interne Kommentare","\u002Fincidents\u002Fincident-comments","04.incidents\u002F05.incident-comments",{"title":183,"path":184,"stem":185},"Postmortems","\u002Fincidents\u002Fpostmortems","04.incidents\u002F06.postmortems",{"title":187,"path":188,"stem":189},"Incident-Richtlinien","\u002Fincidents\u002Fincident-policies","04.incidents\u002F07.incident-policies",{"title":191,"path":192,"stem":193},"Incident-Vorlagen","\u002Fincidents\u002Fincident-templates","04.incidents\u002F08.incident-templates",{"title":195,"path":196,"stem":197,"children":198,"page":21},"Eskalation","\u002Fescalation","05.escalation",[199,203,207],{"title":200,"path":201,"stem":202},"Eskalationsrichtlinien","\u002Fescalation\u002Fpolicies","05.escalation\u002F01.policies",{"title":204,"path":205,"stem":206},"Eskalation während eines Incidents","\u002Fescalation\u002Fduring-incident","05.escalation\u002F02.during-incident",{"title":208,"path":209,"stem":210},"Betriebszeiten (On-Call)","\u002Fescalation\u002Foperating-schedules","05.escalation\u002F03.operating-schedules",{"title":212,"path":213,"stem":214,"children":215,"page":21},"Wartungen","\u002Fmaintenance","06.maintenance",[216,220],{"title":217,"path":218,"stem":219},"Wartungen planen","\u002Fmaintenance\u002Foverview","06.maintenance\u002F01.overview",{"title":221,"path":222,"stem":223},"Wartungs-Benachrichtigungen","\u002Fmaintenance\u002Fnotifications","06.maintenance\u002F02.notifications",{"title":225,"path":226,"stem":227,"children":228,"page":21},"Statuspages","\u002Fstatuspages","07.statuspages",[229,233,237,241,245,249,253,257,261],{"title":230,"path":231,"stem":232},"Statuspages verstehen","\u002Fstatuspages\u002Foverview","07.statuspages\u002F01.overview",{"title":234,"path":235,"stem":236},"Statuspage erstellen","\u002Fstatuspages\u002Fcreate-statuspage","07.statuspages\u002F02.create-statuspage",{"title":238,"path":239,"stem":240},"Zugriffskontrolle","\u002Fstatuspages\u002Faccess-control","07.statuspages\u002F03.access-control",{"title":242,"path":243,"stem":244},"Komponenten verwalten","\u002Fstatuspages\u002Fcomponents","07.statuspages\u002F04.components",{"title":246,"path":247,"stem":248},"Abonnenten (Subscriber)","\u002Fstatuspages\u002Fsubscribers","07.statuspages\u002F05.subscribers",{"title":250,"path":251,"stem":252},"Custom Domains","\u002Fstatuspages\u002Fcustom-domains","07.statuspages\u002F06.custom-domains",{"title":254,"path":255,"stem":256},"Öffentliche Ansicht","\u002Fstatuspages\u002Fpublic-view","07.statuspages\u002F07.public-view",{"title":258,"path":259,"stem":260},"Layout-Builder","\u002Fstatuspages\u002Flayout-builder","07.statuspages\u002F08.layout-builder",{"title":262,"path":263,"stem":264},"Metriken","\u002Fstatuspages\u002Fmetrics","07.statuspages\u002F09.metrics",{"title":266,"path":267,"stem":268,"children":269,"page":21},"Team & Organisation","\u002Fteam","08.team",[270,274,278,282,286,290,294,298,302],{"title":271,"path":272,"stem":273},"Organisationen","\u002Fteam\u002Forganizations","08.team\u002F01.organizations",{"title":275,"path":276,"stem":277},"Mitglieder verwalten","\u002Fteam\u002Fmembers","08.team\u002F02.members",{"title":279,"path":280,"stem":281},"Rollen & Berechtigungen","\u002Fteam\u002Froles","08.team\u002F03.roles",{"title":283,"path":284,"stem":285},"Teams","\u002Fteam\u002Fteams","08.team\u002F04.teams",{"title":287,"path":288,"stem":289},"Zugriffsbereiche","\u002Fteam\u002Faccess-areas","08.team\u002F05.access-areas",{"title":291,"path":292,"stem":293},"Einladungen","\u002Fteam\u002Finvitations","08.team\u002F06.invitations",{"title":295,"path":296,"stem":297},"Enterprise SSO (Single Sign-On)","\u002Fteam\u002Fsso","08.team\u002F07.sso",{"title":299,"path":300,"stem":301},"Entra ID (Azure AD) einrichten","\u002Fteam\u002Fsso-entra","08.team\u002F08.sso-entra",{"title":303,"path":304,"stem":305},"Keycloak einrichten","\u002Fteam\u002Fsso-keycloak","08.team\u002F09.sso-keycloak",{"title":307,"path":308,"stem":309,"children":310,"page":21},"Abrechnung","\u002Fbilling","09.billing",[311,315,319,323,327,331,335],{"title":312,"path":313,"stem":314},"Pläne & Preise","\u002Fbilling\u002Fplans","09.billing\u002F01.plans",{"title":316,"path":317,"stem":318},"Plan wechseln","\u002Fbilling\u002Fupgrade-downgrade","09.billing\u002F02.upgrade-downgrade",{"title":320,"path":321,"stem":322},"Zahlungsmethoden","\u002Fbilling\u002Fpayment","09.billing\u002F03.payment",{"title":324,"path":325,"stem":326},"Rechnungen","\u002Fbilling\u002Finvoices","09.billing\u002F04.invoices",{"title":328,"path":329,"stem":330},"SMS- & Voice-Guthaben","\u002Fbilling\u002Fsms-credits","09.billing\u002F05.sms-credits",{"title":332,"path":333,"stem":334},"Plan-Limits","\u002Fbilling\u002Flimits","09.billing\u002F06.limits",{"title":336,"path":337,"stem":338},"Add-Ons","\u002Fbilling\u002Fadd-ons","09.billing\u002F07.add-ons",{"title":340,"path":341,"stem":342,"children":343,"page":21},"Account & Sicherheit","\u002Faccount","10.account",[344,348,352,356,360,364],{"title":345,"path":346,"stem":347},"Profil bearbeiten","\u002Faccount\u002Fprofile","10.account\u002F01.profile",{"title":349,"path":350,"stem":351},"Passwort ändern","\u002Faccount\u002Fpassword","10.account\u002F02.password",{"title":353,"path":354,"stem":355},"Anmelden mit Google, GitHub & Discord","\u002Faccount\u002Fsocial-login","10.account\u002F03.social-login",{"title":357,"path":358,"stem":359},"Zwei-Faktor-Authentifizierung","\u002Faccount\u002Ftwo-factor","10.account\u002F04.two-factor",{"title":361,"path":362,"stem":363},"Account löschen","\u002Faccount\u002Fdelete-account","10.account\u002F05.delete-account",{"title":365,"path":366,"stem":367},"Erscheinungsbild","\u002Faccount\u002Fappearance","10.account\u002F06.appearance",{"title":369,"path":370,"stem":371,"children":372,"page":21},"Benachrichtigungen","\u002Fnotifications","11.notifications",[373,376,380],{"title":369,"path":374,"stem":375},"\u002Fnotifications\u002Foverview","11.notifications\u002F01.overview",{"title":377,"path":378,"stem":379},"Benachrichtigungskanäle","\u002Fnotifications\u002Fchannels","11.notifications\u002F02.channels",{"title":381,"path":382,"stem":383},"Persönliche Benachrichtigungs-Einstellungen","\u002Fnotifications\u002Fpreferences","11.notifications\u002F03.preferences",{"title":385,"path":386,"stem":387,"children":388,"page":21},"API","\u002Fapi","12.api",[389,393,397,401,405],{"title":390,"path":391,"stem":392},"API-Übersicht","\u002Fapi\u002Foverview","12.api\u002F01.overview",{"title":394,"path":395,"stem":396},"API-Tokens","\u002Fapi\u002Ftokens","12.api\u002F02.tokens",{"title":398,"path":399,"stem":400},"API-Endpunkte","\u002Fapi\u002Fendpoints","12.api\u002F03.endpoints",{"title":402,"path":403,"stem":404},"PHP-SDK","\u002Fapi\u002Fphp","12.api\u002F04.php",{"title":406,"path":407,"stem":408},"Laravel","\u002Fapi\u002Flaravel","12.api\u002F05.laravel",{"title":410,"path":411,"stem":412,"children":413,"page":21},"SLA","\u002Fsla","13.sla",[414,418,422],{"title":415,"path":416,"stem":417},"SLA-Monitoring","\u002Fsla\u002Foverview","13.sla\u002F01.overview",{"title":419,"path":420,"stem":421},"SLA-Ziele","\u002Fsla\u002Fobjectives","13.sla\u002F02.objectives",{"title":423,"path":424,"stem":425},"SLA-Reports","\u002Fsla\u002Freports","13.sla\u002F03.reports",{"title":427,"path":428,"stem":429,"children":430,"page":21},"FAQ","\u002Ffaq","14.faq",[431,435,439,443],{"title":432,"path":433,"stem":434},"Allgemeine Fragen","\u002Ffaq\u002Fgeneral","14.faq\u002F01.general",{"title":436,"path":437,"stem":438},"Häufige Fragen zum Monitoring","\u002Ffaq\u002Fmonitoring-faq","14.faq\u002F02.monitoring-faq",{"title":440,"path":441,"stem":442},"Häufige Fragen zur Abrechnung","\u002Ffaq\u002Fbilling-faq","14.faq\u002F03.billing-faq",{"title":154,"path":444,"stem":445},"\u002Ffaq\u002Ftroubleshooting","14.faq\u002F04.troubleshooting",{"title":447,"path":448,"stem":449,"children":450,"page":21},"Roadmap","\u002Froadmap","15.roadmap",[451,455,459],{"title":452,"path":453,"stem":454},"Roadmap lesen","\u002Froadmap\u002Freading-the-roadmap","15.roadmap\u002F01.reading-the-roadmap",{"title":456,"path":457,"stem":458},"Wunsch einreichen","\u002Froadmap\u002Fsubmitting-ideas","15.roadmap\u002F02.submitting-ideas",{"title":460,"path":461,"stem":462},"Warum keine Termine","\u002Froadmap\u002Fwhy-no-dates","15.roadmap\u002F03.why-no-dates",{"id":464,"title":402,"body":465,"description":1600,"extension":1601,"meta":1602,"navigation":1603,"path":403,"seo":1604,"stem":404,"__hash__":1605},"docs\u002F12.api\u002F04.php.md",{"type":466,"value":467,"toc":1592},"minimark",[468,477,485,490,515,518,535,539,547,597,604,607,610,901,911,934,950,954,1068,1081,1084,1116,1123,1279,1283,1289,1535,1553,1557,1588],[469,470,472,473],"h1",{"id":471},"php-sdk","PHP-SDK ",[474,475],"plan-badge",{"plan":476},"team",[478,479,480,484],"p",{},[481,482,483],"code",{},"livck\u002Fcloud-php"," ist der offizielle PHP-Client für die LIVCK Cloud API. Er läuft ab PHP 8.3 und steht unter der MIT-Lizenz. Statt JSON zu bauen, arbeitest du mit typisierten Objekten. Um Wiederholungen, Fehler und Paginierung kümmert sich der Client.",[486,487,489],"h2",{"id":488},"installation","Installation",[491,492,497],"pre",{"className":493,"code":494,"language":495,"meta":496,"style":496},"language-bash shiki shiki-themes github-light github-dark","composer require livck\u002Fcloud-php\n","bash","",[481,498,499],{"__ignoreMap":496},[500,501,504,508,512],"span",{"class":502,"line":503},"line",1,[500,505,507],{"class":506},"sScJk","composer",[500,509,511],{"class":510},"sZZnC"," require",[500,513,514],{"class":510}," livck\u002Fcloud-php\n",[478,516,517],{},"Das SDK sendet über einen PSR-18-Client und nutzt Guzzle, wenn es installiert ist. Hat dein Projekt noch keinen HTTP-Client, installiere Guzzle gleich mit:",[491,519,521],{"className":493,"code":520,"language":495,"meta":496,"style":496},"composer require livck\u002Fcloud-php guzzlehttp\u002Fguzzle\n",[481,522,523],{"__ignoreMap":496},[500,524,525,527,529,532],{"class":502,"line":503},[500,526,507],{"class":506},[500,528,511],{"class":510},[500,530,531],{"class":510}," livck\u002Fcloud-php",[500,533,534],{"class":510}," guzzlehttp\u002Fguzzle\n",[486,536,538],{"id":537},"client-einrichten","Client einrichten",[478,540,541,542,546],{},"Du brauchst einen ",[543,544,545],"a",{"href":395},"API-Token"," deiner Organisation. Hinterlege ihn als Umgebungsvariable oder in einem Secret-Store, nie im Code:",[491,548,552],{"className":549,"code":550,"language":551,"meta":496,"style":496},"language-php shiki shiki-themes github-light github-dark","use LIVCK\\Cloud\\CloudClient;\n\n$client = new CloudClient($token); \u002F\u002F lvk_…\n","php",[481,553,554,568,575],{"__ignoreMap":496},[500,555,556,560,564],{"class":502,"line":503},[500,557,559],{"class":558},"szBVR","use",[500,561,563],{"class":562},"sj4cs"," LIVCK\\Cloud\\CloudClient",[500,565,567],{"class":566},"sVt8B",";\n",[500,569,571],{"class":502,"line":570},2,[500,572,574],{"emptyLinePlaceholder":573},true,"\n",[500,576,578,581,584,587,590,593],{"class":502,"line":577},3,[500,579,580],{"class":566},"$client ",[500,582,583],{"class":558},"=",[500,585,586],{"class":558}," new",[500,588,589],{"class":562}," CloudClient",[500,591,592],{"class":566},"($token); ",[500,594,596],{"class":595},"sJ8bj","\u002F\u002F lvk_…\n",[478,598,599,600,603],{},"Übersetzbare Inhalte wie die Titel von Vorfällen fragst du mit ",[481,601,602],{},"new CloudClient($token, new ClientOptions(locale: 'de'))"," auf Deutsch an. Der Client ändert sich nach dem Erstellen nicht mehr. Eine Instanz kann deshalb in einem Octane- oder Queue-Worker alle Anfragen bedienen.",[486,605,14],{"id":606},"schnellstart",[478,608,609],{},"Das Beispiel sorgt für den Tag eines Kunden, legt einen HTTP-Service an und listet danach alle Services dieses Kunden:",[491,611,613],{"className":549,"code":612,"language":551,"meta":496,"style":496},"use LIVCK\\Cloud\\Builders\\ServiceBuilder;\nuse LIVCK\\Cloud\\CloudClient;\nuse LIVCK\\Cloud\\Query\\ServiceQuery;\n\n$client = new CloudClient($token);\n\n\u002F\u002F Findet den Tag kunde:4711 oder legt ihn an\n$tag = $client->tags()->ensure('kunde', '4711')->tag;\n\n$client->services()->create(\n    ServiceBuilder::http('Onlineshop', 'https:\u002F\u002Fshop.example.com')\n        ->interval(60)\n        ->tags('kunde:4711', 'env=prod'),\n);\n\nforeach ($client->services()->each(ServiceQuery::make()->withTag($tag)) as $service) {\n    echo $service->name, ': ', $service->effectiveStatus->value, PHP_EOL;\n}\n",[481,614,615,624,632,641,646,660,665,671,716,721,742,767,783,803,809,814,860,895],{"__ignoreMap":496},[500,616,617,619,622],{"class":502,"line":503},[500,618,559],{"class":558},[500,620,621],{"class":562}," LIVCK\\Cloud\\Builders\\ServiceBuilder",[500,623,567],{"class":566},[500,625,626,628,630],{"class":502,"line":570},[500,627,559],{"class":558},[500,629,563],{"class":562},[500,631,567],{"class":566},[500,633,634,636,639],{"class":502,"line":577},[500,635,559],{"class":558},[500,637,638],{"class":562}," LIVCK\\Cloud\\Query\\ServiceQuery",[500,640,567],{"class":566},[500,642,644],{"class":502,"line":643},4,[500,645,574],{"emptyLinePlaceholder":573},[500,647,649,651,653,655,657],{"class":502,"line":648},5,[500,650,580],{"class":566},[500,652,583],{"class":558},[500,654,586],{"class":558},[500,656,589],{"class":562},[500,658,659],{"class":566},"($token);\n",[500,661,663],{"class":502,"line":662},6,[500,664,574],{"emptyLinePlaceholder":573},[500,666,668],{"class":502,"line":667},7,[500,669,670],{"class":595},"\u002F\u002F Findet den Tag kunde:4711 oder legt ihn an\n",[500,672,674,677,679,682,685,688,691,693,696,699,702,705,708,711,713],{"class":502,"line":673},8,[500,675,676],{"class":566},"$tag ",[500,678,583],{"class":558},[500,680,681],{"class":566}," $client",[500,683,684],{"class":558},"->",[500,686,687],{"class":506},"tags",[500,689,690],{"class":566},"()",[500,692,684],{"class":558},[500,694,695],{"class":506},"ensure",[500,697,698],{"class":566},"(",[500,700,701],{"class":510},"'kunde'",[500,703,704],{"class":566},", ",[500,706,707],{"class":510},"'4711'",[500,709,710],{"class":566},")",[500,712,684],{"class":558},[500,714,715],{"class":566},"tag;\n",[500,717,719],{"class":502,"line":718},9,[500,720,574],{"emptyLinePlaceholder":573},[500,722,724,727,729,732,734,736,739],{"class":502,"line":723},10,[500,725,726],{"class":566},"$client",[500,728,684],{"class":558},[500,730,731],{"class":506},"services",[500,733,690],{"class":566},[500,735,684],{"class":558},[500,737,738],{"class":506},"create",[500,740,741],{"class":566},"(\n",[500,743,745,748,751,754,756,759,761,764],{"class":502,"line":744},11,[500,746,747],{"class":562},"    ServiceBuilder",[500,749,750],{"class":558},"::",[500,752,753],{"class":506},"http",[500,755,698],{"class":566},[500,757,758],{"class":510},"'Onlineshop'",[500,760,704],{"class":566},[500,762,763],{"class":510},"'https:\u002F\u002Fshop.example.com'",[500,765,766],{"class":566},")\n",[500,768,770,773,776,778,781],{"class":502,"line":769},12,[500,771,772],{"class":558},"        ->",[500,774,775],{"class":506},"interval",[500,777,698],{"class":566},[500,779,780],{"class":562},"60",[500,782,766],{"class":566},[500,784,786,788,790,792,795,797,800],{"class":502,"line":785},13,[500,787,772],{"class":558},[500,789,687],{"class":506},[500,791,698],{"class":566},[500,793,794],{"class":510},"'kunde:4711'",[500,796,704],{"class":566},[500,798,799],{"class":510},"'env=prod'",[500,801,802],{"class":566},"),\n",[500,804,806],{"class":502,"line":805},14,[500,807,808],{"class":566},");\n",[500,810,812],{"class":502,"line":811},15,[500,813,574],{"emptyLinePlaceholder":573},[500,815,817,820,823,825,827,829,831,834,836,839,841,844,846,848,851,854,857],{"class":502,"line":816},16,[500,818,819],{"class":558},"foreach",[500,821,822],{"class":566}," ($client",[500,824,684],{"class":558},[500,826,731],{"class":506},[500,828,690],{"class":566},[500,830,684],{"class":558},[500,832,833],{"class":506},"each",[500,835,698],{"class":566},[500,837,838],{"class":562},"ServiceQuery",[500,840,750],{"class":558},[500,842,843],{"class":506},"make",[500,845,690],{"class":566},[500,847,684],{"class":558},[500,849,850],{"class":506},"withTag",[500,852,853],{"class":566},"($tag)) ",[500,855,856],{"class":558},"as",[500,858,859],{"class":566}," $service) {\n",[500,861,863,866,869,871,874,877,880,882,885,887,890,893],{"class":502,"line":862},17,[500,864,865],{"class":562},"    echo",[500,867,868],{"class":566}," $service",[500,870,684],{"class":558},[500,872,873],{"class":566},"name, ",[500,875,876],{"class":510},"': '",[500,878,879],{"class":566},", $service",[500,881,684],{"class":558},[500,883,884],{"class":566},"effectiveStatus",[500,886,684],{"class":558},[500,888,889],{"class":566},"value, ",[500,891,892],{"class":562},"PHP_EOL",[500,894,567],{"class":566},[500,896,898],{"class":502,"line":897},18,[500,899,900],{"class":566},"}\n",[478,902,903,906,907,910],{},[481,904,905],{},"tags()"," nimmt Tag-Objekte, Tag-IDs und Tag-Namen, auch gemischt. Einen Namen, den es noch nicht gibt, legt die API mit dem Service an. Tag-Namen versteht das SDK ab Version 1.1. Den Tag selbst holst du mit ",[481,908,909],{},"ensure()",", etwa weil eine Statuspage-Gruppe, die sich selbst füllt, seine ID braucht.",[478,912,913,914,704,917,704,920,704,923,704,926,929,930,933],{},"Für jeden Check-Typ gibt es einen eigenen Builder mit genau dessen Optionen: ",[481,915,916],{},"http()",[481,918,919],{},"tcp()",[481,921,922],{},"dns()",[481,924,925],{},"icmp()",[481,927,928],{},"ssl()"," und ",[481,931,932],{},"manual()",".",[935,936,939],"callout",{"title":937,"type":938},"Für Reseller","tip",[478,940,941,942,945,946,949],{},"Die API arbeitet immer auf deiner ganzen Organisation, deine Endkunden trennst du über Tags. Gib jedem Kunden genau einen, etwa ",[481,943,944],{},"kunde:4711",": ",[481,947,948],{},"withTag('kunde:4711')"," listet dann genau seine Services, und eine Statuspage-Gruppe mit diesem Tag füllt sich von selbst.",[486,951,953],{"id":952},"was-der-client-für-dich-erledigt","Was der Client für dich erledigt",[955,956,957,970],"table",{},[958,959,960],"thead",{},[961,962,963,967],"tr",{},[964,965,966],"th",{},"Thema",[964,968,969],{},"Was passiert",[971,972,973,1014,1030,1051],"tbody",{},[961,974,975,982],{},[976,977,978],"td",{},[979,980,981],"strong",{},"Wiederholungen",[976,983,984,985,988,989,704,992,995,996,999,1000,704,1003,929,1006,1009,1010,1013],{},"Nach einem Verbindungsfehler, bei ",[481,986,987],{},"429"," und bei ",[481,990,991],{},"502",[481,993,994],{},"503"," oder ",[481,997,998],{},"504"," auf ",[481,1001,1002],{},"GET",[481,1004,1005],{},"PUT",[481,1007,1008],{},"DELETE"," versucht es der Client bis zu zweimal erneut. Die Pausen werden länger, ein ",[481,1011,1012],{},"Retry-After"," der API hat Vorrang.",[961,1015,1016,1023],{},[976,1017,1018],{},[979,1019,1020],{},[481,1021,1022],{},"Idempotency-Key",[976,1024,1025,1026,1029],{},"Jedes ",[481,1027,1028],{},"POST"," trägt einen Key, jede Wiederholung denselben. Ein wiederholtes Anlegen legt nichts doppelt an.",[961,1031,1032,1037],{},[976,1033,1034],{},[979,1035,1036],{},"Fehler",[976,1038,1039,1040,1043,1044,995,1047,1050],{},"Jeder Fehler kommt als eigene Exception, zum Beispiel ",[481,1041,1042],{},"ValidationException"," bei ",[481,1045,1046],{},"422",[481,1048,1049],{},"PlanLimitException",", wenn ein Limit deines Plans erreicht ist.",[961,1052,1053,1058],{},[976,1054,1055],{},[979,1056,1057],{},"Paginierung",[976,1059,1060,1063,1064,1067],{},[481,1061,1062],{},"list()"," holt eine Seite. ",[481,1065,1066],{},"each()"," geht alle Seiten durch und lädt die nächste erst, wenn die Schleife dort ankommt.",[478,1069,1070,1071,1074,1075,995,1077,1080],{},"Ein ",[481,1072,1073],{},"5xx"," nach einem ",[481,1076,1028],{},[481,1078,1079],{},"PATCH"," wiederholt der Client nicht. Prüfe dann selbst, ob die Aktion durchgelaufen ist.",[478,1082,1083],{},"Mit einem eigenen Key, etwa deiner Bestellnummer, kannst du ein Anlegen auch nach einem Absturz deines Skripts wiederholen. Die API kennt den Key 24 Stunden lang:",[491,1085,1087],{"className":549,"code":1086,"language":551,"meta":496,"style":496},"$client->services()->create($builder, idempotencyKey: 'bestellung-4711-shop');\n",[481,1088,1089],{"__ignoreMap":496},[500,1090,1091,1093,1095,1097,1099,1101,1103,1106,1109,1111,1114],{"class":502,"line":503},[500,1092,726],{"class":566},[500,1094,684],{"class":558},[500,1096,731],{"class":506},[500,1098,690],{"class":566},[500,1100,684],{"class":558},[500,1102,738],{"class":506},[500,1104,1105],{"class":566},"($builder, ",[500,1107,1108],{"class":506},"idempotencyKey",[500,1110,945],{"class":566},[500,1112,1113],{"class":510},"'bestellung-4711-shop'",[500,1115,808],{"class":566},[478,1117,1118,1119,1122],{},"Alle Exceptions implementieren ",[481,1120,1121],{},"LivckCloudException",". Den Token enthält keine Fehlermeldung und keine Log-Zeile:",[491,1124,1126],{"className":549,"code":1125,"language":551,"meta":496,"style":496},"use LIVCK\\Cloud\\Exceptions\\PlanLimitException;\nuse LIVCK\\Cloud\\Exceptions\\ValidationException;\n\ntry {\n    $client->services()->create($builder);\n} catch (ValidationException $e) {\n    echo $e->firstError('settings.interval_seconds') ?? $e->errorMessage();\n} catch (PlanLimitException $e) {\n    echo $e->limitKey(), ': ', $e->usage(), ' von ', $e->limit();\n}\n",[481,1127,1128,1137,1146,1150,1158,1176,1192,1225,1237,1275],{"__ignoreMap":496},[500,1129,1130,1132,1135],{"class":502,"line":503},[500,1131,559],{"class":558},[500,1133,1134],{"class":562}," LIVCK\\Cloud\\Exceptions\\PlanLimitException",[500,1136,567],{"class":566},[500,1138,1139,1141,1144],{"class":502,"line":570},[500,1140,559],{"class":558},[500,1142,1143],{"class":562}," LIVCK\\Cloud\\Exceptions\\ValidationException",[500,1145,567],{"class":566},[500,1147,1148],{"class":502,"line":577},[500,1149,574],{"emptyLinePlaceholder":573},[500,1151,1152,1155],{"class":502,"line":643},[500,1153,1154],{"class":558},"try",[500,1156,1157],{"class":566}," {\n",[500,1159,1160,1163,1165,1167,1169,1171,1173],{"class":502,"line":648},[500,1161,1162],{"class":566},"    $client",[500,1164,684],{"class":558},[500,1166,731],{"class":506},[500,1168,690],{"class":566},[500,1170,684],{"class":558},[500,1172,738],{"class":506},[500,1174,1175],{"class":566},"($builder);\n",[500,1177,1178,1181,1184,1187,1189],{"class":502,"line":662},[500,1179,1180],{"class":566},"} ",[500,1182,1183],{"class":558},"catch",[500,1185,1186],{"class":566}," (",[500,1188,1042],{"class":562},[500,1190,1191],{"class":566}," $e) {\n",[500,1193,1194,1196,1199,1201,1204,1206,1209,1212,1215,1217,1219,1222],{"class":502,"line":667},[500,1195,865],{"class":562},[500,1197,1198],{"class":566}," $e",[500,1200,684],{"class":558},[500,1202,1203],{"class":506},"firstError",[500,1205,698],{"class":566},[500,1207,1208],{"class":510},"'settings.interval_seconds'",[500,1210,1211],{"class":566},") ",[500,1213,1214],{"class":558},"??",[500,1216,1198],{"class":566},[500,1218,684],{"class":558},[500,1220,1221],{"class":506},"errorMessage",[500,1223,1224],{"class":566},"();\n",[500,1226,1227,1229,1231,1233,1235],{"class":502,"line":673},[500,1228,1180],{"class":566},[500,1230,1183],{"class":558},[500,1232,1186],{"class":566},[500,1234,1049],{"class":562},[500,1236,1191],{"class":566},[500,1238,1239,1241,1243,1245,1248,1251,1253,1256,1258,1261,1263,1266,1268,1270,1273],{"class":502,"line":718},[500,1240,865],{"class":562},[500,1242,1198],{"class":566},[500,1244,684],{"class":558},[500,1246,1247],{"class":506},"limitKey",[500,1249,1250],{"class":566},"(), ",[500,1252,876],{"class":510},[500,1254,1255],{"class":566},", $e",[500,1257,684],{"class":558},[500,1259,1260],{"class":506},"usage",[500,1262,1250],{"class":566},[500,1264,1265],{"class":510},"' von '",[500,1267,1255],{"class":566},[500,1269,684],{"class":558},[500,1271,1272],{"class":506},"limit",[500,1274,1224],{"class":566},[500,1276,1277],{"class":502,"line":723},[500,1278,900],{"class":566},[486,1280,1282],{"id":1281},"testen","Testen",[478,1284,1285,1288],{},[481,1286,1287],{},"CloudClient::fake()"," liefert einen Client, der aus einer Liste vorbereiteter Antworten antwortet. Nichts verlässt den Prozess, Wiederholungen warten nicht, und jede Anfrage wird aufgezeichnet:",[491,1290,1292],{"className":549,"code":1291,"language":551,"meta":496,"style":496},"use LIVCK\\Cloud\\CloudClient;\nuse LIVCK\\Cloud\\Testing\\MockResponse;\nuse LIVCK\\Cloud\\Testing\\RecordedRequest;\n\n[$client, $http] = CloudClient::fake([\n    MockResponse::json(['data' => $tagPayload], 201),\n    MockResponse::error(\"Your plan's service limit has been reached.\", 403, extra: [\n        'limit' => 150,\n        'usage' => 150,\n        'upsell' => ['reason' => 'limit', 'key' => 'services'],\n    ]),\n]);\n\n\u002F\u002F Deinen Code mit $client ausführen, dann:\n$http->assertSentCount(2);\n$http->assertSent(fn (RecordedRequest $request): bool => $request->matches('POST', '\u002Fv1\u002Ftags\u002Fensure'));\n",[481,1293,1294,1302,1311,1320,1324,1341,1368,1395,1408,1419,1450,1455,1460,1464,1469,1486],{"__ignoreMap":496},[500,1295,1296,1298,1300],{"class":502,"line":503},[500,1297,559],{"class":558},[500,1299,563],{"class":562},[500,1301,567],{"class":566},[500,1303,1304,1306,1309],{"class":502,"line":570},[500,1305,559],{"class":558},[500,1307,1308],{"class":562}," LIVCK\\Cloud\\Testing\\MockResponse",[500,1310,567],{"class":566},[500,1312,1313,1315,1318],{"class":502,"line":577},[500,1314,559],{"class":558},[500,1316,1317],{"class":562}," LIVCK\\Cloud\\Testing\\RecordedRequest",[500,1319,567],{"class":566},[500,1321,1322],{"class":502,"line":643},[500,1323,574],{"emptyLinePlaceholder":573},[500,1325,1326,1329,1331,1333,1335,1338],{"class":502,"line":648},[500,1327,1328],{"class":566},"[$client, $http] ",[500,1330,583],{"class":558},[500,1332,589],{"class":562},[500,1334,750],{"class":558},[500,1336,1337],{"class":506},"fake",[500,1339,1340],{"class":566},"([\n",[500,1342,1343,1346,1348,1351,1354,1357,1360,1363,1366],{"class":502,"line":662},[500,1344,1345],{"class":562},"    MockResponse",[500,1347,750],{"class":558},[500,1349,1350],{"class":506},"json",[500,1352,1353],{"class":566},"([",[500,1355,1356],{"class":510},"'data'",[500,1358,1359],{"class":558}," =>",[500,1361,1362],{"class":566}," $tagPayload], ",[500,1364,1365],{"class":562},"201",[500,1367,802],{"class":566},[500,1369,1370,1372,1374,1377,1379,1382,1384,1387,1389,1392],{"class":502,"line":667},[500,1371,1345],{"class":562},[500,1373,750],{"class":558},[500,1375,1376],{"class":506},"error",[500,1378,698],{"class":566},[500,1380,1381],{"class":510},"\"Your plan's service limit has been reached.\"",[500,1383,704],{"class":566},[500,1385,1386],{"class":562},"403",[500,1388,704],{"class":566},[500,1390,1391],{"class":506},"extra",[500,1393,1394],{"class":566},": [\n",[500,1396,1397,1400,1402,1405],{"class":502,"line":673},[500,1398,1399],{"class":510},"        'limit'",[500,1401,1359],{"class":558},[500,1403,1404],{"class":562}," 150",[500,1406,1407],{"class":566},",\n",[500,1409,1410,1413,1415,1417],{"class":502,"line":718},[500,1411,1412],{"class":510},"        'usage'",[500,1414,1359],{"class":558},[500,1416,1404],{"class":562},[500,1418,1407],{"class":566},[500,1420,1421,1424,1426,1429,1432,1434,1437,1439,1442,1444,1447],{"class":502,"line":723},[500,1422,1423],{"class":510},"        'upsell'",[500,1425,1359],{"class":558},[500,1427,1428],{"class":566}," [",[500,1430,1431],{"class":510},"'reason'",[500,1433,1359],{"class":558},[500,1435,1436],{"class":510}," 'limit'",[500,1438,704],{"class":566},[500,1440,1441],{"class":510},"'key'",[500,1443,1359],{"class":558},[500,1445,1446],{"class":510}," 'services'",[500,1448,1449],{"class":566},"],\n",[500,1451,1452],{"class":502,"line":744},[500,1453,1454],{"class":566},"    ]),\n",[500,1456,1457],{"class":502,"line":769},[500,1458,1459],{"class":566},"]);\n",[500,1461,1462],{"class":502,"line":785},[500,1463,574],{"emptyLinePlaceholder":573},[500,1465,1466],{"class":502,"line":805},[500,1467,1468],{"class":595},"\u002F\u002F Deinen Code mit $client ausführen, dann:\n",[500,1470,1471,1474,1476,1479,1481,1484],{"class":502,"line":811},[500,1472,1473],{"class":566},"$http",[500,1475,684],{"class":558},[500,1477,1478],{"class":506},"assertSentCount",[500,1480,698],{"class":566},[500,1482,1483],{"class":562},"2",[500,1485,808],{"class":566},[500,1487,1488,1490,1492,1495,1497,1500,1502,1505,1508,1511,1514,1517,1519,1522,1524,1527,1529,1532],{"class":502,"line":816},[500,1489,1473],{"class":566},[500,1491,684],{"class":558},[500,1493,1494],{"class":506},"assertSent",[500,1496,698],{"class":566},[500,1498,1499],{"class":558},"fn",[500,1501,1186],{"class":566},[500,1503,1504],{"class":562},"RecordedRequest",[500,1506,1507],{"class":566}," $request)",[500,1509,1510],{"class":558},":",[500,1512,1513],{"class":558}," bool",[500,1515,1516],{"class":566}," => $request",[500,1518,684],{"class":558},[500,1520,1521],{"class":506},"matches",[500,1523,698],{"class":566},[500,1525,1526],{"class":510},"'POST'",[500,1528,704],{"class":566},[500,1530,1531],{"class":510},"'\u002Fv1\u002Ftags\u002Fensure'",[500,1533,1534],{"class":566},"));\n",[478,1536,1537,1540,1541,1544,1545,1548,1549,1552],{},[481,1538,1539],{},"$tagPayload"," steht für einen Tag, wie ihn die API liefert. ",[481,1542,1543],{},"MockResponse"," baut außerdem Listen-Seiten (",[481,1546,1547],{},"page()",") und Verbindungsabbrüche (",[481,1550,1551],{},"networkError()",").",[486,1554,1556],{"id":1555},"weiterführende-themen","Weiterführende Themen",[1558,1559,1560,1570,1578,1583],"ul",{},[1561,1562,1563,1569],"li",{},[543,1564,1568],{"href":1565,"rel":1566},"https:\u002F\u002Fgithub.com\u002FLIVCK\u002Fcloud-php#readme",[1567],"nofollow","README auf GitHub"," -- die vollständige Referenz mit Beispielen für Reseller",[1561,1571,1572,1577],{},[543,1573,1576],{"href":1574,"rel":1575},"https:\u002F\u002Fpackagist.org\u002Fpackages\u002Flivck\u002Fcloud-php",[1567],"livck\u002Fcloud-php auf Packagist"," -- Versionen und Abhängigkeiten",[1561,1579,1580,1582],{},[543,1581,406],{"href":407}," -- das Paket für Laravel-Anwendungen",[1561,1584,1585,1587],{},[543,1586,398],{"href":399}," -- Alle verfügbaren Endpunkte im Überblick",[1589,1590,1591],"style",{},"html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}",{"title":496,"searchDepth":577,"depth":577,"links":1593},[1594,1595,1596,1597,1598,1599],{"id":488,"depth":570,"text":489},{"id":537,"depth":570,"text":538},{"id":606,"depth":570,"text":14},{"id":952,"depth":570,"text":953},{"id":1281,"depth":570,"text":1282},{"id":1555,"depth":570,"text":1556},"Das offizielle PHP-SDK für die LIVCK Cloud API. Installation, Einrichtung und die ersten Services.","md",{},null,{"title":402,"description":1600},"9_x0a1nNSuXw1eNkewu_eZYlx7BO40CjMWwHc-NXpBA",1790473986267]