{
  "info": {
    "name": "5c SMS & Dingo Mail API",
    "_postman_id": "8f4d2a1c-3b6e-4f7a-9c0d-5e8b1a2c3d4e",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json",
    "description": "# 5c SMS & Dingo Mail API\n\nOne API for business messaging across two channels: SMS through **5c SMS** and email through **Dingo Mail**. Send and track SMS, hold two-way conversations, read inbound messages, and manage opt-outs, sender IDs and virtual numbers. Send transactional and bulk email from your own verified sending domains, with delivery status on every message. Endpoints are secure, JSON over HTTPS, and grouped in the sidebar by area.\n\n## Getting started\n\n**Step 1: Generate your API key.**\n1. Go to https://www.5centsms.com.au/dashboard/api\n2. In **API Key Management**, set a **Key Alias** to identify the key.\n3. Click **Create New API Key**.\n4. Copy the generated **Key ID** and **Key Secret**.\n\nThe same key authenticates both the 5c SMS endpoints and the Dingo Mail email endpoints.\n\n> **Important:** Store your credentials securely. The Key Secret is shown only once and cannot be retrieved again.\n\n**Step 2: Send your first SMS.**\n```bash\ncurl -X POST {{base_url_sms}}/sms \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"key-id\": \"Paste Key ID here\",\n    \"key-secret\": \"Paste Key Secret here\",\n    \"sender\": \"0404123123\",\n    \"to\": \"Paste recipient number here\",\n    \"message\": \"Hello World\"\n  }'\n```\n\n**Step 3: Send your first email.**\n```bash\ncurl -X POST {{base_url_dingo}}/email \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"key-id\": \"Paste Key ID here\",\n    \"key-secret\": \"Paste Key Secret here\",\n    \"SenderEmail\": \"news@mail.example.com\",\n    \"SenderName\": \"Example\",\n    \"Subject\": \"Hello\",\n    \"Text\": \"Hello World\",\n    \"Recipient\": \"Paste recipient email here\"\n  }'\n```\n\nEmail sends from a verified sending domain. Register one with **Create Domain** (under Email Domains) or in the dashboard, then use any address at that domain as the `SenderEmail`.\n\n## Authentication\n\nEvery request authenticates with your `key-id` and `key-secret` supplied **in the JSON request body** (set them once as the `key_id` / `key_secret` collection variables and they apply to every request here). All requests must use **HTTPS** — a plain HTTP request is rejected with `400 HTTPS Required`.\n\n## Responses & errors\n\nEvery response is JSON and carries an `error` field. The HTTP status follows from it:\n\n- **HTTP 200** — success; `error` is an empty string (`\"\"`).\n- **HTTP 400** — the request failed; the reason is in `error`.\n- **HTTP 401** — authentication failed (see the table below).\n- **HTTP 503** — the API is in maintenance; retry shortly.\n\nAn unsupported method/path combination returns `Unsupported method. Please see our API Docs`.\n\n**Authentication errors (HTTP 401):**\n\n| Error | Cause |\n| --- | --- |\n| `Failed (Invalid Key ID)` | The `key-id` is missing or not recognised. |\n| `Failed (Invalid Key Secret)` | The `key-secret` does not match the key. |\n| `Failed (Invalid API ID or Key)` | The key id/secret pair is invalid. |\n| `Failed (Invalid Username or API Key)` | Legacy credential pair is invalid. |\n\n## API hosts\n\nTwo base URLs back this collection, preset as variables:\n\n- `{{base_url_sms}}` (5c SMS): SMS, Conversations, Account, Logins, Sender IDs, Virtual Numbers.\n- `{{base_url_dingo}}` (Dingo Mail): Email and Email Domains.\n\n## Pagination\n\nList endpoints return results **newest-first, one page at a time**. To fetch the next page, pass the **last item's `id`** as the `after` query parameter. `after` is a 24-character hex cursor (a MongoDB ObjectId), **not** an offset or page number.\n\nEach list response includes `next_page` — a ready-to-use relative path already containing the `after` value for the following page — and `count` (items on the current page). Follow `next_page` until it is absent or empty.\n\nPage sizes are fixed per endpoint:\n\n| Endpoint | Page size |\n| --- | --- |\n| List Sent SMS | 20 |\n| List Emails | 20 (override with `limit`, 1–100) |\n| List Inbound Messages | 50 |\n| List Opt-outs | 1000 |\n\nA malformed `after` returns HTTP 400 — `Failed (Invalid Page)` on the SMS / Inbox / Opt-out endpoints, `Invalid after parameter` on List Emails (which also rejects a bad `limit` with `Invalid limit parameter`). Logins, Sender IDs, Virtual Numbers, and Email Domains return full unpaginated lists.\n\n## Message status codes\n\nThe `status` field on a message maps to a human-readable `status_text`. For the full list of status codes and their meanings, see [Message Status List](https://www.5centsms.com.au/web/status).\n\n## Data retention\n\nMessage data is retained for 365 days from the date of processing, after which it is permanently purged. Contact support if you require a different retention timeframe.\n\n## Using Postman\n\nDownload this collection and import it into Postman (**Import → File**, or paste the raw link). Set the `key_id` and `key_secret` collection variables once under the collection's **Variables** tab, then open any request and click **Send**. Each request's **Documentation** pane (the right-hand panel) shows its parameters, response fields, and errors."
  },
  "variable": [
    {
      "key": "base_url_sms",
      "value": "https://www.5centsms.com.au/api/v5"
    },
    {
      "key": "base_url_dingo",
      "value": "https://api.dingomail.com.au/api/v5"
    },
    {
      "key": "key_id",
      "value": ""
    },
    {
      "key": "key_secret",
      "value": ""
    }
  ],
  "item": [
    {
      "name": "SMS",
      "item": [
        {
          "name": "Send SMS",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url_sms}}/sms",
              "host": [
                "{{base_url_sms}}"
              ],
              "path": [
                "sms"
              ]
            },
            "description": "Send a single SMS to one or more recipients.\n\n#### Request body parameters\n| Field | Type | Required | Description |\n| --- | --- | --- | --- |\n| `sender` | string | Yes | Sender ID. Max 13 characters; max 11 if alphanumeric ([0-9a-zA-Z] only). |\n| `to` | string | Yes | Recipient number(s), comma-separated. International or 04 format. |\n| `message` | string | Yes | Message content. Hex-encoded UTF-16 when `unicode` is true. |\n| `test` | boolean | No | Simulate the send — no SMS delivered, no credits charged. Default false. |\n| `unicode` | boolean | No | Send as UTF-16; `message` must be hex-encoded. Must be enabled on your account. Default false. |\n| `schedule` | integer | No | UNIX epoch seconds for future delivery, max 356 days ahead. |\n\n#### Response fields\n| Field | Type | Description |\n| --- | --- | --- |\n| `error` | string | Empty on success. |\n| `messages` | array | One entry per recipient. |\n| `messages[].destination` | string | Recipient number. |\n| `messages[].id` | string | Message id. |\n| `messages[].status` | integer | Status code (see Introduction). |\n| `messages[].status_text` | string | Human-readable status. |\n| `messages[].credits` | number | Credits charged. |\n| `messages[].schedule` | integer | Scheduled epoch — only when the message is scheduled (status 1005). |\n\n#### Errors\n| Error | HTTP | Cause |\n| --- | --- | --- |\n| `Failed (Invalid Sender ID)` | 400 | `sender` missing, >13 chars, or alphanumeric >11 chars / invalid characters. |\n| `Failed (Invalid Destination)` | 400 | `to` missing. |\n| `Failed (Invalid Message)` | 400 | `message` missing. |\n\n#### Notes\n- With `unicode`, emoji and non-GSM text are supported; e.g. `Testing🎉` hex-encodes to `00540065007300740069006E0067D83CDF89`.\n- Use `test: true` to verify integration without sending or charging.",
            "body": {
              "mode": "raw",
              "options": {
                "raw": {
                  "language": "json"
                }
              },
              "raw": "{\n  \"key-id\": \"{{key_id}}\",\n  \"key-secret\": \"{{key_secret}}\",\n  \"sender\": \"0404123123\",\n  \"to\": \"0412333555\",\n  \"message\": \"Hello World\",\n  \"test\": false,\n  \"unicode\": false,\n  \"schedule\": 0\n}"
            }
          },
          "response": [
            {
              "name": "200 OK",
              "code": 200,
              "status": "OK",
              "body": "{\n  \"error\": \"\",\n  \"messages\": [\n    {\n      \"destination\": \"0412333555\",\n      \"id\": \"683554c596937cc4b90f5cf7\",\n      \"status\": 1011,\n      \"status_text\": \"Sending...\",\n      \"credits\": 1\n    }\n  ]\n}"
            },
            {
              "name": "400 Bad Request",
              "code": 400,
              "status": "Bad Request",
              "body": "{\n  \"error\": \"Failed (Invalid Sender ID)\"\n}"
            },
            {
              "name": "401 Unauthorized",
              "code": 401,
              "status": "Unauthorized",
              "body": "{\n  \"error\": \"Failed (Invalid API ID or Key)\"\n}"
            }
          ]
        },
        {
          "name": "List Sent SMS",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url_sms}}/sms",
              "host": [
                "{{base_url_sms}}"
              ],
              "path": [
                "sms"
              ],
              "query": [
                {
                  "key": "after",
                  "value": "",
                  "description": "24-hex cursor — the `id` of the last message on the previous page.",
                  "disabled": true
                }
              ]
            },
            "description": "List your sent messages, newest first (20 per page).\n\n#### Response fields\n| Field | Type | Description |\n| --- | --- | --- |\n| `error` | string | Empty on success. |\n| `messages` | array | Sent messages this page. |\n| `messages[].destination` | string | Recipient number. |\n| `messages[].id` | string | Message id. |\n| `messages[].status` | integer | Status code (see Introduction). |\n| `messages[].status_text` | string | Human-readable status. |\n| `messages[].message_text` | string | Message content. |\n| `messages[].credits` | number | Credits charged. |\n| `messages[].send_timestamp` | integer | Epoch seconds when sent. |\n| `messages[].delivery_timestamp` | integer | Epoch seconds when delivery confirmed. |\n| `messages[].delivery_network` | string | Delivering network, when known. |\n| `next_page` | string | Relative path for the next page. |\n| `count` | integer | Messages on this page. |\n\n#### Errors\n| Error | HTTP | Cause |\n| --- | --- | --- |\n| `Failed (Invalid Page)` | 400 | `after` is not a valid 24-hex cursor. |\n\n#### Notes\n- See **Pagination** in the Introduction for the `after` cursor convention.",
            "body": {
              "mode": "raw",
              "options": {
                "raw": {
                  "language": "json"
                }
              },
              "raw": "{\n  \"key-id\": \"{{key_id}}\",\n  \"key-secret\": \"{{key_secret}}\"\n}"
            }
          },
          "response": [
            {
              "name": "200 OK",
              "code": 200,
              "status": "OK",
              "body": "{\n  \"error\": \"\",\n  \"messages\": [\n    {\n      \"destination\": \"0412333555\",\n      \"id\": \"683554c596937cc4b90f5cf7\",\n      \"status\": 1002,\n      \"status_text\": \"Sent (Delivery Confirmed)\",\n      \"message_text\": \"Hello World\",\n      \"credits\": 1,\n      \"send_timestamp\": 1717000000,\n      \"delivery_timestamp\": 1717000020,\n      \"delivery_network\": \"Telstra\"\n    }\n  ],\n  \"next_page\": \"/api/v5/sms?after=683554c596937cc4b90f5cf7\",\n  \"count\": 1\n}"
            },
            {
              "name": "401 Unauthorized",
              "code": 401,
              "status": "Unauthorized",
              "body": "{\n  \"error\": \"Failed (Invalid API ID or Key)\"\n}"
            }
          ]
        },
        {
          "name": "Get SMS Status",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url_sms}}/sms/:id",
              "host": [
                "{{base_url_sms}}"
              ],
              "path": [
                "sms",
                ":id"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "",
                  "description": "Message id."
                }
              ]
            },
            "description": "Fetch the current status and details of a single sent message.\n\n#### Response fields\n| Field | Type | Description |\n| --- | --- | --- |\n| `error` | string | Empty on success. |\n| `message` | object | The message (same fields as List Sent SMS). |\n\n#### Errors\n| Error | HTTP | Cause |\n| --- | --- | --- |\n| `Failed (Unauthorised)` | 400 | Message not found, or not owned by this account. |",
            "body": {
              "mode": "raw",
              "options": {
                "raw": {
                  "language": "json"
                }
              },
              "raw": "{\n  \"key-id\": \"{{key_id}}\",\n  \"key-secret\": \"{{key_secret}}\"\n}"
            }
          },
          "response": [
            {
              "name": "200 OK",
              "code": 200,
              "status": "OK",
              "body": "{\n  \"error\": \"\",\n  \"message\": {\n    \"destination\": \"0412333555\",\n    \"id\": \"683554c596937cc4b90f5cf7\",\n    \"status\": 1002,\n    \"status_text\": \"Sent (Delivery Confirmed)\",\n    \"message_text\": \"Hello World\",\n    \"credits\": 1,\n    \"send_timestamp\": 1717000000,\n    \"delivery_timestamp\": 1717000020,\n    \"delivery_network\": \"Telstra\"\n  }\n}"
            },
            {
              "name": "401 Unauthorized",
              "code": 401,
              "status": "Unauthorized",
              "body": "{\n  \"error\": \"Failed (Invalid API ID or Key)\"\n}"
            }
          ]
        },
        {
          "name": "Cancel / Delete SMS",
          "request": {
            "method": "DELETE",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url_sms}}/sms/:id",
              "host": [
                "{{base_url_sms}}"
              ],
              "path": [
                "sms",
                ":id"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "",
                  "description": "Message id."
                }
              ]
            },
            "description": "Cancel a still-scheduled message (status 1005), or delete a sent message's record.\n\n#### Response fields\n| Field | Type | Description |\n| --- | --- | --- |\n| `error` | string | Empty on success. |\n\n#### Errors\n| Error | HTTP | Cause |\n| --- | --- | --- |\n| `Failed (Unauthorised)` | 400 | Message not found, or not owned by this account. |",
            "body": {
              "mode": "raw",
              "options": {
                "raw": {
                  "language": "json"
                }
              },
              "raw": "{\n  \"key-id\": \"{{key_id}}\",\n  \"key-secret\": \"{{key_secret}}\"\n}"
            }
          },
          "response": [
            {
              "name": "200 OK",
              "code": 200,
              "status": "OK",
              "body": "{\n  \"error\": \"\"\n}"
            },
            {
              "name": "401 Unauthorized",
              "code": 401,
              "status": "Unauthorized",
              "body": "{\n  \"error\": \"Failed (Invalid API ID or Key)\"\n}"
            }
          ]
        },
        {
          "name": "List Inbound Messages",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url_sms}}/inbox",
              "host": [
                "{{base_url_sms}}"
              ],
              "path": [
                "inbox"
              ],
              "query": [
                {
                  "key": "after",
                  "value": "",
                  "description": "24-hex cursor — the `id` of the last message on the previous page.",
                  "disabled": true
                }
              ]
            },
            "description": "List inbound (received) messages, newest first (50 per page).\n\n#### Response fields\n| Field | Type | Description |\n| --- | --- | --- |\n| `error` | string | Empty on success. |\n| `messages` | array | Inbound messages this page. |\n| `messages[].id` | string | Inbound message id. |\n| `messages[].to` | string | Your number that received it. |\n| `messages[].from` | string | Sender number. |\n| `messages[].message` | string | Message content. |\n| `messages[].date` | integer | Epoch seconds received. |\n| `messages[].contact_name` | string | Matched contact name, when known. |\n| `next_page` | string | Relative path for the next page. |\n| `count` | integer | Messages on this page. |\n\n#### Errors\n| Error | HTTP | Cause |\n| --- | --- | --- |\n| `Failed (Invalid Page)` | 400 | `after` is not a valid 24-hex cursor. |",
            "body": {
              "mode": "raw",
              "options": {
                "raw": {
                  "language": "json"
                }
              },
              "raw": "{\n  \"key-id\": \"{{key_id}}\",\n  \"key-secret\": \"{{key_secret}}\"\n}"
            }
          },
          "response": [
            {
              "name": "200 OK",
              "code": 200,
              "status": "OK",
              "body": "{\n  \"error\": \"\",\n  \"messages\": [\n    {\n      \"id\": \"683554c596937cc4b90f5cf7\",\n      \"to\": \"0400000000\",\n      \"from\": \"0412333555\",\n      \"message\": \"STOP\",\n      \"date\": 1717000000,\n      \"contact_name\": \"Jane\"\n    }\n  ],\n  \"next_page\": \"/api/v5/inbox?after=683554c596937cc4b90f5cf7\",\n  \"count\": 1\n}"
            },
            {
              "name": "401 Unauthorized",
              "code": 401,
              "status": "Unauthorized",
              "body": "{\n  \"error\": \"Failed (Invalid API ID or Key)\"\n}"
            }
          ]
        },
        {
          "name": "Delete Inbound Message",
          "request": {
            "method": "DELETE",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url_sms}}/inbox/:id",
              "host": [
                "{{base_url_sms}}"
              ],
              "path": [
                "inbox",
                ":id"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "",
                  "description": "Inbound message id."
                }
              ]
            },
            "description": "Delete a single inbound message record.\n\n#### Response fields\n| Field | Type | Description |\n| --- | --- | --- |\n| `error` | string | Empty on success. |\n\n#### Errors\n| Error | HTTP | Cause |\n| --- | --- | --- |\n| `Failed (Unauthorised)` | 400 | Message not found, or not owned by this account. |",
            "body": {
              "mode": "raw",
              "options": {
                "raw": {
                  "language": "json"
                }
              },
              "raw": "{\n  \"key-id\": \"{{key_id}}\",\n  \"key-secret\": \"{{key_secret}}\"\n}"
            }
          },
          "response": [
            {
              "name": "200 OK",
              "code": 200,
              "status": "OK",
              "body": "{\n  \"error\": \"\"\n}"
            },
            {
              "name": "401 Unauthorized",
              "code": 401,
              "status": "Unauthorized",
              "body": "{\n  \"error\": \"Failed (Invalid API ID or Key)\"\n}"
            }
          ]
        },
        {
          "name": "List Opt-outs",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url_sms}}/optouts",
              "host": [
                "{{base_url_sms}}"
              ],
              "path": [
                "optouts"
              ],
              "query": [
                {
                  "key": "after",
                  "value": "",
                  "description": "24-hex cursor — the `id` of the last record on the previous page.",
                  "disabled": true
                }
              ]
            },
            "description": "List numbers that have opted out, newest first (1000 per page).\n\n#### Response fields\n| Field | Type | Description |\n| --- | --- | --- |\n| `error` | string | Empty on success. |\n| `numbers` | array | Opted-out numbers this page. |\n| `numbers[].id` | string | Opt-out record id. |\n| `numbers[].number` | string | Opted-out number. |\n| `numbers[].timestamp` | integer | Epoch seconds of opt-out. |\n| `count` | integer | Records on this page. |\n| `next_page` | string | Relative path for the next page. |\n\n#### Errors\n| Error | HTTP | Cause |\n| --- | --- | --- |\n| `Failed (Invalid Page)` | 400 | `after` is not a valid 24-hex cursor. |",
            "body": {
              "mode": "raw",
              "options": {
                "raw": {
                  "language": "json"
                }
              },
              "raw": "{\n  \"key-id\": \"{{key_id}}\",\n  \"key-secret\": \"{{key_secret}}\"\n}"
            }
          },
          "response": [
            {
              "name": "200 OK",
              "code": 200,
              "status": "OK",
              "body": "{\n  \"error\": \"\",\n  \"numbers\": [\n    {\n      \"id\": \"683554c596937cc4b90f5cf7\",\n      \"number\": \"0412333555\",\n      \"timestamp\": 1717000000\n    }\n  ],\n  \"count\": 1\n}"
            },
            {
              "name": "401 Unauthorized",
              "code": 401,
              "status": "Unauthorized",
              "body": "{\n  \"error\": \"Failed (Invalid API ID or Key)\"\n}"
            }
          ]
        },
        {
          "name": "Delete Opt-out",
          "request": {
            "method": "DELETE",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url_sms}}/optouts/:number",
              "host": [
                "{{base_url_sms}}"
              ],
              "path": [
                "optouts",
                ":number"
              ],
              "variable": [
                {
                  "key": "number",
                  "value": "",
                  "description": "The opted-out number to remove."
                }
              ]
            },
            "description": "Remove a number from your opt-out list.\n\n#### Response fields\n| Field | Type | Description |\n| --- | --- | --- |\n| `error` | string | Empty on success. |\n| `message` | string | Confirmation message. |",
            "body": {
              "mode": "raw",
              "options": {
                "raw": {
                  "language": "json"
                }
              },
              "raw": "{\n  \"key-id\": \"{{key_id}}\",\n  \"key-secret\": \"{{key_secret}}\"\n}"
            }
          },
          "response": [
            {
              "name": "200 OK",
              "code": 200,
              "status": "OK",
              "body": "{\n  \"error\": \"\",\n  \"message\": \"Number removed.\"\n}"
            },
            {
              "name": "401 Unauthorized",
              "code": 401,
              "status": "Unauthorized",
              "body": "{\n  \"error\": \"Failed (Invalid API ID or Key)\"\n}"
            }
          ]
        }
      ]
    },
    {
      "name": "Conversations",
      "item": [
        {
          "name": "List Conversations",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url_sms}}/conversations?per_page=50",
              "host": [
                "{{base_url_sms}}"
              ],
              "path": [
                "conversations"
              ],
              "query": [
                {
                  "key": "before",
                  "value": "",
                  "disabled": true,
                  "description": "Cursor from a previous response's next_cursor. Omit for the first page."
                },
                {
                  "key": "per_page",
                  "value": "50",
                  "description": "Page size, max 200. Default 50."
                },
                {
                  "key": "q",
                  "value": "",
                  "disabled": true,
                  "description": "Digit search on the contact number."
                },
                {
                  "key": "replies",
                  "value": "1",
                  "disabled": true,
                  "description": "Set to 1 to return only conversations that have an inbound reply."
                },
                {
                  "key": "unread",
                  "value": "1",
                  "disabled": true,
                  "description": "Set to 1 to return only unread conversations."
                }
              ]
            },
            "body": {
              "mode": "raw",
              "options": {
                "raw": {
                  "language": "json"
                }
              },
              "raw": "{\n  \"key-id\": \"{{key_id}}\",\n  \"key-secret\": \"{{key_secret}}\"\n}"
            },
            "description": "List the account's two-way SMS conversations, newest activity first, cursor-paginated. Requires Conversations (threads) enabled and at least one virtual mobile number (VMN).\n\n#### Response fields\n| Field | Type | Description |\n| --- | --- | --- |\n| `error` | string | Empty on success. |\n| `conversations` | array | One entry per conversation, newest activity first. |\n| `conversations[].id` | string | Conversation id. |\n| `conversations[].remote_number` | string | Contact number, normalised to `61` international form. |\n| `conversations[].contact_name` | string | Matched contact name, or empty. |\n| `conversations[].last_message_at` | integer | Epoch seconds of the latest message. |\n| `conversations[].unread` | boolean | Unread flag. |\n| `conversations[].has_inbound` | boolean | True once the contact has replied. |\n| `conversations[].last_local_number` | string | The VMN this thread is on. |\n| `conversations[].created_at` | integer | Epoch seconds the conversation began. |\n| `next_cursor` | string or null | Pass as `before` for the next page; null on the last page. |\n| `count` | integer | Conversations on this page. |\n\n#### Errors\n| Error | HTTP | Cause |\n| --- | --- | --- |\n| `Conversations are not enabled for this account. Enable Conversations in your 5cSMS dashboard settings, or contact support to turn on two-way messaging.` | 400 | Account lacks the `ENABLE_THREADS` flag. Response also carries `error_code: \"threads_disabled\"`. |\n| `Conversations require a dedicated virtual mobile number (VMN). Add a VMN in your 5cSMS dashboard under Virtual Numbers, then inbound replies will thread automatically.` | 400 | Threads on but the account has no VMN. Response also carries `error_code: \"no_vmn\"`. |\n| `Failed (Method Not Supported)` | 400 | A POST or DELETE was sent to any `/conversations` route. The endpoint is read-only. |\n\n#### Notes\n- Gate failures return an extra `error_code` field (`threads_disabled` or `no_vmn`) so an integrator can branch programmatically.\n- Follow `next_cursor` (passed back as the `before` parameter) until it is null.\n- `q` matches digits in the remote number; `replies=1` and `unread=1` are independent filters.\n- To send, use `POST /api/v5/sms`. Replies thread into the conversation automatically."
          },
          "response": [
            {
              "name": "200 OK",
              "code": 200,
              "status": "OK",
              "body": "{\n  \"error\": \"\",\n  \"conversations\": [\n    {\n      \"id\": \"66b0a1c2d3e4f5a6b7c8d9e0\",\n      \"remote_number\": \"61412345678\",\n      \"contact_name\": \"Jane Smith\",\n      \"last_message_at\": 1749600120,\n      \"unread\": true,\n      \"has_inbound\": true,\n      \"last_local_number\": \"61480000000\",\n      \"created_at\": 1749000000\n    }\n  ],\n  \"next_cursor\": \"1749600120_66b0a1c2d3e4f5a6b7c8d9e0\",\n  \"count\": 1\n}"
            },
            {
              "name": "400 Bad Request",
              "code": 400,
              "status": "Bad Request",
              "body": "{\n  \"error\": \"Conversations are not enabled for this account. Enable Conversations in your 5cSMS dashboard settings, or contact support to turn on two-way messaging.\",\n  \"error_code\": \"threads_disabled\"\n}"
            },
            {
              "name": "401 Unauthorized",
              "code": 401,
              "status": "Unauthorized",
              "body": "{\n  \"error\": \"Failed (Invalid API ID or Key)\"\n}"
            }
          ]
        },
        {
          "name": "Resolve Conversation by Number",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url_sms}}/conversations?number=0412345678",
              "host": [
                "{{base_url_sms}}"
              ],
              "path": [
                "conversations"
              ],
              "query": [
                {
                  "key": "number",
                  "value": "0412345678",
                  "description": "Required. Recipient MSISDN in 04..., +61..., or 61... form; normalised to 61 international form."
                }
              ]
            },
            "body": {
              "mode": "raw",
              "options": {
                "raw": {
                  "language": "json"
                }
              },
              "raw": "{\n  \"key-id\": \"{{key_id}}\",\n  \"key-secret\": \"{{key_secret}}\"\n}"
            },
            "description": "Resolve a single conversation by the remote phone number. The number is normalised to `61` international form, so `04...`, `+61...`, and `61...` inputs all resolve.\n\n#### Response fields\n| Field | Type | Description |\n| --- | --- | --- |\n| `error` | string | Empty on success. |\n| `conversation` | object or null | The matching conversation summary (same fields as a List entry, plus `contact_name`), or `null` when the number has no thread. |\n\n#### Errors\n| Error | HTTP | Cause |\n| --- | --- | --- |\n| `Conversations are not enabled for this account. Enable Conversations in your 5cSMS dashboard settings, or contact support to turn on two-way messaging.` | 400 | Account lacks the `ENABLE_THREADS` flag. Response also carries `error_code: \"threads_disabled\"`. |\n| `Conversations require a dedicated virtual mobile number (VMN). Add a VMN in your 5cSMS dashboard under Virtual Numbers, then inbound replies will thread automatically.` | 400 | Threads on but the account has no VMN. Response also carries `error_code: \"no_vmn\"`. |\n\n#### Notes\n- A number with no conversation returns `{\"error\": \"\", \"conversation\": null}`. This is a success, not an error.\n- Gate failures return an extra `error_code` field (`threads_disabled` or `no_vmn`)."
          },
          "response": [
            {
              "name": "200 OK (resolved)",
              "code": 200,
              "status": "OK",
              "body": "{\n  \"error\": \"\",\n  \"conversation\": {\n    \"id\": \"66b0a1c2d3e4f5a6b7c8d9e0\",\n    \"remote_number\": \"61412345678\",\n    \"contact_name\": \"Jane Smith\",\n    \"last_message_at\": 1749600120,\n    \"unread\": true,\n    \"has_inbound\": true,\n    \"last_local_number\": \"61480000000\",\n    \"created_at\": 1749000000\n  }\n}"
            },
            {
              "name": "200 OK (no thread)",
              "code": 200,
              "status": "OK",
              "body": "{\n  \"error\": \"\",\n  \"conversation\": null\n}"
            },
            {
              "name": "401 Unauthorized",
              "code": 401,
              "status": "Unauthorized",
              "body": "{\n  \"error\": \"Failed (Invalid API ID or Key)\"\n}"
            }
          ]
        },
        {
          "name": "Get Conversation Messages",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url_sms}}/conversations/:id",
              "host": [
                "{{base_url_sms}}"
              ],
              "path": [
                "conversations",
                ":id"
              ],
              "query": [
                {
                  "key": "limit",
                  "value": "50",
                  "disabled": true,
                  "description": "Page size, 1 to 100. Default 50."
                }
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "66b0a1c2d3e4f5a6b7c8d9e0",
                  "description": "Conversation id."
                }
              ]
            },
            "body": {
              "mode": "raw",
              "options": {
                "raw": {
                  "language": "json"
                }
              },
              "raw": "{\n  \"key-id\": \"{{key_id}}\",\n  \"key-secret\": \"{{key_secret}}\"\n}"
            },
            "description": "Fetch the conversation summary plus the most recent page of messages (oldest to newest within the page). Opening a conversation marks it read.\n\n#### Response fields\n| Field | Type | Description |\n| --- | --- | --- |\n| `error` | string | Empty on success. |\n| `conversation` | object | Conversation summary, including `contact_name`. |\n| `messages` | array | Messages, oldest to newest within the page. |\n| `messages[].id` | string | Message id. |\n| `messages[].message` | string | Message text. |\n| `messages[].timestamp` | integer | Epoch seconds. |\n| `messages[].type` | string | `MT` (sent) or `MO` (received). |\n| `messages[].status` | integer or null | Delivery status code (MT only). See the message status table in the Introduction. |\n| `messages[].status_text` | string | Human-readable status, e.g. \"Delivered\" (MT only). |\n| `messages[].scheduled` | boolean | Present and true when the message is scheduled (MT only). |\n| `messages[].cancelled` | boolean | Present and true when the message was cancelled (MT only). |\n| `messages[].cancellable` | boolean | Present and true when the message can still be cancelled (MT only). |\n| `messages[].images` | array | Image URLs (MMS only). |\n| `has_more` | boolean | True when older messages remain (page back with `action=older`). |\n| `oldest_mo_ts` | integer | Oldest received-message watermark on this page (use as `before_mo`). |\n| `oldest_mt_ts` | integer | Oldest sent-message watermark on this page (use as `before_mt`). |\n| `newest_mo_ts` | integer | Newest received-message watermark (use as `since_mo` when polling). |\n| `newest_mt_ts` | integer | Newest sent-message watermark (use as `since_mt` when polling). |\n\n#### Errors\n| Error | HTTP | Cause |\n| --- | --- | --- |\n| `Conversations are not enabled for this account. Enable Conversations in your 5cSMS dashboard settings, or contact support to turn on two-way messaging.` | 400 | Account lacks the `ENABLE_THREADS` flag. Response also carries `error_code: \"threads_disabled\"`. |\n| `Conversations require a dedicated virtual mobile number (VMN). Add a VMN in your 5cSMS dashboard under Virtual Numbers, then inbound replies will thread automatically.` | 400 | Threads on but the account has no VMN. Response also carries `error_code: \"no_vmn\"`. |\n| `Failed (Conversation Not Found)` | 400 | The `id` was not found or is not owned by this account. |\n\n#### Notes\n- Side effect: opening a conversation marks it read (`unread` becomes false).\n- Page back through history with the **Page Older Messages** request, and fetch new messages with the **Poll Conversation** request.\n- To send a reply, use `POST /api/v5/sms`. Replies thread into the conversation automatically."
          },
          "response": [
            {
              "name": "200 OK",
              "code": 200,
              "status": "OK",
              "body": "{\n  \"error\": \"\",\n  \"conversation\": {\n    \"id\": \"66b0a1c2d3e4f5a6b7c8d9e0\",\n    \"remote_number\": \"61412345678\",\n    \"contact_name\": \"Jane Smith\",\n    \"last_message_at\": 1749600120,\n    \"unread\": false,\n    \"has_inbound\": true,\n    \"last_local_number\": \"61480000000\",\n    \"created_at\": 1749000000\n  },\n  \"messages\": [\n    {\n      \"id\": \"66a0a1c2d3e4f5a6b7c8d9e0\",\n      \"message\": \"Your booking is confirmed\",\n      \"timestamp\": 1749600060,\n      \"type\": \"MT\",\n      \"status\": 1002,\n      \"status_text\": \"Sent (Delivery Confirmed)\"\n    },\n    {\n      \"id\": \"66a1a1c2d3e4f5a6b7c8d9e0\",\n      \"message\": \"Yes please\",\n      \"timestamp\": 1749600120,\n      \"type\": \"MO\"\n    }\n  ],\n  \"has_more\": false,\n  \"oldest_mo_ts\": 1749600120,\n  \"oldest_mt_ts\": 1749600060,\n  \"newest_mo_ts\": 1749600120,\n  \"newest_mt_ts\": 1749600060\n}"
            },
            {
              "name": "400 Bad Request",
              "code": 400,
              "status": "Bad Request",
              "body": "{\n  \"error\": \"Failed (Conversation Not Found)\"\n}"
            },
            {
              "name": "401 Unauthorized",
              "code": 401,
              "status": "Unauthorized",
              "body": "{\n  \"error\": \"Failed (Invalid API ID or Key)\"\n}"
            }
          ]
        },
        {
          "name": "Poll Conversation",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url_sms}}/conversations/:id?action=poll&since_mo=1749600120&since_mt=1749600060",
              "host": [
                "{{base_url_sms}}"
              ],
              "path": [
                "conversations",
                ":id"
              ],
              "query": [
                {
                  "key": "action",
                  "value": "poll",
                  "description": "Required. Set to poll."
                },
                {
                  "key": "since_mo",
                  "value": "1749600120",
                  "description": "Required. Received-message watermark (epoch seconds); use the prior response's newest_mo_ts."
                },
                {
                  "key": "since_mt",
                  "value": "1749600060",
                  "description": "Required. Sent-message watermark (epoch seconds); use the prior response's newest_mt_ts."
                }
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "66b0a1c2d3e4f5a6b7c8d9e0",
                  "description": "Conversation id."
                }
              ]
            },
            "body": {
              "mode": "raw",
              "options": {
                "raw": {
                  "language": "json"
                }
              },
              "raw": "{\n  \"key-id\": \"{{key_id}}\",\n  \"key-secret\": \"{{key_secret}}\"\n}"
            },
            "description": "Return only messages newer than the supplied watermarks. Use the `newest_mo_ts` and `newest_mt_ts` from the initial load (or the previous poll) as `since_mo` and `since_mt`. A poll that returns new messages marks the conversation read.\n\n#### Response fields\n| Field | Type | Description |\n| --- | --- | --- |\n| `error` | string | Empty on success. |\n| `messages` | array | Only messages newer than the watermarks (same message shape as **Get Conversation Messages**). |\n| `now` | integer | Server epoch seconds, for poll cadence. |\n\n#### Errors\n| Error | HTTP | Cause |\n| --- | --- | --- |\n| `Conversations are not enabled for this account. Enable Conversations in your 5cSMS dashboard settings, or contact support to turn on two-way messaging.` | 400 | Account lacks the `ENABLE_THREADS` flag. Response also carries `error_code: \"threads_disabled\"`. |\n| `Conversations require a dedicated virtual mobile number (VMN). Add a VMN in your 5cSMS dashboard under Virtual Numbers, then inbound replies will thread automatically.` | 400 | Threads on but the account has no VMN. Response also carries `error_code: \"no_vmn\"`. |\n| `Failed (Conversation Not Found)` | 400 | The `id` was not found or is not owned by this account. |\n| `Failed (Invalid Watermark)` | 400 | `since_mo` or `since_mt` is missing or not a digit string. |\n\n#### Notes\n- Side effect: a poll that returns one or more new messages marks the conversation read.\n- `since_mo` and `since_mt` must be integer epoch-second values."
          },
          "response": [
            {
              "name": "200 OK",
              "code": 200,
              "status": "OK",
              "body": "{\n  \"error\": \"\",\n  \"messages\": [\n    {\n      \"id\": \"66a2a1c2d3e4f5a6b7c8d9e0\",\n      \"message\": \"On my way\",\n      \"timestamp\": 1749600300,\n      \"type\": \"MO\"\n    }\n  ],\n  \"now\": 1749600305\n}"
            },
            {
              "name": "401 Unauthorized",
              "code": 401,
              "status": "Unauthorized",
              "body": "{\n  \"error\": \"Failed (Invalid API ID or Key)\"\n}"
            }
          ]
        },
        {
          "name": "Page Older Messages",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url_sms}}/conversations/:id?action=older&before_mo=1749600120&before_mt=1749600060",
              "host": [
                "{{base_url_sms}}"
              ],
              "path": [
                "conversations",
                ":id"
              ],
              "query": [
                {
                  "key": "action",
                  "value": "older",
                  "description": "Required. Set to older."
                },
                {
                  "key": "before_mo",
                  "value": "1749600120",
                  "description": "Required. Use the prior response's oldest_mo_ts."
                },
                {
                  "key": "before_mt",
                  "value": "1749600060",
                  "description": "Required. Use the prior response's oldest_mt_ts."
                },
                {
                  "key": "limit",
                  "value": "50",
                  "disabled": true,
                  "description": "Page size, 1 to 100. Default 50."
                }
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "66b0a1c2d3e4f5a6b7c8d9e0",
                  "description": "Conversation id."
                }
              ]
            },
            "body": {
              "mode": "raw",
              "options": {
                "raw": {
                  "language": "json"
                }
              },
              "raw": "{\n  \"key-id\": \"{{key_id}}\",\n  \"key-secret\": \"{{key_secret}}\"\n}"
            },
            "description": "Page back through history older than the supplied cursors. Use the `oldest_mo_ts` and `oldest_mt_ts` from the previous page as `before_mo` and `before_mt`.\n\n#### Response fields\n| Field | Type | Description |\n| --- | --- | --- |\n| `error` | string | Empty on success. |\n| `messages` | array | The older page (same message shape as **Get Conversation Messages**). |\n| `has_more` | boolean | True when still-older messages remain. |\n| `oldest_mo_ts` | integer | Oldest received-message watermark on this page (use as the next `before_mo`). |\n| `oldest_mt_ts` | integer | Oldest sent-message watermark on this page (use as the next `before_mt`). |\n\n#### Errors\n| Error | HTTP | Cause |\n| --- | --- | --- |\n| `Conversations are not enabled for this account. Enable Conversations in your 5cSMS dashboard settings, or contact support to turn on two-way messaging.` | 400 | Account lacks the `ENABLE_THREADS` flag. Response also carries `error_code: \"threads_disabled\"`. |\n| `Conversations require a dedicated virtual mobile number (VMN). Add a VMN in your 5cSMS dashboard under Virtual Numbers, then inbound replies will thread automatically.` | 400 | Threads on but the account has no VMN. Response also carries `error_code: \"no_vmn\"`. |\n| `Failed (Conversation Not Found)` | 400 | The `id` was not found or is not owned by this account. |\n| `Failed (Invalid Watermark)` | 400 | `before_mo` or `before_mt` is missing or not a digit string. |\n\n#### Notes\n- This request does not mark the conversation read (unlike the initial load and a poll that returns new messages)."
          },
          "response": [
            {
              "name": "200 OK",
              "code": 200,
              "status": "OK",
              "body": "{\n  \"error\": \"\",\n  \"messages\": [\n    {\n      \"id\": \"669f0a1c2d3e4f5a6b7c8d90\",\n      \"message\": \"Earlier message\",\n      \"timestamp\": 1749500050,\n      \"type\": \"MO\"\n    }\n  ],\n  \"has_more\": true,\n  \"oldest_mo_ts\": 1749500050,\n  \"oldest_mt_ts\": 1749500000\n}"
            },
            {
              "name": "401 Unauthorized",
              "code": 401,
              "status": "Unauthorized",
              "body": "{\n  \"error\": \"Failed (Invalid API ID or Key)\"\n}"
            }
          ]
        }
      ]
    },
    {
      "name": "Email",
      "item": [
        {
          "name": "Send Email",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url_dingo}}/email",
              "host": [
                "{{base_url_dingo}}"
              ],
              "path": [
                "email"
              ]
            },
            "description": "Send a transactional email. The sender must be on a registered, validated domain (see Email Domains).\n\n#### Request body parameters\n| Field | Type | Required | Description |\n| --- | --- | --- | --- |\n| `SenderEmail` | string | Yes | From address. Must be on a registered, validated domain. |\n| `Subject` | string | Yes | Email subject. |\n| `Text` | string | Yes | Plain-text body. |\n| `Html` | string | No | HTML body. Defaults to `Text` if omitted. |\n| `SenderName` | string | No | Display name for the From address. |\n| `Recipient` | string or array | Conditional | To recipient(s). At least one of Recipient / CC / BCC is required; combined max 50. |\n| `CC` | string or array | Conditional | CC recipient(s). |\n| `BCC` | string or array | Conditional | BCC recipient(s). |\n| `ReplyTo` | string | No | Reply-To address. |\n| `Attachments` | array | No | Array of `{url, filename?}`. Requires the DINGO_ATTACHMENT account flag; max 5. |\n\n#### Response fields\n| Field | Type | Description |\n| --- | --- | --- |\n| `error` | string | Empty on success. |\n| `messages` | array | One entry per send. |\n| `messages[].Id` | string | Email id. |\n| `messages[].Status` | string | Email status. |\n| `messages[].Recipients` | object | `{To, CC, TotalCount}` — BCC omitted for privacy. |\n\n#### Errors\n| Error | HTTP | Cause |\n| --- | --- | --- |\n| `Email not enabled. Please contact us.` | 400 | Email is not enabled on this account. |\n| `Required parameter: {field} missing` | 400 | A required field (SenderEmail / Subject / Text) is missing. |\n| `Required parameter: At least one of Recipient, CC, or BCC must be provided` | 400 | No recipient supplied. |\n| `Too many recipients. Maximum 50 allowed, got {n}.` | 400 | Combined recipients exceed 50. |\n| `Invalid email addresses: {list}` | 400 | One or more recipient addresses are malformed. |\n| `Invalid Sender Email` | 400 | `SenderEmail` is malformed. |\n| `Invalid Sender Domain` | 400 | Sender domain is not registered/validated on this account. |\n| `Attachments not enabled for this account` | 403 | Attachments require the DINGO_ATTACHMENT flag. |\n| `Maximum {n} attachments allowed` | 400 | Too many attachments (max 5). |\n| `Each attachment must have a url field` | 400 | An attachment entry is missing `url`. |",
            "body": {
              "mode": "raw",
              "options": {
                "raw": {
                  "language": "json"
                }
              },
              "raw": "{\n  \"key-id\": \"{{key_id}}\",\n  \"key-secret\": \"{{key_secret}}\",\n  \"SenderEmail\": \"news@mail.example.com\",\n  \"SenderName\": \"Example\",\n  \"Subject\": \"Welcome\",\n  \"Text\": \"Hello there\",\n  \"Html\": \"<p>Hello there</p>\",\n  \"Recipient\": \"jane@example.com\",\n  \"ReplyTo\": \"support@example.com\"\n}"
            }
          },
          "response": [
            {
              "name": "200 OK",
              "code": 200,
              "status": "OK",
              "body": "{\n  \"error\": \"\",\n  \"messages\": [\n    {\n      \"Id\": \"683554c596937cc4b90f5cf7\",\n      \"Status\": \"queued\",\n      \"Recipients\": {\n        \"To\": [\n          \"jane@example.com\"\n        ],\n        \"CC\": [],\n        \"TotalCount\": 1\n      }\n    }\n  ]\n}"
            },
            {
              "name": "400 Bad Request",
              "code": 400,
              "status": "Bad Request",
              "body": "{\n  \"error\": \"Invalid Sender Domain\"\n}"
            },
            {
              "name": "401 Unauthorized",
              "code": 401,
              "status": "Unauthorized",
              "body": "{\n  \"error\": \"Failed (Invalid API ID or Key)\"\n}"
            }
          ]
        },
        {
          "name": "List Emails",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url_dingo}}/email",
              "host": [
                "{{base_url_dingo}}"
              ],
              "path": [
                "email"
              ],
              "query": [
                {
                  "key": "after",
                  "value": "",
                  "description": "24-hex cursor — the `id` of the last email on the previous page.",
                  "disabled": true
                },
                {
                  "key": "limit",
                  "value": "20",
                  "description": "Page size, 1–100. Default 20.",
                  "disabled": true
                }
              ]
            },
            "description": "List sent emails, newest first.\n\n#### Response fields\n| Field | Type | Description |\n| --- | --- | --- |\n| `error` | string | Empty on success. |\n| `emails` | array | Emails this page. |\n| `emails[].id` | string | Email id. |\n| `emails[].status` | string | Email status. |\n| `emails[].from` | string | From address. |\n| `emails[].sender_name` | string | From display name. |\n| `emails[].to` | array | To recipients. |\n| `emails[].cc` | array | CC recipients. |\n| `emails[].subject` | string | Subject. |\n| `emails[].created_at` | integer | Epoch seconds created. |\n| `emails[].method` | string | Send method. |\n| `count` | integer | Emails on this page. |\n| `next_page` | string | Relative path for the next page — present only when `count >= limit`. |\n\n#### Errors\n| Error | HTTP | Cause |\n| --- | --- | --- |\n| `Invalid after parameter` | 400 | `after` is not a valid 24-hex cursor. |\n| `Invalid limit parameter` | 400 | `limit` is outside 1–100. |",
            "body": {
              "mode": "raw",
              "options": {
                "raw": {
                  "language": "json"
                }
              },
              "raw": "{\n  \"key-id\": \"{{key_id}}\",\n  \"key-secret\": \"{{key_secret}}\"\n}"
            }
          },
          "response": [
            {
              "name": "200 OK",
              "code": 200,
              "status": "OK",
              "body": "{\n  \"error\": \"\",\n  \"emails\": [\n    {\n      \"id\": \"683554c596937cc4b90f5cf7\",\n      \"status\": \"sent\",\n      \"from\": \"news@mail.example.com\",\n      \"sender_name\": \"Example\",\n      \"to\": [\n        \"jane@example.com\"\n      ],\n      \"cc\": [],\n      \"subject\": \"Welcome\",\n      \"created_at\": 1717000000,\n      \"method\": \"api\"\n    }\n  ],\n  \"count\": 1\n}"
            },
            {
              "name": "401 Unauthorized",
              "code": 401,
              "status": "Unauthorized",
              "body": "{\n  \"error\": \"Failed (Invalid API ID or Key)\"\n}"
            }
          ]
        },
        {
          "name": "Get Email",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url_dingo}}/email/:id",
              "host": [
                "{{base_url_dingo}}"
              ],
              "path": [
                "email",
                ":id"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "",
                  "description": "Email id."
                }
              ]
            },
            "description": "Fetch a single email, including its full text and HTML bodies.\n\n#### Response fields\n| Field | Type | Description |\n| --- | --- | --- |\n| `error` | string | Empty on success. |\n| `email` | object | id, status, from, sender_name, to, cc, subject, text, html, reply_to, created_at, method. |\n\n#### Errors\n| Error | HTTP | Cause |\n| --- | --- | --- |\n| `Invalid email ID` | 400 | `id` is not a valid 24-hex id. |\n| `Email not found` | 400 | No such email, or not owned by this account. |",
            "body": {
              "mode": "raw",
              "options": {
                "raw": {
                  "language": "json"
                }
              },
              "raw": "{\n  \"key-id\": \"{{key_id}}\",\n  \"key-secret\": \"{{key_secret}}\"\n}"
            }
          },
          "response": [
            {
              "name": "200 OK",
              "code": 200,
              "status": "OK",
              "body": "{\n  \"error\": \"\",\n  \"email\": {\n    \"id\": \"683554c596937cc4b90f5cf7\",\n    \"status\": \"sent\",\n    \"from\": \"news@mail.example.com\",\n    \"sender_name\": \"Example\",\n    \"to\": [\n      \"jane@example.com\"\n    ],\n    \"cc\": [],\n    \"subject\": \"Welcome\",\n    \"text\": \"Hello there\",\n    \"html\": \"<p>Hello there</p>\",\n    \"reply_to\": \"support@example.com\",\n    \"created_at\": 1717000000,\n    \"method\": \"api\"\n  }\n}"
            },
            {
              "name": "401 Unauthorized",
              "code": 401,
              "status": "Unauthorized",
              "body": "{\n  \"error\": \"Failed (Invalid API ID or Key)\"\n}"
            }
          ]
        }
      ]
    },
    {
      "name": "Account",
      "item": [
        {
          "name": "Get Balance",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url_sms}}/balance",
              "host": [
                "{{base_url_sms}}"
              ],
              "path": [
                "balance"
              ]
            },
            "description": "Get your account's credit balance and billing mode.\n\n#### Response fields\n| Field | Type | Description |\n| --- | --- | --- |\n| `error` | string | Empty on success. |\n| `balance` | object | Balance details. |\n| `balance.postpaid` | boolean | True if the account is postpaid. |\n| `balance.credits` | number | Available credits. |",
            "body": {
              "mode": "raw",
              "options": {
                "raw": {
                  "language": "json"
                }
              },
              "raw": "{\n  \"key-id\": \"{{key_id}}\",\n  \"key-secret\": \"{{key_secret}}\"\n}"
            }
          },
          "response": [
            {
              "name": "200 OK",
              "code": 200,
              "status": "OK",
              "body": "{\n  \"error\": \"\",\n  \"balance\": {\n    \"postpaid\": false,\n    \"credits\": 1234.5\n  }\n}"
            },
            {
              "name": "401 Unauthorized",
              "code": 401,
              "status": "Unauthorized",
              "body": "{\n  \"error\": \"Failed (Invalid API ID or Key)\"\n}"
            }
          ]
        },
        {
          "name": "Pre-warm Send Queue",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url_sms}}/prewarm",
              "host": [
                "{{base_url_sms}}"
              ],
              "path": [
                "prewarm"
              ]
            },
            "description": "Pre-warm the send queue ahead of a large campaign. Requires the QUEUE_PREWARM account flag; usable once per 60 minutes.\n\n#### Response fields\n| Field | Type | Description |\n| --- | --- | --- |\n| `error` | string | Empty on success. |\n| `message` | string | Confirmation message. |\n\n#### Errors\n| Error | HTTP | Cause |\n| --- | --- | --- |\n| `Account does not have queue pre-warming enabled` | 400 | QUEUE_PREWARM flag not set on the account. |\n| `Queue was already pre-warmed recently. Please wait {n} minutes before trying again.` | 400 | Pre-warmed within the last 60 minutes. |",
            "body": {
              "mode": "raw",
              "options": {
                "raw": {
                  "language": "json"
                }
              },
              "raw": "{\n  \"key-id\": \"{{key_id}}\",\n  \"key-secret\": \"{{key_secret}}\"\n}"
            }
          },
          "response": [
            {
              "name": "200 OK",
              "code": 200,
              "status": "OK",
              "body": "{\n  \"error\": \"\",\n  \"message\": \"Queue pre-warming initiated.\"\n}"
            },
            {
              "name": "400 Bad Request",
              "code": 400,
              "status": "Bad Request",
              "body": "{\n  \"error\": \"Account does not have queue pre-warming enabled\"\n}"
            },
            {
              "name": "401 Unauthorized",
              "code": 401,
              "status": "Unauthorized",
              "body": "{\n  \"error\": \"Failed (Invalid API ID or Key)\"\n}"
            }
          ]
        }
      ]
    },
    {
      "name": "Logins",
      "item": [
        {
          "name": "Create Login",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url_sms}}/logins",
              "host": [
                "{{base_url_sms}}"
              ],
              "path": [
                "logins"
              ]
            },
            "description": "Create (or re-invite) a sub-login on your account.\n\n#### Request body parameters\n| Field | Type | Required | Description |\n| --- | --- | --- | --- |\n| `name` | string | Yes | Login's display name. |\n| `email` | string | Yes | Login's email address. |\n| `role` | string | No | One of `admin`, `manager`, `sender`, `reporting`. Default `admin`. |\n\n#### Response fields\n| Field | Type | Description |\n| --- | --- | --- |\n| `error` | string | Empty on success. |\n| `login_id` | string | The login's id. |\n| `is_new` | boolean | True if a new login was created. |\n| `message` | string | Confirmation message. |\n\n#### Errors\n| Error | HTTP | Cause |\n| --- | --- | --- |\n| `Missing required field: name` | 400 | `name` not supplied. |\n| `Missing required field: email` | 400 | `email` not supplied. |\n| `Invalid email address` | 400 | `email` is malformed. |\n| `Invalid role. Must be one of: admin, manager, sender, reporting` | 400 | `role` is not an allowed value. |\n| `Login already exists on this account` | 400 | A login with that email already exists here. |",
            "body": {
              "mode": "raw",
              "options": {
                "raw": {
                  "language": "json"
                }
              },
              "raw": "{\n  \"key-id\": \"{{key_id}}\",\n  \"key-secret\": \"{{key_secret}}\",\n  \"name\": \"Jane Smith\",\n  \"email\": \"jane@example.com\",\n  \"role\": \"admin\"\n}"
            }
          },
          "response": [
            {
              "name": "200 OK",
              "code": 200,
              "status": "OK",
              "body": "{\n  \"error\": \"\",\n  \"login_id\": \"683554c596937cc4b90f5cf7\",\n  \"is_new\": true,\n  \"message\": \"Login created\"\n}"
            },
            {
              "name": "400 Bad Request",
              "code": 400,
              "status": "Bad Request",
              "body": "{\n  \"error\": \"Invalid role. Must be one of: admin, manager, sender, reporting\"\n}"
            },
            {
              "name": "401 Unauthorized",
              "code": 401,
              "status": "Unauthorized",
              "body": "{\n  \"error\": \"Failed (Invalid API ID or Key)\"\n}"
            }
          ]
        },
        {
          "name": "List Logins",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url_sms}}/logins",
              "host": [
                "{{base_url_sms}}"
              ],
              "path": [
                "logins"
              ]
            },
            "description": "List all logins on your account.\n\n#### Response fields\n| Field | Type | Description |\n| --- | --- | --- |\n| `error` | string | Empty on success. |\n| `logins` | array | Logins on the account. |\n| `logins[].login_id` | string | Login id. |\n| `logins[].name` | string | Display name. |\n| `logins[].email` | string | Email address. |\n| `logins[].role` | string | Role. |\n| `count` | integer | Number of logins. |",
            "body": {
              "mode": "raw",
              "options": {
                "raw": {
                  "language": "json"
                }
              },
              "raw": "{\n  \"key-id\": \"{{key_id}}\",\n  \"key-secret\": \"{{key_secret}}\"\n}"
            }
          },
          "response": [
            {
              "name": "200 OK",
              "code": 200,
              "status": "OK",
              "body": "{\n  \"error\": \"\",\n  \"logins\": [\n    {\n      \"login_id\": \"683554c596937cc4b90f5cf7\",\n      \"name\": \"Jane Smith\",\n      \"email\": \"jane@example.com\",\n      \"role\": \"admin\"\n    }\n  ],\n  \"count\": 1\n}"
            },
            {
              "name": "401 Unauthorized",
              "code": 401,
              "status": "Unauthorized",
              "body": "{\n  \"error\": \"Failed (Invalid API ID or Key)\"\n}"
            }
          ]
        },
        {
          "name": "Change Login Role",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url_sms}}/logins/:login_id",
              "host": [
                "{{base_url_sms}}"
              ],
              "path": [
                "logins",
                ":login_id"
              ],
              "variable": [
                {
                  "key": "login_id",
                  "value": "",
                  "description": "Login id."
                }
              ]
            },
            "description": "Change a login's role.\n\n#### Request body parameters\n| Field | Type | Required | Description |\n| --- | --- | --- | --- |\n| `action` | string | Yes | Must be `change_role`. |\n| `role` | string | Yes | One of `admin`, `manager`, `sender`, `reporting`. |\n\n#### Response fields\n| Field | Type | Description |\n| --- | --- | --- |\n| `error` | string | Empty on success. |\n| `login_id` | string | The login's id. |\n| `role` | string | The new role. |\n| `message` | string | Confirmation message. |\n\n#### Errors\n| Error | HTTP | Cause |\n| --- | --- | --- |\n| `Invalid login_id format` | 400 | `login_id` is not a valid id. |\n| `Missing required field: role` | 400 | `role` not supplied. |\n| `Invalid role. Must be one of: admin, manager, sender, reporting` | 400 | `role` is not an allowed value. |\n| `Login not found on this account` | 400 | No such login on this account. |",
            "body": {
              "mode": "raw",
              "options": {
                "raw": {
                  "language": "json"
                }
              },
              "raw": "{\n  \"key-id\": \"{{key_id}}\",\n  \"key-secret\": \"{{key_secret}}\",\n  \"action\": \"change_role\",\n  \"role\": \"manager\"\n}"
            }
          },
          "response": [
            {
              "name": "200 OK",
              "code": 200,
              "status": "OK",
              "body": "{\n  \"error\": \"\",\n  \"login_id\": \"683554c596937cc4b90f5cf7\",\n  \"role\": \"manager\",\n  \"message\": \"Role updated\"\n}"
            },
            {
              "name": "401 Unauthorized",
              "code": 401,
              "status": "Unauthorized",
              "body": "{\n  \"error\": \"Failed (Invalid API ID or Key)\"\n}"
            }
          ]
        },
        {
          "name": "Delete Login",
          "request": {
            "method": "DELETE",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url_sms}}/logins/:login_id",
              "host": [
                "{{base_url_sms}}"
              ],
              "path": [
                "logins",
                ":login_id"
              ],
              "variable": [
                {
                  "key": "login_id",
                  "value": "",
                  "description": "Login id."
                }
              ]
            },
            "description": "Remove a login from your account.\n\n#### Response fields\n| Field | Type | Description |\n| --- | --- | --- |\n| `error` | string | Empty on success. |\n| `login_id` | string | The removed login's id. |\n| `message` | string | Confirmation message. |\n\n#### Errors\n| Error | HTTP | Cause |\n| --- | --- | --- |\n| `Invalid login_id format` | 400 | `login_id` is not a valid id. |\n| `Login not found on this account` | 400 | No such login on this account. |",
            "body": {
              "mode": "raw",
              "options": {
                "raw": {
                  "language": "json"
                }
              },
              "raw": "{\n  \"key-id\": \"{{key_id}}\",\n  \"key-secret\": \"{{key_secret}}\"\n}"
            }
          },
          "response": [
            {
              "name": "200 OK",
              "code": 200,
              "status": "OK",
              "body": "{\n  \"error\": \"\",\n  \"login_id\": \"683554c596937cc4b90f5cf7\",\n  \"message\": \"Login removed from account\"\n}"
            },
            {
              "name": "401 Unauthorized",
              "code": 401,
              "status": "Unauthorized",
              "body": "{\n  \"error\": \"Failed (Invalid API ID or Key)\"\n}"
            }
          ]
        }
      ]
    },
    {
      "name": "Sender IDs",
      "item": [
        {
          "name": "List Sender IDs",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url_sms}}/senderid",
              "host": [
                "{{base_url_sms}}"
              ],
              "path": [
                "senderid"
              ]
            },
            "description": "List the sender IDs registered on your account.\n\n#### Response fields\n| Field | Type | Description |\n| --- | --- | --- |\n| `error` | string | Empty on success. |\n| `senderids` | array | Registered sender IDs. |\n| `senderids[].id` | string | Sender ID record id. |\n| `senderids[].senderid` | string | The sender ID value. |\n| `senderids[].status` | string | Approval status. |",
            "body": {
              "mode": "raw",
              "options": {
                "raw": {
                  "language": "json"
                }
              },
              "raw": "{\n  \"key-id\": \"{{key_id}}\",\n  \"key-secret\": \"{{key_secret}}\"\n}"
            }
          },
          "response": [
            {
              "name": "200 OK",
              "code": 200,
              "status": "OK",
              "body": "{\n  \"error\": \"\",\n  \"senderids\": [\n    {\n      \"id\": \"683554c596937cc4b90f5cf7\",\n      \"senderid\": \"EXAMPLE\",\n      \"status\": \"approved\"\n    }\n  ]\n}"
            },
            {
              "name": "401 Unauthorized",
              "code": 401,
              "status": "Unauthorized",
              "body": "{\n  \"error\": \"Failed (Invalid API ID or Key)\"\n}"
            }
          ]
        },
        {
          "name": "Create Sender ID",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url_sms}}/senderid",
              "host": [
                "{{base_url_sms}}"
              ],
              "path": [
                "senderid"
              ]
            },
            "description": "Register a new sender ID for approval.\n\n#### Request body parameters\n| Field | Type | Required | Description |\n| --- | --- | --- | --- |\n| `senderid` | string | Yes | The sender ID to register. |\n\n#### Response fields\n| Field | Type | Description |\n| --- | --- | --- |\n| `error` | string | Empty on success. |\n| `message` | string | Confirmation message. |\n\n#### Errors\n| Error | HTTP | Cause |\n| --- | --- | --- |\n| `Missing Sender ID` | 400 | `senderid` not supplied. |\n| `Invalid new Sender ID` | 400 | `senderid` is not valid. |",
            "body": {
              "mode": "raw",
              "options": {
                "raw": {
                  "language": "json"
                }
              },
              "raw": "{\n  \"key-id\": \"{{key_id}}\",\n  \"key-secret\": \"{{key_secret}}\",\n  \"senderid\": \"EXAMPLE\"\n}"
            }
          },
          "response": [
            {
              "name": "200 OK",
              "code": 200,
              "status": "OK",
              "body": "{\n  \"error\": \"\",\n  \"message\": \"Sender ID created\"\n}"
            },
            {
              "name": "400 Bad Request",
              "code": 400,
              "status": "Bad Request",
              "body": "{\n  \"error\": \"Invalid new Sender ID\"\n}"
            },
            {
              "name": "401 Unauthorized",
              "code": 401,
              "status": "Unauthorized",
              "body": "{\n  \"error\": \"Failed (Invalid API ID or Key)\"\n}"
            }
          ]
        },
        {
          "name": "Delete Sender ID",
          "request": {
            "method": "DELETE",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url_sms}}/senderid/:id",
              "host": [
                "{{base_url_sms}}"
              ],
              "path": [
                "senderid",
                ":id"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "",
                  "description": "Sender ID record id."
                }
              ]
            },
            "description": "Remove a sender ID from your account.\n\n#### Response fields\n| Field | Type | Description |\n| --- | --- | --- |\n| `error` | string | Empty on success. |",
            "body": {
              "mode": "raw",
              "options": {
                "raw": {
                  "language": "json"
                }
              },
              "raw": "{\n  \"key-id\": \"{{key_id}}\",\n  \"key-secret\": \"{{key_secret}}\"\n}"
            }
          },
          "response": [
            {
              "name": "200 OK",
              "code": 200,
              "status": "OK",
              "body": "{\n  \"error\": \"\"\n}"
            },
            {
              "name": "401 Unauthorized",
              "code": 401,
              "status": "Unauthorized",
              "body": "{\n  \"error\": \"Failed (Invalid API ID or Key)\"\n}"
            }
          ]
        }
      ]
    },
    {
      "name": "Virtual Numbers",
      "item": [
        {
          "name": "List Virtual Numbers",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url_sms}}/virtualnumber",
              "host": [
                "{{base_url_sms}}"
              ],
              "path": [
                "virtualnumber"
              ]
            },
            "description": "List the virtual numbers on your account.\n\n#### Response fields\n| Field | Type | Description |\n| --- | --- | --- |\n| `error` | string | Empty on success. |\n| `virtualnumbers` | array | Virtual numbers. |\n| `virtualnumbers[].id` | string | Virtual number record id. |\n| `virtualnumbers[].number` | string | Number in international format. |\n| `virtualnumbers[].number_formatted` | string | Human-formatted number. |\n| `virtualnumbers[].country` | string | Country code. |\n| `virtualnumbers[].type` | string | `standard` or `unified`. |\n| `count` | integer | Number of virtual numbers. |",
            "body": {
              "mode": "raw",
              "options": {
                "raw": {
                  "language": "json"
                }
              },
              "raw": "{\n  \"key-id\": \"{{key_id}}\",\n  \"key-secret\": \"{{key_secret}}\"\n}"
            }
          },
          "response": [
            {
              "name": "200 OK",
              "code": 200,
              "status": "OK",
              "body": "{\n  \"error\": \"\",\n  \"virtualnumbers\": [\n    {\n      \"id\": \"683554c596937cc4b90f5cf7\",\n      \"number\": \"61400000000\",\n      \"number_formatted\": \"0400 000 000\",\n      \"country\": \"AU\",\n      \"type\": \"standard\"\n    }\n  ],\n  \"count\": 1\n}"
            },
            {
              "name": "401 Unauthorized",
              "code": 401,
              "status": "Unauthorized",
              "body": "{\n  \"error\": \"Failed (Invalid API ID or Key)\"\n}"
            }
          ]
        },
        {
          "name": "Purchase Virtual Number",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url_sms}}/virtualnumber",
              "host": [
                "{{base_url_sms}}"
              ],
              "path": [
                "virtualnumber"
              ]
            },
            "description": "Purchase a virtual number. Charges the card on file and creates a monthly subscription. Default limit 2 numbers unless the MORE_VMNS flag is set.\n\n#### Request body parameters\n| Field | Type | Required | Description |\n| --- | --- | --- | --- |\n| `country` | string | Yes | Only `AU` is supported for API purchases. |\n| `type` | string | No | `standard` or `unified`. Default `standard`; `unified` requires the ENABLE_UNIFIED flag. |\n\n#### Response fields\n| Field | Type | Description |\n| --- | --- | --- |\n| `error` | string | Empty on success. |\n| `message` | string | Confirmation message. |\n| `virtualnumber` | object | `{id, number, number_formatted, country}`. |\n\n#### Errors\n| Error | HTTP | Cause |\n| --- | --- | --- |\n| `Missing required parameter: country` | 400 | `country` not supplied. |\n| `Invalid country. Currently only AU is supported for API requests.` | 400 | `country` is not `AU`. |\n| `Invalid type. Must be \"standard\" or \"unified\".` | 400 | `type` is not an allowed value. |\n| `Your account is not enabled for Unified Mobile Numbers. Please contact us.` | 400 | `type: unified` without the ENABLE_UNIFIED flag. |\n| `Your account is currently on hold. Please contact us to purchase a virtual number.` | 400 | Account is on hold. |\n| `Maximum virtual numbers reached. Contact us to request increaed quota.` | 400 | Number limit reached (default 2). |\n| `No payment method on file. Please add a payment method in the dashboard.` | 400 | No card on file. |\n| `Invalid subscription plan` | 400 | Subscription plan could not be resolved. |\n| `Your payment was declined by your bank.` | 400 | Card charge declined. |",
            "body": {
              "mode": "raw",
              "options": {
                "raw": {
                  "language": "json"
                }
              },
              "raw": "{\n  \"key-id\": \"{{key_id}}\",\n  \"key-secret\": \"{{key_secret}}\",\n  \"country\": \"AU\",\n  \"type\": \"standard\"\n}"
            }
          },
          "response": [
            {
              "name": "200 OK",
              "code": 200,
              "status": "OK",
              "body": "{\n  \"error\": \"\",\n  \"message\": \"Virtual number purchased\",\n  \"virtualnumber\": {\n    \"id\": \"683554c596937cc4b90f5cf7\",\n    \"number\": \"61400000000\",\n    \"number_formatted\": \"0400 000 000\",\n    \"country\": \"AU\"\n  }\n}"
            },
            {
              "name": "400 Bad Request",
              "code": 400,
              "status": "Bad Request",
              "body": "{\n  \"error\": \"Invalid country. Currently only AU is supported for API requests.\"\n}"
            },
            {
              "name": "401 Unauthorized",
              "code": 401,
              "status": "Unauthorized",
              "body": "{\n  \"error\": \"Failed (Invalid API ID or Key)\"\n}"
            }
          ]
        },
        {
          "name": "Delete Virtual Number",
          "request": {
            "method": "DELETE",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url_sms}}/virtualnumber/:id",
              "host": [
                "{{base_url_sms}}"
              ],
              "path": [
                "virtualnumber",
                ":id"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "",
                  "description": "Virtual number record id."
                }
              ]
            },
            "description": "Release a virtual number and cancel its subscription.\n\n#### Response fields\n| Field | Type | Description |\n| --- | --- | --- |\n| `error` | string | Empty on success. |\n| `message` | string | Confirmation message. |\n\n#### Errors\n| Error | HTTP | Cause |\n| --- | --- | --- |\n| `Invalid virtual number ID format` | 400 | `id` is not a valid id. |\n| `Virtual number not found` | 400 | No such virtual number. |\n| `Unauthorized - you do not own this virtual number` | 400 | Number not owned by this account. |",
            "body": {
              "mode": "raw",
              "options": {
                "raw": {
                  "language": "json"
                }
              },
              "raw": "{\n  \"key-id\": \"{{key_id}}\",\n  \"key-secret\": \"{{key_secret}}\"\n}"
            }
          },
          "response": [
            {
              "name": "200 OK",
              "code": 200,
              "status": "OK",
              "body": "{\n  \"error\": \"\",\n  \"message\": \"Virtual number released\"\n}"
            },
            {
              "name": "401 Unauthorized",
              "code": 401,
              "status": "Unauthorized",
              "body": "{\n  \"error\": \"Failed (Invalid API ID or Key)\"\n}"
            }
          ]
        }
      ]
    },
    {
      "name": "Email Domains",
      "item": [
        {
          "name": "List Domains",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url_dingo}}/domain",
              "host": [
                "{{base_url_dingo}}"
              ],
              "path": [
                "domain"
              ]
            },
            "description": "List the email domains registered on your account.\n\n#### Response fields\n| Field | Type | Description |\n| --- | --- | --- |\n| `error` | string | Empty on success. |\n| `domains` | array | Registered domains. |\n| `domains[].id` | string | Domain record id. |\n| `domains[].domain` | string | Domain name. |\n| `domains[].subdomain` | string | Sending subdomain. |\n| `domains[].status` | string | Verification status. |\n| `domains[].dkim_names` | array | DKIM record names. |\n| `domains[].verification` | string | SES verification state. |\n| `count` | integer | Number of domains. |",
            "body": {
              "mode": "raw",
              "options": {
                "raw": {
                  "language": "json"
                }
              },
              "raw": "{\n  \"key-id\": \"{{key_id}}\",\n  \"key-secret\": \"{{key_secret}}\"\n}"
            }
          },
          "response": [
            {
              "name": "200 OK",
              "code": 200,
              "status": "OK",
              "body": "{\n  \"error\": \"\",\n  \"domains\": [\n    {\n      \"id\": \"683554c596937cc4b90f5cf7\",\n      \"domain\": \"example.com\",\n      \"subdomain\": \"email\",\n      \"status\": \"verified\",\n      \"dkim_names\": [\n        \"k1._domainkey\"\n      ],\n      \"verification\": \"verified\"\n    }\n  ],\n  \"count\": 1\n}"
            },
            {
              "name": "401 Unauthorized",
              "code": 401,
              "status": "Unauthorized",
              "body": "{\n  \"error\": \"Failed (Invalid API ID or Key)\"\n}"
            }
          ]
        },
        {
          "name": "Get Domain",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url_dingo}}/domain/:id",
              "host": [
                "{{base_url_dingo}}"
              ],
              "path": [
                "domain",
                ":id"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "",
                  "description": "Domain record id."
                }
              ]
            },
            "description": "Fetch a single email domain, including its DKIM and verification details.\n\n#### Response fields\n| Field | Type | Description |\n| --- | --- | --- |\n| `error` | string | Empty on success. |\n| `domain` | object | id, domain, subdomain, status, dkim_names, verification. |\n\n#### Errors\n| Error | HTTP | Cause |\n| --- | --- | --- |\n| `Failed (Domain not found or unauthorized)` | 400 | No such domain, or not owned by this account. |",
            "body": {
              "mode": "raw",
              "options": {
                "raw": {
                  "language": "json"
                }
              },
              "raw": "{\n  \"key-id\": \"{{key_id}}\",\n  \"key-secret\": \"{{key_secret}}\"\n}"
            }
          },
          "response": [
            {
              "name": "200 OK",
              "code": 200,
              "status": "OK",
              "body": "{\n  \"error\": \"\",\n  \"domain\": {\n    \"id\": \"683554c596937cc4b90f5cf7\",\n    \"domain\": \"example.com\",\n    \"subdomain\": \"email\",\n    \"status\": \"verified\",\n    \"dkim_names\": [\n      \"k1._domainkey\"\n    ],\n    \"verification\": \"verified\"\n  }\n}"
            },
            {
              "name": "401 Unauthorized",
              "code": 401,
              "status": "Unauthorized",
              "body": "{\n  \"error\": \"Failed (Invalid API ID or Key)\"\n}"
            }
          ]
        },
        {
          "name": "Create Domain",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url_dingo}}/domain",
              "host": [
                "{{base_url_dingo}}"
              ],
              "path": [
                "domain"
              ]
            },
            "description": "Register a new email domain. Email must be enabled and your plan's domain limit must not be exceeded.\n\n#### Request body parameters\n| Field | Type | Required | Description |\n| --- | --- | --- | --- |\n| `domain` | string | Yes | Domain name (valid domain format). |\n| `subdomain` | string | No | Sending subdomain; letters, numbers, hyphens. Default `email`. If a full host is supplied it is auto-corrected and a `warning` is returned. |\n\n#### Response fields\n| Field | Type | Description |\n| --- | --- | --- |\n| `error` | string | Empty on success. |\n| `message` | object | `{id, domain}`. |\n| `warning` | string | Present only when the subdomain was auto-corrected. |\n\n#### Errors\n| Error | HTTP | Cause |\n| --- | --- | --- |\n| `Email not enabled. Please contact us.` | 400 | Email is not enabled on this account. |\n| `Domain limit reached. Your plan allows {n} domain{s}. Please upgrade your plan or contact us.` | 400 | Plan domain limit reached. |\n| `Missing Domain` | 400 | `domain` not supplied. |\n| `Invalid Domain` | 400 | `domain` is not a valid domain. |\n| `Domain already registered. Please contact us.` | 400 | Domain already exists. |\n| `Invalid subdomain. Use only letters, numbers, and hyphens.` | 400 | `subdomain` contains invalid characters. |",
            "body": {
              "mode": "raw",
              "options": {
                "raw": {
                  "language": "json"
                }
              },
              "raw": "{\n  \"key-id\": \"{{key_id}}\",\n  \"key-secret\": \"{{key_secret}}\",\n  \"domain\": \"example.com\",\n  \"subdomain\": \"email\"\n}"
            }
          },
          "response": [
            {
              "name": "200 OK",
              "code": 200,
              "status": "OK",
              "body": "{\n  \"error\": \"\",\n  \"message\": {\n    \"id\": \"683554c596937cc4b90f5cf7\",\n    \"domain\": \"example.com\"\n  }\n}"
            },
            {
              "name": "400 Bad Request",
              "code": 400,
              "status": "Bad Request",
              "body": "{\n  \"error\": \"Invalid Domain\"\n}"
            },
            {
              "name": "401 Unauthorized",
              "code": 401,
              "status": "Unauthorized",
              "body": "{\n  \"error\": \"Failed (Invalid API ID or Key)\"\n}"
            }
          ]
        }
      ]
    }
  ]
}
