[{"data":1,"prerenderedAt":1808},["ShallowReactive",2],{"docs-nav":3,"content:\u002Fguides\u002Fquickstart":78},[4,18,29,35,46,63,66,69,72,75],{"path":5,"title":6,"navTitle":6,"order":7,"subnav":8},"\u002Fapi\u002Fapi-tokens","API tokens",3,[9,12,15],{"title":10,"anchor":11},"Create an API key","create-an-api-key",{"title":13,"anchor":14},"List API keys","list-api-keys",{"title":16,"anchor":17},"Revoke an API key","revoke-an-api-key",{"path":19,"title":20,"navTitle":20,"order":21,"subnav":22},"\u002Fapi\u002Fbalances","Balances",4,[23,26],{"title":24,"anchor":25},"The balance object","the-balance-object",{"title":27,"anchor":28},"List balances","list-balances",{"path":30,"title":31,"navTitle":32,"order":33,"subnav":34},"\u002Fapi","API overview","Overview",1,null,{"path":36,"title":37,"navTitle":37,"order":38,"subnav":39},"\u002Fapi\u002Fsender-ids","Sender IDs",5,[40,43],{"title":41,"anchor":42},"The sender identity object","the-sender-identity-object",{"title":44,"anchor":45},"List sender IDs","list-sender-ids",{"path":47,"title":48,"navTitle":48,"order":49,"subnav":50},"\u002Fapi\u002Fsms","SMS",2,[51,54,57,60],{"title":52,"anchor":53},"The message object","the-message-object",{"title":55,"anchor":56},"Send an SMS","send-an-sms",{"title":58,"anchor":59},"Retrieve an SMS","retrieve-an-sms",{"title":61,"anchor":62},"Send bulk SMS","send-bulk-sms",{"path":64,"title":65,"navTitle":65,"order":49,"subnav":34},"\u002Fguides\u002Fauthentication","Authentication",{"path":67,"title":68,"navTitle":68,"order":7,"subnav":34},"\u002Fguides\u002Fbulk-sms","Bulk SMS",{"path":70,"title":71,"navTitle":71,"order":38,"subnav":34},"\u002Fguides\u002Fmcp","AI agents (MCP)",{"path":73,"title":74,"navTitle":74,"order":33,"subnav":34},"\u002Fguides\u002Fquickstart","Quickstart",{"path":76,"title":77,"navTitle":77,"order":21,"subnav":34},"\u002Fguides\u002Fwebhooks","Webhooks",{"id":79,"path":73,"title":74,"description":80,"navTitle":74,"order":33,"wide":81,"body":82,"seo":1804,"stem":1805,"extension":1806,"meta":1807,"navigation":366},"content\u002Fguides\u002Fquickstart.md","Send your first SMS with the Sendai API — confirm your sender ID, get an API key, POST a message, and poll it until the carrier confirms delivery.",false,{"type":83,"value":84,"toc":1796},"minimark",[85,94,99,115,141,152,156,163,537,544,658,666,670,683,1039,1050,1202,1226,1257,1261,1279,1530,1620,1666,1672,1676,1679,1742,1762,1766,1792],[86,87,88,89,93],"p",{},"This guide takes you from zero to a delivered SMS: confirm your sender ID, get an API key,\nsend a message, and confirm it arrived. Every request uses the base URL\n",[90,91,92],"code",{},"https:\u002F\u002Fapi.sendai.co.zw",".",[95,96,98],"h2",{"id":97},"before-you-send-your-sender-id","Before you send: your sender ID",[86,100,101,102,105,106,110,111,114],{},"The ",[90,103,104],{},"from"," on every message must be a ",[107,108,109],"strong",{},"sender ID already approved on your account"," — an\nunapproved value is rejected with ",[90,112,113],{},"400 unknown or unapproved sender id",", so this is worth 30\nseconds before your first call.",[86,116,117,118,121,122,125,126,129,130,133,134,137,138,93],{},"You captured your sender ID (up to 3, each 3–11 letters or numbers) when you registered.\nApproval runs on the network-operator side and usually takes ",[107,119,120],{},"about 30 minutes"," — check its\nstatus in the dashboard under ",[107,123,124],{},"Settings",", or list your identities over the API with\n",[127,128,37],"a",{"href":36}," and use any ",[90,131,132],{},"address"," whose ",[90,135,136],{},"verification_status"," is\n",[90,139,140],{},"verified",[86,142,143,144,147,148,151],{},"Two more things while you wait: accounts are ",[107,145,146],{},"prepaid",", so top up your balance in the\ndashboard before the first send; and everywhere below, replace ",[90,149,150],{},"YOUR_SENDER_ID"," with your\napproved sender ID.",[95,153,155],{"id":154},"_1-get-an-api-key","1. Get an API key",[86,157,158,159,162],{},"Create your first key in the dashboard under ",[107,160,161],{},"Settings → Developer",". Once you hold one, you\ncan mint further keys over the API — one per service is good practice:",[164,165,168,234,403],"code-group",{"title":166,"label":167},"Request","POST \u002Fapi\u002Fv1\u002Fapi-tokens",[169,170,176],"pre",{"className":171,"code":172,"filename":173,"language":174,"meta":175,"style":175},"language-bash shiki shiki-themes github-light github-dark","curl -X POST https:\u002F\u002Fapi.sendai.co.zw\u002Fapi\u002Fv1\u002Fapi-tokens \\\n  -H \"Authorization: Bearer $SENDAI_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{ \"name\": \"orders-service\" }'\n","cURL","bash","",[90,177,178,200,217,226],{"__ignoreMap":175},[179,180,182,186,190,194,197],"span",{"class":181,"line":33},"line",[179,183,185],{"class":184},"sScJk","curl",[179,187,189],{"class":188},"sj4cs"," -X",[179,191,193],{"class":192},"sZZnC"," POST",[179,195,196],{"class":192}," https:\u002F\u002Fapi.sendai.co.zw\u002Fapi\u002Fv1\u002Fapi-tokens",[179,198,199],{"class":188}," \\\n",[179,201,202,205,208,212,215],{"class":181,"line":49},[179,203,204],{"class":188},"  -H",[179,206,207],{"class":192}," \"Authorization: Bearer ",[179,209,211],{"class":210},"sVt8B","$SENDAI_API_KEY",[179,213,214],{"class":192},"\"",[179,216,199],{"class":188},[179,218,219,221,224],{"class":181,"line":7},[179,220,204],{"class":188},[179,222,223],{"class":192}," \"Content-Type: application\u002Fjson\"",[179,225,199],{"class":188},[179,227,228,231],{"class":181,"line":21},[179,229,230],{"class":188},"  -d",[179,232,233],{"class":192}," '{ \"name\": \"orders-service\" }'\n",[169,235,240],{"className":236,"code":237,"filename":238,"language":239,"meta":175,"style":175},"language-js shiki shiki-themes github-light github-dark","const res = await fetch('https:\u002F\u002Fapi.sendai.co.zw\u002Fapi\u002Fv1\u002Fapi-tokens', {\n  method: 'POST',\n  headers: {\n    'Authorization': `Bearer ${process.env.SENDAI_API_KEY}`,\n    'Content-Type': 'application\u002Fjson',\n  },\n  body: JSON.stringify({ name: 'orders-service' }),\n})\n\nconst { data } = await res.json()\n\u002F\u002F data.token is shown only in this response — store it now\n","Node.js","js",[90,241,242,269,280,285,314,326,332,355,361,368,396],{"__ignoreMap":175},[179,243,244,248,251,254,257,260,263,266],{"class":181,"line":33},[179,245,247],{"class":246},"szBVR","const",[179,249,250],{"class":188}," res",[179,252,253],{"class":246}," =",[179,255,256],{"class":246}," await",[179,258,259],{"class":184}," fetch",[179,261,262],{"class":210},"(",[179,264,265],{"class":192},"'https:\u002F\u002Fapi.sendai.co.zw\u002Fapi\u002Fv1\u002Fapi-tokens'",[179,267,268],{"class":210},", {\n",[179,270,271,274,277],{"class":181,"line":49},[179,272,273],{"class":210},"  method: ",[179,275,276],{"class":192},"'POST'",[179,278,279],{"class":210},",\n",[179,281,282],{"class":181,"line":7},[179,283,284],{"class":210},"  headers: {\n",[179,286,287,290,293,296,299,301,304,306,309,312],{"class":181,"line":21},[179,288,289],{"class":192},"    'Authorization'",[179,291,292],{"class":210},": ",[179,294,295],{"class":192},"`Bearer ${",[179,297,298],{"class":210},"process",[179,300,93],{"class":192},[179,302,303],{"class":210},"env",[179,305,93],{"class":192},[179,307,308],{"class":188},"SENDAI_API_KEY",[179,310,311],{"class":192},"}`",[179,313,279],{"class":210},[179,315,316,319,321,324],{"class":181,"line":38},[179,317,318],{"class":192},"    'Content-Type'",[179,320,292],{"class":210},[179,322,323],{"class":192},"'application\u002Fjson'",[179,325,279],{"class":210},[179,327,329],{"class":181,"line":328},6,[179,330,331],{"class":210},"  },\n",[179,333,335,338,341,343,346,349,352],{"class":181,"line":334},7,[179,336,337],{"class":210},"  body: ",[179,339,340],{"class":188},"JSON",[179,342,93],{"class":210},[179,344,345],{"class":184},"stringify",[179,347,348],{"class":210},"({ name: ",[179,350,351],{"class":192},"'orders-service'",[179,353,354],{"class":210}," }),\n",[179,356,358],{"class":181,"line":357},8,[179,359,360],{"class":210},"})\n",[179,362,364],{"class":181,"line":363},9,[179,365,367],{"emptyLinePlaceholder":366},true,"\n",[179,369,371,373,376,379,382,385,387,390,393],{"class":181,"line":370},10,[179,372,247],{"class":246},[179,374,375],{"class":210}," { ",[179,377,378],{"class":188},"data",[179,380,381],{"class":210}," } ",[179,383,384],{"class":246},"=",[179,386,256],{"class":246},[179,388,389],{"class":210}," res.",[179,391,392],{"class":184},"json",[179,394,395],{"class":210},"()\n",[179,397,399],{"class":181,"line":398},11,[179,400,402],{"class":401},"sJ8bj","\u002F\u002F data.token is shown only in this response — store it now\n",[169,404,409],{"className":405,"code":406,"filename":407,"language":408,"meta":175,"style":175},"language-python shiki shiki-themes github-light github-dark","import os\nimport requests\n\nres = requests.post(\n    \"https:\u002F\u002Fapi.sendai.co.zw\u002Fapi\u002Fv1\u002Fapi-tokens\",\n    headers={\"Authorization\": f\"Bearer {os.environ['SENDAI_API_KEY']}\"},\n    json={\"name\": \"orders-service\"},\n)\n\ndata = res.json()[\"data\"]\n# data[\"token\"] is shown only in this response — store it now\n","Python","python",[90,410,411,419,426,430,440,447,488,507,512,516,532],{"__ignoreMap":175},[179,412,413,416],{"class":181,"line":33},[179,414,415],{"class":246},"import",[179,417,418],{"class":210}," os\n",[179,420,421,423],{"class":181,"line":49},[179,422,415],{"class":246},[179,424,425],{"class":210}," requests\n",[179,427,428],{"class":181,"line":7},[179,429,367],{"emptyLinePlaceholder":366},[179,431,432,435,437],{"class":181,"line":21},[179,433,434],{"class":210},"res ",[179,436,384],{"class":246},[179,438,439],{"class":210}," requests.post(\n",[179,441,442,445],{"class":181,"line":38},[179,443,444],{"class":192},"    \"https:\u002F\u002Fapi.sendai.co.zw\u002Fapi\u002Fv1\u002Fapi-tokens\"",[179,446,279],{"class":210},[179,448,449,453,455,458,461,463,466,469,471,474,477,480,483,485],{"class":181,"line":328},[179,450,452],{"class":451},"s4XuR","    headers",[179,454,384],{"class":246},[179,456,457],{"class":210},"{",[179,459,460],{"class":192},"\"Authorization\"",[179,462,292],{"class":210},[179,464,465],{"class":246},"f",[179,467,468],{"class":192},"\"Bearer ",[179,470,457],{"class":188},[179,472,473],{"class":210},"os.environ[",[179,475,476],{"class":192},"'SENDAI_API_KEY'",[179,478,479],{"class":210},"]",[179,481,482],{"class":188},"}",[179,484,214],{"class":192},[179,486,487],{"class":210},"},\n",[179,489,490,493,495,497,500,502,505],{"class":181,"line":334},[179,491,492],{"class":451},"    json",[179,494,384],{"class":246},[179,496,457],{"class":210},[179,498,499],{"class":192},"\"name\"",[179,501,292],{"class":210},[179,503,504],{"class":192},"\"orders-service\"",[179,506,487],{"class":210},[179,508,509],{"class":181,"line":357},[179,510,511],{"class":210},")\n",[179,513,514],{"class":181,"line":363},[179,515,367],{"emptyLinePlaceholder":366},[179,517,518,521,523,526,529],{"class":181,"line":370},[179,519,520],{"class":210},"data ",[179,522,384],{"class":246},[179,524,525],{"class":210}," res.json()[",[179,527,528],{"class":192},"\"data\"",[179,530,531],{"class":210},"]\n",[179,533,534],{"class":181,"line":398},[179,535,536],{"class":401},"# data[\"token\"] is shown only in this response — store it now\n",[86,538,539,540,543],{},"The response contains the key ",[107,541,542],{},"once"," — store it securely; it cannot be retrieved again.",[164,545,547],{"title":546},"Response",[169,548,552],{"className":549,"code":550,"filename":551,"language":392,"meta":175,"style":175},"language-json shiki shiki-themes github-light github-dark","{\n  \"status\": \"success\",\n  \"message\": \"api token created — save this token, it will not be shown again\",\n  \"data\": {\n    \"id\": \"9f2a4c8e-6b21-4d0f-a97b-5e8c1d2f6a3b\",\n    \"name\": \"orders-service\",\n    \"token\": \"sk_live_4c8e6b21d0f34a97b5e8c1d2f6a3b904\",\n    \"account_id\": \"2d6f4b8e-1a90-4e21-8b7d-3f1a5c2e9a0c\",\n    \"created_at\": \"2026-07-06T09:12:03Z\"\n  }\n}\n","201 Created",[90,553,554,559,571,583,591,603,614,626,638,648,653],{"__ignoreMap":175},[179,555,556],{"class":181,"line":33},[179,557,558],{"class":210},"{\n",[179,560,561,564,566,569],{"class":181,"line":49},[179,562,563],{"class":188},"  \"status\"",[179,565,292],{"class":210},[179,567,568],{"class":192},"\"success\"",[179,570,279],{"class":210},[179,572,573,576,578,581],{"class":181,"line":7},[179,574,575],{"class":188},"  \"message\"",[179,577,292],{"class":210},[179,579,580],{"class":192},"\"api token created — save this token, it will not be shown again\"",[179,582,279],{"class":210},[179,584,585,588],{"class":181,"line":21},[179,586,587],{"class":188},"  \"data\"",[179,589,590],{"class":210},": {\n",[179,592,593,596,598,601],{"class":181,"line":38},[179,594,595],{"class":188},"    \"id\"",[179,597,292],{"class":210},[179,599,600],{"class":192},"\"9f2a4c8e-6b21-4d0f-a97b-5e8c1d2f6a3b\"",[179,602,279],{"class":210},[179,604,605,608,610,612],{"class":181,"line":328},[179,606,607],{"class":188},"    \"name\"",[179,609,292],{"class":210},[179,611,504],{"class":192},[179,613,279],{"class":210},[179,615,616,619,621,624],{"class":181,"line":334},[179,617,618],{"class":188},"    \"token\"",[179,620,292],{"class":210},[179,622,623],{"class":192},"\"sk_live_4c8e6b21d0f34a97b5e8c1d2f6a3b904\"",[179,625,279],{"class":210},[179,627,628,631,633,636],{"class":181,"line":357},[179,629,630],{"class":188},"    \"account_id\"",[179,632,292],{"class":210},[179,634,635],{"class":192},"\"2d6f4b8e-1a90-4e21-8b7d-3f1a5c2e9a0c\"",[179,637,279],{"class":210},[179,639,640,643,645],{"class":181,"line":363},[179,641,642],{"class":188},"    \"created_at\"",[179,644,292],{"class":210},[179,646,647],{"class":192},"\"2026-07-06T09:12:03Z\"\n",[179,649,650],{"class":181,"line":370},[179,651,652],{"class":210},"  }\n",[179,654,655],{"class":181,"line":398},[179,656,657],{"class":210},"}\n",[86,659,660,661,663,664,93],{},"Export it as ",[90,662,308],{}," and it authenticates every call below. For rotation and safe\nhandling, see ",[127,665,65],{"href":64},[95,667,669],{"id":668},"_2-send-an-sms","2. Send an SMS",[86,671,672,675,676,678,679,682],{},[90,673,674],{},"to"," is an MSISDN in international format, ",[90,677,104],{}," is your approved sender ID, and ",[90,680,681],{},"message","\nis the text body.",[164,684,686,751,903],{"title":166,"label":685},"POST \u002Fapi\u002Fv1\u002Fsms",[169,687,689],{"className":171,"code":688,"filename":173,"language":174,"meta":175,"style":175},"curl -X POST https:\u002F\u002Fapi.sendai.co.zw\u002Fapi\u002Fv1\u002Fsms \\\n  -H \"Authorization: Bearer $SENDAI_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"to\": \"263771000000\",\n    \"from\": \"YOUR_SENDER_ID\",\n    \"message\": \"Your code is 4821\"\n  }'\n",[90,690,691,704,716,724,731,736,741,746],{"__ignoreMap":175},[179,692,693,695,697,699,702],{"class":181,"line":33},[179,694,185],{"class":184},[179,696,189],{"class":188},[179,698,193],{"class":192},[179,700,701],{"class":192}," https:\u002F\u002Fapi.sendai.co.zw\u002Fapi\u002Fv1\u002Fsms",[179,703,199],{"class":188},[179,705,706,708,710,712,714],{"class":181,"line":49},[179,707,204],{"class":188},[179,709,207],{"class":192},[179,711,211],{"class":210},[179,713,214],{"class":192},[179,715,199],{"class":188},[179,717,718,720,722],{"class":181,"line":7},[179,719,204],{"class":188},[179,721,223],{"class":192},[179,723,199],{"class":188},[179,725,726,728],{"class":181,"line":21},[179,727,230],{"class":188},[179,729,730],{"class":192}," '{\n",[179,732,733],{"class":181,"line":38},[179,734,735],{"class":192},"    \"to\": \"263771000000\",\n",[179,737,738],{"class":181,"line":328},[179,739,740],{"class":192},"    \"from\": \"YOUR_SENDER_ID\",\n",[179,742,743],{"class":181,"line":334},[179,744,745],{"class":192},"    \"message\": \"Your code is 4821\"\n",[179,747,748],{"class":181,"line":357},[179,749,750],{"class":192},"  }'\n",[169,752,754],{"className":236,"code":753,"filename":238,"language":239,"meta":175,"style":175},"const res = await fetch('https:\u002F\u002Fapi.sendai.co.zw\u002Fapi\u002Fv1\u002Fsms', {\n  method: 'POST',\n  headers: {\n    'Authorization': `Bearer ${process.env.SENDAI_API_KEY}`,\n    'Content-Type': 'application\u002Fjson',\n  },\n  body: JSON.stringify({\n    to: '263771000000',\n    from: 'YOUR_SENDER_ID',\n    message: 'Your code is 4821',\n  }),\n})\n\nconst sms = await res.json() \u002F\u002F bare message object — no data wrapper\n",[90,755,756,775,783,787,809,819,823,836,846,856,866,871,876,881],{"__ignoreMap":175},[179,757,758,760,762,764,766,768,770,773],{"class":181,"line":33},[179,759,247],{"class":246},[179,761,250],{"class":188},[179,763,253],{"class":246},[179,765,256],{"class":246},[179,767,259],{"class":184},[179,769,262],{"class":210},[179,771,772],{"class":192},"'https:\u002F\u002Fapi.sendai.co.zw\u002Fapi\u002Fv1\u002Fsms'",[179,774,268],{"class":210},[179,776,777,779,781],{"class":181,"line":49},[179,778,273],{"class":210},[179,780,276],{"class":192},[179,782,279],{"class":210},[179,784,785],{"class":181,"line":7},[179,786,284],{"class":210},[179,788,789,791,793,795,797,799,801,803,805,807],{"class":181,"line":21},[179,790,289],{"class":192},[179,792,292],{"class":210},[179,794,295],{"class":192},[179,796,298],{"class":210},[179,798,93],{"class":192},[179,800,303],{"class":210},[179,802,93],{"class":192},[179,804,308],{"class":188},[179,806,311],{"class":192},[179,808,279],{"class":210},[179,810,811,813,815,817],{"class":181,"line":38},[179,812,318],{"class":192},[179,814,292],{"class":210},[179,816,323],{"class":192},[179,818,279],{"class":210},[179,820,821],{"class":181,"line":328},[179,822,331],{"class":210},[179,824,825,827,829,831,833],{"class":181,"line":334},[179,826,337],{"class":210},[179,828,340],{"class":188},[179,830,93],{"class":210},[179,832,345],{"class":184},[179,834,835],{"class":210},"({\n",[179,837,838,841,844],{"class":181,"line":357},[179,839,840],{"class":210},"    to: ",[179,842,843],{"class":192},"'263771000000'",[179,845,279],{"class":210},[179,847,848,851,854],{"class":181,"line":363},[179,849,850],{"class":210},"    from: ",[179,852,853],{"class":192},"'YOUR_SENDER_ID'",[179,855,279],{"class":210},[179,857,858,861,864],{"class":181,"line":370},[179,859,860],{"class":210},"    message: ",[179,862,863],{"class":192},"'Your code is 4821'",[179,865,279],{"class":210},[179,867,868],{"class":181,"line":398},[179,869,870],{"class":210},"  }),\n",[179,872,874],{"class":181,"line":873},12,[179,875,360],{"class":210},[179,877,879],{"class":181,"line":878},13,[179,880,367],{"emptyLinePlaceholder":366},[179,882,884,886,889,891,893,895,897,900],{"class":181,"line":883},14,[179,885,247],{"class":246},[179,887,888],{"class":188}," sms",[179,890,253],{"class":246},[179,892,256],{"class":246},[179,894,389],{"class":210},[179,896,392],{"class":184},[179,898,899],{"class":210},"() ",[179,901,902],{"class":401},"\u002F\u002F bare message object — no data wrapper\n",[169,904,906],{"className":405,"code":905,"filename":407,"language":408,"meta":175,"style":175},"import os\nimport requests\n\nres = requests.post(\n    \"https:\u002F\u002Fapi.sendai.co.zw\u002Fapi\u002Fv1\u002Fsms\",\n    headers={\"Authorization\": f\"Bearer {os.environ['SENDAI_API_KEY']}\"},\n    json={\n        \"to\": \"263771000000\",\n        \"from\": \"YOUR_SENDER_ID\",\n        \"message\": \"Your code is 4821\",\n    },\n)\n\nsms = res.json()  # bare message object — no data wrapper\n",[90,907,908,914,920,924,932,939,969,977,989,1001,1013,1018,1022,1026],{"__ignoreMap":175},[179,909,910,912],{"class":181,"line":33},[179,911,415],{"class":246},[179,913,418],{"class":210},[179,915,916,918],{"class":181,"line":49},[179,917,415],{"class":246},[179,919,425],{"class":210},[179,921,922],{"class":181,"line":7},[179,923,367],{"emptyLinePlaceholder":366},[179,925,926,928,930],{"class":181,"line":21},[179,927,434],{"class":210},[179,929,384],{"class":246},[179,931,439],{"class":210},[179,933,934,937],{"class":181,"line":38},[179,935,936],{"class":192},"    \"https:\u002F\u002Fapi.sendai.co.zw\u002Fapi\u002Fv1\u002Fsms\"",[179,938,279],{"class":210},[179,940,941,943,945,947,949,951,953,955,957,959,961,963,965,967],{"class":181,"line":328},[179,942,452],{"class":451},[179,944,384],{"class":246},[179,946,457],{"class":210},[179,948,460],{"class":192},[179,950,292],{"class":210},[179,952,465],{"class":246},[179,954,468],{"class":192},[179,956,457],{"class":188},[179,958,473],{"class":210},[179,960,476],{"class":192},[179,962,479],{"class":210},[179,964,482],{"class":188},[179,966,214],{"class":192},[179,968,487],{"class":210},[179,970,971,973,975],{"class":181,"line":334},[179,972,492],{"class":451},[179,974,384],{"class":246},[179,976,558],{"class":210},[179,978,979,982,984,987],{"class":181,"line":357},[179,980,981],{"class":192},"        \"to\"",[179,983,292],{"class":210},[179,985,986],{"class":192},"\"263771000000\"",[179,988,279],{"class":210},[179,990,991,994,996,999],{"class":181,"line":363},[179,992,993],{"class":192},"        \"from\"",[179,995,292],{"class":210},[179,997,998],{"class":192},"\"YOUR_SENDER_ID\"",[179,1000,279],{"class":210},[179,1002,1003,1006,1008,1011],{"class":181,"line":370},[179,1004,1005],{"class":192},"        \"message\"",[179,1007,292],{"class":210},[179,1009,1010],{"class":192},"\"Your code is 4821\"",[179,1012,279],{"class":210},[179,1014,1015],{"class":181,"line":398},[179,1016,1017],{"class":210},"    },\n",[179,1019,1020],{"class":181,"line":873},[179,1021,511],{"class":210},[179,1023,1024],{"class":181,"line":878},[179,1025,367],{"emptyLinePlaceholder":366},[179,1027,1028,1031,1033,1036],{"class":181,"line":883},[179,1029,1030],{"class":210},"sms ",[179,1032,384],{"class":246},[179,1034,1035],{"class":210}," res.json()  ",[179,1037,1038],{"class":401},"# bare message object — no data wrapper\n",[86,1040,1041,1042,1045,1046,1049],{},"Sendai validates and prices the message, holds the charge against your balance, and returns\n",[90,1043,1044],{},"202 Accepted",". (Responses on this page show an account whose approved sender ID is\n",[90,1047,1048],{},"Sendai SMS",".)",[164,1051,1052],{"title":546},[169,1053,1055],{"className":549,"code":1054,"filename":1044,"language":392,"meta":175,"style":175},"{\n  \"id\": \"0f9c1b3a-6d2e-4a1b-9c3d-7e5f2a8b4c10\",\n  \"to\": \"263771000000\",\n  \"message\": \"Your code is 4821\",\n  \"sender_id\": \"Sendai SMS\",\n  \"operator\": \"econet\",\n  \"charge\": \"450\",\n  \"charge_currency\": \"USD\",\n  \"operator_response\": \"\",\n  \"received_at\": \"2026-07-06T09:12:03Z\",\n  \"status\": \"enqueued\",\n  \"created_at\": \"2026-07-06T09:12:03Z\",\n  \"delivered_at\": null\n}\n",[90,1056,1057,1061,1073,1084,1094,1106,1118,1130,1142,1154,1166,1177,1188,1198],{"__ignoreMap":175},[179,1058,1059],{"class":181,"line":33},[179,1060,558],{"class":210},[179,1062,1063,1066,1068,1071],{"class":181,"line":49},[179,1064,1065],{"class":188},"  \"id\"",[179,1067,292],{"class":210},[179,1069,1070],{"class":192},"\"0f9c1b3a-6d2e-4a1b-9c3d-7e5f2a8b4c10\"",[179,1072,279],{"class":210},[179,1074,1075,1078,1080,1082],{"class":181,"line":7},[179,1076,1077],{"class":188},"  \"to\"",[179,1079,292],{"class":210},[179,1081,986],{"class":192},[179,1083,279],{"class":210},[179,1085,1086,1088,1090,1092],{"class":181,"line":21},[179,1087,575],{"class":188},[179,1089,292],{"class":210},[179,1091,1010],{"class":192},[179,1093,279],{"class":210},[179,1095,1096,1099,1101,1104],{"class":181,"line":38},[179,1097,1098],{"class":188},"  \"sender_id\"",[179,1100,292],{"class":210},[179,1102,1103],{"class":192},"\"Sendai SMS\"",[179,1105,279],{"class":210},[179,1107,1108,1111,1113,1116],{"class":181,"line":328},[179,1109,1110],{"class":188},"  \"operator\"",[179,1112,292],{"class":210},[179,1114,1115],{"class":192},"\"econet\"",[179,1117,279],{"class":210},[179,1119,1120,1123,1125,1128],{"class":181,"line":334},[179,1121,1122],{"class":188},"  \"charge\"",[179,1124,292],{"class":210},[179,1126,1127],{"class":192},"\"450\"",[179,1129,279],{"class":210},[179,1131,1132,1135,1137,1140],{"class":181,"line":357},[179,1133,1134],{"class":188},"  \"charge_currency\"",[179,1136,292],{"class":210},[179,1138,1139],{"class":192},"\"USD\"",[179,1141,279],{"class":210},[179,1143,1144,1147,1149,1152],{"class":181,"line":363},[179,1145,1146],{"class":188},"  \"operator_response\"",[179,1148,292],{"class":210},[179,1150,1151],{"class":192},"\"\"",[179,1153,279],{"class":210},[179,1155,1156,1159,1161,1164],{"class":181,"line":370},[179,1157,1158],{"class":188},"  \"received_at\"",[179,1160,292],{"class":210},[179,1162,1163],{"class":192},"\"2026-07-06T09:12:03Z\"",[179,1165,279],{"class":210},[179,1167,1168,1170,1172,1175],{"class":181,"line":398},[179,1169,563],{"class":188},[179,1171,292],{"class":210},[179,1173,1174],{"class":192},"\"enqueued\"",[179,1176,279],{"class":210},[179,1178,1179,1182,1184,1186],{"class":181,"line":873},[179,1180,1181],{"class":188},"  \"created_at\"",[179,1183,292],{"class":210},[179,1185,1163],{"class":192},[179,1187,279],{"class":210},[179,1189,1190,1193,1195],{"class":181,"line":878},[179,1191,1192],{"class":188},"  \"delivered_at\"",[179,1194,292],{"class":210},[179,1196,1197],{"class":188},"null\n",[179,1199,1200],{"class":181,"line":883},[179,1201,657],{"class":210},[1203,1204,1205],"blockquote",{},[86,1206,1207,1210,1211,1213,1214,1216,1217,1221,1222,93],{},[107,1208,1209],{},"This response is not enveloped."," ",[90,1212,685],{}," returns the message object as the\nwhole body — there is no ",[90,1215,378],{}," to unwrap. Every ",[1218,1219,1220],"em",{},"other"," endpoint does wrap its payload. See\n",[127,1223,1225],{"href":1224},"\u002Fapi#two-response-conventions","two response conventions",[86,1227,1228,1229,1234,1235,1237,1238,1241,1242,1245,1246,1249,1250,1252,1253,93],{},"Two more things to note: the sender comes back as ",[107,1230,1231],{},[90,1232,1233],{},"sender_id",", not ",[90,1236,104],{},"; and ",[90,1239,1240],{},"charge"," is\na ",[107,1243,1244],{},"string"," on this endpoint, in ten-thousandths of ",[90,1247,1248],{},"charge_currency"," (",[90,1251,1127],{}," == 0.045). See\n",[127,1254,1256],{"href":1255},"\u002Fapi#billing-and-segments","billing and segments",[95,1258,1260],{"id":1259},"_3-confirm-it-arrived","3. Confirm it arrived",[86,1262,1263,1264,1267,1268,1271,1272,1275,1276,1278],{},"Poll ",[90,1265,1266],{},"GET \u002Fapi\u002Fv1\u002Fsms\u002F{id}"," with the ",[90,1269,1270],{},"id"," from the send response. This response ",[107,1273,1274],{},"is","\nenveloped, so the message sits under ",[90,1277,378],{},":",[164,1280,1281,1306,1413],{"title":166,"label":1266},[169,1282,1284],{"className":171,"code":1283,"filename":173,"language":174,"meta":175,"style":175},"curl https:\u002F\u002Fapi.sendai.co.zw\u002Fapi\u002Fv1\u002Fsms\u002F0f9c1b3a-6d2e-4a1b-9c3d-7e5f2a8b4c10 \\\n  -H \"Authorization: Bearer $SENDAI_API_KEY\"\n",[90,1285,1286,1295],{"__ignoreMap":175},[179,1287,1288,1290,1293],{"class":181,"line":33},[179,1289,185],{"class":184},[179,1291,1292],{"class":192}," https:\u002F\u002Fapi.sendai.co.zw\u002Fapi\u002Fv1\u002Fsms\u002F0f9c1b3a-6d2e-4a1b-9c3d-7e5f2a8b4c10",[179,1294,199],{"class":188},[179,1296,1297,1299,1301,1303],{"class":181,"line":49},[179,1298,204],{"class":188},[179,1300,207],{"class":192},[179,1302,211],{"class":210},[179,1304,1305],{"class":192},"\"\n",[169,1307,1309],{"className":236,"code":1308,"filename":238,"language":239,"meta":175,"style":175},"const id = '0f9c1b3a-6d2e-4a1b-9c3d-7e5f2a8b4c10'\n\nconst res = await fetch(`https:\u002F\u002Fapi.sendai.co.zw\u002Fapi\u002Fv1\u002Fsms\u002F${id}`, {\n  headers: { 'Authorization': `Bearer ${process.env.SENDAI_API_KEY}` },\n})\n\nconst { data: sms } = await res.json() \u002F\u002F enveloped — the message is under data\n",[90,1310,1311,1323,1327,1350,1377,1381,1385],{"__ignoreMap":175},[179,1312,1313,1315,1318,1320],{"class":181,"line":33},[179,1314,247],{"class":246},[179,1316,1317],{"class":188}," id",[179,1319,253],{"class":246},[179,1321,1322],{"class":192}," '0f9c1b3a-6d2e-4a1b-9c3d-7e5f2a8b4c10'\n",[179,1324,1325],{"class":181,"line":49},[179,1326,367],{"emptyLinePlaceholder":366},[179,1328,1329,1331,1333,1335,1337,1339,1341,1344,1346,1348],{"class":181,"line":7},[179,1330,247],{"class":246},[179,1332,250],{"class":188},[179,1334,253],{"class":246},[179,1336,256],{"class":246},[179,1338,259],{"class":184},[179,1340,262],{"class":210},[179,1342,1343],{"class":192},"`https:\u002F\u002Fapi.sendai.co.zw\u002Fapi\u002Fv1\u002Fsms\u002F${",[179,1345,1270],{"class":210},[179,1347,311],{"class":192},[179,1349,268],{"class":210},[179,1351,1352,1355,1358,1360,1362,1364,1366,1368,1370,1372,1374],{"class":181,"line":21},[179,1353,1354],{"class":210},"  headers: { ",[179,1356,1357],{"class":192},"'Authorization'",[179,1359,292],{"class":210},[179,1361,295],{"class":192},[179,1363,298],{"class":210},[179,1365,93],{"class":192},[179,1367,303],{"class":210},[179,1369,93],{"class":192},[179,1371,308],{"class":188},[179,1373,311],{"class":192},[179,1375,1376],{"class":210}," },\n",[179,1378,1379],{"class":181,"line":38},[179,1380,360],{"class":210},[179,1382,1383],{"class":181,"line":328},[179,1384,367],{"emptyLinePlaceholder":366},[179,1386,1387,1389,1391,1393,1395,1398,1400,1402,1404,1406,1408,1410],{"class":181,"line":334},[179,1388,247],{"class":246},[179,1390,375],{"class":210},[179,1392,378],{"class":451},[179,1394,292],{"class":210},[179,1396,1397],{"class":188},"sms",[179,1399,381],{"class":210},[179,1401,384],{"class":246},[179,1403,256],{"class":246},[179,1405,389],{"class":210},[179,1407,392],{"class":184},[179,1409,899],{"class":210},[179,1411,1412],{"class":401},"\u002F\u002F enveloped — the message is under data\n",[169,1414,1416],{"className":405,"code":1415,"filename":407,"language":408,"meta":175,"style":175},"import os\nimport requests\n\nsms_id = \"0f9c1b3a-6d2e-4a1b-9c3d-7e5f2a8b4c10\"\n\nres = requests.get(\n    f\"https:\u002F\u002Fapi.sendai.co.zw\u002Fapi\u002Fv1\u002Fsms\u002F{sms_id}\",\n    headers={\"Authorization\": f\"Bearer {os.environ['SENDAI_API_KEY']}\"},\n)\n\nsms = res.json()[\"data\"]  # enveloped — the message is under data\n",[90,1417,1418,1424,1430,1434,1444,1448,1457,1476,1506,1510,1514],{"__ignoreMap":175},[179,1419,1420,1422],{"class":181,"line":33},[179,1421,415],{"class":246},[179,1423,418],{"class":210},[179,1425,1426,1428],{"class":181,"line":49},[179,1427,415],{"class":246},[179,1429,425],{"class":210},[179,1431,1432],{"class":181,"line":7},[179,1433,367],{"emptyLinePlaceholder":366},[179,1435,1436,1439,1441],{"class":181,"line":21},[179,1437,1438],{"class":210},"sms_id ",[179,1440,384],{"class":246},[179,1442,1443],{"class":192}," \"0f9c1b3a-6d2e-4a1b-9c3d-7e5f2a8b4c10\"\n",[179,1445,1446],{"class":181,"line":38},[179,1447,367],{"emptyLinePlaceholder":366},[179,1449,1450,1452,1454],{"class":181,"line":328},[179,1451,434],{"class":210},[179,1453,384],{"class":246},[179,1455,1456],{"class":210}," requests.get(\n",[179,1458,1459,1462,1465,1467,1470,1472,1474],{"class":181,"line":334},[179,1460,1461],{"class":246},"    f",[179,1463,1464],{"class":192},"\"https:\u002F\u002Fapi.sendai.co.zw\u002Fapi\u002Fv1\u002Fsms\u002F",[179,1466,457],{"class":188},[179,1468,1469],{"class":210},"sms_id",[179,1471,482],{"class":188},[179,1473,214],{"class":192},[179,1475,279],{"class":210},[179,1477,1478,1480,1482,1484,1486,1488,1490,1492,1494,1496,1498,1500,1502,1504],{"class":181,"line":357},[179,1479,452],{"class":451},[179,1481,384],{"class":246},[179,1483,457],{"class":210},[179,1485,460],{"class":192},[179,1487,292],{"class":210},[179,1489,465],{"class":246},[179,1491,468],{"class":192},[179,1493,457],{"class":188},[179,1495,473],{"class":210},[179,1497,476],{"class":192},[179,1499,479],{"class":210},[179,1501,482],{"class":188},[179,1503,214],{"class":192},[179,1505,487],{"class":210},[179,1507,1508],{"class":181,"line":363},[179,1509,511],{"class":210},[179,1511,1512],{"class":181,"line":370},[179,1513,367],{"emptyLinePlaceholder":366},[179,1515,1516,1518,1520,1522,1524,1527],{"class":181,"line":398},[179,1517,1030],{"class":210},[179,1519,384],{"class":246},[179,1521,525],{"class":210},[179,1523,528],{"class":192},[179,1525,1526],{"class":210},"]  ",[179,1528,1529],{"class":401},"# enveloped — the message is under data\n",[164,1531,1532],{"title":546},[169,1533,1536],{"className":549,"code":1534,"filename":1535,"language":392,"meta":175,"style":175},"{\n  \"status\": \"success\",\n  \"message\": \"request successful\",\n  \"data\": {\n    \"id\": \"0f9c1b3a-6d2e-4a1b-9c3d-7e5f2a8b4c10\",\n    \"status\": \"success\",\n    \"operator_response\": \"DELIVRD\",\n    \"delivered_at\": \"2026-07-06T09:12:44Z\"\n  }\n}\n","200 OK",[90,1537,1538,1542,1552,1563,1569,1579,1590,1602,1612,1616],{"__ignoreMap":175},[179,1539,1540],{"class":181,"line":33},[179,1541,558],{"class":210},[179,1543,1544,1546,1548,1550],{"class":181,"line":49},[179,1545,563],{"class":188},[179,1547,292],{"class":210},[179,1549,568],{"class":192},[179,1551,279],{"class":210},[179,1553,1554,1556,1558,1561],{"class":181,"line":7},[179,1555,575],{"class":188},[179,1557,292],{"class":210},[179,1559,1560],{"class":192},"\"request successful\"",[179,1562,279],{"class":210},[179,1564,1565,1567],{"class":181,"line":21},[179,1566,587],{"class":188},[179,1568,590],{"class":210},[179,1570,1571,1573,1575,1577],{"class":181,"line":38},[179,1572,595],{"class":188},[179,1574,292],{"class":210},[179,1576,1070],{"class":192},[179,1578,279],{"class":210},[179,1580,1581,1584,1586,1588],{"class":181,"line":328},[179,1582,1583],{"class":188},"    \"status\"",[179,1585,292],{"class":210},[179,1587,568],{"class":192},[179,1589,279],{"class":210},[179,1591,1592,1595,1597,1600],{"class":181,"line":334},[179,1593,1594],{"class":188},"    \"operator_response\"",[179,1596,292],{"class":210},[179,1598,1599],{"class":192},"\"DELIVRD\"",[179,1601,279],{"class":210},[179,1603,1604,1607,1609],{"class":181,"line":357},[179,1605,1606],{"class":188},"    \"delivered_at\"",[179,1608,292],{"class":210},[179,1610,1611],{"class":192},"\"2026-07-06T09:12:44Z\"\n",[179,1613,1614],{"class":181,"line":363},[179,1615,652],{"class":210},[179,1617,1618],{"class":181,"line":370},[179,1619,657],{"class":210},[86,1621,1622,1210,1628,1631,1632,1635,1636,1639,1640,1635,1643,1646,1647,1650,1651,1653,1654,1657,1658,1661,1662,1665],{},[107,1623,1624,1627],{},[90,1625,1626],{},"delivered_at"," is the delivery signal.",[90,1629,1630],{},"status"," moves ",[90,1633,1634],{},"created"," → ",[90,1637,1638],{},"enqueued"," →\n",[90,1641,1642],{},"processing",[90,1644,1645],{},"success"," (or ",[90,1648,1649],{},"failed",") and tells you the send pipeline finished;\n",[90,1652,1626],{}," going from ",[90,1655,1656],{},"null"," to a timestamp is the carrier confirming it reached the\nhandset. A message can sit at ",[90,1659,1660],{},"status: success"," with ",[90,1663,1664],{},"delivered_at: null"," for a while — that\nis normal, not a failure.",[86,1667,1668,1669,93],{},"Carrier confirmation is asynchronous and can take seconds to hours, so poll on an interval\nrather than in a tight loop — or skip polling entirely and register a\n",[127,1670,1671],{"href":76},"webhook",[95,1673,1675],{"id":1674},"errors","Errors",[86,1677,1678],{},"Branch on the HTTP status code:",[1680,1681,1682,1695],"table",{},[1683,1684,1685],"thead",{},[1686,1687,1688,1692],"tr",{},[1689,1690,1691],"th",{},"Status",[1689,1693,1694],{},"Meaning",[1696,1697,1698,1712,1722,1732],"tbody",{},[1686,1699,1700,1706],{},[1701,1702,1703],"td",{},[90,1704,1705],{},"400",[1701,1707,1708,1709,1711],{},"Malformed JSON, an invalid id, or a ",[90,1710,104],{}," that is not an approved sender ID.",[1686,1713,1714,1719],{},[1701,1715,1716],{},[90,1717,1718],{},"401",[1701,1720,1721],{},"Missing, malformed, or revoked API key.",[1686,1723,1724,1729],{},[1701,1725,1726],{},[90,1727,1728],{},"404",[1701,1730,1731],{},"No such message on your account.",[1686,1733,1734,1739],{},[1701,1735,1736],{},[90,1737,1738],{},"422",[1701,1740,1741],{},"Your prepaid balance does not cover the send (bulk endpoint).",[86,1743,1744,1745,1747,1748,1750,1751,1754,1755,1758,1759,93],{},"Note that the two error bodies differ: ",[90,1746,685],{}," and ",[90,1749,1266],{}," return\n",[90,1752,1753],{},"error.type",", everything else returns ",[90,1756,1757],{},"error.code",". See ",[127,1760,1674],{"href":1761},"\u002Fapi#errors",[95,1763,1765],{"id":1764},"next-steps","Next steps",[1767,1768,1769,1775,1780,1786],"ul",{},[1770,1771,1772,1773],"li",{},"Send to many recipients at once → ",[127,1774,68],{"href":67},[1770,1776,1777,1778],{},"Get delivery pushed to you → ",[127,1779,77],{"href":76},[1770,1781,1782,1783],{},"Let an AI agent send from your account → ",[127,1784,1785],{"href":70},"AI agents",[1770,1787,1788,1789],{},"Every endpoint, request, and response → ",[127,1790,1791],{"href":30},"API reference",[1793,1794,1795],"style",{},"html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}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 .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}",{"title":175,"searchDepth":49,"depth":49,"links":1797},[1798,1799,1800,1801,1802,1803],{"id":97,"depth":49,"text":98},{"id":154,"depth":49,"text":155},{"id":668,"depth":49,"text":669},{"id":1259,"depth":49,"text":1260},{"id":1674,"depth":49,"text":1675},{"id":1764,"depth":49,"text":1765},{"title":74,"description":80},"guides\u002Fquickstart","md",{},1786390037511]