One workflow. One outcome: your data.
From sensor to insight: price your deployment, activate any eligible Iridium SBD or Certus modem in about 5 minutes, and your data is ready to download. Available after your first message and stored for up to 5 years at no extra cost.*
Using an AI assistant? Follow the AI agent workflow to estimate deployment costs, prepare a customer activation link, and retrieve telemetry through REST or the available MCP tools. Payment, email codes, and passwords stay with the customer.
*While the account remains active and in good standing, subject to the Terms.
From sensor to insight.
Your device sends a few bytes over Iridium. We receive, store and bill them, and your data is ready in the dashboard. You build the left side; the right side is handled for you.
- 01Sensor
Measures what you care about.
Your part - 02Microcontroller
Packs readings into bytes and talks to the modem.
Your part - 03Iridium modem
SBD 9602 / 9603 or Certus 9704 sends the bytes.
Your part - 04Iridium network
Global coverage, pole to pole.
Handled for you - 05Telemetry Station
Receives, stores and bills every message.
Handled for you - 06Your data
Dashboard, data download API and destinations.
Ready to use
I have an SBD modem
Iridium 9602 or 9603. Best for small messages, up to 340 bytes each.
- 1Wire the modemConnect its UART to your microcontroller or a USB-serial adapter (19200 baud, 8N1 by default), plus power and an antenna with a clear view of the sky.
- 2Find the IMEIIt is the 15-digit number on the modem label, or send AT+CGSN and the modem replies with it.
- 3Price your deploymentEnter payload size, how often you send and your dates in the SBD calculator. Smaller payloads cost less; the Payload Optimizer shows how to shrink them.
- 4ActivateContinue from the calculator: enter and verify the IMEI, add optional destinations, pay with a card and create your password. About 5 minutes.
- 5Send your first messageGo outside and run the AT commands in Send your first message. It appears in your dashboard as soon as Iridium delivers it.
I have a Certus 9704
Iridium 9704 on Certus IMT. Larger messages and a modern serial protocol.
- 1Wire the modemConnect UART (230400 baud), ENABLE and BOOTED, reviewed power and an antenna with sky view. BEAR is in G1 design; its supply ratings and hardware integration remain under review.
- 2Find the IMEIIt is printed on the modem label. The open-source Telemetry Station SDK also reads it and prints your calculator and activation links.
- 3Price your deploymentUse the Certus calculator with your payload size, send interval and dates.
- 4ActivateContinue from the calculator: verify the IMEI, add optional destinations, pay and create your password.
- 5Send your first messageStart the modem with the SDK and send one message outdoors. See Send your first message.
I'm choosing hardware
No modem yet? Start with what you need to send.
- 1Small, simple readingsA few numbers every hour or so fit easily in SBD. 9602 and 9603 modems are mature, widely available and low power.
- 2Larger or richer messagesChoose Certus 9704 for larger payloads and a longer-term path on Iridium's newest messaging service.
- 3Want it on one board?The BEAR Module 9704 is in G1 design, with an alpha host SDK and optional GNSS design input. Hardware qualification is pending. No-payment pre-order inquiries are open.
- 4Not an embedded engineer?Pacific Gyre can design the sensor, firmware and full instrument for you. Tell us about your project.
- 5
Set up a deployment in about 5 minutes.
If you already know your device details, the whole flow is four steps.
- 01
Define the deployment
Enter your device type (SBD or Certus), message volume, and start and end dates in the calculator. The price you see there carries into activation unchanged.
- 02
Add your devices
Enter each 15-digit IMEI and verify it. A wrong IMEI is rejected before you pay, so you can correct it and retry.
- 03
Choose destinations (optional)
Data is always available in your dashboard and API. Add Email, DirectIP, or HTTPS destinations only if you want a copy forwarded.
- 04
Pay and create your password
Fund your account with credits through secure checkout, then sign in. Your devices appear in the dashboard.
Send your first message.
Activate first, then send one short message outdoors with a clear view of the sky. Indoors, the modem usually cannot reach a satellite.
Iridium SBD 9602 / 9603: AT commands
AT -> OK modem is awake
AT&K0 -> OK no hardware flow control (3-wire UART)
AT+SBDWB=12 -> READY you will send 12 bytes
<12 bytes><2-byte checksum>
-> 0 OK bytes loaded
AT+SBDIX -> +SBDIX: 0, 1, 0, 0, 0, 0
^ MO status 0-4 = sent; 5 or higher = retry laterIridium Certus 9704: Telemetry Station SDK
ts_bear_start(&bear); /* ENABLE high, waits for BOOTED */
for (;;) {
ts_bear_poll(&bear); /* call every few ms; never blocks */
/* TS_EVENT_READY -> queue your payload (see SDK README) */
/* TS_EVENT_MO_DELIVERED -> Iridium confirmed delivery */
}
ts_bear_shutdown(&bear); /* wait for TS_EVENT_STOPPED, then */
/* remove power */Each message appears in your dashboard shortly after Iridium delivers it. Timing depends on satellite visibility and the network.
Download your data from the dashboard.
The dashboard validates your choices and builds the download for you. No hand-written request is required.
- 01
Open your dashboard
Sign in to the account that owns the devices.
- 02
Select devices
Pick rows, or leave all clear to include the whole fleet.
- 03
Choose UTC dates and format
Set a start day, a later end day, and JSON or CSV.
- 04
Download
Open the generated link for a file, or copy it into your own workflow.
Try it with example data
Manage devices and export telemetry.
Download device data
3 devices- North Pacific Buoy300000000000001
- Coastal Weather Station300000000000002
- Research Drifter300000000000003
Dates are UTC days—
curl --fail --location "{DATA_DOWNLOAD_API_URL}/?apiKey=YOUR_API_KEY&imeis=300000000000001%2C300000000000002%2C300000000000003&start=2026-08-14T00%3A00%3A00.000Z&end=2026-08-21T00%3A00%3A00.000Z&format=json" --output telemetry.jsonAll IMEIs, telemetry values, and credentials above are fictional.
What is in each downloaded record
- IMEI and device name
- UTC timestamp
- Network metadata (SBD or Certus)
- Raw payload (hex)
- Decoded values, when a decoder is configured
JSON suits applications and CSV suits spreadsheets. Decoded fields vary by device and decoder configuration.
Forward Iridium telemetry into the systems you already operate.
Add Email, DirectIP, or HTTPS API destinations in the deployment details when you activate devices. The backend submits a normalized message and one configured destination to the outbound service for each delivery attempt.
- Destinations are available for SBD and Certus devices, with all three types: DirectIP (
directip), Email (email), and HTTPS (https). - Certus devices: Topic ID: 394 is required in your firmware. Certus messages sent on any other topic are not forwarded. This is an upstream routing requirement, not a topic check performed by the outbound service.
- Destinations are configured only in the activation deployment details, for both the guest activation flow and the dashboard activation flow.
- Custom destinations are configured in the deployment details when devices are activated. They stay fixed until the device is deactivated or its deployment end date passes. Destinations cannot be edited on an individual device.
- Each destination is 5 credits and is included in the activation quote before you pay.
- Email destinations need a valid address, DirectIP destinations need
host:port, and HTTPS destinations need an absolutehttps://URL.
SBD deployments can use Email, DirectIP, and HTTPS API destinations. The destination list is paired with the device IMEI in activation so each modem can have its own forwarding configuration.
DirectIP delivery is emitted as a binary DirectIP-compatible mobile-originated frame over TCP.
Certus deployments can also use Email, DirectIP, and HTTPS API destinations. Iridium CloudConnect is the upstream Certus path. Telemetry Station normalizes the CloudConnect message before creating the selected customer delivery.
For DirectIP, Telemetry Station builds the same DirectIP-compatible MO frame expected by the customer TCP listener. This is a Telemetry Station compatibility translation, not native Iridium Certus DirectIP.
Enter the recipient email address. Telemetry Station sends one email for each forwarded message from hello@telemetrystation.com. Allow-list that address if your mail gateway filters automated messages.
Iridium message from 300234012345678The service generates both plain-text and HTML bodies. Each body contains the normalized customer message fields and values.
hello@telemetrystation.comyou@example.comIridium message from 300234012345678iridiumDataId: 123456
imei: 300234012345678
sim:
messageId: 42
dateTime: 2026-10-05T18:30:00.000Z
endTimeOfSession: 2026-10-05T18:30:04.000Z
dataLength: 5
data: 48656c6c6f
satelliteLatitude: 32.7157
satelliteLongitude: -117.1611
satelliteRadiusKm: 12
sessionStatus: COMPLETE<h2>Telemetry Station Iridium message</h2><table>
<tr><th align="left">iridiumDataId</th><td><code>123456</code></td></tr>
<tr><th align="left">imei</th><td><code>300234012345678</code></td></tr>
<tr><th align="left">sim</th><td><code></code></td></tr>
<tr><th align="left">messageId</th><td><code>42</code></td></tr>
<tr><th align="left">dateTime</th><td><code>2026-10-05T18:30:00.000Z</code></td></tr>
<tr><th align="left">endTimeOfSession</th><td><code>2026-10-05T18:30:04.000Z</code></td></tr>
<tr><th align="left">dataLength</th><td><code>5</code></td></tr>
<tr><th align="left">data</th><td><code>48656c6c6f</code></td></tr>
<tr><th align="left">satelliteLatitude</th><td><code>32.7157</code></td></tr>
<tr><th align="left">satelliteLongitude</th><td><code>-117.1611</code></td></tr>
<tr><th align="left">satelliteRadiusKm</th><td><code>12</code></td></tr>
<tr><th align="left">sessionStatus</th><td><code>COMPLETE</code></td></tr>
</table>- Prefer the text/plain part. Every field is one line in the form `name: value`, in the same order as the HTTPS JSON body.
- Split each line on the first `: ` only. Values such as ISO timestamps can contain colons.
- A field with no value (for example sim when unavailable) is an empty string after the colon, not the word null.
- All values are plain strings. Convert iridiumDataId, dataLength, satelliteLatitude, satelliteLongitude and satelliteRadiusKm to numbers, and dateTime / endTimeOfSession to dates, yourself.
- The data field contains even-length hexadecimal, optionally prefixed with 0x, not decoded text. For example, 48656c6c6f represents the 5 bytes of Hello. Payload strings containing newlines are rejected before delivery.
- The HTML part is the same data as a two-column table. Each value is inside a <code> element and &, <, >, " and ' are HTML-escaped; unescape them before use.
- The IMEI is also in the subject line, which is a convenient routing key before opening the body.
const NUMERIC = new Set([
"iridiumDataId", "dataLength",
"satelliteLatitude", "satelliteLongitude", "satelliteRadiusKm",
]);
// `text` is the text/plain body from your mail library (e.g. mailparser).
function parseTelemetryEmail(text: string) {
const message: Record<string, string | number | null> = {};
for (const line of text.split(/\r?\n/)) {
const split = line.indexOf(": ");
const name = split === -1 ? line.replace(/:$/, "") : line.slice(0, split);
if (!name) continue;
const raw = split === -1 ? "" : line.slice(split + 2);
message[name] = raw === "" ? null : NUMERIC.has(name) ? Number(raw) : raw;
}
return message;
}Configure a reachable TCP listener as host:port, for example telemetry.example.com:5000. Telemetry Station opens a TCP connection, writes one complete binary DirectIP-compatible MO frame, then closes the connection.
The activation UI accepts host:port. The internal outbound API requires the destination URI tcp://host:port. The example address above is for illustration only; use your own public, reachable listener.
0.0.0.0.DirectIP protocol version byte followed by the total body length.
Message reference, IMEI, session status, MOMSN, MTMSN placeholder, and UTC session timestamp.
The normalized telemetry payload.
Included only when location forwarding is enabled and latitude, longitude, and radius are all available.
A frame is a 3-byte protocol header followed by one or more information elements. All multi-byte integers are big-endian.
- Read the first 3 bytes. Byte 0 must be 0x01; bytes 1-2 are the big-endian length of everything that follows.
- Read exactly that many bytes from the TCP stream. The sender closes the connection after one frame.
- Loop while bytes remain: read 1 byte for the IEI and 2 bytes (big-endian) for the element length L, then read L body bytes.
- Dispatch on the IEI and decode the body using the field tables. Skip unknown IEIs by advancing L bytes so future elements do not break your parser.
- Validate: the IMEI is 15 digits, the MO header body is 28 bytes, and the sum of (3 + L) over all elements equals the overall message length.
| Field | Bytes | Encoding | Meaning |
|---|---|---|---|
| Protocol revision | 1 | uint8 | Always 0x01. |
| Overall message length | 2 | uint16, big-endian | Number of bytes that follow this 3-byte header, i.e. the combined size of every information element including each element's own 3-byte header. |
| Field | Bytes | Encoding | Meaning |
|---|---|---|---|
| Information element identifier (IEI) | 1 | uint8 | Selects the element type: 0x01 MO header, 0x02 MO payload, 0x03 MO location. |
| Information element length | 2 | uint16, big-endian | Number of body bytes that follow this 3-byte element header. It does not include the identifier or the length field itself. |
0x01 - MO headerLength: 28 bytes (fixed). Presence: Always first.
| Field | Bytes | Encoding | Meaning |
|---|---|---|---|
| Message reference (CDR) | 4 | uint32, big-endian | The iridiumDataId value, which must fit an unsigned 32-bit integer. |
| IMEI | 15 | ASCII digits | The 15-digit device IMEI, one ASCII character per byte. |
| Session status | 1 | uint8 | 0 = session completed successfully. Non-zero values report a degraded or failed session. |
| MOMSN | 2 | uint16, big-endian | Mobile-originated message sequence number: messageId must represent an integer from 0 to 65535. Null becomes 0; out-of-range values are rejected, not wrapped. |
| MTMSN | 2 | uint16, big-endian | Mobile-terminated sequence number. Always 0 because Telemetry Station does not deliver MT messages here. |
| Time of session | 4 | uint32, big-endian | UTC session time as seconds since the Unix epoch. |
0x02 - MO payloadLength: N bytes (variable). Presence: Always present.
| Field | Bytes | Encoding | Meaning |
|---|---|---|---|
| Payload | N | raw bytes | The telemetry payload exactly as received from the device. N is the element length from the 3-byte element header. |
0x03 - MO locationLength: 11 bytes (fixed). Presence: Only when location forwarding is enabled and latitude, longitude and radius are all available.
| Field | Bytes | Encoding | Meaning |
|---|---|---|---|
| Flags | 1 | bit field | Bit 1 = 1 when latitude is south (0 = north). Bit 0 = 1 when longitude is west (0 = east). Remaining bits are 0. |
| Latitude | 3 | uint8 degrees + uint16 thousandths of a minute (big-endian) | Unsigned magnitude. Decimal degrees = degrees + thousandths / 1000 / 60. Apply the sign from the flags. |
| Longitude | 3 | uint8 degrees + uint16 thousandths of a minute (big-endian) | Same layout as latitude. |
| CEP radius | 4 | uint32, big-endian | Estimated position radius in kilometers. |
function parseDirectIp(frame: Buffer) {
if (frame[0] !== 0x01) throw new Error("Unsupported protocol revision");
const total = frame.readUInt16BE(1);
if (frame.length < 3 + total) throw new Error("Incomplete frame");
const result: Record<string, unknown> = {};
let offset = 3;
const end = 3 + total;
while (offset + 3 <= end) {
const iei = frame[offset];
const length = frame.readUInt16BE(offset + 1);
const body = frame.subarray(offset + 3, offset + 3 + length);
offset += 3 + length;
if (iei === 0x01) {
result.messageReference = body.readUInt32BE(0);
result.imei = body.toString("ascii", 4, 19);
result.sessionStatus = body[19];
result.momsn = body.readUInt16BE(20);
result.mtmsn = body.readUInt16BE(22);
result.sessionTime = new Date(body.readUInt32BE(24) * 1000);
} else if (iei === 0x02) {
result.payload = Buffer.from(body);
} else if (iei === 0x03) {
const south = (body[0] & 0b10) !== 0;
const west = (body[0] & 0b01) !== 0;
const coord = (i: number) =>
body[i] + body.readUInt16BE(i + 1) / 1000 / 60;
result.latitude = (south ? -1 : 1) * coord(1);
result.longitude = (west ? -1 : 1) * coord(4);
result.radiusKm = body.readUInt32BE(7);
}
}
return result;
}The normalized message must have a 15-digit IMEI, a messageId representing an integer from 0 to 65535 (null maps to 0), a dateTime fitting unsigned 32-bit Unix seconds, and an iridiumDataId fitting an unsigned 32-bit message reference. Out-of-range values are rejected, not wrapped. The hexadecimal payload is decoded to raw bytes for the frame. Location is included only when enabled and all required location values are available.
Configure a public https:// endpoint such as https://api.example.com/iridium. Telemetry Station sends one POST request for each forwarded message.
{
"iridiumDataId": 123456,
"imei": "300234012345678",
"sim": null,
"messageId": "42",
"dateTime": "2026-10-05T18:30:00.000Z",
"endTimeOfSession": "2026-10-05T18:30:04.000Z",
"dataLength": 5,
"data": "48656c6c6f",
"satelliteLatitude": 32.7157,
"satelliteLongitude": -117.1611,
"satelliteRadiusKm": 12,
"sessionStatus": "COMPLETE"
}This is the request sent to your customer endpoint, not the internal request to the outbound service. Delivery-control fields such as destinationId, deliveryMethod, destination, deliveryId, geoDataFlag, and attemptCount are not included. The example data is hexadecimal for "Hello": 10 hex characters representing 5 bytes.
Return any HTTP 200-299 status to accept the message. No response body or JSON schema is required; 204 No Content is sufficient. The service uses only the response status and does not interpret the body.
The HTTPS body is the serialized customer message. Date values are sent as UTC ISO 8601 strings or null. The payload is an even-length hexadecimal string, optionally prefixed with 0x; there is no separate payload-encoding field. dataLength is the decoded byte count. Null source data becomes an empty string with dataLength 0. geoDataFlag controls only the DirectIP location element; HTTPS and email retain the location fields.
iridiumDataIdTelemetry Station identifier for the normalized Iridium message.
imeiThe 15-digit Iridium device IMEI.
simSIM identifier when available for the source message.
messageIdNetwork or message sequence identifier retained with the normalized message.
dateTimeMessage or session timestamp serialized as an ISO 8601 string when available.
endTimeOfSessionEnd-of-session timestamp serialized as an ISO 8601 string when available.
dataLengthDecoded payload length in bytes, not the length of the hexadecimal string. For example, 48656c6c6f represents 5 bytes.
dataEven-length hexadecimal payload string, optionally prefixed with 0x. The source string is preserved; null source data becomes an empty string with dataLength 0. No separate encoding field is included.
satelliteLatitudeLatitude metadata when available.
satelliteLongitudeLongitude metadata when available.
satelliteRadiusKmAssociated radius value in kilometers when available.
sessionStatusIridium or normalized session status when available.
Each outbound-service call makes one transport attempt. The service does not create delivery jobs, retry, deduplicate, or persist delivery status; those responsibilities belong to the calling backend. A timeout or lost response can occur after delivery, so the caller must reconcile before retrying.
Delivery succeeds only when the SMTP transport accepts the recipient and does not report a rejected address. This does not guarantee delivery to the mailbox. The default sender is hello@telemetrystation.com, but the service deployment can override it with SMTP_FROM.
Delivery succeeds when the TCP connection is established and the complete frame is written. The service does not wait for an application-level customer acknowledgement.
Any 200–299 response is accepted. Redirects are not followed. Non-2xx status codes, timeouts, and connection errors are treated as failed delivery attempts.
The backend calls authenticated POST /api/forward with the raw message and destination fields. After successful transport completion, that internal API returns HTTP 200 with {"ok":true}. Failures return an HTTP error status and {"ok":false,"error":{"code":"...","message":"..."}}. Your customer webhook does not need to return either of these JSON bodies.
Included in the deployment quote.
Destination fees are included as deployment line items in the activation quote, before the promotion is deducted. The normal rate is 5 credits per configured destination, per device, for each UTC calendar month touched by the deployment.
The checkout summary shown at payment lists the payment-processing fee and the final total charged.
Test the destination before deployment. For DirectIP, verify the firewall and TCP listener. For HTTPS, verify TLS, JSON parsing, 2xx response behavior, and whether you need to add request authentication. For Email, verify the mailbox accepts messages from hello@telemetrystation.com.
See every credit and every charge.
You prepay with credits and charges are deducted from your balance. Two dashboard sections show exactly what happened and what comes next. All months follow UTC calendar dates.
Account projection: what is next
Pick a month to see how your balance is expected to move, based on known charges. Use it to decide when to add credits.
- Opening balance.
- Credits in your account at the start of the month.
- Credits added.
- Credits you purchased that month.
- Posted charges.
- Charges already deducted, such as activation, prorated service, and usage.
- Upcoming charges.
- Charges we already know are coming, such as monthly service and destination fees.
- Month-end balance.
- What remains after posted and upcoming charges. Lowest balance and the projected zero-balance date show how long your credits last.
Billing history: what happened
Pick a UTC month for a statement of credits and charges. Each statement can be downloaded as a PDF.
- Credits purchased.
- Service credits added to your account.
- Processing fees.
- Stripe fees apply to dollar-funded checkouts only and are shown separately. Total card payments is credits plus these fees.
- Charges posted.
- Activation fees, prorated monthly fees, message and data usage, destination fees, suspension fees, and other adjustments.
- Account register.
- Every credit and charge in the selected UTC month, one line each.
- Device charge register.
- The same charges grouped by device, so you can see what each one costs.
Both sections use the same ledger, so a charge in the projection becomes a posted charge in your statement, and the closing balance matches your current balance. Destinations cost 5 credits per destination per device per calendar month in the deployment dates.
Want to script downloads? One GET request.
Copy the URL from your dashboard export. It contains your API key, so keep it private and server-side, rotate the key if it is exposed, and treat every date and timestamp as UTC.
Query parameters
apiKeyRequiredThe API key associated with the authenticated Telemetry Station profile.
imeisRequiredOne or more 15-digit device IMEIs separated by commas. Duplicate values are removed by the dashboard builder.
startRequiredThe selected start calendar day converted to midnight UTC.
endRequiredThe selected end calendar day converted to midnight UTC. It must be later than start.
formatRequiredThe requested download representation.
Validation rules
- Every IMEI is exactly 15 digits; duplicates are removed.
- Start and end are valid UTC dates, and end is later.
- Format is JSON or CSV.
- Treat any non-successful HTTP response as a failed export.
Quick fixes for common questions.
My IMEI was rejected during activation
The device is active but no data has arrived
Messages arrive but the values look wrong
My destination is not receiving messages
My balance is running low
I need to end a deployment early or extend it
Still stuck? Contact our engineers. Signed-in customers can also use Technical support on the Account page.
What's live, and what's next.
We ship a feature when it is reliable enough to run your deployment on. Anything not yet live is labeled, and its documentation is added when it launches, so you never plan around a feature that isn't ready.
Available to every account today.
- SBD and Certus calculators
- Self-service activation in about 5 minutes
- Dashboard: map, fleet, account projection, billing history
- Data download API (JSON and CSV)
- Destinations: Email, DirectIP, HTTPS API
- Device management: suspend, resume, end dates
- Payload Optimizer
Built and in testing. They appear in your dashboard as they are enabled.
- Send messages to devices (MT)
- Saved MT messages
- Payload parsers and parsed downloads
- Open-source SDKAlpha: F169 checkout, generated codec, optional GNSS API
On the roadmap. Details are published when each one is ready.
- Analytics and alerts
- Shared data across devices (pooling)
- BEAR Module 9704In design (G1). Sales target April 2027, tentative
Terms in plain words.
- IMEI
- The modem's 15-digit ID. It is how Telemetry Station recognizes and bills each device.
- SBD
- Iridium Short Burst Data. Small messages (up to 340 bytes) from 9602 and 9603 modems.
- Certus / IMT
- Iridium's newer messaging service used by the 9704 modem, with larger messages.
- MO / MT
- Mobile-originated messages go from your device to you. Mobile-terminated messages go from you to your device.
- Payload
- The bytes your device sends. Fewer bytes per message means lower cost.
- Credits
- Prepaid balance for service. 1 credit = $1.00. Charges are deducted as they happen.
- Deployment
- A device's planned start and end dates, which set its monthly service charges.
- Destination
- An optional extra copy of each message sent to your email, DirectIP listener or HTTPS API.
- UTC
- All dates and months use Coordinated Universal Time, so every customer sees the same boundaries.
Ready to activate? Start in the calculator.
Self-service is all most teams need. If you want help with firmware, integrations, or a custom workflow, our engineers are available.