> For the complete documentation index, see [llms.txt](https://panaceamobile.gitbook.io/panacea-mobile-help-centre/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://panaceamobile.gitbook.io/panacea-mobile-help-centre/developers/https-api/examples/php/php-api-library.md).

# PHP API Library

```php
<?php

class PanaceaApi {

    var $url = "http://eu-api.panaceamobile.com/json";

	var $curl = false;

	var $debug = true;

	var $error = null;

	var $username = null;

	var $password = null;

	var $performActionsImmediately = true;

	var $queuedActions = array();

	function __construct() {
		$ver = explode(".", phpversion());
		if(($ver[0] >= 5)) {
			$this->debug("Version OK ".implode(".", $ver));
			if(!function_exists('json_decode') || !function_exists('json_encode')) {
				$this->debug("You need the json_encode and json_decode functions to use this Class, JSON is available in PHP 5.2.0 and up for alternatives please see http://json.org");
				$this->debug("Your PHP version is ".implode(".", $ver)." ".__FILE__);
				die();
			}
		} else {
			$this->debug("You need at least PHP 5 to use this Class ".__FILE__);
			die();
		}
	}

	function debug($str, $nl = true) {
		if($this->debug) {
			echo $str;
			if($nl) {
				echo "\n";
			}
		}
	}

	function call_api($url) {
		if(function_exists('curl_init')) {
			if($this->curl === FALSE) {
				$this->curl = curl_init();
			} else {
				curl_close($this->curl);
				$this->curl = curl_init();
			}
			curl_setopt($this->curl, CURLOPT_HEADER, 1);
			curl_setopt($this->curl, CURLOPT_URL, $url);
			curl_setopt($this->curl, CURLOPT_RETURNTRANSFER, 1);
			curl_setopt($this->curl, CURLINFO_HEADER_OUT, true);
			curl_setopt($this->curl, CURLOPT_HTTPHEADER, array("Connection: keep-alive"));
				
			$result = curl_exec($this->curl);
				
			$size = curl_getinfo($this->curl, CURLINFO_HEADER_SIZE);
			$request_headers = curl_getinfo($this->curl, CURLINFO_HEADER_OUT);
			$response_headers = substr($result, 0, $size);
			$result = substr($result, $size);
				
			$this->debug("--- HTTP Request trace --- ");
			$this->debug($request_headers, false);
			$this->debug($response_headers, false);
			$this->debug($result);
				

				
			if($result !== FALSE) {
				return json_decode($result, true);
			}
			return false;
		} else {
			$this->debug("You need cURL to use this API Library");
		}

		return FALSE;
	}

	function call_api_action($method, $params, $authenticate = true) {
		if($this->performActionsImmediately) {
			$url = $this->url."?action=".urlencode($method->getName());
			if($authenticate) {
				if(!is_null($this->password) && !is_null($this->username)) {
					$url .= "&username=".urlencode($this->username);
					$url .= "&password=".urlencode($this->password);
				} else {
					$this->debug("You need to specify your username and password using setUsername() and setPassword()");
					return FALSE;
				}
			}
			$parameters = $method->getParameters();
			for($i=0;$i<count($params);$i++) {
				if(!is_null($params[$i])) {
					$url .= "&".urlencode($parameters[$i]->getName())."=".urlencode($params[$i]);
				}
			}
				
			return $this->call_api($url);
		} else {
			if(is_null($this->username) || is_null($this->password)) {
				$this->debug("You need to specify your username and password using setUsername() and setPassword() to perform bulk actions");
				return FALSE;
			}
			$action = array(
				'command' => $method->getName(),
				'params' => array()
			);
				
			$parameters = $method->getParameters();
			for($i=0;$i<count($params);$i++) {
				$action['params'][$parameters[$i]->getName()] = $params[$i];
			}
				
			$this->queuedActions[] = $action;
				
			return TRUE;
		}
	}

	function execute_multiple() {
		if(function_exists('curl_init')) {
			if($this->curl === FALSE) {
				$this->curl = curl_init();
			} else {
				curl_close($this->curl);
				$this->curl = curl_init();
			}
				
			$url = $this->url . "?action=execute_multiple";
			$url .= "&username=".urlencode($this->username);
			$url .= "&password=".urlencode($this->password);
				
			curl_setopt($this->curl, CURLOPT_HEADER, 1);
			curl_setopt($this->curl, CURLOPT_URL, $url);
			curl_setopt($this->curl, CURLOPT_RETURNTRANSFER, 1);
			curl_setopt($this->curl, CURLINFO_HEADER_OUT, true);
			curl_setopt($this->curl, CURLOPT_POST, 1);
			curl_setopt($this->curl, CURLOPT_POSTFIELDS, "data=".urlencode(json_encode($this->queuedActions)));
			curl_setopt($this->curl, CURLOPT_HTTPHEADER, array("Connection: keep-alive"));
				
			$result = curl_exec($this->curl);
				
			$size = curl_getinfo($this->curl, CURLINFO_HEADER_SIZE);
			$request_headers = curl_getinfo($this->curl, CURLINFO_HEADER_OUT);
			$response_headers = substr($result, 0, $size);
			$result = substr($result, $size);
				
			$this->debug("--- HTTP Request trace --- ");
			$this->debug($request_headers,false);
			$this->debug("\n");
			$this->debug($response_headers, false);
			$this->debug($result);

				
			if($result !== FALSE) {
				return json_decode($result, true);
			}
			return false;
		} else {
			$this->debug("You need cURL to use this API Library");
		}
		return FALSE;
	}

	function setUsername($username) {
		$this->username = $username;
	}

	function setPassword($password) {
		$this->password = $password;
	}

	function performActionsImmediately($state) {
		$this->performActionsImmediately = $state;
	}

	function message_send($to, $text, $from = null, $report_mask = 19, $report_url = null, $charset = null, $data_coding = null, $message_class = -1, $auto_detect_encoding = null) {
		$args = func_get_args();
		return $this->call_api_action(new ReflectionMethod(__CLASS__, __FUNCTION__), $args);
	}

	function message_status($message_id) {
		$args = func_get_args();
		return $this->call_api_action(new ReflectionMethod(__CLASS__, __FUNCTION__), $args);
	}

	function user_get_balance() {
		$args = func_get_args();
		return $this->call_api_action(new ReflectionMethod(__CLASS__, __FUNCTION__), $args);
	}

	function batches_list() {
		$args = func_get_args();
		return $this->call_api_action(new ReflectionMethod(__CLASS__, __FUNCTION__), $args);
	}

	function batch_start($batch_id) {
		$args = func_get_args();
		return $this->call_api_action(new ReflectionMethod(__CLASS__, __FUNCTION__), $args);
	}

	function batch_stop($batch_id) {
		$args = func_get_args();
		return $this->call_api_action(new ReflectionMethod(__CLASS__, __FUNCTION__), $args);
	}

	function batch_check_status($batch_id) {
		$args = func_get_args();
		return $this->call_api_action(new ReflectionMethod(__CLASS__, __FUNCTION__), $args);
	}
	
	function address_book_groups_get_list() {
		$args = func_get_args();
		return $this->call_api_action(new ReflectionMethod(__CLASS__, __FUNCTION__), $args);
	}
	
	function address_book_group_add($name) {
		$args = func_get_args();
		return $this->call_api_action(new ReflectionMethod(__CLASS__, __FUNCTION__), $args);
	}
	
	function address_book_group_delete($group_id) {
		$args = func_get_args();
		return $this->call_api_action(new ReflectionMethod(__CLASS__, __FUNCTION__), $args);
	}
	
	function address_book_contacts_get_list($group_id) {
		$args = func_get_args();
		return $this->call_api_action(new ReflectionMethod(__CLASS__, __FUNCTION__), $args);
	}
	
	function address_book_contact_add($group_id, $phone_number, $first_name = null, $last_name = null) {
		$args = func_get_args();
		return $this->call_api_action(new ReflectionMethod(__CLASS__, __FUNCTION__), $args);
	}
	
	function address_book_contact_delete($contact_id) {
		$args = func_get_args();
		return $this->call_api_action(new ReflectionMethod(__CLASS__, __FUNCTION__), $args);
	}
	
	function address_book_contact_update($contact_id, $phone_number = null, $first_name = null, $last_name = null) {
		$args = func_get_args();
		return $this->call_api_action(new ReflectionMethod(__CLASS__, __FUNCTION__), $args);
	}
	
	function user_authorize_application($application_name, $icon_url = null, $return_url = null) {
		$args = func_get_args();
		return $this->call_api_action(new ReflectionMethod(__CLASS__, __FUNCTION__), $args, false);
	}
	
	function user_get_api_key($request_key) {
		$args = func_get_args();
		return $this->call_api_action(new ReflectionMethod(__CLASS__, __FUNCTION__), $args, false);
	}
	
    function route_check_price($to) {
        $args = func_get_args();
        return $this->call_api_action(new ReflectionMethod(__CLASS__, __FUNCTION__), $args);
    }

	function batch_create($name, $file, $throughput = 0, $filter = false, $file_type = 'csv', $start_time = null) {
		/* This function has special requirements in terms of streaming raw data, hence it calls the API directly */
		if(function_exists('curl_init')) {
			if($this->curl === FALSE) {
				$this->curl = curl_init();
			} else {
				curl_close($this->curl);
				$this->curl = curl_init();
			}
			
				
			if(!file_exists($file)) {
				$this->debug("File {$file} does not exist");
				return FALSE;
			}
				
			if($file_type != 'zip') {
				$data = "data=".urlencode(file_get_contents($file));
			} else {
				$data = "data=".urlencode(base64_encode(file_get_contents($file)));
			}
				
			$url = $this->url . "?action=batch_create";
			$url .= "&username=".urlencode($this->username);
			$url .= "&password=".urlencode($this->password);
			$url .= "&name=".urlencode($name);
			$url .= "&file_type=".urlencode($file_type);
			$url .= "&filter=".($filter ? 'true' : 'false');
			$url .= "&throughput=".$throughput;
			
			if(!is_null($start_time)) {
				$url .= "&start_time=".urlencode($start_time);
			}
				
			curl_setopt($this->curl, CURLOPT_HEADER, 1);
			curl_setopt($this->curl, CURLOPT_URL, $url);
			curl_setopt($this->curl, CURLOPT_RETURNTRANSFER, 1);
			curl_setopt($this->curl, CURLINFO_HEADER_OUT, true);
			curl_setopt($this->curl, CURLOPT_HTTPHEADER, array("Connection: keep-alive"));
			curl_setopt($this->curl, CURLOPT_POST, 1);
			curl_setopt($this->curl, CURLOPT_POSTFIELDS, $data);
				
			$result = curl_exec($this->curl);
				
			$size = curl_getinfo($this->curl, CURLINFO_HEADER_SIZE);
			$request_headers = curl_getinfo($this->curl, CURLINFO_HEADER_OUT);
			$response_headers = substr($result, 0, $size);
			$result = substr($result, $size);
				
			$this->debug("--- HTTP Request trace --- ");
			$this->debug($request_headers, false);
			$this->debug($response_headers, false);
			$this->debug($result);
				

				
			if($result !== FALSE) {
				return json_decode($result, true);
			}
			return false;
		} else {
			$this->debug("You need cURL to use this API Library");
		}
		return false;

	}

	function ok($result) {
		if(is_array($result)) {
			if(array_key_exists('status', $result)) {
				if($result['status'] >= 0) {
					return TRUE;
				}
				$this->error = $result['message'];
			}
		} else {
			if($result === TRUE) {
				$this->error = "Command queued";
				return TRUE;
			}
			$this->error = "Error communicating with API";
		}
		return FALSE;
	}

	function getError() {
		return $this->error;
	}
}


```


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://panaceamobile.gitbook.io/panacea-mobile-help-centre/developers/https-api/examples/php/php-api-library.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
