[{"data":1,"prerenderedAt":1838},["ShallowReactive",2],{"search-de":3,"content-de-api\u002Fsdk":4,"surround-de-\u002Fapi\u002Fsdk":1831},[],{"id":5,"title":6,"body":7,"description":1824,"extension":1825,"meta":1826,"navigation":113,"path":1827,"seo":1828,"stem":1829,"__hash__":1830},"content_de\u002F2.api\u002F3.sdk.md","TypeScript-SDK",{"type":8,"value":9,"toc":1812},"minimark",[10,19,24,81,85,212,215,289,307,383,387,392,395,727,731,734,864,869,872,989,993,996,1063,1067,1074,1159,1163,1166,1588,1714,1718,1721,1793,1796,1808],[11,12,13,14,18],"p",{},"Das offizielle Paket ",[15,16,17],"code",{},"@owlat\u002Fsdk-js"," stellt einen typisierten Client bereit, um aus Node.js, Bun, Deno oder jeder serverseitigen JavaScript-Laufzeitumgebung mit der Owlat-API zu arbeiten.",[20,21,23],"h2",{"id":22},"installation","Installation",[25,26,27,52,67],"code-group",{},[28,29,35],"pre",{"className":30,"code":31,"filename":32,"language":33,"meta":34,"style":34},"language-sh shiki shiki-themes github-light github-dark-dimmed","bun add @owlat\u002Fsdk-js\n","bun","sh","",[15,36,37],{"__ignoreMap":34},[38,39,42,45,49],"span",{"class":40,"line":41},"line",1,[38,43,32],{"class":44},"sOLd2",[38,46,48],{"class":47},"s-HuK"," add",[38,50,51],{"class":47}," @owlat\u002Fsdk-js\n",[28,53,56],{"className":30,"code":54,"filename":55,"language":33,"meta":34,"style":34},"npm install @owlat\u002Fsdk-js\n","npm",[15,57,58],{"__ignoreMap":34},[38,59,60,62,65],{"class":40,"line":41},[38,61,55],{"class":44},[38,63,64],{"class":47}," install",[38,66,51],{"class":47},[28,68,71],{"className":30,"code":69,"filename":70,"language":33,"meta":34,"style":34},"pnpm add @owlat\u002Fsdk-js\n","pnpm",[15,72,73],{"__ignoreMap":34},[38,74,75,77,79],{"class":40,"line":41},[38,76,70],{"class":44},[38,78,48],{"class":47},[38,80,51],{"class":47},[20,82,84],{"id":83},"schnellstart","Schnellstart",[28,86,90],{"className":87,"code":88,"language":89,"meta":34,"style":34},"language-typescript shiki shiki-themes github-light github-dark-dimmed","import { Owlat } from '@owlat\u002Fsdk-js'\n\nconst owlat = new Owlat('lm_live_...')\n\n\u002F\u002F Send a transactional email\nawait owlat.transactional.send({\n  email: 'recipient@example.com',\n  slug: 'welcome-email',\n  dataVariables: { firstName: 'Mira' }\n})\n","typescript",[15,91,92,108,115,144,149,156,171,183,194,206],{"__ignoreMap":34},[38,93,94,98,102,105],{"class":40,"line":41},[38,95,97],{"class":96},"s7YZ4","import",[38,99,101],{"class":100},"sYgZi"," { Owlat } ",[38,103,104],{"class":96},"from",[38,106,107],{"class":47}," '@owlat\u002Fsdk-js'\n",[38,109,111],{"class":40,"line":110},2,[38,112,114],{"emptyLinePlaceholder":113},true,"\n",[38,116,118,121,125,128,131,135,138,141],{"class":40,"line":117},3,[38,119,120],{"class":96},"const",[38,122,124],{"class":123},"sviXB"," owlat",[38,126,127],{"class":96}," =",[38,129,130],{"class":96}," new",[38,132,134],{"class":133},"sPO5f"," Owlat",[38,136,137],{"class":100},"(",[38,139,140],{"class":47},"'lm_live_...'",[38,142,143],{"class":100},")\n",[38,145,147],{"class":40,"line":146},4,[38,148,114],{"emptyLinePlaceholder":113},[38,150,152],{"class":40,"line":151},5,[38,153,155],{"class":154},"sDN9O","\u002F\u002F Send a transactional email\n",[38,157,159,162,165,168],{"class":40,"line":158},6,[38,160,161],{"class":96},"await",[38,163,164],{"class":100}," owlat.transactional.",[38,166,167],{"class":133},"send",[38,169,170],{"class":100},"({\n",[38,172,174,177,180],{"class":40,"line":173},7,[38,175,176],{"class":100},"  email: ",[38,178,179],{"class":47},"'recipient@example.com'",[38,181,182],{"class":100},",\n",[38,184,186,189,192],{"class":40,"line":185},8,[38,187,188],{"class":100},"  slug: ",[38,190,191],{"class":47},"'welcome-email'",[38,193,182],{"class":100},[38,195,197,200,203],{"class":40,"line":196},9,[38,198,199],{"class":100},"  dataVariables: { firstName: ",[38,201,202],{"class":47},"'Mira'",[38,204,205],{"class":100}," }\n",[38,207,209],{"class":40,"line":208},10,[38,210,211],{"class":100},"})\n",[11,213,214],{},"Sie können auch ein Konfigurationsobjekt übergeben:",[28,216,218],{"className":87,"code":217,"language":89,"meta":34,"style":34},"const owlat = new Owlat({\n  apiKey: 'lm_live_...',\n  baseUrl: 'https:\u002F\u002Fyour-deployment.convex.site',\n  timeout: 30000,\n  retry: { maxRetries: 2, initialDelayMs: 500, backoffMultiplier: 2 },\n})\n",[15,219,220,234,243,253,263,285],{"__ignoreMap":34},[38,221,222,224,226,228,230,232],{"class":40,"line":41},[38,223,120],{"class":96},[38,225,124],{"class":123},[38,227,127],{"class":96},[38,229,130],{"class":96},[38,231,134],{"class":133},[38,233,170],{"class":100},[38,235,236,239,241],{"class":40,"line":110},[38,237,238],{"class":100},"  apiKey: ",[38,240,140],{"class":47},[38,242,182],{"class":100},[38,244,245,248,251],{"class":40,"line":117},[38,246,247],{"class":100},"  baseUrl: ",[38,249,250],{"class":47},"'https:\u002F\u002Fyour-deployment.convex.site'",[38,252,182],{"class":100},[38,254,255,258,261],{"class":40,"line":146},[38,256,257],{"class":100},"  timeout: ",[38,259,260],{"class":123},"30000",[38,262,182],{"class":100},[38,264,265,268,271,274,277,280,282],{"class":40,"line":151},[38,266,267],{"class":100},"  retry: { maxRetries: ",[38,269,270],{"class":123},"2",[38,272,273],{"class":100},", initialDelayMs: ",[38,275,276],{"class":123},"500",[38,278,279],{"class":100},", backoffMultiplier: ",[38,281,270],{"class":123},[38,283,284],{"class":100}," },\n",[38,286,287],{"class":40,"line":158},[38,288,211],{"class":100},[11,290,291,294,295,298,299,302,303,306],{},[15,292,293],{},"baseUrl"," ist optional und hat den Standardwert ",[15,296,297],{},"https:\u002F\u002Fapi.owlat.app",". Sie müssen es nur\nfür selbst gehostete Deployments setzen — richten Sie es auf die Site-URL Ihres Convex-Deployments\n(",[15,300,301],{},"https:\u002F\u002F\u003Cyour-deployment>.convex.site","), die die API unter\n",[15,304,305],{},"\u002Fapi\u002Fv1\u002F*"," ausliefert.",[308,309,312,347],"callout",{"title":310,"type":311},"Retries und Idempotenz","info",[11,313,314,315,319,320,323,324,327,328,331,332,335,336,339,340,339,343,346],{},"Das SDK wiederholt vorübergehende Fehler automatisch — bis zu ",[316,317,318],"strong",{},"2 Wiederholungen","\n(insgesamt 3 Versuche) mit exponentiellem Backoff (500 ms Basis, jeweils verdoppelt).\nEin ",[15,321,322],{},"429"," wird unabhängig von der Methode stets wiederholt, unter Beachtung des\n",[15,325,326],{},"Retry-After","-Headers. Ein ",[15,329,330],{},"5xx"," oder ein Netzwerk-\u002FTimeout-Fehler wird nur bei ",[316,333,334],{},"idempotenten\nMethoden"," (",[15,337,338],{},"GET","\u002F",[15,341,342],{},"PUT",[15,344,345],{},"DELETE",") wiederholt.",[11,348,349,352,353,356,357,360,361,363,364,367,368,371,372,375,376,375,379,382],{},[15,350,351],{},"POST","-Sendungen — ",[15,354,355],{},"transactional.send(...)"," und ",[15,358,359],{},"events.send(...)"," — werden bei einem ",[15,362,330],{},"\noder Netzwerkfehler ",[316,365,366],{},"nicht"," automatisch wiederholt, da der Server keinen Idempotenzschlüssel hat\nund eine bereits verarbeitete Sendung nicht dupliziert werden darf; diese erscheinen als Fehler,\ndie Sie selbst behandeln. Übergeben Sie ",[15,369,370],{},"retry: false",", um Wiederholungen vollständig zu deaktivieren, oder\njustieren Sie ",[15,373,374],{},"maxRetries"," \u002F ",[15,377,378],{},"initialDelayMs",[15,380,381],{},"backoffMultiplier",".",[20,384,386],{"id":385},"ressourcen","Ressourcen",[388,389,391],"h3",{"id":390},"kontakte","Kontakte",[11,393,394],{},"Kontakte in Ihrer Zielgruppe verwalten.",[28,396,398],{"className":87,"code":397,"language":89,"meta":34,"style":34},"\u002F\u002F Create a contact\nconst contact = await owlat.contacts.create({\n  email: 'mira@acme.io',\n  firstName: 'Mira',\n  lastName: 'Chen',\n})\n\n\u002F\u002F Get a contact by ID\nconst found = await owlat.contacts.get('contact_abc123')\n\n\u002F\u002F Update a contact\nconst updated = await owlat.contacts.update('contact_abc123', {\n  firstName: 'Mira',\n  lastName: 'Chen-Lopez',\n})\n\n\u002F\u002F List contacts with cursor-based pagination\nconst result = await owlat.contacts.list({ limit: 25 })\n\u002F\u002F result.data       — Contact[]\n\u002F\u002F result.pagination  — { limit, totalItems, cursor, isDone }\n\n\u002F\u002F Fetch the next page with the returned cursor\nif (!result.pagination.isDone) {\n  const next = await owlat.contacts.list({ cursor: result.pagination.cursor })\n}\n\n\u002F\u002F Or iterate every contact automatically (follows cursors until isDone)\nfor await (const contact of owlat.contacts.listAll()) {\n  console.log(contact.email)\n}\n\n\u002F\u002F Delete a contact\nawait owlat.contacts.delete('contact_abc123')\n",[15,399,400,405,425,434,443,453,457,461,466,489,493,499,523,532,542,547,552,558,584,590,596,601,607,621,641,647,652,658,683,695,700,705,711],{"__ignoreMap":34},[38,401,402],{"class":40,"line":41},[38,403,404],{"class":154},"\u002F\u002F Create a contact\n",[38,406,407,409,412,414,417,420,423],{"class":40,"line":110},[38,408,120],{"class":96},[38,410,411],{"class":123}," contact",[38,413,127],{"class":96},[38,415,416],{"class":96}," await",[38,418,419],{"class":100}," owlat.contacts.",[38,421,422],{"class":133},"create",[38,424,170],{"class":100},[38,426,427,429,432],{"class":40,"line":117},[38,428,176],{"class":100},[38,430,431],{"class":47},"'mira@acme.io'",[38,433,182],{"class":100},[38,435,436,439,441],{"class":40,"line":146},[38,437,438],{"class":100},"  firstName: ",[38,440,202],{"class":47},[38,442,182],{"class":100},[38,444,445,448,451],{"class":40,"line":151},[38,446,447],{"class":100},"  lastName: ",[38,449,450],{"class":47},"'Chen'",[38,452,182],{"class":100},[38,454,455],{"class":40,"line":158},[38,456,211],{"class":100},[38,458,459],{"class":40,"line":173},[38,460,114],{"emptyLinePlaceholder":113},[38,462,463],{"class":40,"line":185},[38,464,465],{"class":154},"\u002F\u002F Get a contact by ID\n",[38,467,468,470,473,475,477,479,482,484,487],{"class":40,"line":196},[38,469,120],{"class":96},[38,471,472],{"class":123}," found",[38,474,127],{"class":96},[38,476,416],{"class":96},[38,478,419],{"class":100},[38,480,481],{"class":133},"get",[38,483,137],{"class":100},[38,485,486],{"class":47},"'contact_abc123'",[38,488,143],{"class":100},[38,490,491],{"class":40,"line":208},[38,492,114],{"emptyLinePlaceholder":113},[38,494,496],{"class":40,"line":495},11,[38,497,498],{"class":154},"\u002F\u002F Update a contact\n",[38,500,502,504,507,509,511,513,516,518,520],{"class":40,"line":501},12,[38,503,120],{"class":96},[38,505,506],{"class":123}," updated",[38,508,127],{"class":96},[38,510,416],{"class":96},[38,512,419],{"class":100},[38,514,515],{"class":133},"update",[38,517,137],{"class":100},[38,519,486],{"class":47},[38,521,522],{"class":100},", {\n",[38,524,526,528,530],{"class":40,"line":525},13,[38,527,438],{"class":100},[38,529,202],{"class":47},[38,531,182],{"class":100},[38,533,535,537,540],{"class":40,"line":534},14,[38,536,447],{"class":100},[38,538,539],{"class":47},"'Chen-Lopez'",[38,541,182],{"class":100},[38,543,545],{"class":40,"line":544},15,[38,546,211],{"class":100},[38,548,550],{"class":40,"line":549},16,[38,551,114],{"emptyLinePlaceholder":113},[38,553,555],{"class":40,"line":554},17,[38,556,557],{"class":154},"\u002F\u002F List contacts with cursor-based pagination\n",[38,559,561,563,566,568,570,572,575,578,581],{"class":40,"line":560},18,[38,562,120],{"class":96},[38,564,565],{"class":123}," result",[38,567,127],{"class":96},[38,569,416],{"class":96},[38,571,419],{"class":100},[38,573,574],{"class":133},"list",[38,576,577],{"class":100},"({ limit: ",[38,579,580],{"class":123},"25",[38,582,583],{"class":100}," })\n",[38,585,587],{"class":40,"line":586},19,[38,588,589],{"class":154},"\u002F\u002F result.data       — Contact[]\n",[38,591,593],{"class":40,"line":592},20,[38,594,595],{"class":154},"\u002F\u002F result.pagination  — { limit, totalItems, cursor, isDone }\n",[38,597,599],{"class":40,"line":598},21,[38,600,114],{"emptyLinePlaceholder":113},[38,602,604],{"class":40,"line":603},22,[38,605,606],{"class":154},"\u002F\u002F Fetch the next page with the returned cursor\n",[38,608,610,613,615,618],{"class":40,"line":609},23,[38,611,612],{"class":96},"if",[38,614,335],{"class":100},[38,616,617],{"class":96},"!",[38,619,620],{"class":100},"result.pagination.isDone) {\n",[38,622,624,627,630,632,634,636,638],{"class":40,"line":623},24,[38,625,626],{"class":96},"  const",[38,628,629],{"class":123}," next",[38,631,127],{"class":96},[38,633,416],{"class":96},[38,635,419],{"class":100},[38,637,574],{"class":133},[38,639,640],{"class":100},"({ cursor: result.pagination.cursor })\n",[38,642,644],{"class":40,"line":643},25,[38,645,646],{"class":100},"}\n",[38,648,650],{"class":40,"line":649},26,[38,651,114],{"emptyLinePlaceholder":113},[38,653,655],{"class":40,"line":654},27,[38,656,657],{"class":154},"\u002F\u002F Or iterate every contact automatically (follows cursors until isDone)\n",[38,659,661,664,666,668,670,672,675,677,680],{"class":40,"line":660},28,[38,662,663],{"class":96},"for",[38,665,416],{"class":96},[38,667,335],{"class":100},[38,669,120],{"class":96},[38,671,411],{"class":123},[38,673,674],{"class":96}," of",[38,676,419],{"class":100},[38,678,679],{"class":133},"listAll",[38,681,682],{"class":100},"()) {\n",[38,684,686,689,692],{"class":40,"line":685},29,[38,687,688],{"class":100},"  console.",[38,690,691],{"class":133},"log",[38,693,694],{"class":100},"(contact.email)\n",[38,696,698],{"class":40,"line":697},30,[38,699,646],{"class":100},[38,701,703],{"class":40,"line":702},31,[38,704,114],{"emptyLinePlaceholder":113},[38,706,708],{"class":40,"line":707},32,[38,709,710],{"class":154},"\u002F\u002F Delete a contact\n",[38,712,714,716,718,721,723,725],{"class":40,"line":713},33,[38,715,161],{"class":96},[38,717,419],{"class":100},[38,719,720],{"class":133},"delete",[38,722,137],{"class":100},[38,724,486],{"class":47},[38,726,143],{"class":100},[388,728,730],{"id":729},"transaktional","Transaktional",[11,732,733],{},"Transaktionale E-Mails mit vorgefertigten Vorlagen versenden.",[28,735,737],{"className":87,"code":736,"language":89,"meta":34,"style":34},"const result = await owlat.transactional.send({\n  \u002F\u002F Identify the template by slug or ID\n  slug: 'order-confirmation',\n\n  \u002F\u002F Recipient\n  email: 'buyer@example.com',\n\n  \u002F\u002F Data variables merged into the template\n  dataVariables: {\n    orderId: 'ORD-7291',\n    total: '$142.00',\n  },\n\n  \u002F\u002F Optional: override language\n  language: 'de',\n})\n\u002F\u002F result.status === 'queued'\n\u002F\u002F result.transactionalEmailId — id of the send record\n\u002F\u002F result.contactId, result.contactCreated, result.language\n",[15,738,739,755,760,769,773,778,787,791,796,801,811,821,826,830,835,845,849,854,859],{"__ignoreMap":34},[38,740,741,743,745,747,749,751,753],{"class":40,"line":41},[38,742,120],{"class":96},[38,744,565],{"class":123},[38,746,127],{"class":96},[38,748,416],{"class":96},[38,750,164],{"class":100},[38,752,167],{"class":133},[38,754,170],{"class":100},[38,756,757],{"class":40,"line":110},[38,758,759],{"class":154},"  \u002F\u002F Identify the template by slug or ID\n",[38,761,762,764,767],{"class":40,"line":117},[38,763,188],{"class":100},[38,765,766],{"class":47},"'order-confirmation'",[38,768,182],{"class":100},[38,770,771],{"class":40,"line":146},[38,772,114],{"emptyLinePlaceholder":113},[38,774,775],{"class":40,"line":151},[38,776,777],{"class":154},"  \u002F\u002F Recipient\n",[38,779,780,782,785],{"class":40,"line":158},[38,781,176],{"class":100},[38,783,784],{"class":47},"'buyer@example.com'",[38,786,182],{"class":100},[38,788,789],{"class":40,"line":173},[38,790,114],{"emptyLinePlaceholder":113},[38,792,793],{"class":40,"line":185},[38,794,795],{"class":154},"  \u002F\u002F Data variables merged into the template\n",[38,797,798],{"class":40,"line":196},[38,799,800],{"class":100},"  dataVariables: {\n",[38,802,803,806,809],{"class":40,"line":208},[38,804,805],{"class":100},"    orderId: ",[38,807,808],{"class":47},"'ORD-7291'",[38,810,182],{"class":100},[38,812,813,816,819],{"class":40,"line":495},[38,814,815],{"class":100},"    total: ",[38,817,818],{"class":47},"'$142.00'",[38,820,182],{"class":100},[38,822,823],{"class":40,"line":501},[38,824,825],{"class":100},"  },\n",[38,827,828],{"class":40,"line":525},[38,829,114],{"emptyLinePlaceholder":113},[38,831,832],{"class":40,"line":534},[38,833,834],{"class":154},"  \u002F\u002F Optional: override language\n",[38,836,837,840,843],{"class":40,"line":544},[38,838,839],{"class":100},"  language: ",[38,841,842],{"class":47},"'de'",[38,844,182],{"class":100},[38,846,847],{"class":40,"line":549},[38,848,211],{"class":100},[38,850,851],{"class":40,"line":554},[38,852,853],{"class":154},"\u002F\u002F result.status === 'queued'\n",[38,855,856],{"class":40,"line":560},[38,857,858],{"class":154},"\u002F\u002F result.transactionalEmailId — id of the send record\n",[38,860,861],{"class":40,"line":586},[38,862,863],{"class":154},"\u002F\u002F result.contactId, result.contactCreated, result.language\n",[865,866,868],"h4",{"id":867},"anhänge","Anhänge",[11,870,871],{},"Sie können Dateien über Base64-kodierten Inhalt oder HTTPS-URLs anhängen (max. 10 Dateien, insgesamt 10 MB):",[28,873,875],{"className":87,"code":874,"language":89,"meta":34,"style":34},"await owlat.transactional.send({\n  email: 'buyer@example.com',\n  slug: 'order-confirmation',\n  attachments: [\n    \u002F\u002F Base64-encoded content\n    {\n      filename: 'invoice.pdf',\n      content: base64String,\n      contentType: 'application\u002Fpdf',\n    },\n    \u002F\u002F URL (fetched server-side)\n    {\n      filename: 'receipt.pdf',\n      url: 'https:\u002F\u002Fyour-api.com\u002Freceipts\u002FORD-7291.pdf',\n    },\n  ],\n})\n",[15,876,877,887,895,903,908,913,918,928,933,943,948,953,957,966,976,980,985],{"__ignoreMap":34},[38,878,879,881,883,885],{"class":40,"line":41},[38,880,161],{"class":96},[38,882,164],{"class":100},[38,884,167],{"class":133},[38,886,170],{"class":100},[38,888,889,891,893],{"class":40,"line":110},[38,890,176],{"class":100},[38,892,784],{"class":47},[38,894,182],{"class":100},[38,896,897,899,901],{"class":40,"line":117},[38,898,188],{"class":100},[38,900,766],{"class":47},[38,902,182],{"class":100},[38,904,905],{"class":40,"line":146},[38,906,907],{"class":100},"  attachments: [\n",[38,909,910],{"class":40,"line":151},[38,911,912],{"class":154},"    \u002F\u002F Base64-encoded content\n",[38,914,915],{"class":40,"line":158},[38,916,917],{"class":100},"    {\n",[38,919,920,923,926],{"class":40,"line":173},[38,921,922],{"class":100},"      filename: ",[38,924,925],{"class":47},"'invoice.pdf'",[38,927,182],{"class":100},[38,929,930],{"class":40,"line":185},[38,931,932],{"class":100},"      content: base64String,\n",[38,934,935,938,941],{"class":40,"line":196},[38,936,937],{"class":100},"      contentType: ",[38,939,940],{"class":47},"'application\u002Fpdf'",[38,942,182],{"class":100},[38,944,945],{"class":40,"line":208},[38,946,947],{"class":100},"    },\n",[38,949,950],{"class":40,"line":495},[38,951,952],{"class":154},"    \u002F\u002F URL (fetched server-side)\n",[38,954,955],{"class":40,"line":501},[38,956,917],{"class":100},[38,958,959,961,964],{"class":40,"line":525},[38,960,922],{"class":100},[38,962,963],{"class":47},"'receipt.pdf'",[38,965,182],{"class":100},[38,967,968,971,974],{"class":40,"line":534},[38,969,970],{"class":100},"      url: ",[38,972,973],{"class":47},"'https:\u002F\u002Fyour-api.com\u002Freceipts\u002FORD-7291.pdf'",[38,975,182],{"class":100},[38,977,978],{"class":40,"line":544},[38,979,947],{"class":100},[38,981,982],{"class":40,"line":549},[38,983,984],{"class":100},"  ],\n",[38,986,987],{"class":40,"line":554},[38,988,211],{"class":100},[388,990,992],{"id":991},"events","Events",[11,994,995],{},"Eigene Ereignisse senden, um Automationen auszulösen und Segmente aufzubauen.",[28,997,999],{"className":87,"code":998,"language":89,"meta":34,"style":34},"await owlat.events.send({\n  email: 'mira@acme.io',\n  eventName: 'plan_upgraded',\n  eventProperties: {\n    plan: 'pro',\n    mrr: 49,\n  },\n})\n",[15,1000,1001,1012,1020,1030,1035,1045,1055,1059],{"__ignoreMap":34},[38,1002,1003,1005,1008,1010],{"class":40,"line":41},[38,1004,161],{"class":96},[38,1006,1007],{"class":100}," owlat.events.",[38,1009,167],{"class":133},[38,1011,170],{"class":100},[38,1013,1014,1016,1018],{"class":40,"line":110},[38,1015,176],{"class":100},[38,1017,431],{"class":47},[38,1019,182],{"class":100},[38,1021,1022,1025,1028],{"class":40,"line":117},[38,1023,1024],{"class":100},"  eventName: ",[38,1026,1027],{"class":47},"'plan_upgraded'",[38,1029,182],{"class":100},[38,1031,1032],{"class":40,"line":146},[38,1033,1034],{"class":100},"  eventProperties: {\n",[38,1036,1037,1040,1043],{"class":40,"line":151},[38,1038,1039],{"class":100},"    plan: ",[38,1041,1042],{"class":47},"'pro'",[38,1044,182],{"class":100},[38,1046,1047,1050,1053],{"class":40,"line":158},[38,1048,1049],{"class":100},"    mrr: ",[38,1051,1052],{"class":123},"49",[38,1054,182],{"class":100},[38,1056,1057],{"class":40,"line":173},[38,1058,825],{"class":100},[38,1060,1061],{"class":40,"line":185},[38,1062,211],{"class":100},[388,1064,1066],{"id":1065},"themen","Themen",[11,1068,1069,1070,1073],{},"Themen-Mitgliedschaften verwalten. Die API ist reine Schreib-API (Hinzufügen\u002FEntfernen) — es gibt keinen\nList-\u002FGet-Endpunkt; kopieren Sie die ",[15,1071,1072],{},"topicId"," daher aus dem Dashboard (Themen → ein Thema).",[28,1075,1077],{"className":87,"code":1076,"language":89,"meta":34,"style":34},"\u002F\u002F Add a contact to a topic\nawait owlat.topics.addContact({\n  topicId: 'topic_abc123',\n  email: 'mira@acme.io',\n})\n\n\u002F\u002F Remove a contact from a topic\nawait owlat.topics.removeContact({\n  topicId: 'topic_abc123',\n  emailOrId: 'mira@acme.io',\n})\n",[15,1078,1079,1084,1096,1106,1114,1118,1122,1127,1138,1146,1155],{"__ignoreMap":34},[38,1080,1081],{"class":40,"line":41},[38,1082,1083],{"class":154},"\u002F\u002F Add a contact to a topic\n",[38,1085,1086,1088,1091,1094],{"class":40,"line":110},[38,1087,161],{"class":96},[38,1089,1090],{"class":100}," owlat.topics.",[38,1092,1093],{"class":133},"addContact",[38,1095,170],{"class":100},[38,1097,1098,1101,1104],{"class":40,"line":117},[38,1099,1100],{"class":100},"  topicId: ",[38,1102,1103],{"class":47},"'topic_abc123'",[38,1105,182],{"class":100},[38,1107,1108,1110,1112],{"class":40,"line":146},[38,1109,176],{"class":100},[38,1111,431],{"class":47},[38,1113,182],{"class":100},[38,1115,1116],{"class":40,"line":151},[38,1117,211],{"class":100},[38,1119,1120],{"class":40,"line":158},[38,1121,114],{"emptyLinePlaceholder":113},[38,1123,1124],{"class":40,"line":173},[38,1125,1126],{"class":154},"\u002F\u002F Remove a contact from a topic\n",[38,1128,1129,1131,1133,1136],{"class":40,"line":185},[38,1130,161],{"class":96},[38,1132,1090],{"class":100},[38,1134,1135],{"class":133},"removeContact",[38,1137,170],{"class":100},[38,1139,1140,1142,1144],{"class":40,"line":196},[38,1141,1100],{"class":100},[38,1143,1103],{"class":47},[38,1145,182],{"class":100},[38,1147,1148,1151,1153],{"class":40,"line":208},[38,1149,1150],{"class":100},"  emailOrId: ",[38,1152,431],{"class":47},[38,1154,182],{"class":100},[38,1156,1157],{"class":40,"line":495},[38,1158,211],{"class":100},[20,1160,1162],{"id":1161},"fehlerbehandlung","Fehlerbehandlung",[11,1164,1165],{},"Das SDK exportiert typisierte Fehlerklassen für häufige Fehlerfälle:",[28,1167,1169],{"className":87,"code":1168,"language":89,"meta":34,"style":34},"import {\n  Owlat,\n  OwlatError,\n  AuthenticationError,\n  RateLimitError,\n  NotFoundError,\n  ValidationError,\n  ConflictError,\n  ForbiddenError,\n  InvalidStateError,\n  LimitReachedError,\n} from '@owlat\u002Fsdk-js'\n\ntry {\n  await owlat.transactional.send({ email: 'user@example.com', slug: 'welcome' })\n} catch (error) {\n  if (error instanceof ValidationError) {\n    console.error('Validation failed:', error.message)\n  } else if (error instanceof InvalidStateError) {\n    \u002F\u002F 422 — unverified sending domain, blocked recipient, unpublished template.\n    \u002F\u002F The most common transactional failure mode.\n    console.error('Cannot send yet:', error.message)\n  } else if (error instanceof ForbiddenError) {\n    \u002F\u002F 403 — suspended \u002F abuse-blocked account.\n    console.error('Not permitted:', error.message)\n  } else if (error instanceof LimitReachedError) {\n    console.error('Plan limit reached:', error.message)\n  } else if (error instanceof RateLimitError) {\n    console.error('Rate limited — retry after backoff')\n  } else if (error instanceof AuthenticationError) {\n    console.error('Bad API key')\n  } else if (error instanceof ConflictError) {\n    console.error('Contact already exists')\n  } else if (error instanceof NotFoundError) {\n    console.error('Resource not found')\n  } else if (error instanceof OwlatError) {\n    console.error('API error:', error.message, error.statusCode)\n  }\n}\n",[15,1170,1171,1178,1183,1188,1193,1198,1203,1208,1213,1218,1223,1228,1237,1241,1248,1271,1281,1298,1314,1334,1339,1344,1357,1374,1379,1392,1409,1422,1439,1452,1469,1482,1499,1512,1530,1544,1562,1577,1583],{"__ignoreMap":34},[38,1172,1173,1175],{"class":40,"line":41},[38,1174,97],{"class":96},[38,1176,1177],{"class":100}," {\n",[38,1179,1180],{"class":40,"line":110},[38,1181,1182],{"class":100},"  Owlat,\n",[38,1184,1185],{"class":40,"line":117},[38,1186,1187],{"class":100},"  OwlatError,\n",[38,1189,1190],{"class":40,"line":146},[38,1191,1192],{"class":100},"  AuthenticationError,\n",[38,1194,1195],{"class":40,"line":151},[38,1196,1197],{"class":100},"  RateLimitError,\n",[38,1199,1200],{"class":40,"line":158},[38,1201,1202],{"class":100},"  NotFoundError,\n",[38,1204,1205],{"class":40,"line":173},[38,1206,1207],{"class":100},"  ValidationError,\n",[38,1209,1210],{"class":40,"line":185},[38,1211,1212],{"class":100},"  ConflictError,\n",[38,1214,1215],{"class":40,"line":196},[38,1216,1217],{"class":100},"  ForbiddenError,\n",[38,1219,1220],{"class":40,"line":208},[38,1221,1222],{"class":100},"  InvalidStateError,\n",[38,1224,1225],{"class":40,"line":495},[38,1226,1227],{"class":100},"  LimitReachedError,\n",[38,1229,1230,1233,1235],{"class":40,"line":501},[38,1231,1232],{"class":100},"} ",[38,1234,104],{"class":96},[38,1236,107],{"class":47},[38,1238,1239],{"class":40,"line":525},[38,1240,114],{"emptyLinePlaceholder":113},[38,1242,1243,1246],{"class":40,"line":534},[38,1244,1245],{"class":96},"try",[38,1247,1177],{"class":100},[38,1249,1250,1253,1255,1257,1260,1263,1266,1269],{"class":40,"line":544},[38,1251,1252],{"class":96},"  await",[38,1254,164],{"class":100},[38,1256,167],{"class":133},[38,1258,1259],{"class":100},"({ email: ",[38,1261,1262],{"class":47},"'user@example.com'",[38,1264,1265],{"class":100},", slug: ",[38,1267,1268],{"class":47},"'welcome'",[38,1270,583],{"class":100},[38,1272,1273,1275,1278],{"class":40,"line":549},[38,1274,1232],{"class":100},[38,1276,1277],{"class":96},"catch",[38,1279,1280],{"class":100}," (error) {\n",[38,1282,1283,1286,1289,1292,1295],{"class":40,"line":554},[38,1284,1285],{"class":96},"  if",[38,1287,1288],{"class":100}," (error ",[38,1290,1291],{"class":96},"instanceof",[38,1293,1294],{"class":44}," ValidationError",[38,1296,1297],{"class":100},") {\n",[38,1299,1300,1303,1306,1308,1311],{"class":40,"line":560},[38,1301,1302],{"class":100},"    console.",[38,1304,1305],{"class":133},"error",[38,1307,137],{"class":100},[38,1309,1310],{"class":47},"'Validation failed:'",[38,1312,1313],{"class":100},", error.message)\n",[38,1315,1316,1319,1322,1325,1327,1329,1332],{"class":40,"line":586},[38,1317,1318],{"class":100},"  } ",[38,1320,1321],{"class":96},"else",[38,1323,1324],{"class":96}," if",[38,1326,1288],{"class":100},[38,1328,1291],{"class":96},[38,1330,1331],{"class":44}," InvalidStateError",[38,1333,1297],{"class":100},[38,1335,1336],{"class":40,"line":592},[38,1337,1338],{"class":154},"    \u002F\u002F 422 — unverified sending domain, blocked recipient, unpublished template.\n",[38,1340,1341],{"class":40,"line":598},[38,1342,1343],{"class":154},"    \u002F\u002F The most common transactional failure mode.\n",[38,1345,1346,1348,1350,1352,1355],{"class":40,"line":603},[38,1347,1302],{"class":100},[38,1349,1305],{"class":133},[38,1351,137],{"class":100},[38,1353,1354],{"class":47},"'Cannot send yet:'",[38,1356,1313],{"class":100},[38,1358,1359,1361,1363,1365,1367,1369,1372],{"class":40,"line":609},[38,1360,1318],{"class":100},[38,1362,1321],{"class":96},[38,1364,1324],{"class":96},[38,1366,1288],{"class":100},[38,1368,1291],{"class":96},[38,1370,1371],{"class":44}," ForbiddenError",[38,1373,1297],{"class":100},[38,1375,1376],{"class":40,"line":623},[38,1377,1378],{"class":154},"    \u002F\u002F 403 — suspended \u002F abuse-blocked account.\n",[38,1380,1381,1383,1385,1387,1390],{"class":40,"line":643},[38,1382,1302],{"class":100},[38,1384,1305],{"class":133},[38,1386,137],{"class":100},[38,1388,1389],{"class":47},"'Not permitted:'",[38,1391,1313],{"class":100},[38,1393,1394,1396,1398,1400,1402,1404,1407],{"class":40,"line":649},[38,1395,1318],{"class":100},[38,1397,1321],{"class":96},[38,1399,1324],{"class":96},[38,1401,1288],{"class":100},[38,1403,1291],{"class":96},[38,1405,1406],{"class":44}," LimitReachedError",[38,1408,1297],{"class":100},[38,1410,1411,1413,1415,1417,1420],{"class":40,"line":654},[38,1412,1302],{"class":100},[38,1414,1305],{"class":133},[38,1416,137],{"class":100},[38,1418,1419],{"class":47},"'Plan limit reached:'",[38,1421,1313],{"class":100},[38,1423,1424,1426,1428,1430,1432,1434,1437],{"class":40,"line":660},[38,1425,1318],{"class":100},[38,1427,1321],{"class":96},[38,1429,1324],{"class":96},[38,1431,1288],{"class":100},[38,1433,1291],{"class":96},[38,1435,1436],{"class":44}," RateLimitError",[38,1438,1297],{"class":100},[38,1440,1441,1443,1445,1447,1450],{"class":40,"line":685},[38,1442,1302],{"class":100},[38,1444,1305],{"class":133},[38,1446,137],{"class":100},[38,1448,1449],{"class":47},"'Rate limited — retry after backoff'",[38,1451,143],{"class":100},[38,1453,1454,1456,1458,1460,1462,1464,1467],{"class":40,"line":697},[38,1455,1318],{"class":100},[38,1457,1321],{"class":96},[38,1459,1324],{"class":96},[38,1461,1288],{"class":100},[38,1463,1291],{"class":96},[38,1465,1466],{"class":44}," AuthenticationError",[38,1468,1297],{"class":100},[38,1470,1471,1473,1475,1477,1480],{"class":40,"line":702},[38,1472,1302],{"class":100},[38,1474,1305],{"class":133},[38,1476,137],{"class":100},[38,1478,1479],{"class":47},"'Bad API key'",[38,1481,143],{"class":100},[38,1483,1484,1486,1488,1490,1492,1494,1497],{"class":40,"line":707},[38,1485,1318],{"class":100},[38,1487,1321],{"class":96},[38,1489,1324],{"class":96},[38,1491,1288],{"class":100},[38,1493,1291],{"class":96},[38,1495,1496],{"class":44}," ConflictError",[38,1498,1297],{"class":100},[38,1500,1501,1503,1505,1507,1510],{"class":40,"line":713},[38,1502,1302],{"class":100},[38,1504,1305],{"class":133},[38,1506,137],{"class":100},[38,1508,1509],{"class":47},"'Contact already exists'",[38,1511,143],{"class":100},[38,1513,1515,1517,1519,1521,1523,1525,1528],{"class":40,"line":1514},34,[38,1516,1318],{"class":100},[38,1518,1321],{"class":96},[38,1520,1324],{"class":96},[38,1522,1288],{"class":100},[38,1524,1291],{"class":96},[38,1526,1527],{"class":44}," NotFoundError",[38,1529,1297],{"class":100},[38,1531,1533,1535,1537,1539,1542],{"class":40,"line":1532},35,[38,1534,1302],{"class":100},[38,1536,1305],{"class":133},[38,1538,137],{"class":100},[38,1540,1541],{"class":47},"'Resource not found'",[38,1543,143],{"class":100},[38,1545,1547,1549,1551,1553,1555,1557,1560],{"class":40,"line":1546},36,[38,1548,1318],{"class":100},[38,1550,1321],{"class":96},[38,1552,1324],{"class":96},[38,1554,1288],{"class":100},[38,1556,1291],{"class":96},[38,1558,1559],{"class":44}," OwlatError",[38,1561,1297],{"class":100},[38,1563,1565,1567,1569,1571,1574],{"class":40,"line":1564},37,[38,1566,1302],{"class":100},[38,1568,1305],{"class":133},[38,1570,137],{"class":100},[38,1572,1573],{"class":47},"'API error:'",[38,1575,1576],{"class":100},", error.message, error.statusCode)\n",[38,1578,1580],{"class":40,"line":1579},38,[38,1581,1582],{"class":100},"  }\n",[38,1584,1586],{"class":40,"line":1585},39,[38,1587,646],{"class":100},[1589,1590,1591,1607],"table",{},[1592,1593,1594],"thead",{},[1595,1596,1597,1601,1604],"tr",{},[1598,1599,1600],"th",{},"Fehlerklasse",[1598,1602,1603],{},"HTTP-Status",[1598,1605,1606],{},"Wann",[1608,1609,1610,1624,1637,1650,1663,1676,1689,1701],"tbody",{},[1595,1611,1612,1618,1621],{},[1613,1614,1615],"td",{},[15,1616,1617],{},"AuthenticationError",[1613,1619,1620],{},"401",[1613,1622,1623],{},"Ungültiger oder fehlender API-Key",[1595,1625,1626,1631,1634],{},[1613,1627,1628],{},[15,1629,1630],{},"LimitReachedError",[1613,1632,1633],{},"402",[1613,1635,1636],{},"Tarif- oder Kontingentgrenze erreicht",[1595,1638,1639,1644,1647],{},[1613,1640,1641],{},[15,1642,1643],{},"ForbiddenError",[1613,1645,1646],{},"403",[1613,1648,1649],{},"Authentifiziert, aber nicht berechtigt (gesperrt \u002F wegen Missbrauchs blockiert)",[1595,1651,1652,1657,1660],{},[1613,1653,1654],{},[15,1655,1656],{},"NotFoundError",[1613,1658,1659],{},"404",[1613,1661,1662],{},"Ressource existiert nicht",[1595,1664,1665,1670,1673],{},[1613,1666,1667],{},[15,1668,1669],{},"ConflictError",[1613,1671,1672],{},"409",[1613,1674,1675],{},"Doppelte Ressource (z. B. bereits vorhandene E-Mail-Adresse)",[1595,1677,1678,1683,1686],{},[1613,1679,1680],{},[15,1681,1682],{},"InvalidStateError",[1613,1684,1685],{},"422",[1613,1687,1688],{},"Der Zustand der Ressource blockiert die Operation (nicht verifizierte Domain, blockierter Empfänger, nicht veröffentlichte Vorlage)",[1595,1690,1691,1696,1698],{},[1613,1692,1693],{},[15,1694,1695],{},"RateLimitError",[1613,1697,322],{},[1613,1699,1700],{},"Zu viele Anfragen",[1595,1702,1703,1708,1711],{},[1613,1704,1705],{},[15,1706,1707],{},"ValidationError",[1613,1709,1710],{},"400",[1613,1712,1713],{},"Der Request-Body besteht die Validierung nicht",[20,1715,1717],{"id":1716},"typen","Typen",[11,1719,1720],{},"Alle Request- und Response-Typen werden zur Verwendung in Ihrem eigenen Code exportiert:",[28,1722,1724],{"className":87,"code":1723,"language":89,"meta":34,"style":34},"import type {\n  Contact,\n  CreateContactParams,\n  UpdateContactParams,\n  SendTransactionalParams,\n  SendTransactionalResponse,\n  TransactionalAttachment,\n  SendEventParams,\n  AddToTopicParams,\n  PaginatedResponse,\n  ApiResponse,\n} from '@owlat\u002Fsdk-js'\n",[15,1725,1726,1735,1740,1745,1750,1755,1760,1765,1770,1775,1780,1785],{"__ignoreMap":34},[38,1727,1728,1730,1733],{"class":40,"line":41},[38,1729,97],{"class":96},[38,1731,1732],{"class":96}," type",[38,1734,1177],{"class":100},[38,1736,1737],{"class":40,"line":110},[38,1738,1739],{"class":100},"  Contact,\n",[38,1741,1742],{"class":40,"line":117},[38,1743,1744],{"class":100},"  CreateContactParams,\n",[38,1746,1747],{"class":40,"line":146},[38,1748,1749],{"class":100},"  UpdateContactParams,\n",[38,1751,1752],{"class":40,"line":151},[38,1753,1754],{"class":100},"  SendTransactionalParams,\n",[38,1756,1757],{"class":40,"line":158},[38,1758,1759],{"class":100},"  SendTransactionalResponse,\n",[38,1761,1762],{"class":40,"line":173},[38,1763,1764],{"class":100},"  TransactionalAttachment,\n",[38,1766,1767],{"class":40,"line":185},[38,1768,1769],{"class":100},"  SendEventParams,\n",[38,1771,1772],{"class":40,"line":196},[38,1773,1774],{"class":100},"  AddToTopicParams,\n",[38,1776,1777],{"class":40,"line":208},[38,1778,1779],{"class":100},"  PaginatedResponse,\n",[38,1781,1782],{"class":40,"line":495},[38,1783,1784],{"class":100},"  ApiResponse,\n",[38,1786,1787,1789,1791],{"class":40,"line":501},[38,1788,1232],{"class":100},[38,1790,104],{"class":96},[38,1792,107],{"class":47},[1794,1795],"hr",{},[308,1797,1800],{"title":1798,"type":1799},"Sie nutzen Java?","tip",[11,1801,1802,1803,382],{},"Für die JVM-Integration (Java 11+) siehe die Referenz zum ",[1804,1805,1807],"a",{"href":1806},"\u002Fapi\u002Fsdk-java","Java-SDK",[1809,1810,1811],"style",{},"html pre.shiki code .sOLd2, html code.shiki .sOLd2{--shiki-default:#6F42C1;--shiki-dark:#F69D50}html pre.shiki code .s-HuK, html code.shiki .s-HuK{--shiki-default:#032F62;--shiki-dark:#96D0FF}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 .s7YZ4, html code.shiki .s7YZ4{--shiki-default:#D73A49;--shiki-dark:#F47067}html pre.shiki code .sYgZi, html code.shiki .sYgZi{--shiki-default:#24292E;--shiki-dark:#ADBAC7}html pre.shiki code .sviXB, html code.shiki .sviXB{--shiki-default:#005CC5;--shiki-dark:#6CB6FF}html pre.shiki code .sPO5f, html code.shiki .sPO5f{--shiki-default:#6F42C1;--shiki-dark:#DCBDFB}html pre.shiki code .sDN9O, html code.shiki .sDN9O{--shiki-default:#6A737D;--shiki-dark:#768390}",{"title":34,"searchDepth":110,"depth":110,"links":1813},[1814,1815,1816,1822,1823],{"id":22,"depth":110,"text":23},{"id":83,"depth":110,"text":84},{"id":385,"depth":110,"text":386,"children":1817},[1818,1819,1820,1821],{"id":390,"depth":117,"text":391},{"id":729,"depth":117,"text":730},{"id":991,"depth":117,"text":992},{"id":1065,"depth":117,"text":1066},{"id":1161,"depth":110,"text":1162},{"id":1716,"depth":110,"text":1717},"Typisierter Client für die Owlat-API, nutzbar aus Node.js, Bun, Deno oder jeder serverseitigen JavaScript-Laufzeitumgebung.","md",{},"\u002Fapi\u002Fsdk",{"title":6,"description":1824},"2.api\u002F3.sdk","1-V2Rn1vOBAWi7dFHX_1KA0u-gIBEt1iJG35uWUZ9LE",[1832,1836],{"title":1833,"path":1834,"stem":1835,"children":-1},"Authentifizierung","\u002Fapi\u002Fauthentication","2.api\u002F2.authentication",{"title":1807,"path":1806,"stem":1837,"children":-1},"2.api\u002F4.sdk-java",1786915099475]