[{"data":1,"prerenderedAt":1286},["ShallowReactive",2],{"search-de":3,"content-de-api\u002Fsdk-java":4,"surround-de-\u002Fapi\u002Fsdk-java":1279},[],{"id":5,"title":6,"body":7,"description":1272,"extension":1273,"meta":1274,"navigation":111,"path":1275,"seo":1276,"stem":1277,"__hash__":1278},"content_de\u002F2.api\u002F4.sdk-java.md","Java-SDK",{"type":8,"value":9,"toc":1259},"minimark",[10,19,24,81,85,159,162,219,223,228,231,460,464,467,534,545,550,553,621,625,628,698,702,709,779,783,790,932,1059,1082,1086,1092,1136,1202,1206,1239,1242,1255],[11,12,13,14,18],"p",{},"Das offizielle Paket ",[15,16,17],"code",{},"owlat-sdk"," stellt einen typisierten Client bereit, um aus jeder JVM-Anwendung mit der Owlat-API zu arbeiten. Erfordert Java 11+.",[20,21,23],"h2",{"id":22},"installation","Installation",[25,26,27,69],"code-group",{},[28,29,35],"pre",{"className":30,"code":31,"filename":32,"language":33,"meta":34,"style":34},"language-xml shiki shiki-themes github-light github-dark-dimmed","\u003Cdependency>\n    \u003CgroupId>com.owlat\u003C\u002FgroupId>\n    \u003CartifactId>owlat-sdk\u003C\u002FartifactId>\n    \u003Cversion>0.1.0\u003C\u002Fversion>\n\u003C\u002Fdependency>\n","Maven","xml","",[15,36,37,45,51,57,63],{"__ignoreMap":34},[38,39,42],"span",{"class":40,"line":41},"line",1,[38,43,44],{},"\u003Cdependency>\n",[38,46,48],{"class":40,"line":47},2,[38,49,50],{},"    \u003CgroupId>com.owlat\u003C\u002FgroupId>\n",[38,52,54],{"class":40,"line":53},3,[38,55,56],{},"    \u003CartifactId>owlat-sdk\u003C\u002FartifactId>\n",[38,58,60],{"class":40,"line":59},4,[38,61,62],{},"    \u003Cversion>0.1.0\u003C\u002Fversion>\n",[38,64,66],{"class":40,"line":65},5,[38,67,68],{},"\u003C\u002Fdependency>\n",[28,70,75],{"className":71,"code":72,"filename":73,"language":74,"meta":34,"style":34},"language-groovy shiki shiki-themes github-light github-dark-dimmed","implementation 'com.owlat:owlat-sdk:0.1.0'\n","Gradle","groovy",[15,76,77],{"__ignoreMap":34},[38,78,79],{"class":40,"line":41},[38,80,72],{},[20,82,84],{"id":83},"schnellstart","Schnellstart",[28,86,90],{"className":87,"code":88,"language":89,"meta":34,"style":34},"language-java shiki shiki-themes github-light github-dark-dimmed","import com.owlat.sdk.Owlat;\nimport com.owlat.sdk.model.contact.Contact;\nimport com.owlat.sdk.model.contact.CreateContactParams;\n\nOwlat owlat = new Owlat(\"lm_live_...\");\n\nContact contact = owlat.contacts().create(\n    CreateContactParams.builder(\"mira@acme.io\")\n        .firstName(\"Mira\")\n        .lastName(\"Chen\")\n        .build()\n);\n","java",[15,91,92,97,102,107,113,118,123,129,135,141,147,153],{"__ignoreMap":34},[38,93,94],{"class":40,"line":41},[38,95,96],{},"import com.owlat.sdk.Owlat;\n",[38,98,99],{"class":40,"line":47},[38,100,101],{},"import com.owlat.sdk.model.contact.Contact;\n",[38,103,104],{"class":40,"line":53},[38,105,106],{},"import com.owlat.sdk.model.contact.CreateContactParams;\n",[38,108,109],{"class":40,"line":59},[38,110,112],{"emptyLinePlaceholder":111},true,"\n",[38,114,115],{"class":40,"line":65},[38,116,117],{},"Owlat owlat = new Owlat(\"lm_live_...\");\n",[38,119,121],{"class":40,"line":120},6,[38,122,112],{"emptyLinePlaceholder":111},[38,124,126],{"class":40,"line":125},7,[38,127,128],{},"Contact contact = owlat.contacts().create(\n",[38,130,132],{"class":40,"line":131},8,[38,133,134],{},"    CreateContactParams.builder(\"mira@acme.io\")\n",[38,136,138],{"class":40,"line":137},9,[38,139,140],{},"        .firstName(\"Mira\")\n",[38,142,144],{"class":40,"line":143},10,[38,145,146],{},"        .lastName(\"Chen\")\n",[38,148,150],{"class":40,"line":149},11,[38,151,152],{},"        .build()\n",[38,154,156],{"class":40,"line":155},12,[38,157,158],{},");\n",[11,160,161],{},"Sie können auch ein vollständiges Konfigurationsobjekt übergeben:",[28,163,165],{"className":87,"code":164,"language":89,"meta":34,"style":34},"import com.owlat.sdk.OwlatConfig;\nimport java.time.Duration;\n\nOwlat owlat = new Owlat(\n    OwlatConfig.builder(\"lm_live_...\")\n        \u002F\u002F Self-hosting? Point baseUrl at your Convex deployment site URL —\n        \u002F\u002F the API is served from https:\u002F\u002F\u003Cyour-deployment>.convex.site\u002Fapi\u002Fv1\u002F*\n        .baseUrl(\"https:\u002F\u002Fyour-deployment.convex.site\")\n        .timeout(Duration.ofSeconds(60))\n        .build()\n);\n",[15,166,167,172,177,181,186,191,196,201,206,211,215],{"__ignoreMap":34},[38,168,169],{"class":40,"line":41},[38,170,171],{},"import com.owlat.sdk.OwlatConfig;\n",[38,173,174],{"class":40,"line":47},[38,175,176],{},"import java.time.Duration;\n",[38,178,179],{"class":40,"line":53},[38,180,112],{"emptyLinePlaceholder":111},[38,182,183],{"class":40,"line":59},[38,184,185],{},"Owlat owlat = new Owlat(\n",[38,187,188],{"class":40,"line":65},[38,189,190],{},"    OwlatConfig.builder(\"lm_live_...\")\n",[38,192,193],{"class":40,"line":120},[38,194,195],{},"        \u002F\u002F Self-hosting? Point baseUrl at your Convex deployment site URL —\n",[38,197,198],{"class":40,"line":125},[38,199,200],{},"        \u002F\u002F the API is served from https:\u002F\u002F\u003Cyour-deployment>.convex.site\u002Fapi\u002Fv1\u002F*\n",[38,202,203],{"class":40,"line":131},[38,204,205],{},"        .baseUrl(\"https:\u002F\u002Fyour-deployment.convex.site\")\n",[38,207,208],{"class":40,"line":137},[38,209,210],{},"        .timeout(Duration.ofSeconds(60))\n",[38,212,213],{"class":40,"line":143},[38,214,152],{},[38,216,217],{"class":40,"line":149},[38,218,158],{},[20,220,222],{"id":221},"ressourcen","Ressourcen",[224,225,227],"h3",{"id":226},"kontakte","Kontakte",[11,229,230],{},"Kontakte in Ihrer Zielgruppe verwalten.",[28,232,234],{"className":87,"code":233,"language":89,"meta":34,"style":34},"\u002F\u002F Create a contact\nContact contact = owlat.contacts().create(\n    CreateContactParams.builder(\"mira@acme.io\")\n        .firstName(\"Mira\")\n        .lastName(\"Chen\")\n        .build()\n);\n\n\u002F\u002F Get by ID or email\nContact found = owlat.contacts().get(\"mira@acme.io\");\n\n\u002F\u002F Update a contact\nContact updated = owlat.contacts().update(\"mira@acme.io\",\n    UpdateContactParams.builder()\n        .lastName(\"Chen-Lopez\")\n        .build()\n);\n\n\u002F\u002F List with cursor-based pagination\nPaginatedResponse\u003CContact> page = owlat.contacts().list(\n    PaginationParams.builder()\n        .limit(25)\n        .search(\"jane\")\n        .build()\n);\n\n\u002F\u002F Fetch the next page with the returned cursor\nif (!page.getPagination().isDone()) {\n    PaginatedResponse\u003CContact> next = owlat.contacts().list(\n        PaginationParams.builder()\n            .cursor(page.getPagination().getCursor())\n            .build()\n    );\n}\n\n\u002F\u002F Or let the SDK follow cursors for you — listAll() returns a lazy\n\u002F\u002F Stream\u003CContact> that fetches pages on demand (limit\u002Fsearch honored,\n\u002F\u002F any supplied cursor ignored), so you never hold the full set in memory\nowlat.contacts().listAll().forEach(c -> System.out.println(c.getEmail()));\n\n\u002F\u002F Delete a contact\nDeleteContactResponse deleted = owlat.contacts().delete(\"mira@acme.io\");\n",[15,235,236,241,245,249,253,257,261,265,269,274,279,283,288,294,300,306,311,316,321,327,333,339,345,351,356,361,366,372,378,384,390,396,402,408,414,419,425,431,437,443,448,454],{"__ignoreMap":34},[38,237,238],{"class":40,"line":41},[38,239,240],{},"\u002F\u002F Create a contact\n",[38,242,243],{"class":40,"line":47},[38,244,128],{},[38,246,247],{"class":40,"line":53},[38,248,134],{},[38,250,251],{"class":40,"line":59},[38,252,140],{},[38,254,255],{"class":40,"line":65},[38,256,146],{},[38,258,259],{"class":40,"line":120},[38,260,152],{},[38,262,263],{"class":40,"line":125},[38,264,158],{},[38,266,267],{"class":40,"line":131},[38,268,112],{"emptyLinePlaceholder":111},[38,270,271],{"class":40,"line":137},[38,272,273],{},"\u002F\u002F Get by ID or email\n",[38,275,276],{"class":40,"line":143},[38,277,278],{},"Contact found = owlat.contacts().get(\"mira@acme.io\");\n",[38,280,281],{"class":40,"line":149},[38,282,112],{"emptyLinePlaceholder":111},[38,284,285],{"class":40,"line":155},[38,286,287],{},"\u002F\u002F Update a contact\n",[38,289,291],{"class":40,"line":290},13,[38,292,293],{},"Contact updated = owlat.contacts().update(\"mira@acme.io\",\n",[38,295,297],{"class":40,"line":296},14,[38,298,299],{},"    UpdateContactParams.builder()\n",[38,301,303],{"class":40,"line":302},15,[38,304,305],{},"        .lastName(\"Chen-Lopez\")\n",[38,307,309],{"class":40,"line":308},16,[38,310,152],{},[38,312,314],{"class":40,"line":313},17,[38,315,158],{},[38,317,319],{"class":40,"line":318},18,[38,320,112],{"emptyLinePlaceholder":111},[38,322,324],{"class":40,"line":323},19,[38,325,326],{},"\u002F\u002F List with cursor-based pagination\n",[38,328,330],{"class":40,"line":329},20,[38,331,332],{},"PaginatedResponse\u003CContact> page = owlat.contacts().list(\n",[38,334,336],{"class":40,"line":335},21,[38,337,338],{},"    PaginationParams.builder()\n",[38,340,342],{"class":40,"line":341},22,[38,343,344],{},"        .limit(25)\n",[38,346,348],{"class":40,"line":347},23,[38,349,350],{},"        .search(\"jane\")\n",[38,352,354],{"class":40,"line":353},24,[38,355,152],{},[38,357,359],{"class":40,"line":358},25,[38,360,158],{},[38,362,364],{"class":40,"line":363},26,[38,365,112],{"emptyLinePlaceholder":111},[38,367,369],{"class":40,"line":368},27,[38,370,371],{},"\u002F\u002F Fetch the next page with the returned cursor\n",[38,373,375],{"class":40,"line":374},28,[38,376,377],{},"if (!page.getPagination().isDone()) {\n",[38,379,381],{"class":40,"line":380},29,[38,382,383],{},"    PaginatedResponse\u003CContact> next = owlat.contacts().list(\n",[38,385,387],{"class":40,"line":386},30,[38,388,389],{},"        PaginationParams.builder()\n",[38,391,393],{"class":40,"line":392},31,[38,394,395],{},"            .cursor(page.getPagination().getCursor())\n",[38,397,399],{"class":40,"line":398},32,[38,400,401],{},"            .build()\n",[38,403,405],{"class":40,"line":404},33,[38,406,407],{},"    );\n",[38,409,411],{"class":40,"line":410},34,[38,412,413],{},"}\n",[38,415,417],{"class":40,"line":416},35,[38,418,112],{"emptyLinePlaceholder":111},[38,420,422],{"class":40,"line":421},36,[38,423,424],{},"\u002F\u002F Or let the SDK follow cursors for you — listAll() returns a lazy\n",[38,426,428],{"class":40,"line":427},37,[38,429,430],{},"\u002F\u002F Stream\u003CContact> that fetches pages on demand (limit\u002Fsearch honored,\n",[38,432,434],{"class":40,"line":433},38,[38,435,436],{},"\u002F\u002F any supplied cursor ignored), so you never hold the full set in memory\n",[38,438,440],{"class":40,"line":439},39,[38,441,442],{},"owlat.contacts().listAll().forEach(c -> System.out.println(c.getEmail()));\n",[38,444,446],{"class":40,"line":445},40,[38,447,112],{"emptyLinePlaceholder":111},[38,449,451],{"class":40,"line":450},41,[38,452,453],{},"\u002F\u002F Delete a contact\n",[38,455,457],{"class":40,"line":456},42,[38,458,459],{},"DeleteContactResponse deleted = owlat.contacts().delete(\"mira@acme.io\");\n",[224,461,463],{"id":462},"transaktional","Transaktional",[11,465,466],{},"Transaktionale E-Mails mit vorgefertigten Vorlagen versenden.",[28,468,470],{"className":87,"code":469,"language":89,"meta":34,"style":34},"import com.owlat.sdk.model.transactional.SendTransactionalParams;\nimport com.owlat.sdk.model.transactional.SendTransactionalResponse;\n\nSendTransactionalResponse result = owlat.transactional().send(\n    SendTransactionalParams.builder(\"buyer@example.com\")\n        .slug(\"order-confirmation\")\n        .dataVariables(Map.of(\n            \"orderId\", \"ORD-7291\",\n            \"total\", \"$142.00\"\n        ))\n        .language(\"en\")\n        .build()\n);\n",[15,471,472,477,482,486,491,496,501,506,511,516,521,526,530],{"__ignoreMap":34},[38,473,474],{"class":40,"line":41},[38,475,476],{},"import com.owlat.sdk.model.transactional.SendTransactionalParams;\n",[38,478,479],{"class":40,"line":47},[38,480,481],{},"import com.owlat.sdk.model.transactional.SendTransactionalResponse;\n",[38,483,484],{"class":40,"line":53},[38,485,112],{"emptyLinePlaceholder":111},[38,487,488],{"class":40,"line":59},[38,489,490],{},"SendTransactionalResponse result = owlat.transactional().send(\n",[38,492,493],{"class":40,"line":65},[38,494,495],{},"    SendTransactionalParams.builder(\"buyer@example.com\")\n",[38,497,498],{"class":40,"line":120},[38,499,500],{},"        .slug(\"order-confirmation\")\n",[38,502,503],{"class":40,"line":125},[38,504,505],{},"        .dataVariables(Map.of(\n",[38,507,508],{"class":40,"line":131},[38,509,510],{},"            \"orderId\", \"ORD-7291\",\n",[38,512,513],{"class":40,"line":137},[38,514,515],{},"            \"total\", \"$142.00\"\n",[38,517,518],{"class":40,"line":143},[38,519,520],{},"        ))\n",[38,522,523],{"class":40,"line":149},[38,524,525],{},"        .language(\"en\")\n",[38,527,528],{"class":40,"line":155},[38,529,152],{},[38,531,532],{"class":40,"line":290},[38,533,158],{},[11,535,536,537,540,541,544],{},"Sie können die Vorlage über ",[15,538,539],{},"slug"," oder ",[15,542,543],{},"transactionalId"," identifizieren. Mindestens eines von beiden muss angegeben werden.",[546,547,549],"h4",{"id":548},"anhänge","Anhänge",[11,551,552],{},"Sie können Dateien über Base64-kodierten Inhalt oder HTTPS-URLs anhängen (max. 10 Dateien, insgesamt 10 MB):",[28,554,556],{"className":87,"code":555,"language":89,"meta":34,"style":34},"import com.owlat.sdk.model.transactional.TransactionalAttachment;\n\nSendTransactionalResponse result = owlat.transactional().send(\n    SendTransactionalParams.builder(\"buyer@example.com\")\n        .slug(\"order-confirmation\")\n        .attachment(TransactionalAttachment.builder(\"invoice.pdf\")\n            .content(base64String)\n            .contentType(\"application\u002Fpdf\")\n            .build())\n        .attachment(TransactionalAttachment.builder(\"receipt.pdf\")\n            .url(\"https:\u002F\u002Fyour-api.com\u002Freceipts\u002FORD-7291.pdf\")\n            .build())\n        .build()\n);\n",[15,557,558,563,567,571,575,579,584,589,594,599,604,609,613,617],{"__ignoreMap":34},[38,559,560],{"class":40,"line":41},[38,561,562],{},"import com.owlat.sdk.model.transactional.TransactionalAttachment;\n",[38,564,565],{"class":40,"line":47},[38,566,112],{"emptyLinePlaceholder":111},[38,568,569],{"class":40,"line":53},[38,570,490],{},[38,572,573],{"class":40,"line":59},[38,574,495],{},[38,576,577],{"class":40,"line":65},[38,578,500],{},[38,580,581],{"class":40,"line":120},[38,582,583],{},"        .attachment(TransactionalAttachment.builder(\"invoice.pdf\")\n",[38,585,586],{"class":40,"line":125},[38,587,588],{},"            .content(base64String)\n",[38,590,591],{"class":40,"line":131},[38,592,593],{},"            .contentType(\"application\u002Fpdf\")\n",[38,595,596],{"class":40,"line":137},[38,597,598],{},"            .build())\n",[38,600,601],{"class":40,"line":143},[38,602,603],{},"        .attachment(TransactionalAttachment.builder(\"receipt.pdf\")\n",[38,605,606],{"class":40,"line":149},[38,607,608],{},"            .url(\"https:\u002F\u002Fyour-api.com\u002Freceipts\u002FORD-7291.pdf\")\n",[38,610,611],{"class":40,"line":155},[38,612,598],{},[38,614,615],{"class":40,"line":290},[38,616,152],{},[38,618,619],{"class":40,"line":296},[38,620,158],{},[224,622,624],{"id":623},"events","Events",[11,626,627],{},"Eigene Ereignisse senden, um Automationen auszulösen und Segmente aufzubauen.",[28,629,631],{"className":87,"code":630,"language":89,"meta":34,"style":34},"import com.owlat.sdk.model.event.SendEventParams;\nimport com.owlat.sdk.model.event.SendEventResponse;\n\nSendEventResponse result = owlat.events().send(\n    SendEventParams.builder(\"mira@acme.io\", \"plan_upgraded\")\n        .eventProperties(Map.of(\n            \"plan\", \"pro\",\n            \"mrr\", 49\n        ))\n        .createContactIfNotExists(true)\n        .build()\n);\n\n\u002F\u002F result.getTriggeredAutomations() — number of automations triggered (int)\n",[15,632,633,638,643,647,652,657,662,667,672,676,681,685,689,693],{"__ignoreMap":34},[38,634,635],{"class":40,"line":41},[38,636,637],{},"import com.owlat.sdk.model.event.SendEventParams;\n",[38,639,640],{"class":40,"line":47},[38,641,642],{},"import com.owlat.sdk.model.event.SendEventResponse;\n",[38,644,645],{"class":40,"line":53},[38,646,112],{"emptyLinePlaceholder":111},[38,648,649],{"class":40,"line":59},[38,650,651],{},"SendEventResponse result = owlat.events().send(\n",[38,653,654],{"class":40,"line":65},[38,655,656],{},"    SendEventParams.builder(\"mira@acme.io\", \"plan_upgraded\")\n",[38,658,659],{"class":40,"line":120},[38,660,661],{},"        .eventProperties(Map.of(\n",[38,663,664],{"class":40,"line":125},[38,665,666],{},"            \"plan\", \"pro\",\n",[38,668,669],{"class":40,"line":131},[38,670,671],{},"            \"mrr\", 49\n",[38,673,674],{"class":40,"line":137},[38,675,520],{},[38,677,678],{"class":40,"line":143},[38,679,680],{},"        .createContactIfNotExists(true)\n",[38,682,683],{"class":40,"line":149},[38,684,152],{},[38,686,687],{"class":40,"line":155},[38,688,158],{},[38,690,691],{"class":40,"line":290},[38,692,112],{"emptyLinePlaceholder":111},[38,694,695],{"class":40,"line":296},[38,696,697],{},"\u002F\u002F result.getTriggeredAutomations() — number of automations triggered (int)\n",[224,699,701],{"id":700},"themen","Themen",[11,703,704,705,708],{},"Themen-Mitgliedschaften verwalten. Die API ist reine Schreib-API (Hinzufügen\u002FEntfernen) — es gibt keinen\nList-\u002FGet-Endpunkt; kopieren Sie die ",[15,706,707],{},"topicId"," daher aus dem Dashboard (Themen → ein Thema).",[28,710,712],{"className":87,"code":711,"language":89,"meta":34,"style":34},"import com.owlat.sdk.model.topic.*;\n\n\u002F\u002F Add a contact to a topic\nAddToTopicResponse added = owlat.topics().addContact(\n    AddToTopicParams.builder(\"topic_abc123\")\n        .email(\"mira@acme.io\")\n        .build()\n);\n\u002F\u002F added.getDoiStatus() — NOT_REQUIRED, PENDING, or CONFIRMED\n\n\u002F\u002F Remove a contact from a topic\nRemoveFromTopicResponse removed = owlat.topics().removeContact(\n    new RemoveFromTopicParams(\"topic_abc123\", \"mira@acme.io\")\n);\n",[15,713,714,719,723,728,733,738,743,747,751,756,760,765,770,775],{"__ignoreMap":34},[38,715,716],{"class":40,"line":41},[38,717,718],{},"import com.owlat.sdk.model.topic.*;\n",[38,720,721],{"class":40,"line":47},[38,722,112],{"emptyLinePlaceholder":111},[38,724,725],{"class":40,"line":53},[38,726,727],{},"\u002F\u002F Add a contact to a topic\n",[38,729,730],{"class":40,"line":59},[38,731,732],{},"AddToTopicResponse added = owlat.topics().addContact(\n",[38,734,735],{"class":40,"line":65},[38,736,737],{},"    AddToTopicParams.builder(\"topic_abc123\")\n",[38,739,740],{"class":40,"line":120},[38,741,742],{},"        .email(\"mira@acme.io\")\n",[38,744,745],{"class":40,"line":125},[38,746,152],{},[38,748,749],{"class":40,"line":131},[38,750,158],{},[38,752,753],{"class":40,"line":137},[38,754,755],{},"\u002F\u002F added.getDoiStatus() — NOT_REQUIRED, PENDING, or CONFIRMED\n",[38,757,758],{"class":40,"line":143},[38,759,112],{"emptyLinePlaceholder":111},[38,761,762],{"class":40,"line":149},[38,763,764],{},"\u002F\u002F Remove a contact from a topic\n",[38,766,767],{"class":40,"line":155},[38,768,769],{},"RemoveFromTopicResponse removed = owlat.topics().removeContact(\n",[38,771,772],{"class":40,"line":290},[38,773,774],{},"    new RemoveFromTopicParams(\"topic_abc123\", \"mira@acme.io\")\n",[38,776,777],{"class":40,"line":296},[38,778,158],{},[20,780,782],{"id":781},"fehlerbehandlung","Fehlerbehandlung",[11,784,785,786,789],{},"Alle Exceptions erben von ",[15,787,788],{},"OwlatException"," (unchecked) und enthalten den HTTP-Statuscode sowie Informationen zum Rate-Limit.",[28,791,793],{"className":87,"code":792,"language":89,"meta":34,"style":34},"import com.owlat.sdk.exception.*;\n\ntry {\n    owlat.transactional().send(\n        SendTransactionalParams.builder(\"user@example.com\").slug(\"welcome\").build()\n    );\n} catch (InvalidStateException e) {\n    \u002F\u002F 422 — unverified sending domain, blocked recipient, unpublished template.\n    \u002F\u002F The most common transactional failure mode.\n    System.err.println(\"Cannot send yet: \" + e.getMessage());\n} catch (ForbiddenException e) {\n    \u002F\u002F 403 — suspended \u002F abuse-blocked account.\n    System.err.println(\"Not permitted: \" + e.getMessage());\n} catch (LimitReachedException e) {\n    System.err.println(\"Plan limit reached: \" + e.getMessage());\n} catch (NotFoundException e) {\n    System.err.println(\"Not found: \" + e.getMessage());\n} catch (AuthenticationException e) {\n    System.err.println(\"Invalid API key\");\n} catch (RateLimitException e) {\n    System.err.println(\"Rate limited. Retry after \" + e.getRetryAfter() + \"s\");\n} catch (ValidationException e) {\n    System.err.println(\"Invalid request: \" + e.getMessage());\n} catch (ConflictException e) {\n    System.err.println(\"Conflict: \" + e.getMessage());\n} catch (OwlatException e) {\n    System.err.println(\"API error \" + e.getStatusCode() + \": \" + e.getMessage());\n}\n",[15,794,795,800,804,809,814,819,823,828,833,838,843,848,853,858,863,868,873,878,883,888,893,898,903,908,913,918,923,928],{"__ignoreMap":34},[38,796,797],{"class":40,"line":41},[38,798,799],{},"import com.owlat.sdk.exception.*;\n",[38,801,802],{"class":40,"line":47},[38,803,112],{"emptyLinePlaceholder":111},[38,805,806],{"class":40,"line":53},[38,807,808],{},"try {\n",[38,810,811],{"class":40,"line":59},[38,812,813],{},"    owlat.transactional().send(\n",[38,815,816],{"class":40,"line":65},[38,817,818],{},"        SendTransactionalParams.builder(\"user@example.com\").slug(\"welcome\").build()\n",[38,820,821],{"class":40,"line":120},[38,822,407],{},[38,824,825],{"class":40,"line":125},[38,826,827],{},"} catch (InvalidStateException e) {\n",[38,829,830],{"class":40,"line":131},[38,831,832],{},"    \u002F\u002F 422 — unverified sending domain, blocked recipient, unpublished template.\n",[38,834,835],{"class":40,"line":137},[38,836,837],{},"    \u002F\u002F The most common transactional failure mode.\n",[38,839,840],{"class":40,"line":143},[38,841,842],{},"    System.err.println(\"Cannot send yet: \" + e.getMessage());\n",[38,844,845],{"class":40,"line":149},[38,846,847],{},"} catch (ForbiddenException e) {\n",[38,849,850],{"class":40,"line":155},[38,851,852],{},"    \u002F\u002F 403 — suspended \u002F abuse-blocked account.\n",[38,854,855],{"class":40,"line":290},[38,856,857],{},"    System.err.println(\"Not permitted: \" + e.getMessage());\n",[38,859,860],{"class":40,"line":296},[38,861,862],{},"} catch (LimitReachedException e) {\n",[38,864,865],{"class":40,"line":302},[38,866,867],{},"    System.err.println(\"Plan limit reached: \" + e.getMessage());\n",[38,869,870],{"class":40,"line":308},[38,871,872],{},"} catch (NotFoundException e) {\n",[38,874,875],{"class":40,"line":313},[38,876,877],{},"    System.err.println(\"Not found: \" + e.getMessage());\n",[38,879,880],{"class":40,"line":318},[38,881,882],{},"} catch (AuthenticationException e) {\n",[38,884,885],{"class":40,"line":323},[38,886,887],{},"    System.err.println(\"Invalid API key\");\n",[38,889,890],{"class":40,"line":329},[38,891,892],{},"} catch (RateLimitException e) {\n",[38,894,895],{"class":40,"line":335},[38,896,897],{},"    System.err.println(\"Rate limited. Retry after \" + e.getRetryAfter() + \"s\");\n",[38,899,900],{"class":40,"line":341},[38,901,902],{},"} catch (ValidationException e) {\n",[38,904,905],{"class":40,"line":347},[38,906,907],{},"    System.err.println(\"Invalid request: \" + e.getMessage());\n",[38,909,910],{"class":40,"line":353},[38,911,912],{},"} catch (ConflictException e) {\n",[38,914,915],{"class":40,"line":358},[38,916,917],{},"    System.err.println(\"Conflict: \" + e.getMessage());\n",[38,919,920],{"class":40,"line":363},[38,921,922],{},"} catch (OwlatException e) {\n",[38,924,925],{"class":40,"line":368},[38,926,927],{},"    System.err.println(\"API error \" + e.getStatusCode() + \": \" + e.getMessage());\n",[38,929,930],{"class":40,"line":374},[38,931,413],{},[933,934,935,951],"table",{},[936,937,938],"thead",{},[939,940,941,945,948],"tr",{},[942,943,944],"th",{},"Exception-Klasse",[942,946,947],{},"HTTP-Status",[942,949,950],{},"Wann",[952,953,954,968,981,994,1007,1020,1033,1046],"tbody",{},[939,955,956,962,965],{},[957,958,959],"td",{},[15,960,961],{},"AuthenticationException",[957,963,964],{},"401",[957,966,967],{},"Ungültiger oder fehlender API-Key",[939,969,970,975,978],{},[957,971,972],{},[15,973,974],{},"LimitReachedException",[957,976,977],{},"402",[957,979,980],{},"Tarif- oder Kontingentgrenze erreicht",[939,982,983,988,991],{},[957,984,985],{},[15,986,987],{},"ForbiddenException",[957,989,990],{},"403",[957,992,993],{},"Authentifiziert, aber nicht berechtigt (gesperrt \u002F wegen Missbrauchs blockiert)",[939,995,996,1001,1004],{},[957,997,998],{},[15,999,1000],{},"NotFoundException",[957,1002,1003],{},"404",[957,1005,1006],{},"Ressource existiert nicht",[939,1008,1009,1014,1017],{},[957,1010,1011],{},[15,1012,1013],{},"ConflictException",[957,1015,1016],{},"409",[957,1018,1019],{},"Doppelte Ressource (z. B. bereits vorhandene E-Mail-Adresse)",[939,1021,1022,1027,1030],{},[957,1023,1024],{},[15,1025,1026],{},"InvalidStateException",[957,1028,1029],{},"422",[957,1031,1032],{},"Der Zustand der Ressource blockiert die Operation (nicht verifizierte Domain, blockierter Empfänger, nicht veröffentlichte Vorlage)",[939,1034,1035,1040,1043],{},[957,1036,1037],{},[15,1038,1039],{},"RateLimitException",[957,1041,1042],{},"429",[957,1044,1045],{},"Zu viele Anfragen",[939,1047,1048,1053,1056],{},[957,1049,1050],{},[15,1051,1052],{},"ValidationException",[957,1054,1055],{},"400",[957,1057,1058],{},"Der Request-Body besteht die Validierung nicht",[11,1060,1061,1062,1065,1066,1069,1070,1073,1074,1077,1078,1081],{},"Jede Exception stellt ",[15,1063,1064],{},"getRateLimit()"," bereit, das ein ",[15,1067,1068],{},"RateLimitInfo"," mit ",[15,1071,1072],{},"getLimit()",", ",[15,1075,1076],{},"getRemaining()"," und ",[15,1079,1080],{},"getReset()"," zurückliefert.",[20,1083,1085],{"id":1084},"rate-limit-tracking","Rate-Limit-Tracking",[11,1087,1088,1089,1091],{},"Rate-Limit-Header werden aus jeder Antwort automatisch geparst. Greifen Sie über ",[15,1090,1064],{}," an jeder Exception darauf zu oder sehen Sie sich die Response-Header direkt an:",[933,1093,1094,1104],{},[936,1095,1096],{},[939,1097,1098,1101],{},[942,1099,1100],{},"Header",[942,1102,1103],{},"Beschreibung",[952,1105,1106,1116,1126],{},[939,1107,1108,1113],{},[957,1109,1110],{},[15,1111,1112],{},"X-RateLimit-Limit",[957,1114,1115],{},"Maximale Anzahl Anfragen pro Fenster",[939,1117,1118,1123],{},[957,1119,1120],{},[15,1121,1122],{},"X-RateLimit-Remaining",[957,1124,1125],{},"Im aktuellen Fenster verbleibende Anfragen",[939,1127,1128,1133],{},[957,1129,1130],{},[15,1131,1132],{},"X-RateLimit-Reset",[957,1134,1135],{},"Sekunden bis zum Zurücksetzen des Fensters",[1137,1138,1141,1175],"callout",{"title":1139,"type":1140},"Retries und Idempotenz","info",[11,1142,1143,1144,1148,1149,1151,1152,1155,1156,1159,1160,1163,1164,1167,1168,1167,1171,1174],{},"Das Java-SDK wiederholt vorübergehende Fehler automatisch — bis zu ",[1145,1146,1147],"strong",{},"2 Wiederholungen","\n(insgesamt 3 Versuche) mit exponentiellem Backoff (500 ms Basis, jeweils verdoppelt).\nEin ",[15,1150,1042],{}," wird unabhängig von der Methode stets wiederholt, unter Beachtung des\n",[15,1153,1154],{},"Retry-After","-Headers (gedeckelt bei 30 s). Ein ",[15,1157,1158],{},"5xx"," oder ein Netzwerk-\u002FTimeout-Fehler wird nur bei\n",[1145,1161,1162],{},"idempotenten Methoden"," (",[15,1165,1166],{},"GET","\u002F",[15,1169,1170],{},"PUT",[15,1172,1173],{},"DELETE",") wiederholt.",[11,1176,1177,1180,1181,1077,1184,1187,1188,1190,1191,1194,1195,1197,1198,1201],{},[15,1178,1179],{},"POST","-Sendungen — ",[15,1182,1183],{},"transactional().send(...)",[15,1185,1186],{},"events().send(...)"," — werden bei einem ",[15,1189,1158],{},"\noder Netzwerkfehler ",[1145,1192,1193],{},"nicht"," automatisch wiederholt, da der Server keinen Idempotenzschlüssel hat\nund eine vom Server bereits verarbeitete Sendung nicht dupliziert werden darf. Diese erscheinen als\nExceptions, die Sie selbst behandeln; spielen Sie sie niemals blind erneut ab. Eine\n",[15,1196,1039],{}," (429) stellt weiterhin ",[15,1199,1200],{},"getRetryAfter()"," bereit, falls Sie zurückregeln und\neinen Aufruf manuell wiederholen möchten.",[20,1203,1205],{"id":1204},"aus-dem-quellcode-bauen","Aus dem Quellcode bauen",[28,1207,1211],{"className":1208,"code":1209,"language":1210,"meta":34,"style":34},"language-bash shiki shiki-themes github-light github-dark-dimmed","cd packages\u002Fsdk-java\nmvn compile\nmvn test\n","bash",[15,1212,1213,1223,1232],{"__ignoreMap":34},[38,1214,1215,1219],{"class":40,"line":41},[38,1216,1218],{"class":1217},"sviXB","cd",[38,1220,1222],{"class":1221},"s-HuK"," packages\u002Fsdk-java\n",[38,1224,1225,1229],{"class":40,"line":47},[38,1226,1228],{"class":1227},"sOLd2","mvn",[38,1230,1231],{"class":1221}," compile\n",[38,1233,1234,1236],{"class":40,"line":53},[38,1235,1228],{"class":1227},[38,1237,1238],{"class":1221}," test\n",[1240,1241],"hr",{},[1137,1243,1246],{"title":1244,"type":1245},"Sie nutzen TypeScript?","tip",[11,1247,1248,1249,1254],{},"Für die Integration mit Node.js, Bun und Deno siehe die Referenz zum ",[1250,1251,1253],"a",{"href":1252},"\u002Fapi\u002Fsdk","TypeScript-SDK",".",[1256,1257,1258],"style",{},"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 .sviXB, html code.shiki .sviXB{--shiki-default:#005CC5;--shiki-dark:#6CB6FF}html pre.shiki code .s-HuK, html code.shiki .s-HuK{--shiki-default:#032F62;--shiki-dark:#96D0FF}html pre.shiki code .sOLd2, html code.shiki .sOLd2{--shiki-default:#6F42C1;--shiki-dark:#F69D50}",{"title":34,"searchDepth":47,"depth":47,"links":1260},[1261,1262,1263,1269,1270,1271],{"id":22,"depth":47,"text":23},{"id":83,"depth":47,"text":84},{"id":221,"depth":47,"text":222,"children":1264},[1265,1266,1267,1268],{"id":226,"depth":53,"text":227},{"id":462,"depth":53,"text":463},{"id":623,"depth":53,"text":624},{"id":700,"depth":53,"text":701},{"id":781,"depth":47,"text":782},{"id":1084,"depth":47,"text":1085},{"id":1204,"depth":47,"text":1205},"Das offizielle Paket `owlat-sdk` stellt einen typisierten Client bereit, um aus jeder JVM-Anwendung mit der Owlat-API zu arbeiten. Erfordert Java 11+.","md",{},"\u002Fapi\u002Fsdk-java",{"title":6,"description":1272},"2.api\u002F4.sdk-java","6nh-0lviqi438UsxoXTR6cVPTNywklHqrR3Ey50O_O4",[1280,1282],{"title":1253,"path":1252,"stem":1281,"children":-1},"2.api\u002F3.sdk",{"title":1283,"path":1284,"stem":1285,"children":-1},"Kontakte-API","\u002Fapi\u002Fcontacts","2.api\u002F5.contacts",1786915106686]