{"info":{"_postman_id":"5f687b33-ea64-467e-a8a5-a80abaede4a4","name":"Fish Africa API","description":"<html><head></head><body><h2 id=\"welcome-to-the-fish-africa-api\">Welcome to the Fish Africa API</h2>\n<p><strong>Fish Africa by DLP</strong> is a powerful <strong>Communications Platform as a Service (CPaaS)</strong> designed for businesses and developers looking to connect with audiences across Africa. Whether you're building customer engagement tools, marketing platforms, or internal messaging systems, our API has you covered.</p>\n<h2 id=\"base-url\">Base URL</h2>\n<p><strong>API Endpoint:</strong> <code>https://api.letsfish.africa</code></p>\n<p>All API requests should be made to this base URL. The collection variable <code>BASE_URL</code> is pre-configured with this value.</p>\n<p>With <strong>Fish Africa</strong>, you can:</p>\n<ul>\n<li>Send <strong>SMS messages</strong> to multiple destinations across the African continent.</li>\n<li><strong>Purchase airtime</strong> and <strong>data bundles</strong> for various mobile networks.</li>\n<li>Seamlessly integrate communication and mobile value-added services into your apps and platforms.</li>\n</ul>\n<h3 id=\"why-fish-africa\">Why Fish Africa?</h3>\n<p>Our platform helps you:</p>\n<ul>\n<li>Engage your users directly through SMS and mobile top-ups.</li>\n<li>Simplify integrations with a clean, RESTful API.</li>\n<li>Reach your customers reliably and at scale.</li>\n</ul>\n<h2 id=\"authentication\">Authentication</h2>\n<p>To access the Fish Africa API, you need to authenticate every request using your <strong>App ID</strong> and <strong>App Secret</strong>. These credentials are issued to you when you create an application via the Fish Africa Developer Dashboard.</p>\n<h3 id=\"getting-your-credentials\">Getting Your Credentials</h3>\n<ol>\n<li>Log into the <a href=\"https://letsfish.africa/login\">Fish Africa Dashboard</a>.</li>\n<li>Navigate to the <strong>Settings</strong> section.</li>\n<li>Create a new app or select an existing one.</li>\n<li>Copy your <code>app_id</code> and <code>app_secret</code>.</li>\n</ol>\n<blockquote>\n<p>⚠️ Keep your credentials secure. Do not expose them in public repositories or client-side code.</p>\n</blockquote>\n<h3 id=\"authenticating-requests\">Authenticating Requests</h3>\n<p>All API requests must include an <code>Authorization</code> header with a <strong>Bearer token</strong> composed of your <code>app_id</code> and <code>app_secret</code>, joined by a period (<code>.</code>).</p>\n<h4 id=\"header-format\">Header Format</h4>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>Authorization: Bearer app_id.app_secret\n</code></pre><h4 id=\"example\">Example</h4>\n<p>If your App ID is <code>abc123</code> and your Secret is <code>xyz789</code>, then your header should be:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>Authorization: Bearer abc123.xyz789\n</code></pre><p><strong>In this Postman collection:</strong></p>\n<ol>\n<li>Update the collection variables <code>APP_ID</code> and <code>APP_SECRET</code> with your credentials from the <a href=\"https://letsfish.africa/login\">Fish Africa Dashboard</a>.</li>\n<li>The <code>BASE_URL</code> is pre-configured to <code>https://api.letsfish.africa</code>.</li>\n<li>All requests are pre-configured with authentication headers using Bearer your_app_id.your_app_secret format.</li>\n</ol>\n<h2 id=\"response-format\">Response Format</h2>\n<p>All responses follow a consistent structure:</p>\n<p><strong>Success Response:</strong></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"success\": true,\n  \"status\": 200,\n  \"message\": \"...\",\n  \"data\": {...}\n}\n</code></pre>\n<p><strong>Error Response:</strong></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"success\": false,\n  \"error\": {\n    \"status\": 400,\n    \"title\": \"...\",\n    \"detail\": \"...\"\n  }\n}\n</code></pre>\n<h2 id=\"common-patterns\">Common Patterns</h2>\n<ul>\n<li><strong>Phone numbers</strong>: International format is encouraged (e.g., <code>233241234567</code>), but local format is also accepted. Numbers not in international format will be treated as local to your account's country.</li>\n<li><strong>Timestamps</strong>: RFC3339 format (e.g., <code>2024-01-01T10:00:00Z</code>)</li>\n<li><strong>Networks</strong>: <code>mtn</code>, <code>vodafone</code>, <code>airteltigo</code></li>\n<li><strong>Status tracking</strong>: Use reference IDs returned from purchase endpoints</li>\n</ul>\n</body></html>","schema":"https://schema.getpostman.com/json/collection/v2.0.0/collection.json","toc":[],"owner":"37437663","collectionId":"5f687b33-ea64-467e-a8a5-a80abaede4a4","publishedId":"2sBXcEizjK","public":true,"customColor":{"top-bar":"FFFFFF","right-sidebar":"303030","highlight":"FF6C37"},"publishDate":"2026-02-19T16:51:48.000Z"},"item":[{"name":"Airtime","item":[{"name":"Purchase Airtime","id":"dd482a21-bd8b-462e-a42a-2a6802279d3e","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer your_app_id.your_app_secret","type":"text"},{"key":"Content-Type","value":"application/json","type":"text"}],"body":{"mode":"raw","raw":"{\n  \"amount\": 10.50,\n  \"buyer_name\": \"John Doe\",\n  \"buyer_phone\": \"233241234567\",\n  \"buyer_email\": \"buyer@example.com\",\n  \"buyer_network\": \"mtn\",\n  \"recipients\": [\n    {\n      \"amount\": 10.50,\n      \"destination\": {\n        \"phone\": \"233241234567\",\n        \"network\": \"mtn\"\n      }\n    }\n  ],\n  \"scheduled_time\": \"2024-01-01T10:00:00Z\"\n}","options":{"raw":{"language":"json"}}},"url":"https://api.letsfish.africa/v1/airtime","description":"<p>Purchase airtime for one or more recipients.</p>\n<p><strong>Request:</strong></p>\n<ul>\n<li><code>recipients</code>: Array of recipient objects with <code>amount</code> and <code>destination</code> (phone + network)</li>\n<li><code>scheduled_time</code>: Optional RFC3339 timestamp for future delivery</li>\n<li>Buyer information is optional but recommended for tracking</li>\n</ul>\n<p><strong>Response:</strong> Returns array of purchase objects with unique <code>reference</code> for each recipient. Use references to track status.</p>\n<p><strong>Example:</strong> Purchase 10 GHS airtime for MTN number <code>233241234567</code></p>\n<p><strong>Phone Number Format:</strong> International format (e.g., <code>233241234567</code>) is encouraged, but local format is also accepted. Numbers not in international format will be treated as local to your account's country.</p>\n","urlObject":{"path":["v1","airtime"],"host":["https://api.letsfish.africa"],"query":[],"variable":[]}},"response":[{"id":"42e74418-e806-4701-a22f-ff4ae67a7fc1","name":"Success - Airtime Purchase Accepted","originalRequest":{"method":"POST","header":[{"key":"Authorization","value":"Bearer your_app_id.your_app_secret"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"amount\": 10.50,\n  \"recipients\": [\n    {\n      \"amount\": 10.50,\n      \"destination\": {\n        \"phone\": \"233241234567\",\n        \"network\": \"mtn\"\n      }\n    }\n  ]\n}"},"url":"https://api.letsfish.africa/v1/airtime"},"status":"Accepted","code":202,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"success\": true,\n  \"status\": 202,\n  \"message\": \"Request accepted for processing\",\n  \"data\": [\n    {\n      \"reference\": \"airtime_ref_123456\",\n      \"number\": \"233241234567\",\n      \"network\": \"mtn\",\n      \"amount\": 10.50,\n      \"status\": \"queued\",\n      \"date_created\": \"2024-01-15T10:30:00Z\"\n    }\n  ]\n}"},{"id":"a689d774-f49c-4826-b87f-3526eb006d5a","name":"Error - Insufficient Balance","originalRequest":{"method":"POST","header":[{"key":"Authorization","value":"Bearer your_app_id.your_app_secret"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"amount\": 10.50,\n  \"recipients\": [\n    {\n      \"amount\": 10.50,\n      \"destination\": {\n        \"phone\": \"233241234567\",\n        \"network\": \"mtn\"\n      }\n    }\n  ]\n}"},"url":"https://api.letsfish.africa/v1/airtime"},"status":"Payment Required","code":402,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"success\": false,\n  \"error\": {\n    \"status\": 402,\n    \"title\": \"Insufficient balance\",\n    \"detail\": \"Your account balance is insufficient to complete this transaction. Required: 10.50, Available: 5.00\"\n  }\n}"},{"id":"32023693-2971-4994-a9f1-496263ddb773","name":"Error - Invalid Request","originalRequest":{"method":"POST","header":[{"key":"Authorization","value":"Bearer your_app_id.your_app_secret"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"amount\": 10.50\n}"},"url":"https://api.letsfish.africa/v1/airtime"},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"success\": false,\n  \"error\": {\n    \"status\": 400,\n    \"title\": \"Bad Request: there is a problem with your request\",\n    \"detail\": \"No value supplied for the 'recipients' parameter\"\n  }\n}"}],"_postman_id":"dd482a21-bd8b-462e-a42a-2a6802279d3e"},{"name":"Get Airtime Status","id":"e0e8b3d0-523b-4f47-839e-330dc137e13a","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer your_app_id.your_app_secret","type":"text"}],"url":"https://api.letsfish.africa/v1/airtime/:reference","description":"<p>Get the current status of an airtime purchase using the reference returned from the purchase endpoint.</p>\n<p><strong>Path Parameter:</strong></p>\n<ul>\n<li><code>reference</code>: The purchase reference from the purchase response</li>\n</ul>\n<p><strong>Response:</strong> Returns full purchase details including current status, amount, recipient, and timestamps.</p>\n","urlObject":{"protocol":"https","path":["v1","airtime",":reference"],"host":["api","letsfish","africa"],"query":[],"variable":[{"id":"46514b5b-6637-400f-9d0f-df336c5e4d00","description":{"content":"<p>The airtime purchase reference</p>\n","type":"text/plain"},"type":"any","value":"airtime_ref_123","key":"reference"}]}},"response":[{"id":"358fe89c-37d4-4bef-aef6-b0a65307f872","name":"Success - Airtime Status Retrieved","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer your_app_id.your_app_secret"}],"url":"https://api.letsfish.africa/v1/airtime/airtime_ref_123456"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"success\": true,\n  \"status\": 200,\n  \"message\": \"Airtime retrieved successfully\",\n  \"data\": {\n    \"status\": \"delivered\",\n    \"reference\": \"airtime_ref_123456\",\n    \"number\": \"233241234567\",\n    \"network\": \"mtn\",\n    \"amount\": 10.50,\n    \"date_created\": \"2024-01-15T10:30:00Z\"\n  }\n}"},{"id":"12643f3a-270b-4bbe-989d-b43445eaf759","name":"Error - Not Found","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer your_app_id.your_app_secret"}],"url":"https://api.letsfish.africa/v1/airtime/invalid_ref"},"status":"Not Found","code":404,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"success\": false,\n  \"error\": {\n    \"status\": 404,\n    \"title\": \"Resource not found\",\n    \"detail\": \"The requested resource was not found\"\n  }\n}"}],"_postman_id":"e0e8b3d0-523b-4f47-839e-330dc137e13a"}],"id":"712f9ae3-8d6a-4ec2-916b-39c83a5c5522","description":"<h2 id=\"airtime-services\">Airtime Services</h2>\n<p>Purchase mobile airtime for single or multiple recipients. Supports immediate and scheduled purchases.</p>\n<p><strong>Key Features:</strong></p>\n<ul>\n<li>Bulk airtime purchases</li>\n<li>Scheduled delivery</li>\n<li>Real-time status tracking</li>\n<li>Multi-network support (MTN, Vodafone, AirtelTigo)</li>\n</ul>\n<p><strong>Status Values:</strong> <code>queued</code>, <code>delivered</code>, <code>failed</code>, <code>scheduled</code>, <code>pending</code>, <code>refunded</code>, <code>review</code>, <code>dnc</code></p>\n","_postman_id":"712f9ae3-8d6a-4ec2-916b-39c83a5c5522"},{"name":"Data Bundle","item":[{"name":"Purchase Data Bundle","id":"0786d756-dc45-4212-82d3-24b262de6504","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer your_app_id.your_app_secret","type":"text"},{"key":"Content-Type","value":"application/json","type":"text"}],"body":{"mode":"raw","raw":"{\n  \"buyer_name\": \"John Doe\",\n  \"buyer_phone\": \"233241234567\",\n  \"buyer_network\": \"mtn\",\n  \"buyer_email\": \"buyer@example.com\",\n  \"recipients\": [\"233241234567\"],\n  \"network\": \"mtn\",\n  \"plan_id\": \"bundle_id_123\",\n  \"amount\": 5.00,\n  \"scheduled_time\": \"2024-01-01T10:00:00Z\",\n  \"webhook_url\": \"https://example.com/webhook\"\n}","options":{"raw":{"language":"json"}}},"url":"https://api.letsfish.africa/v1/databundle","description":"<p>Purchase data bundles for one or more recipients.</p>\n<p><strong>Request:</strong></p>\n<ul>\n<li><code>plan_id</code>: Bundle ID from the bundle list endpoint</li>\n<li><code>network</code>: Target network (mtn, vodafone, airteltigo)</li>\n<li><code>recipients</code>: Array of phone numbers (international format encouraged, local format accepted)</li>\n<li><code>amount</code>: Required for flexi bundles (MTN)</li>\n<li><code>scheduled_time</code>: Optional future delivery time</li>\n</ul>\n<p><strong>Response:</strong> Returns array of purchase objects with <code>reference</code> for status tracking.</p>\n<p><strong>Tip:</strong> Use the bundle list endpoints first to get valid <code>plan_id</code> values.</p>\n<p><strong>Phone Number Format:</strong> International format (e.g., <code>233241234567</code>) is encouraged, but local format is also accepted. Numbers not in international format will be treated as local to your account's country.</p>\n","urlObject":{"protocol":"https","path":["v1","databundle"],"host":["api","letsfish","africa"],"query":[],"variable":[]}},"response":[{"id":"328495dd-eb47-490c-bd17-9d785e9d2966","name":"Success - Data Bundle Purchase Accepted","originalRequest":{"method":"POST","header":[{"key":"Authorization","value":"Bearer your_app_id.your_app_secret"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"recipients\": [\"233241234567\"],\n  \"network\": \"mtn\",\n  \"plan_id\": \"bundle_1\",\n  \"amount\": 5.00\n}"},"url":"https://api.letsfish.africa/v1/databundle"},"status":"Accepted","code":202,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"success\": true,\n  \"status\": 202,\n  \"message\": \"Request accepted for processing\",\n  \"data\": [\n    {\n      \"recipient\": \"233241234567\",\n      \"status\": \"queued\",\n      \"reference\": \"data_ref_789012\",\n      \"volume\": \"1GB\"\n    }\n  ]\n}"},{"id":"3d4c5bb7-f515-4366-8c82-b35275f411ef","name":"Error - Invalid Bundle ID","originalRequest":{"method":"POST","header":[{"key":"Authorization","value":"Bearer your_app_id.your_app_secret"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"recipients\": [\"233241234567\"],\n  \"network\": \"mtn\",\n  \"plan_id\": \"invalid_bundle\"\n}"},"url":"https://api.letsfish.africa/v1/databundle"},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"success\": false,\n  \"error\": {\n    \"status\": 400,\n    \"title\": \"Bad Request: there is a problem with your request\",\n    \"detail\": \"Invalid bundle ID: bundle not found for the specified network\"\n  }\n}"}],"_postman_id":"0786d756-dc45-4212-82d3-24b262de6504"},{"name":"Get Data Bundle Status","id":"1fdc940c-7c53-464f-b40c-62263c1bfe17","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer your_app_id.your_app_secret","type":"text"}],"url":"https://api.letsfish.africa/v1/databundle/:reference","description":"<p>Get the current status of a data bundle purchase.</p>\n<p><strong>Path Parameter:</strong></p>\n<ul>\n<li><code>reference</code>: Purchase reference from the purchase response</li>\n</ul>\n<p><strong>Response:</strong> Includes bundle details (volume, amount), recipient info, and delivery status.</p>\n","urlObject":{"protocol":"https","path":["v1","databundle",":reference"],"host":["api","letsfish","africa"],"query":[],"variable":[{"id":"4027993e-9891-4cd7-af22-c02225a8b1a8","description":{"content":"<p>The data bundle purchase reference</p>\n","type":"text/plain"},"type":"any","value":"data_ref_123","key":"reference"}]}},"response":[{"id":"16ef0518-8a3e-43b1-99b1-ff9139b65a76","name":"Success - Data Bundle Status Retrieved","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer your_app_id.your_app_secret"}],"url":"https://api.letsfish.africa/v1/databundle/data_ref_789012"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"success\": true,\n  \"status\": 200,\n  \"message\": \"Data bundle retrieved successfully\",\n  \"data\": {\n    \"status\": \"delivered\",\n    \"reference\": \"data_ref_789012\",\n    \"recipient_phone\": \"233241234567\",\n    \"recipient_network\": \"mtn\",\n    \"amount\": 5.00,\n    \"volume\": \"1GB\",\n    \"date_created\": \"2024-01-15T10:30:00Z\"\n  }\n}"},{"id":"0365c2a3-9720-4db4-b23f-220cb9dc6d91","name":"Error - Not Found","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer your_app_id.your_app_secret"}],"url":"https://api.letsfish.africa/v1/databundle/invalid_ref"},"status":"Not Found","code":404,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"success\": false,\n  \"error\": {\n    \"status\": 404,\n    \"title\": \"Resource not found\",\n    \"detail\": \"The requested resource was not found\"\n  }\n}"}],"_postman_id":"1fdc940c-7c53-464f-b40c-62263c1bfe17"},{"name":"Get Data Bundle List by Network","id":"5cc979c6-2186-41fa-a34b-fa5d59e288cb","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer your_app_id.your_app_secret","type":"text"}],"url":"https://api.letsfish.africa/v1/databundle/network/:network","description":"<p>Get all available data bundles for a network.</p>\n<p><strong>Path Parameter:</strong></p>\n<ul>\n<li><code>network</code>: Network name (mtn, vodafone, airteltigo)</li>\n</ul>\n<p><strong>Response:</strong> Array of bundle objects with <code>id</code>, <code>name</code>, <code>volume</code>, <code>price</code>, and <code>validity</code>.</p>\n<p><strong>Use Case:</strong> Display available plans to users before purchase. Use the returned <code>id</code> as <code>plan_id</code> in purchase requests.</p>\n","urlObject":{"protocol":"https","path":["v1","databundle","network",":network"],"host":["api","letsfish","africa"],"query":[],"variable":[{"id":"836813f2-f305-4100-b3fb-35a628d8ae38","description":{"content":"<p>Network name (e.g., mtn, vodafone, airteltigo)</p>\n","type":"text/plain"},"type":"any","value":"mtn","key":"network"}]}},"response":[{"id":"14b138dd-8c6b-4a6c-b737-f55088bcf69c","name":"Success - Bundle List Retrieved","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer your_app_id.your_app_secret"}],"url":"https://api.letsfish.africa/v1/databundle/network/mtn"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"success\": true,\n  \"status\": 200,\n  \"message\": \"Bundle list retrieved successfully\",\n  \"data\": [\n    {\n      \"id\": \"bundle_1\",\n      \"name\": \"1GB Data\",\n      \"volume\": \"1GB\",\n      \"price\": \"5.00\",\n      \"validity\": \"30 days\"\n    },\n    {\n      \"id\": \"bundle_2\",\n      \"name\": \"2GB Data\",\n      \"volume\": \"2GB\",\n      \"price\": \"9.00\",\n      \"validity\": \"30 days\"\n    }\n  ]\n}"},{"id":"3fc27474-f57f-426a-9125-ce62511082a4","name":"Error - Invalid Network","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer your_app_id.your_app_secret"}],"url":"https://api.letsfish.africa/v1/databundle/network/invalid"},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"success\": false,\n  \"error\": {\n    \"status\": 400,\n    \"title\": \"Bad Request: there is a problem with your request\",\n    \"detail\": \"Invalid network: network must be one of mtn, vodafone, airteltigo\"\n  }\n}"}],"_postman_id":"5cc979c6-2186-41fa-a34b-fa5d59e288cb"},{"name":"Get Single Data Bundle","id":"9adf1ae9-149b-48ab-8754-8e42a3cf36ab","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer your_app_id.your_app_secret","type":"text"}],"url":"https://api.letsfish.africa/v1/databundle/network/:network/:bundle_id","description":"<p>Get detailed information about a specific bundle.</p>\n<p><strong>Path Parameters:</strong></p>\n<ul>\n<li><code>network</code>: Network name</li>\n<li><code>bundle_id</code>: Bundle identifier from the list endpoint</li>\n</ul>\n<p><strong>Response:</strong> Complete bundle details including pricing and validity information.</p>\n","urlObject":{"protocol":"https","path":["v1","databundle","network",":network",":bundle_id"],"host":["api","letsfish","africa"],"query":[],"variable":[{"id":"84f6702f-41cb-4954-ba8e-c2e2c1e7cfb5","description":{"content":"<p>Network name</p>\n","type":"text/plain"},"type":"any","value":"mtn","key":"network"},{"id":"1e79b560-5a8a-4cad-b01f-d9e8c981ca00","description":{"content":"<p>Bundle identifier</p>\n","type":"text/plain"},"type":"any","value":"bundle_1","key":"bundle_id"}]}},"response":[{"id":"8712db15-e2b1-405f-9e19-112a4409af64","name":"Success - Single Bundle Retrieved","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer your_app_id.your_app_secret"}],"url":"https://api.letsfish.africa/v1/databundle/network/mtn/bundle_1"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"success\": true,\n  \"status\": 200,\n  \"message\": \"Bundle retrieved successfully\",\n  \"data\": {\n    \"id\": \"bundle_1\",\n    \"name\": \"1GB Data\",\n    \"volume\": \"1GB\",\n    \"price\": \"5.00\",\n    \"validity\": \"30 days\"\n  }\n}"},{"id":"38a6180a-7dff-42e6-ba7b-6f5d70ab0d7a","name":"Error - Bundle Not Found","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer your_app_id.your_app_secret"}],"url":"https://api.letsfish.africa/v1/databundle/network/mtn/invalid_bundle"},"status":"Not Found","code":404,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"success\": false,\n  \"error\": {\n    \"status\": 404,\n    \"title\": \"Resource not found\",\n    \"detail\": \"The requested resource was not found\"\n  }\n}"}],"_postman_id":"9adf1ae9-149b-48ab-8754-8e42a3cf36ab"}],"id":"0fb5c082-d676-4075-8a60-cf0dc8dffb08","description":"<h2 id=\"data-bundle-services\">Data Bundle Services</h2>\n<p>Purchase mobile data bundles across multiple networks. Browse available plans before purchasing.</p>\n<p><strong>Key Features:</strong></p>\n<ul>\n<li>Browse bundles by network</li>\n<li>Flexible pricing (fixed and flexi bundles)</li>\n<li>Scheduled purchases</li>\n<li>Webhook notifications</li>\n</ul>\n<p><strong>Workflow:</strong></p>\n<ol>\n<li>Get available bundles → <code>GET /databundle/network/{network}</code></li>\n<li>Select bundle → <code>GET /databundle/network/{network}/{bundle_id}</code></li>\n<li>Purchase → <code>POST /databundle</code></li>\n<li>Track status → <code>GET /databundle/{reference}</code></li>\n</ol>\n","_postman_id":"0fb5c082-d676-4075-8a60-cf0dc8dffb08"},{"name":"SMS","item":[{"name":"Send SMS","id":"54ae3863-79b2-471d-a24e-62ea778b6546","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer your_app_id.your_app_secret","type":"text"},{"key":"Content-Type","value":"application/json","type":"text"}],"body":{"mode":"raw","raw":"{\n  \"campaign_name\": \"Welcome Campaign\",\n  \"campaign_type\": \"promotional\",\n  \"campaign_status\": \"active\",\n  \"sender_id\": \"MySenderID\",\n  \"message\": \"Hello, this is a test message\",\n  \"is_template\": false,\n  \"recipients\": [\"233241234567\", \"233241234568\"],\n  \"scheduled_time\": \"2024-01-01T10:00:00Z\",\n  \"webhook_url\": \"https://example.com/webhook\",\n  \"recurring\": false,\n  \"recurring_start_date\": \"2024-01-01T00:00:00Z\",\n  \"recurring_frequency\": \"daily\",\n  \"recurring_interval\": 1,\n  \"recurring_end_date\": \"2024-01-31T23:59:59Z\"\n}","options":{"raw":{"language":"json"}}},"url":"https://api.letsfish.africa/v1/sms","description":"<p>Send SMS messages to one or more recipients.</p>\n<p><strong>Request:</strong></p>\n<ul>\n<li><code>sender_id</code>: Your registered sender ID</li>\n<li><code>message</code>: Message content (max length varies by provider)</li>\n<li><code>recipients</code>: Array of phone numbers (international format encouraged, local format accepted)</li>\n<li><code>scheduled_time</code>: Optional future delivery (RFC3339)</li>\n<li><code>recurring</code>: Enable recurring campaigns with frequency/interval</li>\n</ul>\n<p><strong>Response:</strong> Array of message objects with <code>reference</code> for tracking. Each recipient gets a unique reference.</p>\n<p><strong>Campaign Fields:</strong> Use <code>campaign_name</code>, <code>campaign_type</code>, and <code>campaign_status</code> for organizing bulk sends.</p>\n<p><strong>Phone Number Format:</strong> International format (e.g., <code>233241234567</code>) is encouraged, but local format is also accepted. Numbers not in international format will be treated as local to your account's country.</p>\n","urlObject":{"protocol":"https","path":["v1","sms"],"host":["api","letsfish","africa"],"query":[],"variable":[]}},"response":[{"id":"7f8d629e-36f4-4e33-8dde-37f0c08bd5a6","name":"Success - SMS Accepted","originalRequest":{"method":"POST","header":[{"key":"Authorization","value":"Bearer your_app_id.your_app_secret"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"sender_id\": \"MySenderID\",\n  \"message\": \"Hello, this is a test message\",\n  \"recipients\": [\"233241234567\"]\n}"},"url":"https://api.letsfish.africa/v1/sms"},"status":"Accepted","code":202,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"success\": true,\n  \"status\": 202,\n  \"message\": \"Request accepted for processing\",\n  \"data\": [\n    {\n      \"recipient\": \"233241234567\",\n      \"cost\": 0.05,\n      \"reference\": \"sms_ref_345678\",\n      \"status\": \"queued\"\n    }\n  ]\n}"},{"id":"df74039d-b078-4e39-9a81-366dec36416c","name":"Error - Invalid Sender ID","originalRequest":{"method":"POST","header":[{"key":"Authorization","value":"Bearer your_app_id.your_app_secret"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"sender_id\": \"InvalidID\",\n  \"message\": \"Test\",\n  \"recipients\": [\"233241234567\"]\n}"},"url":"https://api.letsfish.africa/v1/sms"},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"success\": false,\n  \"error\": {\n    \"status\": 400,\n    \"title\": \"Bad Request: there is a problem with your request\",\n    \"detail\": \"Invalid sender ID: sender ID not found or not approved\"\n  }\n}"}],"_postman_id":"54ae3863-79b2-471d-a24e-62ea778b6546"},{"name":"Send SMS with Template","id":"d33c816e-4d6c-4374-ad44-4f2d04a3f07b","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer your_app_id.your_app_secret","type":"text"},{"key":"Content-Type","value":"application/json","type":"text"}],"body":{"mode":"raw","raw":"{\n  \"campaign_name\": \"Template Campaign\",\n  \"sender_id\": \"MySenderID\",\n  \"message\": \"Hello {{name}}, your code is {{code}}\",\n  \"recipients\": [\n    {\n      \"233241234567\": {\n        \"name\": \"John\",\n        \"code\": \"1234\"\n      }\n    }\n  ],\n  \"scheduled_time\": \"2024-01-01T10:00:00Z\",\n  \"webhook_url\": \"https://example.com/webhook\"\n}","options":{"raw":{"language":"json"}}},"url":"https://api.letsfish.africa/v1/sms/templates/send","description":"<p>Send personalized SMS using templates with variable substitution.</p>\n<p><strong>Request:</strong></p>\n<ul>\n<li><code>message</code>: Template with <code>{{variable}}</code> placeholders</li>\n<li><code>recipients</code>: Array of objects mapping phone numbers to variable values</li>\n</ul>\n<p><strong>Example:</strong></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"message\": \"Hello {{name}}, your code is {{code}}\",\n  \"recipients\": [\n    {\n      \"233241234567\": {\n        \"name\": \"John\",\n        \"code\": \"1234\"\n      }\n    }\n  ]\n}\n</code></pre>\n<p><strong>Use Case:</strong> Personalized messages like OTP codes, account updates, or notifications where each recipient needs unique content.</p>\n<p><strong>Phone Number Format:</strong> International format (e.g., <code>233241234567</code>) is encouraged, but local format is also accepted. Numbers not in international format will be treated as local to your account's country.</p>\n","urlObject":{"protocol":"https","path":["v1","sms","templates","send"],"host":["api","letsfish","africa"],"query":[],"variable":[]}},"response":[{"id":"41ecc0f8-b566-4484-b52d-4cbb5355e004","name":"Success - Template SMS Accepted","originalRequest":{"method":"POST","header":[{"key":"Authorization","value":"Bearer your_app_id.your_app_secret"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"sender_id\": \"MySenderID\",\n  \"message\": \"Hello {{name}}, your code is {{code}}\",\n  \"recipients\": [\n    {\n      \"233241234567\": {\n        \"name\": \"John\",\n        \"code\": \"1234\"\n      }\n    }\n  ]\n}"},"url":"https://api.letsfish.africa/v1/sms/templates/send"},"status":"Accepted","code":202,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"success\": true,\n  \"status\": 202,\n  \"message\": \"Request accepted for processing\",\n  \"data\": [\n    {\n      \"recipient\": \"233241234567\",\n      \"reference\": \"sms_ref_456789\",\n      \"status\": \"queued\"\n    }\n  ]\n}"},{"id":"b008bcf8-6d76-438d-866c-394b467fb28a","name":"Error - Missing Template Variables","originalRequest":{"method":"POST","header":[{"key":"Authorization","value":"Bearer your_app_id.your_app_secret"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"sender_id\": \"MySenderID\",\n  \"message\": \"Hello {{name}}\",\n  \"recipients\": [\n    {\n      \"233241234567\": {}\n    }\n  ]\n}"},"url":"https://api.letsfish.africa/v1/sms/templates/send"},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"success\": false,\n  \"error\": {\n    \"status\": 400,\n    \"title\": \"Bad Request: there is a problem with your request\",\n    \"detail\": \"Missing template variable: name is required for recipient 233241234567\"\n  }\n}"}],"_postman_id":"d33c816e-4d6c-4374-ad44-4f2d04a3f07b"},{"name":"Get SMS Status","id":"7424c20c-81e3-42a6-8c77-67d397263519","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer your_app_id.your_app_secret","type":"text"}],"url":"https://api.letsfish.africa/v1/sms/:reference","description":"<p>Get the delivery status of an SMS message.</p>\n<p><strong>Path Parameter:</strong></p>\n<ul>\n<li><code>reference</code>: Message reference from send response</li>\n</ul>\n<p><strong>Response:</strong> Includes delivery status, timestamps, cost, and recipient information.</p>\n<p><strong>Status Values:</strong> <code>queued</code>, <code>sent</code>, <code>delivered</code>, <code>failed</code>, <code>scheduled</code>, <code>pending</code></p>\n","urlObject":{"protocol":"https","path":["v1","sms",":reference"],"host":["api","letsfish","africa"],"query":[],"variable":[{"id":"567c72c3-7a4e-44e0-a15c-e851df31848f","description":{"content":"<p>The SMS reference</p>\n","type":"text/plain"},"type":"any","value":"sms_ref_123","key":"reference"}]}},"response":[{"id":"5fc1cc0d-4cba-4f91-88cd-2fc2bf1ced3f","name":"Success - SMS Status Retrieved","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer your_app_id.your_app_secret"}],"url":"https://api.letsfish.africa/v1/sms/sms_ref_345678"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"success\": true,\n  \"status\": 200,\n  \"message\": \"SMS retrieved successfully\",\n  \"data\": {\n    \"status\": \"delivered\",\n    \"reference\": \"sms_ref_345678\",\n    \"sender_id\": \"MySenderID\",\n    \"recipient\": \"233241234567\",\n    \"date_created\": \"2024-01-15T10:30:00Z\",\n    \"cost\": 0.05\n  }\n}"},{"id":"8d789baa-33c8-4c74-bc3e-f423e5e38942","name":"Error - Not Found","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer your_app_id.your_app_secret"}],"url":"https://api.letsfish.africa/v1/sms/invalid_ref"},"status":"Not Found","code":404,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"success\": false,\n  \"error\": {\n    \"status\": 404,\n    \"title\": \"Resource not found\",\n    \"detail\": \"The requested resource was not found\"\n  }\n}"}],"_postman_id":"7424c20c-81e3-42a6-8c77-67d397263519"},{"name":"Create SMS Template","id":"84f4d7d4-8a03-40d1-861f-07eb2b59e461","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer your_app_id.your_app_secret","type":"text"},{"key":"Content-Type","value":"application/json","type":"text"}],"body":{"mode":"raw","raw":"{\n  \"name\": \"Welcome Template\",\n  \"message\": \"Hello {{name}}, welcome to our service!\"\n}","options":{"raw":{"language":"json"}}},"url":"https://api.letsfish.africa/v1/sms/templates","description":"<p>Create a reusable SMS template with variable placeholders.</p>\n<p><strong>Request:</strong></p>\n<ul>\n<li><code>name</code>: Template name (for your reference)</li>\n<li><code>message</code>: Template content with <code>{{variable}}</code> syntax</li>\n</ul>\n<p><strong>Response:</strong> Template created successfully. Use template ID in subsequent template-based sends.</p>\n<p><strong>Tip:</strong> Templates are user-scoped. Create once, reuse for personalized campaigns.</p>\n","urlObject":{"protocol":"https","path":["v1","sms","templates"],"host":["api","letsfish","africa"],"query":[],"variable":[]}},"response":[{"id":"785cfeda-01b5-42f3-8a00-7ab2f269f4e9","name":"Success - Template Created","originalRequest":{"method":"POST","header":[{"key":"Authorization","value":"Bearer your_app_id.your_app_secret"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"name\": \"Welcome Template\",\n  \"message\": \"Hello {{name}}, welcome to our service!\"\n}"},"url":"https://api.letsfish.africa/v1/sms/templates"},"status":"Created","code":201,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"success\": true,\n  \"status\": 201,\n  \"message\": \"SMS template created successfully\",\n  \"data\": null\n}"},{"id":"8b389ca9-8125-40fb-95c7-f30fd4c6feea","name":"Error - Missing Template Name","originalRequest":{"method":"POST","header":[{"key":"Authorization","value":"Bearer your_app_id.your_app_secret"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"message\": \"Hello {{name}}\"\n}"},"url":"https://api.letsfish.africa/v1/sms/templates"},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"success\": false,\n  \"error\": {\n    \"status\": 400,\n    \"title\": \"Bad Request: there is a problem with your request\",\n    \"detail\": \"template name is required\"\n  }\n}"}],"_postman_id":"84f4d7d4-8a03-40d1-861f-07eb2b59e461"},{"name":"Get SMS Templates","id":"ac493dfd-7642-4e08-94cc-2582e41f827e","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer your_app_id.your_app_secret","type":"text"}],"url":"https://api.letsfish.africa/v1/sms/templates","description":"<p>List all SMS templates created by the authenticated user.</p>\n<p><strong>Response:</strong> Array of template objects with <code>id</code>, <code>name</code>, <code>message</code>, and creation date.</p>\n<p><strong>Use Case:</strong> Display available templates in your UI or retrieve template IDs for updates.</p>\n","urlObject":{"protocol":"https","path":["v1","sms","templates"],"host":["api","letsfish","africa"],"query":[],"variable":[]}},"response":[{"id":"98564a4a-4fce-4e69-b36e-5f34dabc90c1","name":"Success - Templates Retrieved","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer your_app_id.your_app_secret"}],"url":"https://api.letsfish.africa/v1/sms/templates"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"success\": true,\n  \"status\": 200,\n  \"message\": \"template retrieved successfully\",\n  \"data\": [\n    {\n      \"id\": \"template_123\",\n      \"user_id\": \"user_123\",\n      \"name\": \"Welcome Template\",\n      \"message\": \"Hello {{name}}, welcome!\",\n      \"date_created\": \"2024-01-15T10:30:00Z\"\n    }\n  ]\n}"}],"_postman_id":"ac493dfd-7642-4e08-94cc-2582e41f827e"},{"name":"Update SMS Template","id":"addc6759-8bad-492d-8ffb-254faf1f2304","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"PUT","header":[{"key":"Authorization","value":"Bearer your_app_id.your_app_secret","type":"text"},{"key":"Content-Type","value":"application/json","type":"text"}],"body":{"mode":"raw","raw":"{\n  \"name\": \"Updated Welcome Template\",\n  \"message\": \"Hello {{name}}, welcome to our updated service!\"\n}","options":{"raw":{"language":"json"}}},"url":"https://api.letsfish.africa/v1/sms/templates/:id","description":"<p>Update an existing SMS template.</p>\n<p><strong>Path Parameter:</strong></p>\n<ul>\n<li><code>id</code>: Template ID from the list endpoint</li>\n</ul>\n<p><strong>Request:</strong></p>\n<ul>\n<li><code>name</code>: Updated template name</li>\n<li><code>message</code>: Updated template content</li>\n</ul>\n<p><strong>Response:</strong> Template updated successfully. Changes apply to future sends using this template.</p>\n","urlObject":{"protocol":"https","path":["v1","sms","templates",":id"],"host":["api","letsfish","africa"],"query":[],"variable":[{"id":"95336cf8-8e02-467f-abf7-87b928d99fa3","description":{"content":"<p>Template ID</p>\n","type":"text/plain"},"type":"any","value":"template_123","key":"id"}]}},"response":[{"id":"48064695-340f-47af-8925-abd1d27d6b41","name":"Success - Template Updated","originalRequest":{"method":"PUT","header":[{"key":"Authorization","value":"Bearer your_app_id.your_app_secret"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"name\": \"Updated Welcome Template\",\n  \"message\": \"Hello {{name}}, welcome to our updated service!\"\n}"},"url":"https://api.letsfish.africa/v1/sms/templates/template_123"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"success\": true,\n  \"status\": 200,\n  \"message\": \"Template updated\",\n  \"data\": \"\"\n}"},{"id":"c530aedb-cab8-411a-97b3-1a527b200244","name":"Error - Template Not Found","originalRequest":{"method":"PUT","header":[{"key":"Authorization","value":"Bearer your_app_id.your_app_secret"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"name\": \"Updated Template\",\n  \"message\": \"Updated message\"\n}"},"url":"https://api.letsfish.africa/v1/sms/templates/invalid_id"},"status":"Not Found","code":404,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"success\": false,\n  \"error\": {\n    \"status\": 404,\n    \"title\": \"Resource not found\",\n    \"detail\": \"The requested resource was not found\"\n  }\n}"}],"_postman_id":"addc6759-8bad-492d-8ffb-254faf1f2304"},{"name":"Delete SMS Template","id":"41b47479-b52f-45f3-90c9-debf6f291ed1","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"DELETE","header":[{"key":"Authorization","value":"Bearer your_app_id.your_app_secret","type":"text"}],"url":"https://api.letsfish.africa/v1/sms/templates/:id","description":"<p>Delete an SMS template.</p>\n<p><strong>Path Parameter:</strong></p>\n<ul>\n<li><code>id</code>: Template ID to delete</li>\n</ul>\n<p><strong>Response:</strong> Template deleted successfully. This action cannot be undone.</p>\n","urlObject":{"protocol":"https","path":["v1","sms","templates",":id"],"host":["api","letsfish","africa"],"query":[],"variable":[{"id":"f338d418-b6c2-43d4-a9aa-030db2cfc30c","description":{"content":"<p>Template ID</p>\n","type":"text/plain"},"type":"any","value":"template_123","key":"id"}]}},"response":[{"id":"0e10a7d3-3c83-4dce-b447-3f54187aa9ba","name":"Success - Template Deleted","originalRequest":{"method":"DELETE","header":[{"key":"Authorization","value":"Bearer your_app_id.your_app_secret"}],"url":"https://api.letsfish.africa/v1/sms/templates/template_123"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"success\": true,\n  \"status\": 200,\n  \"message\": \"Template deleted\",\n  \"data\": null\n}"},{"id":"13ead676-ef37-4d46-9c99-63e075fbb2d1","name":"Error - Template Not Found","originalRequest":{"method":"DELETE","header":[{"key":"Authorization","value":"Bearer your_app_id.your_app_secret"}],"url":"https://api.letsfish.africa/v1/sms/templates/invalid_id"},"status":"Not Found","code":404,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"success\": false,\n  \"error\": {\n    \"status\": 404,\n    \"title\": \"Resource not found\",\n    \"detail\": \"The requested resource was not found\"\n  }\n}"}],"_postman_id":"41b47479-b52f-45f3-90c9-debf6f291ed1"}],"id":"2d4b325d-85dd-412d-b039-cb3251126db6","description":"<h2 id=\"sms-services\">SMS Services</h2>\n<p>Send SMS messages with support for templates, scheduling, and recurring campaigns.</p>\n<p><strong>Key Features:</strong></p>\n<ul>\n<li>Bulk messaging</li>\n<li>Template-based sending with variable substitution</li>\n<li>Scheduled and recurring campaigns</li>\n<li>Delivery status tracking</li>\n<li>Webhook callbacks</li>\n</ul>\n<p><strong>Template Variables:</strong> Use <code>{{variable_name}}</code> syntax in templates. Variables are replaced per recipient.</p>\n<p><strong>Campaign Types:</strong> <code>promotional</code>, <code>transactional</code></p>\n<p><strong>Status Values:</strong> <code>queued</code>, <code>sent</code>, <code>delivered</code>, <code>failed</code>, <code>scheduled</code>, <code>pending</code></p>\n","_postman_id":"2d4b325d-85dd-412d-b039-cb3251126db6"},{"name":"Telephony","item":[{"name":"Make OTP Call","id":"84551441-676b-4404-a698-3d514dd013ee","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer your_app_id.your_app_secret","type":"text"},{"key":"Content-Type","value":"application/json","type":"text"}],"body":{"mode":"raw","raw":"{\n  \"otp\": \"1234\",\n  \"phone\": \"233241234567\"\n}","options":{"raw":{"language":"json"}}},"url":"https://api.letsfish.africa/v1/voice-otp","description":"<p>Initiate an automated voice call to deliver an OTP code.</p>\n<p><strong>Request:</strong></p>\n<ul>\n<li><code>otp</code>: The OTP code to deliver (typically 4-6 digits)</li>\n<li><code>phone</code>: Recipient phone number (international format encouraged, local format accepted)</li>\n</ul>\n<p><strong>Response:</strong> Call initiated. The system will make an automated call to deliver the OTP.</p>\n<p><strong>Use Case:</strong> Alternative to SMS for OTP delivery, useful when SMS delivery is unreliable or for accessibility.</p>\n<p><strong>Phone Number Format:</strong> International format (e.g., <code>233241234567</code>) is encouraged, but local format is also accepted. Numbers not in international format will be treated as local to your account's country.</p>\n","urlObject":{"protocol":"https","path":["v1","voice-otp"],"host":["api","letsfish","africa"],"query":[],"variable":[]}},"response":[{"id":"660f6159-a72b-42ae-b641-05a3504cb5ec","name":"Success - OTP Call Initiated","originalRequest":{"method":"POST","header":[{"key":"Authorization","value":"Bearer your_app_id.your_app_secret"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"otp\": \"1234\",\n  \"phone\": \"233241234567\"\n}"},"url":"https://api.letsfish.africa/v1/voice-otp"},"status":"Accepted","code":202,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"success\": true,\n  \"status\": 202,\n  \"message\": \"A phone call will be made shortly\",\n  \"data\": null\n}"},{"id":"b7f9de08-9da0-485c-9709-74449076b9f4","name":"Error - Missing OTP","originalRequest":{"method":"POST","header":[{"key":"Authorization","value":"Bearer your_app_id.your_app_secret"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"phone\": \"233241234567\"\n}"},"url":"https://api.letsfish.africa/v1/voice-otp"},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"success\": false,\n  \"error\": {\n    \"status\": 400,\n    \"title\": \"Bad Request: there is a problem with your request\",\n    \"detail\": \"no OTP supplied\"\n  }\n}"},{"id":"f80a821a-1751-453e-a65a-d58466ad7b62","name":"Error - Invalid Phone Number","originalRequest":{"method":"POST","header":[{"key":"Authorization","value":"Bearer your_app_id.your_app_secret"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"otp\": \"1234\",\n  \"phone\": \"invalid\"\n}"},"url":"https://api.letsfish.africa/v1/voice-otp"},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"success\": false,\n  \"error\": {\n    \"status\": 400,\n    \"title\": \"Bad Request: there is a problem with your request\",\n    \"detail\": \"invalid phone number: `invalid`: invalid phone number format\"\n  }\n}"}],"_postman_id":"84551441-676b-4404-a698-3d514dd013ee"}],"id":"cebc7853-5cb5-49c7-b6ed-74f8014f5cf5","description":"<h2 id=\"telephony-services\">Telephony Services</h2>\n<p>Voice-based services including OTP delivery via automated calls.</p>\n<p><strong>Key Features:</strong></p>\n<ul>\n<li>Voice OTP delivery</li>\n<li>Automated call routing</li>\n<li>Dialplan configuration (internal)</li>\n</ul>\n<p><strong>Use Cases:</strong></p>\n<ul>\n<li>Two-factor authentication</li>\n<li>OTP verification for users without SMS access</li>\n<li>Automated voice notifications</li>\n</ul>\n","_postman_id":"cebc7853-5cb5-49c7-b6ed-74f8014f5cf5"}],"event":[{"listen":"prerequest","script":{"type":"text/javascript","packages":{},"requests":{},"exec":[""],"id":"d91613d1-8d99-425b-9892-e1773b4f77ce"}},{"listen":"test","script":{"type":"text/javascript","packages":{},"requests":{},"exec":[""],"id":"63cb1b96-4021-4057-a0e5-cd900349846a"}}],"variable":[{"key":"BASE_URL","value":"https://api.letsfish.africa"},{"key":"APP_ID","value":"your_app_id"},{"key":"APP_SECRET","value":"your_app_secret"}]}