Travula API Service

Routes

Auth

POST("/auth/sign-in")

Request Body

								

the device object is required but the fields are optional

{ "email": "example@example.com", // required "authType": "email", // required "value": "password", // required "ip": "127.0.0.1", // required "device": { "brand": "WEB", // optional "deviceName": "WEB", // optional "deviceType": "WEB", // optional "manufacturer": "N/A" // optional, "modelName": "N/A", // optional "osBuildId": "N/A", // optional "osInternalBuildId": // optional, "osName": "N/A", // optional "osVersion": "N/A", // optional "supportedCpuArchitectures": "N/A", // optional "totalMemory": 0, // optional "isDevice": false // optional } // required }
POST("/auth/sign-up")

Request Body

								
{
  "firstName": "John", // required
  "lastName": "Doe", // required
  "username": "johndoe", // required
  "email": "johndoe@example.com", // required
	"phoneNumber": "555-1234", // optional
  "countryId": "00000000-0000-0000-0000-000000000000", // required
  "visitingCountryId": "00000000-0000-0000-0000-000000000000", // required
  "password": "password123" // required
}
								
							
POST("/auth/resend-verification-code/:email")
PUT("/auth/verify-code/:email/:code")
PUT("/auth/two-factor-verify-code")

Request Body

								
{
  "email": "example@example.com", // required
  "code": "12345", // required
  "ip": "127.0.0.1", // required
  "device": {
    "brand": "WEB", // optional
    "deviceName": "WEB", // optional
    "deviceType": "WEB", // optional
    "manufacturer": "N/A" // optional,
    "modelName": "N/A", // optional
    "osBuildId": "N/A", // optional
    "osInternalBuildId":  // optional,
    "osName": "N/A", // optional
    "osVersion": "N/A", // optional
    "supportedCpuArchitectures": "N/A", // optional
    "totalMemory": 0, // optional
    "isDevice": false // optional
  } // required
}
								
							
POST("/auth/forgot-password/:email")
PUT("/auth/forgot-password/:email")

Request Body

							
{
	"email": "example@example.com", // required
	"code": "123456", // required
	"newPassword": "password123", // required
}
							
						
POST("/auth/forgot-pin/:email")
PUT("/auth/forgot-pin/:email")

Request Body

								
{
	"email": "example@example.com", // required
	"code": "123456", // required
	"newPin": "123456" // required
}
								
							
POST("/auth/refresh-token")

Request Body

							
{
	"token": "" // required
}
							
						

Users

GET("/users") OR POST("/users")

Request Header

								
{
	 "x-auth-token": "required"
}
								
							

Request Body

								
{
	"filter": "boolean | required"
	"pageNumber": 1, // required
	"batchNumber": 10, // required
	"sort": "required", // ASC | DESC
	"orderBy" :"required", // go to GET("/allowed-query/fields/users") to see accepted fields
	"groups": [{
		"filterGroupCondition":"required" // AND | OR
		"filterSearchCondition":"required" // AND | OR
		"filters": [{
			"searchCondition": "AND",
			"filterOption": "eq",
			"field": "", // go to GET("/allowed-query/fields/users") to see accepted fields
			"value": "user input",
			"dataType": "string" // string | number | bool | date | dateTime
		}]
	}]
}
								
							
GET("/users/details/:userId")

Request Header

								
{
	 "x-auth-token": "required"
}
								
							
PUT("/users/update/:userId")

Request Header

								
{
	 "x-auth-token": "required"
}
								
							

Request Body

								
{
  "firstName": "John",
  "lastName": "Doe",
  "username": "johndoe",
  "email": "johndoe@example.com",
  "address": "123 Main St",
  "phoneNumber": "555-1234",
  "countryId": "US",
  "visitingCountries": [], // array of countryId strings
  "permissions": [], // array of strings
	"twoFactorEnabled": "true | false
}
								
							
PUT("/users/change-password/:userId")

Request Header

								
{
	 "x-auth-token": "required"
}
								
							

Request Body

								
{
	"oldPassword": "required",
	"newPassword": "required"
}
								
							
PUT("/users/create-pin/:userId/:pin")

Request Header

								
{
	 "x-auth-token": "required"
}
								
							
PUT("/users/change-pin/:userId")

Request Header

								
{
	 "x-auth-token": "required"
}
								
							

Request Body

								
{
	"oldPin": "required",
	"newPin": "required"
}
								
							
PUT("/users/verify-user-id-with-veriff")

Request Header

								
{
	 "x-auth-token": "required"
}
								
							

Request Body

								
{
	"userId": "required",
	"veriffSessionId": "required"
}
								
							
DELETE("/users/:userId")

Request Header

								
{
	 "x-auth-token": "required"
}
								
							

Request Body

								
[{
	"questionId": "required",
	"answer": "required"
}]
								
							

Cards

GET("/cards") OR POST("/cards")

Request Header

								
{
	 "x-auth-token": "required"
}
								
							

Request Body

								
{
	"filter": "boolean | required"
	"pageNumber": 1, // required
	"batchNumber": 10, // required
	"sort": "required", // ASC | DESC
	"orderBy" :"required", // go to GET("/allowed-query/fields/cards") to see accepted fields
	"groups": [{
		"filterGroupCondition":"required" // AND | OR
		"filterSearchCondition":"required" // AND | OR
		"filters": [{
			"searchCondition": "AND",
			"filterOption": "eq",
			"field": "", // go to GET("/allowed-query/fields/cards") to see accepted fields
			"value": "user input",
			"dataType": "string" // string | number | bool | date | dateTime
		}]
	}]
}
								
							
GET("/cards/:cardId")

Request Header

								
{
	 "x-auth-token": "required"
}
								
							
POST("/cards/add")

Request Header

								
{
	 "x-auth-token": "required"
}
								
							

Request Body

								
{
  "countryId": "00000000-0000-0000-0000-000000000000", // required
  "userId": "123", // required
  "firstName": "John", // required
  "lastName": "Doe", // required
  "first6": "111111", // required
  "last4": "2222", // required
  "cardNumber": "1234567890123456", // required
  "expiryMonth": "12", // required
  "expiryYear": "2022", // required
  "cvv": "123", // required
  "billingAddress": {
    "line1": "123 Main St", // required
    "line2": "", // optional
    "city": "New York", // required
    "state": "NY", // required
    "postalCode": "10001", // required
    "countryId": "00000000-0000-0000-0000-000000000000" // required
  }, // required
  "cardHolderName": "John Doe", // required
  "scenario": "none", // optional "auth_pin" or "auth_pin_3ds" or "auth_3ds" or "auth_avs"
  "issuerResponses": "none" // optional "approved" or "cannot_verify_pin" or "error" or "exceeds_approval_amount_limit" or "exceeds_withdrawal_limit" or "expired_card" or "incorrect_pin" or "insufficient_funds" or "invalid_cvv" or "pick_up_card_fraud" or "stolen_card_pick_up" or "suspected_fraud" or "system_error"
}						
								
							
PUT("/cards/update/:cardId")

Request Header

								
{
	 "x-auth-token": "required"
}
								
							

Request Body

								

provide either otp, pin or address

{ "otp": { "code": "your_otp_code_here" // required }, "pin": { "pin": "your_pin_here" // required }, "avs": { "address": { "line1": "123 Main St", // required "line2": "", // optional "city": "New York", // required "state": "NY", // required "postalCode": "10001", // required "countryId": "00000000-0000-0000-0000-000000000000" // required } } "scenario": "none", // optional "auth_pin" or "auth_pin_3ds" or "auth_3ds" or "auth_avs" "issuerResponses": "none" // optional "approved" or "cannot_verify_pin" or "error" or "exceeds_approval_amount_limit" or "exceeds_withdrawal_limit" or "expired_card" or "incorrect_pin" or "insufficient_funds" or "invalid_cvv" or "pick_up_card_fraud" or "stolen_card_pick_up" or "suspected_fraud" or "system_error" }
DELETE("/cards/delete/:cardId")

Request Header

								
{
	 "x-auth-token": "required"
}
								
							

Charges

GET("/cards/charge/status/:cardTransactionId") OR POST("/cards/charge/status/:cardTransactionId")

Request Header

								
{
	 "x-auth-token": "required"
}
								
							

Request Body

								
{
  "scenario": "none", // optional "auth_pin" or "auth_pin_3ds" or "auth_3ds" or "auth_avs"
  "issuerResponses": "none" // optional "approved" or "cannot_verify_pin" or "error" or "exceeds_approval_amount_limit" or "exceeds_withdrawal_limit" or "expired_card" or "incorrect_pin" or "insufficient_funds" or "invalid_cvv" or "pick_up_card_fraud" or "stolen_card_pick_up" or "suspected_fraud" or "system_error"
}
								
							
POST("/cards/charge") or POST("/cards/charge/summary")

Request Header

								
{
	 "x-auth-token": "required"
}
								
							

Request Body

								
{
  "cardId": "00000000-0000-0000-0000-000000000000", // required
  "amount": 100, // required
  "pin": "your_pin_here", // required only for POST("/cards/charge")
  "wallet": "NGN", // required
  "scenario": "none", // optional "auth_pin" or "auth_pin_3ds" or "auth_3ds" or "auth_avs"
  "issuerResponses": "none" // optional "approved" or "cannot_verify_pin" or "error" or "exceeds_approval_amount_limit" or "exceeds_withdrawal_limit" or "expired_card" or "incorrect_pin" or "insufficient_funds" or "invalid_cvv" or "pick_up_card_fraud" or "stolen_card_pick_up" or "suspected_fraud" or "system_error"
}
								
							
PUT("/cards/charge/update/:cardTransactionId")

Request Header

								
{
	 "x-auth-token": "required"
}
								
							

Request Body

								
{
  "otp": {
    "code": "your_otp_code_here" // required
  },
  "pin": {
    "pin": "your_pin_here" // required
  },
  "avs": {
      "address": {
			  "line1": "123 Main St", // required
			  "line2": "", // optional
			  "city": "New York", // required
			  "state": "NY", // required
			  "postalCode": "10001", // required
			  "countryId": "00000000-0000-0000-0000-000000000000" // required
      }
  }
  "scenario": "none", // optional "auth_pin" or "auth_pin_3ds" or "auth_3ds" or "auth_avs"
  "issuerResponses": "none" // optional "approved" or "cannot_verify_pin" or "error" or "exceeds_approval_amount_limit" or "exceeds_withdrawal_limit" or "expired_card" or "incorrect_pin" or "insufficient_funds" or "invalid_cvv" or "pick_up_card_fraud" or "stolen_card_pick_up" or "suspected_fraud" or "system_error"
}
								
							

Card Transactions

GET("/cards/transactions") OR POST("/cards/transactions")

Request Header

								
{
	 "x-auth-token": "required"
}
								
							

Request Body

								
{
	"filter": "boolean | required"
	"pageNumber": 1, // required
	"batchNumber": 10, // required
	"sort": "required", // ASC | DESC
	"orderBy" :"required", // go to GET("/allowed-query/fields/cards/transactions") to see accepted fields
	"groups": [{
		"filterGroupCondition":"required" // AND | OR
		"filterSearchCondition":"required" // AND | OR
		"filters": [{
			"searchCondition": "AND",
			"filterOption": "eq",
			"field": "", // go to GET("/allowed-query/fields/cards/transactions") to see accepted fields
			"value": "user input",
			"dataType": "string" // string | number | bool | date | dateTime
		}]
	}]
}
								
							
GET("/cards/transactions/details/:cardTransactionId")

Request Header

								
{
	 "x-auth-token": "required"
}
								
							

Security Questions and Answers

GET("/security-questions-and-answers") OR POST("/security-questions-and-answers")

Request Header

								
{
	 "x-auth-token": "required"
}
								
							

Request Body

								
{
	"filter": "boolean | required"
	"pageNumber": 1, // required
	"batchNumber": 10, // required
	"sort": "required", // ASC | DESC
	"orderBy" :"required", // go to GET("/allowed-query/fields/security-questions-and-answers") to see accepted fields
	"groups": [{
		"filterGroupCondition":"required" // AND | OR
		"filterSearchCondition":"required" // AND | OR
		"filters": [{
			"searchCondition": "AND",
			"filterOption": "eq",
			"field": "", // go to GET("/allowed-query/fields/security-questions-and-answers") to see accepted fields
			"value": "user input",
			"dataType": "string" // string | number | bool | date | dateTime
		}]
	}]
}
								
							
GET("/security-questions-and-answers/details/:securityQuestionAndAnswerId")

Request Header

								
{
	 "x-auth-token": "required"
}
								
							
POST("/security-questions-and-answers/create")

Request Header

								
{
	 "x-auth-token": "required"
}
								
							

Request Body

								
{
	"userId": "required",
	"question": "required",
	"answer": "required"
}
								
							
PUT("/security-questions-and-answers/update/:securityQuestionAndAnswerId")

Request Header

								
{
	 "x-auth-token": "required"
}
								
							

Request Body

								
{
	"userId": "required",
	"question": "required",
	"answer": "required"
}
								
							

Charges

GET("/charges") OR POST("/charges")

Request Header

								
{
	 "x-auth-token": "required"
}
								
							

Request Body

								
{
	"filter": "boolean | required"
	"pageNumber": 1, // required
	"batchNumber": 10, // required
	"sort": "required", // ASC | DESC
	"orderBy" :"required", // go to GET("/allowed-query/fields/charges") to see accepted fields
	"groups": [{
		"filterGroupCondition":"required" // AND | OR
		"filterSearchCondition":"required" // AND | OR
		"filters": [{
			"searchCondition": "AND",
			"filterOption": "eq",
			"field": "", // go to GET("/allowed-query/fields/charges") to see accepted fields
			"value": "user input",
			"dataType": "string" // string | number | bool | date | dateTime
		}]
	}]
}
								
							
GET("/charges/details/:chargeId")

Request Header

								
{
	 "x-auth-token": "required"
}
								
							
POST("/charges/create")

Request Header

								
{
	 "x-auth-token": "required"
}
								
							

Request Body

								
{
  "CountryId": "00000000-0000-0000-0000-000000000000", // required
  "value": 0, // required
  "type": "your_type_here", // required "fixed" or "percentage"
  "startRange": 0, // required
  "endRange": 0, // required
}
								
							
POST("/charges/update/:chargeId")

Request Header

								
{
	 "x-auth-token": "required"
}
								
							

Request Body

								
{
	"CountryId": "00000000-0000-0000-0000-000000000000",
	"value": 0,
	"type": "your_type_here","fixed" or "percentage"
	"startRange": 0,
	"endRange": 0,
}
								
							
DELETE("/charges/delete/:chargeId")

Request Header

								
{
	 "x-auth-token": "required"
}
								
							

Rates

GET("/rates") OR POST("/rates")

Request Header

								
{
	 "x-auth-token": "required"
}
								
							

Request Body

								
{
	"filter": "boolean | required"
	"pageNumber": 1, // required
	"batchNumber": 10, // required
	"sort": "required", // ASC | DESC
	"orderBy" :"required", // go to GET("/allowed-query/fields/rates") to see accepted fields
	"groups": [{
		"filterGroupCondition":"required" // AND | OR
		"filterSearchCondition":"required" // AND | OR
		"filters": [{
			"searchCondition": "AND",
			"filterOption": "eq",
			"field": "", // go to GET("/allowed-query/fields/rates") to see accepted fields
			"value": "user input",
			"dataType": "string" // string | number | bool | date | dateTime
		}]
	}]
}
								
							
GET("/rates/details/:rateId")

Request Header

								
{
	 "x-auth-token": "required"
}
								
							
POST("/rates/create")

Request Header

								
{
	 "x-auth-token": "required"
}
								
							

Request Body

								
{
  "sourceCountryId": "00000000-0000-0000-0000-000000000000", // required
  "destinationCountryId": "00000000-0000-0000-0000-000000000000", // required
  "amount": 0, // required
}
								
							
PUT("/rates/update/:rateId")

Request Header

								
{
	 "x-auth-token": "required"
}
								
							

Request Body

								
{
	"sourceCountryId": "00000000-0000-0000-0000-000000000000",
	"destinationCountryId": "00000000-0000-0000-0000-000000000000",
	"amount": 0,
}
								
							
DELETE("/rates/delete/:rateId")

Request Header

								
{
	 "x-auth-token": "required"
}
								
							

Country

GET("/countries") OR POST("/countries")

Request Header

								
{
	 "x-auth-token": "required"
}
								
							

Request Body

								
{
	"filter": "boolean | required"
	"pageNumber": 1, // required
	"batchNumber": 10, // required
	"sort": "required", // ASC | DESC
	"orderBy" :"required", // go to GET("/allowed-query/fields/countries") to see accepted fields
	"groups": [{
		"filterGroupCondition":"required" // AND | OR
		"filterSearchCondition":"required" // AND | OR
		"filters": [{
			"searchCondition": "AND",
			"filterOption": "eq",
			"field": "", // go to GET("/allowed-query/fields/countries") to see accepted fields
			"value": "user input",
			"dataType": "string" // string | number | bool | date | dateTime
		}]
	}]
}
								
							
GET("/countries/details/:countryId")

Request Header

								
{
	 "x-auth-token": "required"
}
								
							
POST("/countries/create")

Request Header

								
{
	 "x-auth-token": "required"
}
								
							

Request Body

								
{
  "name": "United States", // required
  "currency": "USD", // required
  "currencyName": "dollar", // optional
  "currencySymbol": "$", // optional
  "unicodeFlag": "", // optional
  "flag": "", // optional
  "countryCode": "+1", // required
  "iso2": "US", // required
  "iso3": "USA" // required
}
								
							
PUT("/countries/update/:countryId")

Request Header

								
{
	 "x-auth-token": "required"
}
								
							

Request Body

								
{
	"name": "United States",
	"currency": "USD",
	"currencyName": "dollar",
	"currencySymbol": "$",
	"unicodeFlag": "",
	"flag": "",
	"countryCode": "+1",
	"iso2": "US",
	"iso3": "USA"
}
								
							
DELETE("/countries/delete/:countryId")

Request Header

								
{
	 "x-auth-token": "required"
}
								
							

Wallet

GET("/wallet/banks")

Request Header

								
{
	 "x-auth-token": "required"
}
								
							
GET("/wallet//beneficiary-name/:receiverAccountNumber/:bankCode")

Request Header

								
{
	 "x-auth-token": "required"
}
								
							
GET("/wallet/details/:userId")

Request Header

								
{
	 "x-auth-token": "required"
}
								
							
GET("/wallet/fetch-phone-number-network-provider/:phoneNumber")

Request Header

								
{
	 "x-auth-token": "required"
}
								
							
GET("/fetch-data-bundle/:network")

network options: "MTN" | "GLO" | "Airtel" | "9Mobile" and is case sensitive

Request Header

								
{
	 "x-auth-token": "required"
}
								
							
POST("/wallet/purchase-airtime")

Request Header

								
{
	 "x-auth-token": "required"
}
								
							

Request Body

								
{
  "phoneNumber": "08075753242", // required
  "amount": 100, // required
  "network": // required "MTN", // MTN | GLO | Airtel | 9Mobile
  "userId": "00000000-0000-0000-0000-000000000000", // required",
  "countryId": "00000000-0000-0000-0000-00000000000", // required",
  "authType": "faceId/touchId", // required faceId/touchId | pin
  "value": "" // required
}
								
							
POST("/wallet/purchase-data-bundle")

Request Header

								
{
	 "x-auth-token": "required"
}
								
							

Request Body

								
{
  "phoneNumber": "08075753242", // required
  "amount": 1000, // required
  "network": // required "MTN", // MTN | GLO | Airtel | 9Mobile
  "bouquetCode": "your_bouquet_code_here", // required
  "userId": "00000000-0000-0000-0000-00000000000", // required",
  "countryId": "00000000-0000-0000-0000-00000000000", // required",
  "authType": "faceId/touchId", // required faceId/touchId | pin
  "value": "your_value_here" // required 
}
								
							
POST("/wallet/transfer")

Request Header

								
{
	 "x-auth-token": "required"
}
								
							

Request Body

								
{
  "amount": 1000, // required
  "receiverAccountNumber": "your_receiver_account_number_here", // required
  "receiverBankName": "your_receiver_bank_name_here",
  "receiverBankCode": "your_receiver_bank_code_here",
  "userId": "00000000-0000-0000-0000-00000000000", // required",
  "countryId": "00000000-0000-0000-0000-00000000000", // required",
  "narration": "your_narration_here",
  "authType": "faceId/touchId", // required faceId/touchId | pin
  "value": "your_value_here" // required
	"saveAsBeneficiary": "boolean | optional"
}
								
							

Wallet Transactions

GET("/wallet/transactions") OR POST("/wallet/transactions")

Request Header

								
{
	 "x-auth-token": "required"
}
								
							

Request Body

								
{
	"filter": "boolean | required"
	"pageNumber": 1, // required
	"batchNumber": 10, // required
	"sort": "required", // ASC | DESC
	"orderBy" :"required", // go to GET("/allowed-query/fields/wallet/transactions") to see accepted fields
	"groups": [{
		"filterGroupCondition":"required" // AND | OR
		"filterSearchCondition":"required" // AND | OR
		"filters": [{
			"searchCondition": "AND",
			"filterOption": "eq",
			"field": "", // go to GET("/allowed-query/fields/wallet/transactions") to see accepted fields
			"value": "user input",
			"dataType": "string" // string | number | bool | date | dateTime
		}]
	}]
}
								
							
GET("/wallet/transactions/details/:transactionId")

Request Header

								
{
	 "x-auth-token": "required"
}
								
							

Recent Transfers

GET("/recent-transfers") OR POST("/recent-transfers")

Request Header

								
{
	 "x-auth-token": "required"
}
								
							

Request Body

								
{
	"filter": "boolean | required"
	"pageNumber": 1, // required
	"batchNumber": 10, // required
	"sort": "required", // ASC | DESC
	"orderBy" :"required", // go to GET("/allowed-query/fields/recent-transfers") to see accepted fields
	"groups": [{
		"filterGroupCondition":"required" // AND | OR
		"filterSearchCondition":"required" // AND | OR
		"filters": [{
			"searchCondition": "AND",
			"filterOption": "eq",
			"field": "", // go to GET("/allowed-query/fields/recent-transfers") to see accepted fields
			"value": "user input",
			"dataType": "string" // string | number | bool | date | dateTime
		}]
	}]
}
								
							
GET("/recent-transfers/details/:id")

Request Header

								
{
	 "x-auth-token": "required"
}
								
							
DELETE("/recent-transfers/delete/:id")

Request Header

								
{
	 "x-auth-token": "required"
}
								
							

Deployment

Docker

Docker is a set of platform as a service products that use OS-level virtualization to deliver software in packages called containers. The service has both free and premium tiers. The software that hosts the containers is called Docker Engine.

VPS

VPS can stand for virtual private server, which is a type of hosting service that uses virtualization technology. VPSs are virtual machines that run their own operating system and have their own dedicated resources, including CPU, RAM, storage, and bandwidth.

NGINX

Nginx is a web server that can also be used as a reverse proxy, load balancer, mail proxy and HTTP cache.

Dockerfile

A Dockerfile is a that contains instructions for building a Docker image. Docker images are used to create Docker containers, which are isolated, lightweight, and portable execution environments. Dockerfiles are made up of a series of commands, each of which tells Docker how to build the image. The commands are executed in order, and each one builds upon the previous one.

Docker Compose File

A Docker Compose file is a file that defines and runs multi-container Docker applications. With Compose, you can create a YAML file to define the services and networks for your application. Then, with a single command, you can create and start all the services from your configuration. To create a Docker Compose file, you need to define the services that make up your application. Each service is defined by a YAML block that specifies the image, ports, volumes, and other configuration options for the container.

CI/CD Pipline

The .gitlab-ci.yml file is a YAML file that defines project configuration in GitLab CI. It is placed at the root of the repository. The .gitlab-ci.yml file defines: