{"id":"sms.status","module":"sms","namespace":"sms","action":"status","method":"GET","path":"/v1/sms/status/{id}","idempotent":false,"available":true,"vendors":["twilio","tencent_sms"],"vendors_ready":["tencent_sms"],"vendors_pending":["twilio"],"key_status":"live","default_vendor":"tencent_sms","self_hosted":false,"minimum_tier":"standard","supported_message_classes":null,"regions":["western"],"dynamic_params":{},"models_tracked":false,"sdk_hint":"Regular parameters + types are stable — read them from the typed SDK signature / API reference for this capability. discovery only carries the runtime-dynamic values above (available, vendors, dynamic_params).","params":{},"response":{"title":"SmsStatus","description":"Current status of an SMS message, read back from the edge's per-account sent-message archive (sms.status / sms.list). The archive keys the row by `id`; `status` carries the lifecycle state (mirrors enums/SmsState, plus 'not_found' on a missing-id read). 'attempt'/'state'/'last_event' are vendor-delivery-tracking fields not currently populated by the archive and are optional. See docs/phase2/P2_03_New_Modules.md §1.2.","type":"object","required":["id","status"],"additionalProperties":false,"properties":{"id":{"type":"string","description":"Message id (send returns e.g. 'sms_…'); the archive stores it under 'id'."},"status":{"type":"string","description":"Lifecycle state: one of enums/SmsState (queued|sending|sent|delivered|failed|deferred|expired|cancelled|auto_suppressed) or 'not_found' when the id is unknown."},"channel":{"type":["string","null"],"enum":["sms","email",null],"description":"Always 'sms' for this capability."},"account_id":{"type":["string","null"],"description":"Account identifier that owns this resource"},"to":{"description":"Recipient(s) as supplied at send time."},"vendor":{"type":["string","null"],"description":"Vendor that handled the send; null on a not-found read."},"vendor_message_id":{"type":["string","null"],"description":"Message identifier assigned by the upstream vendor"},"created_at":{"type":["string","null"],"format":"date-time","description":"ISO 8601 timestamp when this resource was created"},"found":{"type":"boolean","description":"true when the id resolved to an archived message; false on a miss. (A miss should raise a typed 404 once SMS_MESSAGE_NOT_FOUND lands — see module notes.)"},"state":{"description":"Current lifecycle state of this resource","type":"string","enum":["queued","sending","sent","delivered","failed","deferred","expired","cancelled","auto_suppressed"]},"attempt":{"type":["integer","null"],"minimum":0,"description":"Current attempt number (for retries)"},"last_event":{"type":["string","null"],"description":"Description of the most recent event"},"delivered_at":{"type":["string","null"],"format":"date-time","description":"ISO 8601 timestamp when the message was delivered"},"failed_reason":{"type":["string","null"],"description":"Reason for failure, if the operation failed"}}},"errors":["ACCOUNT_AUTORECHARGE_LIMIT","ACCOUNT_FROZEN","AUTH_RATE_LIMIT","AUTH_REFRESH_TOO_FREQUENT","IDEMPOTENCY_KEY_CONFLICT","INSUFFICIENT_CREDIT","INTERNAL_ERROR","INVALID_ARGUMENT","INVALID_PHONE_NUMBER","KEY_REVOKED","MAINTENANCE","NETWORK_ERROR","RATE_LIMIT_ACCOUNT","RATE_LIMIT_USER","RATE_LIMIT_VENDOR","SCOPE_INSUFFICIENT","SMS_CONFIRMATION_REQUIRED","SMS_CONTENT_REJECTED","SMS_INBOUND_NOT_SUPPORTED","SMS_INVALID_RETENTION","SMS_MESSAGE_NOT_FOUND","SMS_NOT_CONFIGURED","SMS_RATE_LIMIT","SMS_SEGMENT_LIMIT_EXCEEDED","SMS_SENDER_NOT_REGISTERED","SMS_SEND_FAILED","SMS_SIGNATURE_NOT_FOUND","SMS_SUPPRESSED_RECIPIENT","SMS_TEMPLATE_NOT_APPROVED","SMS_TEMPLATE_NOT_FOUND","SMS_TEMPLATE_REQUIRED","SMS_VENDOR_DOWN","SMS_VENDOR_UNSUPPORTED_OP","UNAUTHORIZED","VENDOR_AUTH_ERROR","VENDOR_DOWN","VENDOR_TIMEOUT","WALLET_EXPIRED"],"examples":{"curl":"curl -X GET https://api.infrai.cc/v1/sms/status/ID \\\n  -H \"Authorization: Bearer $INFRAI_API_KEY\"","python":"# Zero-install REST call — no SDK required (short-term the API is REST-only).\nimport os, requests\n\nresp = requests.get(\n    \"https://api.infrai.cc/v1/sms/status/ID\",\n    headers={\n        \"Authorization\": f\"Bearer {os.environ['INFRAI_API_KEY']}\",\n    },\n)\nresp.raise_for_status()\nprint(resp.json())","javascript":"// Zero-install REST call — no SDK required (short-term the API is REST-only).\nconst resp = await fetch(\n  \"https://api.infrai.cc/v1/sms/status/ID\",\n  {\n    method: \"GET\",\n    headers: {\n      \"Authorization\": `Bearer ${process.env.INFRAI_API_KEY}`,\n    },\n  },\n);\nconsole.log(await resp.json());","typescript":"// Zero-install REST call — no SDK required (short-term the API is REST-only).\nconst resp = await fetch(\n  \"https://api.infrai.cc/v1/sms/status/ID\",\n  {\n    method: \"GET\",\n    headers: {\n      \"Authorization\": `Bearer ${process.env.INFRAI_API_KEY}`,\n    },\n  },\n);\nif (!resp.ok) throw new Error(`infrai ${resp.status}`);\nconst data: unknown = await resp.json();\nconsole.log(data);","go":"// Zero-install REST call — no SDK required (short-term the API is REST-only).\npackage main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"os\"\n)\n\nfunc main() {\n\treq, _ := http.NewRequest(\"GET\", \"https://api.infrai.cc/v1/sms/status/ID\", nil)\n\treq.Header.Set(\"Authorization\", \"Bearer \"+os.Getenv(\"INFRAI_API_KEY\"))\n\tresp, err := http.DefaultClient.Do(req)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tdefer resp.Body.Close()\n\tfmt.Println(resp.Status)\n}","java":"// Zero-install REST call — no SDK required (short-term the API is REST-only).\nimport java.net.URI;\nimport java.net.http.*;\n\nHttpRequest req = HttpRequest.newBuilder()\n    .uri(URI.create(\"https://api.infrai.cc/v1/sms/status/ID\"))\n    .header(\"Authorization\", \"Bearer \" + System.getenv(\"INFRAI_API_KEY\"))\n    .method(\"GET\", HttpRequest.BodyPublishers.noBody())\n    .build();\nHttpResponse<String> resp = HttpClient.newHttpClient()\n    .send(req, HttpResponse.BodyHandlers.ofString());\nSystem.out.println(resp.body());","csharp":"// Zero-install REST call — no SDK required (short-term the API is REST-only).\nusing System;\nusing System.Net.Http;\n\nvar client = new HttpClient();\nvar req = new HttpRequestMessage(new HttpMethod(\"GET\"), \"https://api.infrai.cc/v1/sms/status/ID\");\nvar key = Environment.GetEnvironmentVariable(\"INFRAI_API_KEY\");\nreq.Headers.Add(\"Authorization\", \"Bearer \" + key);\nvar resp = await client.SendAsync(req);\nConsole.WriteLine(await resp.Content.ReadAsStringAsync());","php":"<?php\n// Zero-install REST call — no SDK required (short-term the API is REST-only).\n$ch = curl_init(\"https://api.infrai.cc/v1/sms/status/ID\");\ncurl_setopt($ch, CURLOPT_CUSTOMREQUEST, \"GET\");\ncurl_setopt($ch, CURLOPT_RETURNTRANSFER, true);\ncurl_setopt($ch, CURLOPT_HTTPHEADER, [\n    \"Authorization: Bearer \" . getenv(\"INFRAI_API_KEY\"),\n]);\n$response = curl_exec($ch);\ncurl_close($ch);\necho $response;","ruby":"# Zero-install REST call — no SDK required (short-term the API is REST-only).\nrequire \"net/http\"\nrequire \"uri\"\n\nuri = URI(\"https://api.infrai.cc/v1/sms/status/ID\")\nhttp = Net::HTTP.new(uri.host, uri.port)\nhttp.use_ssl = true\nreq = Net::HTTP::Get.new(uri)\nreq[\"Authorization\"] = \"Bearer #{ENV['INFRAI_API_KEY']}\"\nres = http.request(req)\nputs res.body","rust":"// Zero-install REST call — no SDK required (short-term the API is REST-only). (uses the reqwest + tokio crates)\nuse std::env;\n\n#[tokio::main]\nasync fn main() -> Result<(), Box<dyn std::error::Error>> {\n    let resp = reqwest::Client::new()\n        .get(\"https://api.infrai.cc/v1/sms/status/ID\")\n        .header(\"Authorization\", format!(\"Bearer {}\", env::var(\"INFRAI_API_KEY\")?))\n        .send()\n        .await?;\n    println!(\"{}\", resp.text().await?);\n    Ok(())\n}"},"billing":{"is_billable":false,"free":true,"billing_class":"service_markup","unit":"per_call","note":"free (rate-limited); does NOT consume the new-account trial"}}