{
  "info": {
    "_postman_id": "63e8c785-c5aa-ea46-5c73-337da2b097b8",
    "name": "SMSRAVE APIs",
    "description": "SMSRAVE turns an Android phone into an SMS gateway. Fill in the collection **Variables** tab first.\n\nDocs: https://smsrave.com/developers · Video tutorials: https://smsrave.com/tutorials",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
  },
  "item": [
    {
      "name": "1. Website API v1 (API key)",
      "description": "Your own systems talking to the SMSRAVE website. Send SMS (queued; your phone sends them on its next sync) and read what the phone synced.\n\n**Auth:** `Authorization: Bearer {{apiKey}}` — copy the key from **Dashboard → API access**. `?apikey=` also works.\n\nReading messages/contacts/polls needs an active **Regular** plan (that is what syncs from the phone). Sending works on any active account.",
      "auth": {
        "type": "bearer",
        "bearer": [
          {
            "key": "token",
            "value": "{{apiKey}}",
            "type": "string"
          }
        ]
      },
      "item": [
        {
          "name": "Account & plan",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/v1/me",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "me"
              ]
            },
            "description": "Who the key belongs to, the plan and whether cloud sync is active."
          },
          "response": [
            {
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/me",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "me"
                  ]
                },
                "description": "Who the key belongs to, the plan and whether cloud sync is active."
              },
              "name": "OK",
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"status\": \"ok\",\n  \"email\": \"you@example.com\",\n  \"name\": \"Ada\",\n  \"plan\": 2,\n  \"expiry\": \"31/12/2026\",\n  \"canCloud\": true\n}"
            },
            {
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/me",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "me"
                  ]
                },
                "description": "Who the key belongs to, the plan and whether cloud sync is active."
              },
              "name": "Bad key",
              "status": "Unauthorized",
              "code": 401,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"status\": \"error\",\n  \"message\": \"Invalid or missing API key. Send Authorization: Bearer <apiKey>.\"\n}"
            }
          ]
        },
        {
          "name": "Send SMS",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/sms/send",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "sms",
                "send"
              ]
            },
            "description": "Queue an SMS to one or more numbers (comma, semicolon or new line; max 500). The phone sends them on its next sync.\n\n- `to` — numbers\n- `message` — the text\n- `store` — `true` (default) keeps a copy in the phone's Sent box",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"to\": \"+2348012345678,+2348098765432\",\n  \"message\": \"Hello from my app\",\n  \"store\": true\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/sms/send",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "sms",
                    "send"
                  ]
                },
                "description": "Queue an SMS to one or more numbers (comma, semicolon or new line; max 500). The phone sends them on its next sync.\n\n- `to` — numbers\n- `message` — the text\n- `store` — `true` (default) keeps a copy in the phone's Sent box",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"to\": \"+2348012345678,+2348098765432\",\n  \"message\": \"Hello from my app\",\n  \"store\": true\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "name": "Queued",
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"status\": \"ok\",\n  \"queued\": 2,\n  \"ids\": [\n    \"6717a1c2e4b0a1b2c3d4e5f6\",\n    \"6717a1c2e4b0a1b2c3d4e5f7\"\n  ]\n}"
            },
            {
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/sms/send",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "sms",
                    "send"
                  ]
                },
                "description": "Queue an SMS to one or more numbers (comma, semicolon or new line; max 500). The phone sends them on its next sync.\n\n- `to` — numbers\n- `message` — the text\n- `store` — `true` (default) keeps a copy in the phone's Sent box",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"to\": \"+2348012345678,+2348098765432\",\n  \"message\": \"Hello from my app\",\n  \"store\": true\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "name": "Missing message",
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"status\": \"error\",\n  \"message\": \"message is required\"\n}"
            }
          ]
        },
        {
          "name": "Status of queued SMS",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/v1/commands?limit=50",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "commands"
              ],
              "query": [
                {
                  "key": "limit",
                  "value": "50",
                  "description": "max 200",
                  "disabled": false
                }
              ]
            },
            "description": "The SMS you queued, newest first, with `queued` / `sent` status."
          },
          "response": [
            {
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/commands?limit=50",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "commands"
                  ],
                  "query": [
                    {
                      "key": "limit",
                      "value": "50",
                      "description": "max 200",
                      "disabled": false
                    }
                  ]
                },
                "description": "The SMS you queued, newest first, with `queued` / `sent` status."
              },
              "name": "OK",
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"status\": \"ok\",\n  \"items\": [\n    {\n      \"id\": \"6717a1c2e4b0a1b2c3d4e5f6\",\n      \"to\": \"+2348012345678\",\n      \"message\": \"Hello from my app\",\n      \"status\": \"sent\",\n      \"createdAt\": \"2026-10-21T09:00:00.000Z\",\n      \"sentAt\": \"2026-10-21T09:01:12.000Z\"\n    }\n  ]\n}"
            }
          ]
        },
        {
          "name": "Messages",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/v1/messages?box=inbox&limit=50",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "messages"
              ],
              "query": [
                {
                  "key": "box",
                  "value": "inbox",
                  "description": "inbox or sent (leave out for both)",
                  "disabled": false
                },
                {
                  "key": "limit",
                  "value": "50",
                  "description": "max 200",
                  "disabled": false
                }
              ]
            },
            "description": "SMS synced from the phone, newest first."
          },
          "response": [
            {
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/messages?box=inbox&limit=50",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "messages"
                  ],
                  "query": [
                    {
                      "key": "box",
                      "value": "inbox",
                      "description": "inbox or sent (leave out for both)",
                      "disabled": false
                    },
                    {
                      "key": "limit",
                      "value": "50",
                      "description": "max 200",
                      "disabled": false
                    }
                  ]
                },
                "description": "SMS synced from the phone, newest first."
              },
              "name": "OK",
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"status\": \"ok\",\n  \"items\": [\n    {\n      \"address\": \"+2348012345678\",\n      \"name\": \"John\",\n      \"body\": \"Hi\",\n      \"incoming\": true,\n      \"read\": true,\n      \"date\": \"2026-10-21T08:55:00.000Z\"\n    }\n  ]\n}"
            }
          ]
        },
        {
          "name": "Contacts",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/v1/contacts?limit=200",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "contacts"
              ],
              "query": [
                {
                  "key": "q",
                  "value": "john",
                  "description": "search name or number",
                  "disabled": true
                },
                {
                  "key": "limit",
                  "value": "200",
                  "description": "max 1000",
                  "disabled": false
                }
              ]
            },
            "description": "Contacts synced from the phone."
          },
          "response": [
            {
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/contacts?limit=200",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "contacts"
                  ],
                  "query": [
                    {
                      "key": "q",
                      "value": "john",
                      "description": "search name or number",
                      "disabled": true
                    },
                    {
                      "key": "limit",
                      "value": "200",
                      "description": "max 1000",
                      "disabled": false
                    }
                  ]
                },
                "description": "Contacts synced from the phone."
              },
              "name": "OK",
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"status\": \"ok\",\n  \"items\": [\n    {\n      \"name\": \"John\",\n      \"phone\": \"+2348012345678\"\n    }\n  ]\n}"
            }
          ]
        },
        {
          "name": "Polls",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/api/v1/polls",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "polls"
              ]
            },
            "description": "SMS polls synced from the phone."
          },
          "response": [
            {
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/v1/polls",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "v1",
                    "polls"
                  ]
                },
                "description": "SMS polls synced from the phone."
              },
              "name": "OK",
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"status\": \"ok\",\n  \"items\": [\n    {\n      \"pollId\": \"1\",\n      \"title\": \"Best colour\",\n      \"status\": \"1\",\n      \"voteCount\": \"3\"\n    }\n  ]\n}"
            }
          ]
        }
      ]
    },
    {
      "name": "2. Phone developer API (LAN)",
      "description": "Call the phone directly over your Wi-Fi. Turn on the web server in SMSRAVE on the phone, open the address it shows, then the **Developer** app on the browser desktop for the key.\n\n**Base URL:** `{{phoneUrl}}` (e.g. `http://192.168.1.50:8080`). **Auth:** `Authorization: Bearer {{phoneApiKey}}` or a `key` parameter. Five wrong keys lock the caller out for 5 minutes.\n\nErrors answer `{\"status\":\"error\",\"message\":\"…\"}` with an HTTP error code.",
      "auth": {
        "type": "bearer",
        "bearer": [
          {
            "key": "token",
            "value": "{{phoneApiKey}}",
            "type": "string"
          }
        ]
      },
      "item": [
        {
          "name": "Ping",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{phoneUrl}}/api/dev/ping",
              "host": [
                "{{phoneUrl}}"
              ],
              "path": [
                "api",
                "dev",
                "ping"
              ]
            },
            "description": "Checks the address and the key."
          },
          "response": [
            {
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{phoneUrl}}/api/dev/ping",
                  "host": [
                    "{{phoneUrl}}"
                  ],
                  "path": [
                    "api",
                    "dev",
                    "ping"
                  ]
                },
                "description": "Checks the address and the key."
              },
              "name": "OK",
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"status\": \"ok\",\n  \"app\": \"smsrave\"\n}"
            }
          ]
        },
        {
          "name": "Send SMS",
          "request": {
            "method": "POST",
            "header": [],
            "url": {
              "raw": "{{phoneUrl}}/api/dev/sms/send",
              "host": [
                "{{phoneUrl}}"
              ],
              "path": [
                "api",
                "dev",
                "sms",
                "send"
              ]
            },
            "description": "Sends right away from the phone (max 100 numbers, 5000 characters). GET with the same query parameters also works.",
            "body": {
              "mode": "urlencoded",
              "urlencoded": [
                {
                  "key": "to",
                  "value": "+2348012345678",
                  "description": "numbers, separated by comma, semicolon or new line (max 100)",
                  "type": "text",
                  "disabled": false
                },
                {
                  "key": "message",
                  "value": "Hello from Postman",
                  "description": "the text (max 5000 characters)",
                  "type": "text",
                  "disabled": false
                },
                {
                  "key": "sim",
                  "value": "0",
                  "description": "SIM slot: 0 (default), 1 or 2",
                  "type": "text",
                  "disabled": false
                },
                {
                  "key": "store",
                  "value": "true",
                  "description": "true keeps a copy in the phone's Sent box; false does not",
                  "type": "text",
                  "disabled": false
                }
              ]
            }
          },
          "response": [
            {
              "originalRequest": {
                "method": "POST",
                "header": [],
                "url": {
                  "raw": "{{phoneUrl}}/api/dev/sms/send",
                  "host": [
                    "{{phoneUrl}}"
                  ],
                  "path": [
                    "api",
                    "dev",
                    "sms",
                    "send"
                  ]
                },
                "description": "Sends right away from the phone (max 100 numbers, 5000 characters). GET with the same query parameters also works.",
                "body": {
                  "mode": "urlencoded",
                  "urlencoded": [
                    {
                      "key": "to",
                      "value": "+2348012345678",
                      "description": "numbers, separated by comma, semicolon or new line (max 100)",
                      "type": "text",
                      "disabled": false
                    },
                    {
                      "key": "message",
                      "value": "Hello from Postman",
                      "description": "the text (max 5000 characters)",
                      "type": "text",
                      "disabled": false
                    },
                    {
                      "key": "sim",
                      "value": "0",
                      "description": "SIM slot: 0 (default), 1 or 2",
                      "type": "text",
                      "disabled": false
                    },
                    {
                      "key": "store",
                      "value": "true",
                      "description": "true keeps a copy in the phone's Sent box; false does not",
                      "type": "text",
                      "disabled": false
                    }
                  ]
                }
              },
              "name": "Sent",
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"status\": \"sent\",\n  \"count\": 1,\n  \"stored\": true\n}"
            }
          ]
        },
        {
          "name": "Contacts",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{phoneUrl}}/api/dev/contacts?offset=0&limit=100",
              "host": [
                "{{phoneUrl}}"
              ],
              "path": [
                "api",
                "dev",
                "contacts"
              ],
              "query": [
                {
                  "key": "q",
                  "value": "john",
                  "description": "search name or number",
                  "disabled": true
                },
                {
                  "key": "offset",
                  "value": "0",
                  "description": "skip this many",
                  "disabled": false
                },
                {
                  "key": "limit",
                  "value": "100",
                  "description": "max 500",
                  "disabled": false
                }
              ]
            },
            "description": "Contacts on the phone."
          },
          "response": [
            {
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{phoneUrl}}/api/dev/contacts?offset=0&limit=100",
                  "host": [
                    "{{phoneUrl}}"
                  ],
                  "path": [
                    "api",
                    "dev",
                    "contacts"
                  ],
                  "query": [
                    {
                      "key": "q",
                      "value": "john",
                      "description": "search name or number",
                      "disabled": true
                    },
                    {
                      "key": "offset",
                      "value": "0",
                      "description": "skip this many",
                      "disabled": false
                    },
                    {
                      "key": "limit",
                      "value": "100",
                      "description": "max 500",
                      "disabled": false
                    }
                  ]
                },
                "description": "Contacts on the phone."
              },
              "name": "OK",
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"total\": 12,\n  \"items\": [\n    {\n      \"id\": \"7\",\n      \"name\": \"John\",\n      \"phones\": [\n        {\n          \"number\": \"+2348012345678\",\n          \"type\": \"Mobile\"\n        }\n      ]\n    }\n  ]\n}"
            }
          ]
        },
        {
          "name": "SMS messages",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{phoneUrl}}/api/dev/sms?box=inbox&offset=0&limit=50",
              "host": [
                "{{phoneUrl}}"
              ],
              "path": [
                "api",
                "dev",
                "sms"
              ],
              "query": [
                {
                  "key": "box",
                  "value": "inbox",
                  "description": "inbox, sent, draft, outbox or all",
                  "disabled": false
                },
                {
                  "key": "thread",
                  "value": "",
                  "description": "conversation id",
                  "disabled": true
                },
                {
                  "key": "since",
                  "value": "0",
                  "description": "only newer than this time (ms)",
                  "disabled": true
                },
                {
                  "key": "offset",
                  "value": "0",
                  "description": "skip this many",
                  "disabled": false
                },
                {
                  "key": "limit",
                  "value": "50",
                  "description": "max 500",
                  "disabled": false
                }
              ]
            },
            "description": "SMS on the phone, newest first."
          },
          "response": [
            {
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{phoneUrl}}/api/dev/sms?box=inbox&offset=0&limit=50",
                  "host": [
                    "{{phoneUrl}}"
                  ],
                  "path": [
                    "api",
                    "dev",
                    "sms"
                  ],
                  "query": [
                    {
                      "key": "box",
                      "value": "inbox",
                      "description": "inbox, sent, draft, outbox or all",
                      "disabled": false
                    },
                    {
                      "key": "thread",
                      "value": "",
                      "description": "conversation id",
                      "disabled": true
                    },
                    {
                      "key": "since",
                      "value": "0",
                      "description": "only newer than this time (ms)",
                      "disabled": true
                    },
                    {
                      "key": "offset",
                      "value": "0",
                      "description": "skip this many",
                      "disabled": false
                    },
                    {
                      "key": "limit",
                      "value": "50",
                      "description": "max 500",
                      "disabled": false
                    }
                  ]
                },
                "description": "SMS on the phone, newest first."
              },
              "name": "OK",
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"count\": 1,\n  \"items\": [\n    {\n      \"id\": \"42\",\n      \"address\": \"+2348012345678\",\n      \"body\": \"Hi\",\n      \"date\": 1760000000000,\n      \"type\": 1,\n      \"incoming\": true,\n      \"read\": true,\n      \"thread\": \"3\"\n    }\n  ]\n}"
            }
          ]
        },
        {
          "name": "Polls",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{phoneUrl}}/api/dev/polls",
              "host": [
                "{{phoneUrl}}"
              ],
              "path": [
                "api",
                "dev",
                "polls"
              ]
            },
            "description": "All polls with options and vote counts."
          },
          "response": [
            {
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{phoneUrl}}/api/dev/polls",
                  "host": [
                    "{{phoneUrl}}"
                  ],
                  "path": [
                    "api",
                    "dev",
                    "polls"
                  ]
                },
                "description": "All polls with options and vote counts."
              },
              "name": "OK",
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"items\": [\n    {\n      \"id\": 1,\n      \"title\": \"Vote\",\n      \"status\": \"1\",\n      \"options\": [\n        {\n          \"name\": \"A\",\n          \"match\": \"a\",\n          \"count\": 3\n        }\n      ],\n      \"total\": 3\n    }\n  ]\n}"
            }
          ]
        },
        {
          "name": "Poll with votes",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{phoneUrl}}/api/dev/poll?id=1",
              "host": [
                "{{phoneUrl}}"
              ],
              "path": [
                "api",
                "dev",
                "poll"
              ],
              "query": [
                {
                  "key": "id",
                  "value": "1",
                  "description": "the poll id",
                  "disabled": false
                }
              ]
            },
            "description": "One poll and its last 100 votes."
          },
          "response": [
            {
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{phoneUrl}}/api/dev/poll?id=1",
                  "host": [
                    "{{phoneUrl}}"
                  ],
                  "path": [
                    "api",
                    "dev",
                    "poll"
                  ],
                  "query": [
                    {
                      "key": "id",
                      "value": "1",
                      "description": "the poll id",
                      "disabled": false
                    }
                  ]
                },
                "description": "One poll and its last 100 votes."
              },
              "name": "OK",
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"id\": 1,\n  \"title\": \"Vote\",\n  \"options\": [\n    {\n      \"name\": \"A\",\n      \"match\": \"a\",\n      \"count\": 3\n    }\n  ],\n  \"total\": 3,\n  \"votes\": [\n    {\n      \"mobile\": \"+2348012345678\",\n      \"body\": \"A\",\n      \"date\": 1760000000000\n    }\n  ]\n}"
            }
          ]
        },
        {
          "name": "Senders",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{phoneUrl}}/api/dev/senders",
              "host": [
                "{{phoneUrl}}"
              ],
              "path": [
                "api",
                "dev",
                "senders"
              ]
            },
            "description": "Senders (delivery destinations) on the phone. Credentials are never returned."
          },
          "response": [
            {
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{phoneUrl}}/api/dev/senders",
                  "host": [
                    "{{phoneUrl}}"
                  ],
                  "path": [
                    "api",
                    "dev",
                    "senders"
                  ]
                },
                "description": "Senders (delivery destinations) on the phone. Credentials are never returned."
              },
              "name": "OK",
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"items\": [\n    {\n      \"id\": \"3\",\n      \"title\": \"My webhook\",\n      \"type\": \"webhook\",\n      \"kind\": \"local\",\n      \"name\": \"Web Hook\",\n      \"status\": \"1\"\n    }\n  ]\n}"
            }
          ]
        },
        {
          "name": "Create sender",
          "description": "Create a destination a forwarder delivers to. One request per type.",
          "item": [
            {
              "name": "Webhook sender",
              "request": {
                "method": "POST",
                "header": [],
                "url": {
                  "raw": "{{phoneUrl}}/api/dev/sender/create",
                  "host": [
                    "{{phoneUrl}}"
                  ],
                  "path": [
                    "api",
                    "dev",
                    "sender",
                    "create"
                  ]
                },
                "description": "Posts each forwarded SMS to your URL.",
                "body": {
                  "mode": "urlencoded",
                  "urlencoded": [
                    {
                      "key": "type",
                      "value": "webhook",
                      "type": "text",
                      "disabled": false
                    },
                    {
                      "key": "name",
                      "value": "My server",
                      "type": "text",
                      "disabled": false
                    },
                    {
                      "key": "webServer",
                      "value": "https://example.com/hook",
                      "description": "your URL",
                      "type": "text",
                      "disabled": false
                    },
                    {
                      "key": "method",
                      "value": "POST",
                      "description": "GET or POST",
                      "type": "text",
                      "disabled": false
                    },
                    {
                      "key": "secret",
                      "value": "s3cret",
                      "description": "optional HMAC secret",
                      "type": "text",
                      "disabled": false
                    }
                  ]
                }
              },
              "response": [
                {
                  "originalRequest": {
                    "method": "POST",
                    "header": [],
                    "url": {
                      "raw": "{{phoneUrl}}/api/dev/sender/create",
                      "host": [
                        "{{phoneUrl}}"
                      ],
                      "path": [
                        "api",
                        "dev",
                        "sender",
                        "create"
                      ]
                    },
                    "description": "Posts each forwarded SMS to your URL.",
                    "body": {
                      "mode": "urlencoded",
                      "urlencoded": [
                        {
                          "key": "type",
                          "value": "webhook",
                          "type": "text",
                          "disabled": false
                        },
                        {
                          "key": "name",
                          "value": "My server",
                          "type": "text",
                          "disabled": false
                        },
                        {
                          "key": "webServer",
                          "value": "https://example.com/hook",
                          "description": "your URL",
                          "type": "text",
                          "disabled": false
                        },
                        {
                          "key": "method",
                          "value": "POST",
                          "description": "GET or POST",
                          "type": "text",
                          "disabled": false
                        },
                        {
                          "key": "secret",
                          "value": "s3cret",
                          "description": "optional HMAC secret",
                          "type": "text",
                          "disabled": false
                        }
                      ]
                    }
                  },
                  "name": "Created",
                  "status": "OK",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"status\": \"created\",\n  \"id\": 5,\n  \"type\": \"webhook\"\n}"
                }
              ]
            },
            {
              "name": "Email sender",
              "request": {
                "method": "POST",
                "header": [],
                "url": {
                  "raw": "{{phoneUrl}}/api/dev/sender/create",
                  "host": [
                    "{{phoneUrl}}"
                  ],
                  "path": [
                    "api",
                    "dev",
                    "sender",
                    "create"
                  ]
                },
                "description": "Emails each forwarded SMS through your SMTP server.",
                "body": {
                  "mode": "urlencoded",
                  "urlencoded": [
                    {
                      "key": "type",
                      "value": "email",
                      "type": "text",
                      "disabled": false
                    },
                    {
                      "key": "name",
                      "value": "Office inbox",
                      "type": "text",
                      "disabled": false
                    },
                    {
                      "key": "host",
                      "value": "smtp.example.com",
                      "type": "text",
                      "disabled": false
                    },
                    {
                      "key": "port",
                      "value": "465",
                      "type": "text",
                      "disabled": false
                    },
                    {
                      "key": "ssl",
                      "value": "true",
                      "type": "text",
                      "disabled": false
                    },
                    {
                      "key": "fromemail",
                      "value": "phone@example.com",
                      "type": "text",
                      "disabled": false
                    },
                    {
                      "key": "pwd",
                      "value": "smtp-password",
                      "type": "text",
                      "disabled": false
                    },
                    {
                      "key": "toemail",
                      "value": "me@example.com",
                      "type": "text",
                      "disabled": false
                    },
                    {
                      "key": "nickname",
                      "value": "SMSRAVE",
                      "type": "text",
                      "disabled": false
                    }
                  ]
                }
              },
              "response": [
                {
                  "originalRequest": {
                    "method": "POST",
                    "header": [],
                    "url": {
                      "raw": "{{phoneUrl}}/api/dev/sender/create",
                      "host": [
                        "{{phoneUrl}}"
                      ],
                      "path": [
                        "api",
                        "dev",
                        "sender",
                        "create"
                      ]
                    },
                    "description": "Emails each forwarded SMS through your SMTP server.",
                    "body": {
                      "mode": "urlencoded",
                      "urlencoded": [
                        {
                          "key": "type",
                          "value": "email",
                          "type": "text",
                          "disabled": false
                        },
                        {
                          "key": "name",
                          "value": "Office inbox",
                          "type": "text",
                          "disabled": false
                        },
                        {
                          "key": "host",
                          "value": "smtp.example.com",
                          "type": "text",
                          "disabled": false
                        },
                        {
                          "key": "port",
                          "value": "465",
                          "type": "text",
                          "disabled": false
                        },
                        {
                          "key": "ssl",
                          "value": "true",
                          "type": "text",
                          "disabled": false
                        },
                        {
                          "key": "fromemail",
                          "value": "phone@example.com",
                          "type": "text",
                          "disabled": false
                        },
                        {
                          "key": "pwd",
                          "value": "smtp-password",
                          "type": "text",
                          "disabled": false
                        },
                        {
                          "key": "toemail",
                          "value": "me@example.com",
                          "type": "text",
                          "disabled": false
                        },
                        {
                          "key": "nickname",
                          "value": "SMSRAVE",
                          "type": "text",
                          "disabled": false
                        }
                      ]
                    }
                  },
                  "name": "Created",
                  "status": "OK",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"status\": \"created\",\n  \"id\": 6,\n  \"type\": \"email\"\n}"
                }
              ]
            },
            {
              "name": "SMS sender",
              "request": {
                "method": "POST",
                "header": [],
                "url": {
                  "raw": "{{phoneUrl}}/api/dev/sender/create",
                  "host": [
                    "{{phoneUrl}}"
                  ],
                  "path": [
                    "api",
                    "dev",
                    "sender",
                    "create"
                  ]
                },
                "description": "Forwards by SMS to other numbers.",
                "body": {
                  "mode": "urlencoded",
                  "urlencoded": [
                    {
                      "key": "type",
                      "value": "sms",
                      "type": "text",
                      "disabled": false
                    },
                    {
                      "key": "name",
                      "value": "Forward to my other phone",
                      "type": "text",
                      "disabled": false
                    },
                    {
                      "key": "mobiles",
                      "value": "+2348098765432",
                      "description": "comma separated",
                      "type": "text",
                      "disabled": false
                    },
                    {
                      "key": "sim",
                      "value": "0",
                      "type": "text",
                      "disabled": false
                    },
                    {
                      "key": "onlyNoNetwork",
                      "value": "false",
                      "description": "only when there is no data connection",
                      "type": "text",
                      "disabled": false
                    }
                  ]
                }
              },
              "response": [
                {
                  "originalRequest": {
                    "method": "POST",
                    "header": [],
                    "url": {
                      "raw": "{{phoneUrl}}/api/dev/sender/create",
                      "host": [
                        "{{phoneUrl}}"
                      ],
                      "path": [
                        "api",
                        "dev",
                        "sender",
                        "create"
                      ]
                    },
                    "description": "Forwards by SMS to other numbers.",
                    "body": {
                      "mode": "urlencoded",
                      "urlencoded": [
                        {
                          "key": "type",
                          "value": "sms",
                          "type": "text",
                          "disabled": false
                        },
                        {
                          "key": "name",
                          "value": "Forward to my other phone",
                          "type": "text",
                          "disabled": false
                        },
                        {
                          "key": "mobiles",
                          "value": "+2348098765432",
                          "description": "comma separated",
                          "type": "text",
                          "disabled": false
                        },
                        {
                          "key": "sim",
                          "value": "0",
                          "type": "text",
                          "disabled": false
                        },
                        {
                          "key": "onlyNoNetwork",
                          "value": "false",
                          "description": "only when there is no data connection",
                          "type": "text",
                          "disabled": false
                        }
                      ]
                    }
                  },
                  "name": "Created",
                  "status": "OK",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"status\": \"created\",\n  \"id\": 7,\n  \"type\": \"sms\"\n}"
                }
              ]
            },
            {
              "name": "Bulk SMS sender",
              "request": {
                "method": "POST",
                "header": [],
                "url": {
                  "raw": "{{phoneUrl}}/api/dev/sender/create",
                  "host": [
                    "{{phoneUrl}}"
                  ],
                  "path": [
                    "api",
                    "dev",
                    "sender",
                    "create"
                  ]
                },
                "description": "Forwards to a list of numbers.",
                "body": {
                  "mode": "urlencoded",
                  "urlencoded": [
                    {
                      "key": "type",
                      "value": "bulksms",
                      "type": "text",
                      "disabled": false
                    },
                    {
                      "key": "name",
                      "value": "Team",
                      "type": "text",
                      "disabled": false
                    },
                    {
                      "key": "mobiles",
                      "value": "+2348011111111,+2348022222222",
                      "description": "comma separated",
                      "type": "text",
                      "disabled": false
                    }
                  ]
                }
              },
              "response": [
                {
                  "originalRequest": {
                    "method": "POST",
                    "header": [],
                    "url": {
                      "raw": "{{phoneUrl}}/api/dev/sender/create",
                      "host": [
                        "{{phoneUrl}}"
                      ],
                      "path": [
                        "api",
                        "dev",
                        "sender",
                        "create"
                      ]
                    },
                    "description": "Forwards to a list of numbers.",
                    "body": {
                      "mode": "urlencoded",
                      "urlencoded": [
                        {
                          "key": "type",
                          "value": "bulksms",
                          "type": "text",
                          "disabled": false
                        },
                        {
                          "key": "name",
                          "value": "Team",
                          "type": "text",
                          "disabled": false
                        },
                        {
                          "key": "mobiles",
                          "value": "+2348011111111,+2348022222222",
                          "description": "comma separated",
                          "type": "text",
                          "disabled": false
                        }
                      ]
                    }
                  },
                  "name": "Created",
                  "status": "OK",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"status\": \"created\",\n  \"id\": 8,\n  \"type\": \"bulksms\"\n}"
                }
              ]
            }
          ]
        },
        {
          "name": "Create forwarder",
          "request": {
            "method": "POST",
            "header": [],
            "url": {
              "raw": "{{phoneUrl}}/api/dev/forwarder/create",
              "host": [
                "{{phoneUrl}}"
              ],
              "path": [
                "api",
                "dev",
                "forwarder",
                "create"
              ]
            },
            "description": "When an incoming SMS matches, deliver it through a sender. Leave the match fields out to forward everything.\n\nRules: `equal`, `notequal`, `contains`, `start`, `end`.",
            "body": {
              "mode": "urlencoded",
              "urlencoded": [
                {
                  "key": "title",
                  "value": "Bank alerts",
                  "type": "text",
                  "disabled": false
                },
                {
                  "key": "senderid",
                  "value": "5",
                  "description": "id from Create sender",
                  "type": "text",
                  "disabled": false
                },
                {
                  "key": "phonematch",
                  "value": "condition",
                  "description": "all or condition",
                  "type": "text",
                  "disabled": false
                },
                {
                  "key": "phonematchrule",
                  "value": "contains",
                  "type": "text",
                  "disabled": false
                },
                {
                  "key": "phonevalue",
                  "value": "GTBANK",
                  "type": "text",
                  "disabled": false
                },
                {
                  "key": "contentmatch",
                  "value": "all",
                  "description": "all or condition",
                  "type": "text",
                  "disabled": false
                },
                {
                  "key": "contentmatchrule",
                  "value": "contains",
                  "description": "",
                  "type": "text",
                  "disabled": true
                },
                {
                  "key": "contentvalue",
                  "value": "",
                  "description": "",
                  "type": "text",
                  "disabled": true
                }
              ]
            }
          },
          "response": [
            {
              "originalRequest": {
                "method": "POST",
                "header": [],
                "url": {
                  "raw": "{{phoneUrl}}/api/dev/forwarder/create",
                  "host": [
                    "{{phoneUrl}}"
                  ],
                  "path": [
                    "api",
                    "dev",
                    "forwarder",
                    "create"
                  ]
                },
                "description": "When an incoming SMS matches, deliver it through a sender. Leave the match fields out to forward everything.\n\nRules: `equal`, `notequal`, `contains`, `start`, `end`.",
                "body": {
                  "mode": "urlencoded",
                  "urlencoded": [
                    {
                      "key": "title",
                      "value": "Bank alerts",
                      "type": "text",
                      "disabled": false
                    },
                    {
                      "key": "senderid",
                      "value": "5",
                      "description": "id from Create sender",
                      "type": "text",
                      "disabled": false
                    },
                    {
                      "key": "phonematch",
                      "value": "condition",
                      "description": "all or condition",
                      "type": "text",
                      "disabled": false
                    },
                    {
                      "key": "phonematchrule",
                      "value": "contains",
                      "type": "text",
                      "disabled": false
                    },
                    {
                      "key": "phonevalue",
                      "value": "GTBANK",
                      "type": "text",
                      "disabled": false
                    },
                    {
                      "key": "contentmatch",
                      "value": "all",
                      "description": "all or condition",
                      "type": "text",
                      "disabled": false
                    },
                    {
                      "key": "contentmatchrule",
                      "value": "contains",
                      "description": "",
                      "type": "text",
                      "disabled": true
                    },
                    {
                      "key": "contentvalue",
                      "value": "",
                      "description": "",
                      "type": "text",
                      "disabled": true
                    }
                  ]
                }
              },
              "name": "Created",
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"status\": \"created\",\n  \"id\": 9\n}"
            }
          ]
        }
      ]
    },
    {
      "name": "3. App sync API (account token)",
      "description": "The endpoints the SMSRAVE Android app uses to sync with the website. Useful for testing a server or building your own client. JSON in/out; arrays travel as JSON **strings** inside `param`, `poll`, `vote`.\n\n**Auth:** `Authorization: Bearer {{syncToken}}` (or `token` in the body). Run **Sign in** first — it saves the token.",
      "auth": {
        "type": "bearer",
        "bearer": [
          {
            "key": "token",
            "value": "{{syncToken}}",
            "type": "string"
          }
        ]
      },
      "item": [
        {
          "name": "Account",
          "item": [
            {
              "name": "Register",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/register",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "register"
                  ]
                },
                "description": "Create an account. Answers the sync token.",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"email\": \"you@example.com\",\n  \"password\": \"choose-a-password\",\n  \"name\": \"Ada\",\n  \"mobile\": \"+2348012345678\",\n  \"country\": \"NG\",\n  \"devicename\": \"Postman\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "auth": {
                  "type": "noauth"
                }
              },
              "response": [
                {
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/api/register",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "api",
                        "register"
                      ]
                    },
                    "description": "Create an account. Answers the sync token.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"email\": \"you@example.com\",\n  \"password\": \"choose-a-password\",\n  \"name\": \"Ada\",\n  \"mobile\": \"+2348012345678\",\n  \"country\": \"NG\",\n  \"devicename\": \"Postman\"\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    },
                    "auth": {
                      "type": "noauth"
                    }
                  },
                  "name": "Created",
                  "status": "OK",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"status\": 200,\n  \"token\": \"…\",\n  \"user\": {\n    \"expiry_ms\": 0,\n    \"expiry_date\": \"31/01/2020\",\n    \"plan\": \"0\",\n    \"email\": \"you@example.com\",\n    \"name\": \"Ada\",\n    \"balance\": \"0\"\n  }\n}"
                }
              ],
              "event": [
                {
                  "listen": "test",
                  "script": {
                    "type": "text/javascript",
                    "exec": [
                      "const d = pm.response.json();",
                      "if (d && d.token) { pm.collectionVariables.set('syncToken', d.token); console.log('syncToken saved'); }"
                    ]
                  }
                }
              ]
            },
            {
              "name": "Sign in",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/auth",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "auth"
                  ]
                },
                "description": "Email + password → sync token (saved to {{syncToken}} by the test script).",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"email\": \"you@example.com\",\n  \"password\": \"your-password\",\n  \"deviceid\": \"postman\",\n  \"devicename\": \"Postman\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "auth": {
                  "type": "noauth"
                }
              },
              "response": [
                {
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/api/auth",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "api",
                        "auth"
                      ]
                    },
                    "description": "Email + password → sync token (saved to {{syncToken}} by the test script).",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"email\": \"you@example.com\",\n  \"password\": \"your-password\",\n  \"deviceid\": \"postman\",\n  \"devicename\": \"Postman\"\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    },
                    "auth": {
                      "type": "noauth"
                    }
                  },
                  "name": "OK",
                  "status": "OK",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"status\": 200,\n  \"token\": \"…\",\n  \"user\": {\n    \"expiry_ms\": 1798675200000,\n    \"expiry_date\": \"31/12/2026\",\n    \"plan\": \"2\",\n    \"email\": \"you@example.com\",\n    \"name\": \"Ada\",\n    \"balance\": \"0\"\n  }\n}"
                },
                {
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/api/auth",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "api",
                        "auth"
                      ]
                    },
                    "description": "Email + password → sync token (saved to {{syncToken}} by the test script).",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"email\": \"you@example.com\",\n  \"password\": \"your-password\",\n  \"deviceid\": \"postman\",\n  \"devicename\": \"Postman\"\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    },
                    "auth": {
                      "type": "noauth"
                    }
                  },
                  "name": "Wrong password",
                  "status": "Unauthorized",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"status\": 401,\n  \"message\": \"Invalid login\"\n}"
                }
              ],
              "event": [
                {
                  "listen": "test",
                  "script": {
                    "type": "text/javascript",
                    "exec": [
                      "const d = pm.response.json();",
                      "if (d && d.token) { pm.collectionVariables.set('syncToken', d.token); console.log('syncToken saved'); }"
                    ]
                  }
                }
              ]
            },
            {
              "name": "Refresh account",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/updateac",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "updateac"
                  ]
                },
                "description": "Plan, expiry and balance; also marks the device as seen.",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"devicename\": \"Postman\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "response": [
                {
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/api/updateac",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "api",
                        "updateac"
                      ]
                    },
                    "description": "Plan, expiry and balance; also marks the device as seen.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"devicename\": \"Postman\"\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "name": "OK",
                  "status": "OK",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"status\": \"200\",\n  \"expiry_ms\": 1798675200000,\n  \"lastseen\": \"31/12/2026\",\n  \"email\": \"you@example.com\",\n  \"plan\": \"2\",\n  \"name\": \"Ada\",\n  \"balance\": \"0\"\n}"
                }
              ]
            },
            {
              "name": "Verify temporary app PIN",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/pin/verify",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "pin",
                    "verify"
                  ]
                },
                "description": "The one-time PIN from Dashboard → App PIN (valid 10 minutes, 5 tries).",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"pin\": \"123456\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "response": [
                {
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/api/pin/verify",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "api",
                        "pin",
                        "verify"
                      ]
                    },
                    "description": "The one-time PIN from Dashboard → App PIN (valid 10 minutes, 5 tries).",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"pin\": \"123456\"\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "name": "Accepted",
                  "status": "OK",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"status\": 200,\n  \"message\": \"Temporary PIN accepted. Set a new app PIN.\"\n}"
                }
              ]
            }
          ]
        },
        {
          "name": "Sync (Regular plan)",
          "item": [
            {
              "name": "Upload SMS",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/sms",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "sms"
                  ]
                },
                "description": "Upload SMS from the phone. Any SMS queued on the website comes back in `message` (a JSON string).",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"param\": \"[{\\\"id\\\":\\\"101\\\",\\\"address\\\":\\\"+2348012345678\\\",\\\"name\\\":\\\"John\\\",\\\"body\\\":\\\"Hello\\\",\\\"read\\\":\\\"1\\\",\\\"thread_id\\\":\\\"3\\\",\\\"type\\\":1,\\\"date\\\":\\\"2026-10-21 09:00:00\\\"}]\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "response": [
                {
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/api/sms",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "api",
                        "sms"
                      ]
                    },
                    "description": "Upload SMS from the phone. Any SMS queued on the website comes back in `message` (a JSON string).",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"param\": \"[{\\\"id\\\":\\\"101\\\",\\\"address\\\":\\\"+2348012345678\\\",\\\"name\\\":\\\"John\\\",\\\"body\\\":\\\"Hello\\\",\\\"read\\\":\\\"1\\\",\\\"thread_id\\\":\\\"3\\\",\\\"type\\\":1,\\\"date\\\":\\\"2026-10-21 09:00:00\\\"}]\"\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "name": "OK",
                  "status": "OK",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"status\": \"200\",\n  \"date\": \"21/10/2026 09:00:00\",\n  \"expiry_ms\": 1798675200000,\n  \"lastseen\": \"31/12/2026\",\n  \"plan\": \"2\",\n  \"message\": \"[{\\\"sender\\\":\\\"+2348098765432\\\",\\\"message\\\":\\\"Queued from the web\\\"}]\"\n}"
                }
              ]
            },
            {
              "name": "Upload contacts",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/contact",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "contact"
                  ]
                },
                "description": "`complete: \"1\"` means this is the whole address book, so missing contacts are removed.",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"param\": \"[{\\\"contactId\\\":\\\"7\\\",\\\"name\\\":\\\"John\\\",\\\"phone\\\":\\\"+2348012345678\\\"}]\",\n  \"complete\": \"1\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "response": []
            },
            {
              "name": "Upload polls & votes",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/poll",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "poll"
                  ]
                },
                "description": "Answers the highest vote id received.",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"poll\": \"[{\\\"id\\\":\\\"1\\\",\\\"title\\\":\\\"Best colour\\\",\\\"entries\\\":\\\"{\\\\\\\"Red\\\\\\\":\\\\\\\"{\\\\\\\\\\\\\\\"match\\\\\\\\\\\\\\\":\\\\\\\\\\\\\\\"red\\\\\\\\\\\\\\\",\\\\\\\\\\\\\\\"count\\\\\\\\\\\\\\\":\\\\\\\\\\\\\\\"2\\\\\\\\\\\\\\\"}\\\\\\\"}\\\",\\\"status\\\":\\\"1\\\",\\\"maxvote\\\":\\\"1\\\",\\\"vote_count\\\":\\\"2\\\",\\\"date\\\":\\\"2026-10-21 09:00:00\\\"}]\",\n  \"vote\": \"[{\\\"id\\\":\\\"55\\\",\\\"voteid\\\":\\\"1\\\",\\\"mobile\\\":\\\"+2348012345678\\\",\\\"body\\\":\\\"red\\\",\\\"status\\\":\\\"1\\\",\\\"date\\\":\\\"2026-10-21 09:05:00\\\"}]\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "response": []
            },
            {
              "name": "Pending SMS from the website",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/pendingsms",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "pendingsms"
                  ]
                },
                "description": "SMS queued on the website for the phone to send (marked sent once handed out).",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"type\": \"single\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "response": [
                {
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/api/pendingsms",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "api",
                        "pendingsms"
                      ]
                    },
                    "description": "SMS queued on the website for the phone to send (marked sent once handed out).",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"type\": \"single\"\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "name": "OK",
                  "status": "OK",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"status\": \"200\",\n  \"message\": \"[{\\\"sender\\\":\\\"+2348012345678\\\",\\\"message\\\":\\\"text\\\"}]\"\n}"
                }
              ]
            },
            {
              "name": "Download config",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/config",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "config"
                  ]
                },
                "description": "Website-created senders, forwarders, extraction rules, bulk campaigns and deletes for the phone.",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"phoneDeletes\": \"[]\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "response": []
            },
            {
              "name": "Upload config",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/config/upload",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "config",
                    "upload"
                  ]
                },
                "description": "Phone senders/rules/blocked numbers, campaign progress and deletes.",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"senders\": \"[]\",\n  \"rules\": \"[]\",\n  \"blocked\": \"[]\",\n  \"blockedComplete\": \"0\",\n  \"appliedDeletes\": \"[]\",\n  \"phoneDeletes\": \"[]\",\n  \"campaigns\": \"[]\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "response": []
            },
            {
              "name": "Pending deletes",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/pending-deletes",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "pending-deletes"
                  ]
                },
                "description": "Deletes requested on the website waiting for approval on the phone.",
                "body": {
                  "mode": "raw",
                  "raw": "{}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "response": []
            },
            {
              "name": "Resolve pending delete",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/pending-deletes/resolve",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "pending-deletes",
                    "resolve"
                  ]
                },
                "description": "`decision`: approve or reject.",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"id\": \"<pending delete id>\",\n  \"decision\": \"approve\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "response": []
            },
            {
              "name": "Caller name lookup",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/acsearch",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "acsearch"
                  ]
                },
                "description": "Name for a number from your synced contacts.",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"address\": \"+2348012345678\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "response": []
            }
          ]
        },
        {
          "name": "Restore (CSV)",
          "item": [
            {
              "name": "Contacts CSV",
              "request": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/downloadcontact",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "downloadcontact"
                  ]
                },
                "description": "All synced contacts as CSV."
              },
              "response": []
            },
            {
              "name": "SMS CSV",
              "request": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/downloadsms",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "downloadsms"
                  ]
                },
                "description": "All synced SMS as CSV."
              },
              "response": []
            },
            {
              "name": "Call log CSV",
              "request": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/api/downloadagogol",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "downloadagogol"
                  ]
                },
                "description": "All synced calls as CSV (call-log builds only)."
              },
              "response": []
            }
          ]
        },
        {
          "name": "Support",
          "item": [
            {
              "name": "Open a ticket",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/mobilesupport",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "mobilesupport"
                  ]
                },
                "description": "Token optional.",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"name\": \"Ada\",\n  \"email\": \"you@example.com\",\n  \"subject\": \"Help\",\n  \"message\": \"My question…\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "response": []
            },
            {
              "name": "My tickets",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/tickets",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "tickets"
                  ]
                },
                "description": "Your tickets with replies.",
                "body": {
                  "mode": "raw",
                  "raw": "{}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "response": []
            },
            {
              "name": "Reply to a ticket",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/ticket/reply",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "ticket",
                    "reply"
                  ]
                },
                "description": "",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"id\": \"<ticket id>\",\n  \"message\": \"Thanks!\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "response": []
            }
          ]
        },
        {
          "name": "Sender store",
          "item": [
            {
              "name": "List senders",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/fetch_sender",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "fetch_sender"
                  ]
                },
                "description": "The sender store catalogue.",
                "body": {
                  "mode": "raw",
                  "raw": "{}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "auth": {
                  "type": "noauth"
                }
              },
              "response": []
            },
            {
              "name": "Search senders",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/search_sender",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "search_sender"
                  ]
                },
                "description": "",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"search\": \"twilio\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "auth": {
                  "type": "noauth"
                }
              },
              "response": []
            },
            {
              "name": "Install sender",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/install_sender",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "install_sender"
                  ]
                },
                "description": "Paid senders need the token of an account that bought it.",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"senderid\": \"<slug>\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "response": []
            }
          ]
        },
        {
          "name": "Utilities",
          "item": [
            {
              "name": "Encrypt message",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/encrypt",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "encrypt"
                  ]
                },
                "description": "Self-destruct message: AES-256-GCM with a password-derived key.",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"message\": \"secret text\",\n  \"password\": \"pass\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "auth": {
                  "type": "noauth"
                }
              },
              "response": [],
              "event": [
                {
                  "listen": "test",
                  "script": {
                    "type": "text/javascript",
                    "exec": [
                      "const d = pm.response.json();",
                      "if (d && d.message) { pm.collectionVariables.set('encrypted', d.message); console.log('encrypted saved'); }"
                    ]
                  }
                }
              ]
            },
            {
              "name": "Decrypt message",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/api/decrypt",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "api",
                    "decrypt"
                  ]
                },
                "description": "",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"message\": \"{{encrypted}}\",\n  \"password\": \"pass\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "auth": {
                  "type": "noauth"
                }
              },
              "response": []
            }
          ]
        }
      ]
    },
    {
      "name": "4. SMS fetch URL (your server)",
      "description": "The other direction: the phone regularly POSTs to **your** URL and sends any messages you return. Use this request to test your own endpoint the way the phone calls it.\n\nYour server answers `{\"messages\": \"<JSON array as a string>\"}`; each item has `to` and `message`. Return `\"[]\"` when there is nothing to send.",
      "item": [
        {
          "name": "What the phone sends",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{smsFetchUrl}}",
              "host": [
                "{{smsFetchUrl}}"
              ],
              "path": []
            },
            "description": "Set {{smsFetchUrl}} to your endpoint.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"type\": \"sie\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{syncToken}}",
                  "type": "string"
                }
              ]
            }
          },
          "response": [
            {
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{smsFetchUrl}}",
                  "host": [
                    "{{smsFetchUrl}}"
                  ],
                  "path": []
                },
                "description": "Set {{smsFetchUrl}} to your endpoint.",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"type\": \"sie\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "auth": {
                  "type": "bearer",
                  "bearer": [
                    {
                      "key": "token",
                      "value": "{{syncToken}}",
                      "type": "string"
                    }
                  ]
                }
              },
              "name": "Your answer",
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"messages\": \"[{\\\"to\\\":\\\"+2348012345678\\\",\\\"message\\\":\\\"Hello from my server\\\"}]\"\n}"
            }
          ]
        }
      ]
    }
  ],
  "variable": [
    {
      "key": "baseUrl",
      "value": "https://smsrave.com",
      "type": "string",
      "description": "The SMSRAVE website"
    },
    {
      "key": "apiKey",
      "value": "",
      "type": "string",
      "description": "Dashboard → API access → Your API key"
    },
    {
      "key": "syncToken",
      "value": "",
      "type": "string",
      "description": "Saved by \"Sign in\", or Dashboard → API access → Account sync token"
    },
    {
      "key": "phoneUrl",
      "value": "http://192.168.1.50:8080",
      "type": "string",
      "description": "The address the phone shows when its web server is on"
    },
    {
      "key": "phoneApiKey",
      "value": "",
      "type": "string",
      "description": "Browser desktop → Developer app → Your API key"
    },
    {
      "key": "smsFetchUrl",
      "value": "https://your-server.com/sms-fetch",
      "type": "string",
      "description": "Your SMS fetch URL endpoint"
    },
    {
      "key": "encrypted",
      "value": "",
      "type": "string",
      "description": "Set by \"Encrypt message\""
    }
  ]
}
