A simple Command Line Interface that allows you to authenticate with the Pindo API.
Project description
pindo-cli
Installation
Install from PyPi using pip, a package manager for Python.
pip install pindo-cli
Don't have pip installed? Try installing it, by running this from the command line:
$ curl https://raw.github.com/pypa/pip/master/contrib/get-pip.py | python
python setup.py install
You may need to run the above commands with sudo.
Getting Started
Once you have installed Pindo CLI you're ready to go.
pindo --help
Usage: pindo [OPTIONS] COMMAND [ARGS]...
Pindo CLI
A simple Command Line Interface that allows you to authenticate with the Pindo API
https://www.pindo.io
Options:
--debug / --no-debug
-v, --version Show the version and exit.
--help Show this message and exit.
Commands:
balance Get account balance
org Organization
refresh-token Refresh a Token.
register Create a new Pindo account.
sms Send a test message
token Request a token for using Pindo API.
- Send a test message
pindo sms --help
Usage: pindo sms [OPTIONS]
Send a test message
Options:
--token TEXT API Token
--to TEXT Receiver phone number (+250xxxxxx)
--text TEXT Message to send
--sender TEXT Sender name
--help Show this message and exit.
API Response Code
| Code | Text | Meaning |
|---|---|---|
| 201 | sent | Successfully sent |
| 401 | unauthorized | unauthorized access |
| 404 | not found | invalid resource URI |
| 409 | conflict | number is from unsupported country |
| 409 | conflict | number is from unsupported telco |
| 409 | conflict | Wrong phone number format |
- An example of a successfully sent SMS.
{
"count": 1,
"remaining_balance": 3.11,
"sms_id":"1058918",
"self_url": "https://api.pindo.io/v1/sms/1058918",
"sms_items": [
{
"id": 1062502,
"item_price": 0.01,
"network": "63510",
"remaining_balance": 3.11,
"status": "sent",
"to": "+250785000000"
}
]
}
- Pindo Webhook Event example
POSTmethods
{
"status": "DELIVRD",
"sms_id": 1058918,
"modified_at": "24-07-2020, 23:35:32",
"retries_count": 0
}
SMS API Usage
The pindo api needs your Token. You can either pass the token directly to the constructor (see the code below) or via environment variables.
# cURL
curl -X POST \
https://api.pindo.io/v1/sms/ \
-H 'Accept: */*' \
-H 'Authorization: Bearer your-token' \
-H 'Content-Type: application/json' \
-d '{
"to" : "+250781234567",
"text" : "Hello from Pindo",
"sender" : "Pindo"
}'
# python
import requests
token='your-token'
headers = {'Authorization': 'Bearer ' + token}
data = {'to' : '+250781234567', 'text' : 'Hello from Pindo', 'sender' : 'Pindo'}
url = 'https://api.pindo.io/v1/sms/'
response = requests.post(url, json=data, headers=headers)
print(response)
print(response.json())
// NodeJS
var request = require("request");
data = { to: "+250781234567", text: "Hello from Pindo", sender: "Pindo" };
var options = {
method: "POST",
body: data,
json: true,
url: "https://api.pindo.io/v1/sms/",
headers: {
Authorization: "Bearer your-token"
}
};
function callback(error, response, body) {
if (!error && response.statusCode == 200) {
console.log(body);
}
}
//call the request
request(options, callback);
// Java
OkHttpClient client = new OkHttpClient();
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{"to" : "+250781234567", "text" : "Hello from Pindo","sender" : "Pindo"}");
Request request = new Request.Builder()
.url("https://api.pindo.io/v1/sms/")
.post(body)
.addHeader("Content-Type", "application/json")
.addHeader("Authorization", "Bearer your-token")
.build();
Response response = client.newCall(request).execute();
// PHP
$request = new HttpRequest();
$request->setUrl('https://api.pindo.io/v1/sms/');
$request->setMethod(HTTP_METH_POST);
$request->setHeaders(array(
'Authorization' => 'Bearer your-token',
'Content-Type' => 'application/json'
));
$request->setBody('{
"to" : "+250781234567",
"text" : "Hello from Pindo",
"sender" : "Pindo"
}');
try {
$response = $request->send();
echo $response->getBody();
} catch (HttpException $ex) {
echo $ex;
}
// cURL
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => "https://api.pindo.io/v1/sms/",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS =>"{\n\t\"to\" : \"+250781234567\",\n\t\"text\" : \"Test SMS.\",\n\t\"sender\" : \"Pindo\"\n}",
CURLOPT_HTTPHEADER => array(
"Authorization: Bearer token",
"Content-Type: application/json"
),
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
// GO
package main
import (
"fmt"
"strings"
"net/http"
"io/ioutil"
)
func main() {
url := "https://api.pindo.io/v1/sms/"
payload := strings.NewReader("{"to" : "+250781234567", "text" : "Hello from Pindo","sender" : "Pindo"}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
req.Header.Add("Authorization", "Bearer your-token")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := ioutil.ReadAll(res.Body)
fmt.Println(res)
fmt.Println(string(body))
}
// C#
var client = new RestClient("https://api.pindo.io/v1/sms/");
var request = new RestRequest(Method.POST);
request.AddHeader("Authorization", "Bearer your-token");
request.AddHeader("Content-Type", "application/json");
request.AddParameter("undefined", "{\n\t\"to\" : \"+250781234567\", \n\t\"text\" : \"Hello from Pindo\",\n\t\"sender\" : \"Pindo\"\n}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
# ruby
require 'net/http'
require 'json'
require 'uri'
data = { to: '+250781234567', text: 'Hello from Pindo', sender: 'Pindo' };
uri = URI('https://api.pindo.io/v1/sms/')
http = Net::HTTP.new(uri.host, uri.port)
req = Net::HTTP::Post.new(uri)
req['Authorization'] = 'Bearer your-token'
req['Content-Type'] = 'application/json'
req.body = data.to_json
http.request(req)
// Dart
import 'dart:convert';
import 'package:http/http.dart' as http;
Future main() async {
String url = 'https://api.pindo.io/v1/sms/';
Map<String, String> data = {
'to': '+250781234567',
'text': 'Hello from Pindo',
'sender': 'Pindo'
};
Map<String, String> headers = {
'Authorization': 'Bearer your-token',
'Content-Type': 'application/json'
};
http.Response response = await http.post(
url,
body: jsonEncode(data),
headers: headers,
);
print(response.statusCode);
print(jsonDecode(response.body));
}
Verify API Usage
PindoVerfiy API lets you send a PIN to a user's phone and validate that they received it. PindoVerfiy can be used for a number of authentication and anti-fraud purposes, such as 2-factor authentication, password-less sign-in, and validating users’ phone numbers.
- An example of a successfully generated PIN.
{
"message": "success",
"network": "63510",
"remaining_balance": 487.49,
"request_id": 4
}
- An example of a successfully verified PIN.
{
"message": "success",
"remaining_balance": 487.49,
"request_id": 4
}
- Generate a PIN.
# python
import requests
import json
url = "https://api.pindo.io/v1/verify"
payload = json.dumps({
"brand": "Pindo",
"number": "+250781234567"
})
headers = {
'Authorization': 'Bearer your-token',
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.json())
// NodeJS
var request = require('request');
var options = {
'method': 'POST',
'url': 'https://api.pindo.io/v1/verify',
'headers': {
'Authorization': 'Bearer your-token',
'Content-Type': 'application/json'
},
body: JSON.stringify({
"brand": "Pindo",
"number": "+250781234567"
})
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
// Java
OkHttpClient client = new OkHttpClient().newBuilder()
.build();
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\n \"brand\":\"Pindo\",\n \"number\":\"+250781234567\"\n}\n");
Request request = new Request.Builder()
.url("https://api.pindo.io/v1/verify")
.method("POST", body)
.addHeader("Authorization", "Bearer your-token")
.addHeader("Content-Type", "application/json")
.build();
Response response = client.newCall(request).execute();
// PHP
<?php
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => 'https://api.pindo.io/v1/verify',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_POSTFIELDS =>'{
"brand":"Pindo",
"number":"+250781234567"
}
',
CURLOPT_HTTPHEADER => array(
'Authorization: Bearer your-token',
'Content-Type: application/json'
),
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
- Verify a PIN
// NodeJS
var request = require('request');
var options = {
'method': 'POST',
'url': 'https://api.pindo.io/v1/verify/check',
'headers': {
'Authorization': 'Bearer your-token',
'Content-Type': 'application/json'
},
body: JSON.stringify({
"code": "752623",
"request_id": 4
})
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
- Check PIN status
// NodeJS
var request = require('request');
var options = {
'method': 'GET',
'url': 'https://api.pindo.io/v1/verify/status/:request_id',
'headers': {
'Authorization': 'Bearer your-token'
}
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
- Cancel a PIN
// NodeJS
var request = require('request');
var options = {
'method': 'PUT',
'url': 'https://api.pindo.io/v1/verify/cancel/:request_id',
'headers': {
'Authorization': 'Bearer your-token'
}
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file pindo-cli-0.2.1.tar.gz.
File metadata
- Download URL: pindo-cli-0.2.1.tar.gz
- Upload date:
- Size: 11.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.7.1 importlib_metadata/4.10.1 pkginfo/1.8.2 requests/2.27.1 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.9.10
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
86ab7fa06b7df8ee312e1e4d58c37071edf4bb43287bcab1b5a26b92f164bfdb
|
|
| MD5 |
393d52dea2daaf8461f7b71f95d07422
|
|
| BLAKE2b-256 |
76950f2ea41b50faea6410819d6f3ff28f19cbe213b1345e3122c3b033fa0b0a
|
File details
Details for the file pindo_cli-0.2.1-py3-none-any.whl.
File metadata
- Download URL: pindo_cli-0.2.1-py3-none-any.whl
- Upload date:
- Size: 8.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.7.1 importlib_metadata/4.10.1 pkginfo/1.8.2 requests/2.27.1 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.9.10
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
82d374f98f89ff79068d8e4a97f0934381b660be3308d2c5ac35bbc87fbea6ba
|
|
| MD5 |
8dff6fa2b9b2f673aec1a9c120b501d9
|
|
| BLAKE2b-256 |
80a21b4a06cf1dcbcb07d138680393dd3452cfc6979fda28c7af9cd99fe7ded7
|