$wgDBname<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://www.cablefree.net/support/radio/software/index.php?action=history&amp;feed=atom&amp;title=API_command_notes</id>
	<title>API command notes - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://www.cablefree.net/support/radio/software/index.php?action=history&amp;feed=atom&amp;title=API_command_notes"/>
	<link rel="alternate" type="text/html" href="https://www.cablefree.net/support/radio/software/index.php?title=API_command_notes&amp;action=history"/>
	<updated>2026-04-19T03:29:58Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.37.3</generator>
	<entry>
		<id>https://www.cablefree.net/support/radio/software/index.php?title=API_command_notes&amp;diff=804&amp;oldid=prev</id>
		<title>Administrator: Created page with &quot;==Summary==  This page contains some information about details of API commands, examples or use-cases. For more detailed information refer to API.  {{ Note|Till version 4....&quot;</title>
		<link rel="alternate" type="text/html" href="https://www.cablefree.net/support/radio/software/index.php?title=API_command_notes&amp;diff=804&amp;oldid=prev"/>
		<updated>2015-12-10T10:22:45Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;==Summary==  This page contains some information about details of API commands, examples or use-cases. For more detailed information refer to &lt;a href=&quot;/support/radio/software/index.php/API&quot; class=&quot;mw-redirect&quot; title=&quot;API&quot;&gt;API&lt;/a&gt;.  {{ Note|Till version 4....&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;==Summary==&lt;br /&gt;
&lt;br /&gt;
This page contains some information about details of API commands, examples or use-cases. For more detailed information refer to [[API]]. &lt;br /&gt;
{{ Note|Till version 4.6  including API logins where shown as winbox logins. Since 4.7 this behaviour is changed and API logins will be correctly recognised and displayed as API logins. }}&lt;br /&gt;
&lt;br /&gt;
==General information about API sentences==&lt;br /&gt;
Communication with router through API is done using &amp;#039;&amp;#039;&amp;#039;API sentences&amp;#039;&amp;#039;&amp;#039; that consist of &amp;#039;&amp;#039;&amp;#039;API command&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;attributes&amp;#039;&amp;#039;&amp;#039;. API [[API#Queries | queries]] are considered special command attribute, for example &amp;#039;&amp;#039;&amp;#039;command tags&amp;#039;&amp;#039;&amp;#039;. In each sentence can only be &amp;#039;&amp;#039;&amp;#039;one command&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;many attributes&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
====Command====&lt;br /&gt;
API command is command as it is available from CLI (or special API command like &amp;#039;getall&amp;#039;). Command syntax is derived from CLI and includes CLI path to and command itself.&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&lt;br /&gt;
 /ip address print&lt;br /&gt;
&lt;br /&gt;
API command derived from this CLI command will be:&lt;br /&gt;
&lt;br /&gt;
 /ip/address/print&lt;br /&gt;
&lt;br /&gt;
in this case, /ip/address/ is path and print is command itself, but, since &amp;#039;&amp;#039;print&amp;#039;&amp;#039; or command on its own does not have meaning, path+command is considered to be command as that determines what to do exactly.&lt;br /&gt;
&lt;br /&gt;
====Attributes====&lt;br /&gt;
======CLI Attributes======&lt;br /&gt;
Each API sentence can have attributes. Full attribute list can be acquired from CLI using &amp;#039;&amp;#039;?&amp;#039;&amp;#039; or double &amp;#039;&amp;#039;Tab&amp;#039;&amp;#039; key.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
First, what command we are going to use?&lt;br /&gt;
In CLI we will examine /ip address add command.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
What attributes command has?&lt;br /&gt;
result of &amp;#039;&amp;#039;?&amp;#039;&amp;#039; &lt;br /&gt;
&lt;br /&gt;
 [admin@CableFree] &amp;gt; ip address add &lt;br /&gt;
 Creates new item with specified property values.&lt;br /&gt;
 &lt;br /&gt;
 address -- Local IP address&lt;br /&gt;
 broadcast -- Broadcast address&lt;br /&gt;
 comment -- Short description of the item&lt;br /&gt;
 copy-from -- Item number&lt;br /&gt;
 disabled -- Defines whether item is ignored or used&lt;br /&gt;
 interface -- Interface name&lt;br /&gt;
 netmask -- Network mask&lt;br /&gt;
 network -- Network prefix&lt;br /&gt;
&lt;br /&gt;
result of double &amp;#039;&amp;#039;Tab&amp;#039;&amp;#039;&lt;br /&gt;
 [admin@CableFree] &amp;gt; ip address add   &lt;br /&gt;
 broadcast  comment  copy-from  disabled  netmask  network  address  interface&lt;br /&gt;
&lt;br /&gt;
{{ Note|Not all attributes will have full or precise description in CLI, but all attributes will have precise and full description of values accepted by attribute }}&lt;br /&gt;
&lt;br /&gt;
Building API sentence:&lt;br /&gt;
 /ip/address/add&lt;br /&gt;
 =address=192.168.88.1/24&lt;br /&gt;
 =interface=ether1&lt;br /&gt;
&lt;br /&gt;
Result of execution of this command will be IP address added on interface ether1 same as in CLI.&lt;br /&gt;
&lt;br /&gt;
{{ Note|If command in CLI does not have named attribute using &amp;#039;&amp;#039;?&amp;#039;&amp;#039; key you can get required attribute name. Atribute that is not named will appear in between &amp;lt;&amp;gt; }}&lt;br /&gt;
======API attributes======&lt;br /&gt;
&lt;br /&gt;
API has some special attributes, that are not available through CLI, or are not available through CLI directly. These atributes starts with dot. For example .id, that gives identification number of the item, whilst these can be seen in CLI (returned by find) ID is not directly shown with the item.&lt;br /&gt;
&lt;br /&gt;
======API command attributes ======&lt;br /&gt;
All attributes of command starts with equals sigh, whilst special case for API attribute to command itself. Like &amp;#039;&amp;#039;&amp;#039;.tag&amp;#039;&amp;#039;&amp;#039; attribute that is not part of any command, but can be used to identify returned data of command executed.&lt;br /&gt;
&lt;br /&gt;
====Atributes without value====&lt;br /&gt;
Commands in RadioOS have attributes that does not have any value set, If these attributes are used it just indicates that they should be used, and value, if any is given will be ignored.&lt;br /&gt;
&lt;br /&gt;
For example, indicate that we will follow IP address changes:&lt;br /&gt;
 /ip/address/print&lt;br /&gt;
 =follow=&lt;br /&gt;
&lt;br /&gt;
See the equals marks surrounding &amp;#039;&amp;#039;follow&amp;#039;&amp;#039; - they should be there as attribute should be between them.&lt;br /&gt;
&lt;br /&gt;
====API sentence structure====&lt;br /&gt;
API sentence should be sent in very specific form. About precise descriptions please see [[API]]. If you are not going to write your own API implementations or, you do not understand exactly how it should be created, here is the explanation:&lt;br /&gt;
* API sentence can consist of several lines (or words);&lt;br /&gt;
* when sent to router each word have to have a prefix, that have to be made in a specific way encoding length of the word;&lt;br /&gt;
* last word in API sentence have to be zero terminated (have to contain byte set to all zeros). Also, if sentence only contains one word, it has to be zero terminated, or else router will wait for further words in that sentence, and all other words will be counted as words from same sentence, not new sentence.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
All this boils down to this, where &amp;#039;&amp;#039;XX&amp;#039;&amp;#039; is encoded word legth, &amp;#039;&amp;#039;aaaa&amp;#039;&amp;#039; is word and &amp;#039;&amp;#039;0x00&amp;#039;&amp;#039; is terminating zero&lt;br /&gt;
single line sentence&lt;br /&gt;
 XXaaaa0x00&lt;br /&gt;
&lt;br /&gt;
multiple line sentence&lt;br /&gt;
 XXaaaa&lt;br /&gt;
 XXaaaa0x00&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
 XXaaaa&lt;br /&gt;
 XXaaaa&lt;br /&gt;
 XXaaaa0x00&lt;br /&gt;
&lt;br /&gt;
{{ Note|Usually API implementations takes care of &amp;#039;&amp;#039;encoding word length&amp;#039;&amp;#039; part and user only have to worry to make sure that correct method/function is used to send words over to router and make sure words make meaningful sentence for execution }}&lt;br /&gt;
&lt;br /&gt;
====Scripting and API====&lt;br /&gt;
It is possible to access RadioOS scripting global variables through the API if user have enough permissions to read this menu.&lt;br /&gt;
 /system/script/environment&lt;br /&gt;
&lt;br /&gt;
Users are able to remove or alter value of the variable. Keep in mind, that variable type is automatically determined by scripting engine. Be aware that variable type can change while you are working with it.&lt;br /&gt;
&lt;br /&gt;
Also, no other scripting constructs are available in API (:if, :for etc.)&lt;br /&gt;
{{ Note|Through API it is not possible to create new variables}}&lt;br /&gt;
{{ Note|Find command have many constructs that are part of scripting, thus not available through API}}&lt;br /&gt;
&lt;br /&gt;
====API login====&lt;br /&gt;
since RadioOS 4.7 it is possible to monitor all API connections to RadioOS under &amp;#039;&amp;#039;/user active&amp;#039;&amp;#039; menu in console (or corresponding menu in winbox). Same way that can be done for telnet, ssh, winbox and webfig logins.&lt;br /&gt;
&lt;br /&gt;
====!fatal====&lt;br /&gt;
!fatal can be received only in cases when API is closing connection:&lt;br /&gt;
* too many commands are sent to router prior login&lt;br /&gt;
* there is error in authentication that is not recoerable&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;/quit&amp;#039;&amp;#039;&amp;#039; command is sent to router. Response looks like this:&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; /quit&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;&amp;lt;&amp;lt; !fatal&lt;br /&gt;
 &amp;lt;&amp;lt;&amp;lt; session terminated on request&lt;br /&gt;
&lt;br /&gt;
==CLI commands that are not in API==&lt;br /&gt;
some commands are not available in API when compared with CLI, these include interactive commands and scripting commands&lt;br /&gt;
====Interactive commands====&lt;br /&gt;
interactive command examples that will not work in API are:&lt;br /&gt;
  /system telnet&lt;br /&gt;
&lt;br /&gt;
  /system ssh&lt;br /&gt;
&lt;br /&gt;
  /tool mac-telnet&lt;br /&gt;
&lt;br /&gt;
====Scripting commands====&lt;br /&gt;
Any find command is not supported, use queries and proplist instead&lt;br /&gt;
 /ip adddress find&lt;br /&gt;
&lt;br /&gt;
Commands that starts with semicolon:&lt;br /&gt;
  delay  error    find  foreach  if   local    parse&lt;br /&gt;
  put  set   toarray  toid  toip6  tostr   typeof&lt;br /&gt;
  do     execute  for   global   len  nothing&lt;br /&gt;
  pick   resolve  time  tobool   toip  tonum  totime  while&lt;br /&gt;
&lt;br /&gt;
==API sentence examples==&lt;br /&gt;
Examples of use of commands&lt;br /&gt;
&lt;br /&gt;
====Addressing entries====&lt;br /&gt;
&lt;br /&gt;
In some places in API it is possible to address entries using value of &amp;#039;&amp;#039;name&amp;#039;&amp;#039; attribute as attribute &amp;#039;&amp;#039;.id&amp;#039;&amp;#039; value. Some places where ambiguity could arise this feature is not available.&lt;br /&gt;
&lt;br /&gt;
======Examples======&lt;br /&gt;
&lt;br /&gt;
setting interface name to one that already exist:&lt;br /&gt;
  /interface/set&lt;br /&gt;
  =.id=ether1&lt;br /&gt;
  =name=ether2&lt;br /&gt;
&lt;br /&gt;
will result in:&lt;br /&gt;
&lt;br /&gt;
  !trap&lt;br /&gt;
  =category=4&lt;br /&gt;
  =message=already have device with such name &lt;br /&gt;
  &lt;br /&gt;
  !done&lt;br /&gt;
&lt;br /&gt;
While adding several entries with same name as static DNS entries is completely legal, addressing entries using &amp;#039;&amp;#039;name&amp;#039;&amp;#039; value for .id is &amp;#039;&amp;#039;&amp;#039;NOT&amp;#039;&amp;#039;&amp;#039;. Entry with name=example.com address=192.168.88.1 added before.&lt;br /&gt;
&lt;br /&gt;
  /ip/dns/static/set&lt;br /&gt;
  =.id=example.com&lt;br /&gt;
  =address=3.3.3.3&lt;br /&gt;
&lt;br /&gt;
The result&lt;br /&gt;
  !trap&lt;br /&gt;
  =category=0&lt;br /&gt;
  =message=no such item&lt;br /&gt;
&lt;br /&gt;
====Monitor-traffic====&lt;br /&gt;
it is equivalent of CLI &amp;#039;&amp;#039;/interface monitor-traffic&amp;#039;&amp;#039; command&lt;br /&gt;
&lt;br /&gt;
======Details======&lt;br /&gt;
*Basic command syntax:&lt;br /&gt;
&lt;br /&gt;
 /interface/monitor-traffic&lt;br /&gt;
 =interface=&amp;lt;id1&amp;gt;,&amp;lt;id2&amp;gt;,&amp;lt;id3&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Output: replies will be sent in succession with in statistics about interface in order of IDs given in command. So, first re! will be for &amp;lt;id1&amp;gt;, second for &amp;lt;id2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Duration: command runs until interrupted with /cancel&lt;br /&gt;
&lt;br /&gt;
*planned changes: it is planned to add item identification to replies.&lt;br /&gt;
*since interfaces have name field, value from that field can be used to address interface instead of .id&lt;br /&gt;
======Example======&lt;br /&gt;
&lt;br /&gt;
*Command&lt;br /&gt;
 /interface/monitor-traffic&lt;br /&gt;
 =interface=ether1-Local,ether3-Out&lt;br /&gt;
&lt;br /&gt;
*Return&lt;br /&gt;
 !re&lt;br /&gt;
 =rx-packets-per-second=4&lt;br /&gt;
 =rx-drops-per-second=0&lt;br /&gt;
 =rx-errors-per-second=0&lt;br /&gt;
 =rx-bits-per-second=8531&lt;br /&gt;
 =tx-packets-per-second=3&lt;br /&gt;
 =tx-drops-per-second=0&lt;br /&gt;
 =tx-errors-per-second=0&lt;br /&gt;
 =tx-bits-per-second=11266&lt;br /&gt;
 &lt;br /&gt;
 !re&lt;br /&gt;
 =rx-packets-per-second=8&lt;br /&gt;
 =rx-drops-per-second=0&lt;br /&gt;
 =rx-errors-per-second=0&lt;br /&gt;
 =rx-bits-per-second=14179&lt;br /&gt;
 =tx-packets-per-second=4&lt;br /&gt;
 =tx-drops-per-second=0&lt;br /&gt;
 =tx-errors-per-second=0&lt;br /&gt;
 =tx-bits-per-second=8591&lt;br /&gt;
 &lt;br /&gt;
 !re&lt;br /&gt;
 =rx-packets-per-second=4&lt;br /&gt;
 =rx-drops-per-second=0&lt;br /&gt;
 =rx-errors-per-second=0&lt;br /&gt;
 =rx-bits-per-second=2312&lt;br /&gt;
 =tx-packets-per-second=2&lt;br /&gt;
 =tx-drops-per-second=0&lt;br /&gt;
 =tx-errors-per-second=0&lt;br /&gt;
 =tx-bits-per-second=3039&lt;br /&gt;
 &lt;br /&gt;
 !re&lt;br /&gt;
 =rx-packets-per-second=5&lt;br /&gt;
 =rx-drops-per-second=0&lt;br /&gt;
 =rx-errors-per-second=0&lt;br /&gt;
 =rx-bits-per-second=4217&lt;br /&gt;
 =tx-packets-per-second=1&lt;br /&gt;
 =tx-drops-per-second=0 &lt;br /&gt;
 =tx-errors-per-second=0&lt;br /&gt;
 =tx-bits-per-second=635&lt;br /&gt;
&lt;br /&gt;
====Ping v4.x and older====&lt;br /&gt;
it is not equivalent of ping available in CLI, but it supports same arguments and working principles are the same. Only difference is in data returned.&lt;br /&gt;
======Details======&lt;br /&gt;
*ping in API reports how many successful replies it has received. And can only be used to determine if target host is capable of replying to ICMP requests&lt;br /&gt;
*for ease of use it us suggested that it is used with count argument set to some value&lt;br /&gt;
*Ping returns only when it is interrupted or reached count limit.&lt;br /&gt;
======Example======&lt;br /&gt;
 /ping&lt;br /&gt;
 =address=192.168.88.1&lt;br /&gt;
 =count=3&lt;br /&gt;
&lt;br /&gt;
In this case ping returned after duration*count seconds, where duration was default 1 second.&lt;br /&gt;
 !done&lt;br /&gt;
 =ret=3&lt;br /&gt;
&lt;br /&gt;
====Ping v5.x and newer ====&lt;br /&gt;
it is  equivalent of ping available in CLI, but it will give report on averages every time it has result for sent ping.&lt;br /&gt;
======Details======&lt;br /&gt;
*for ease of use it us suggested that it is used with count argument set to some value&lt;br /&gt;
*Ping returns only when it is interrupted or reached count limit.&lt;br /&gt;
*Timing results are in form HH:MM:SS.sss (HH - hours; MM - minutes; SS - seconds; sss - miliseconds)&lt;br /&gt;
&lt;br /&gt;
======Example======&lt;br /&gt;
 /ping&lt;br /&gt;
 =address=192.168.88.1&lt;br /&gt;
 =count=2&lt;br /&gt;
&lt;br /&gt;
In this case ping returned after duration*count seconds, where duration was default 1 second.&lt;br /&gt;
&lt;br /&gt;
 !re&lt;br /&gt;
 =host=192.168.88.1&lt;br /&gt;
 =size=56&lt;br /&gt;
 =ttl=42&lt;br /&gt;
 =time=00:00:00.001&lt;br /&gt;
 =sent=1&lt;br /&gt;
 =received=1&lt;br /&gt;
 =packet-loss=0&lt;br /&gt;
 =min-rtt=00:00:00.001&lt;br /&gt;
 =avg-rtt=00:00:00.001&lt;br /&gt;
 =max-rtt=00:00:00.001&lt;br /&gt;
 &lt;br /&gt;
 !re&lt;br /&gt;
 =host=192.168.88.1&lt;br /&gt;
 =size=56&lt;br /&gt;
 =ttl=42&lt;br /&gt;
 =time=00:00:00.001&lt;br /&gt;
 =sent=2&lt;br /&gt;
 =received=2&lt;br /&gt;
 =packet-loss=0&lt;br /&gt;
 =min-rtt=00:00:00.001&lt;br /&gt;
 =avg-rtt=00:00:00.001&lt;br /&gt;
 =max-rtt=00:00:00.001&lt;br /&gt;
 &lt;br /&gt;
 !done&lt;br /&gt;
&lt;br /&gt;
====Cancel tagging====&lt;br /&gt;
You may cancel every previously executed task. Note however how cancel behaves with specified tag and without.&lt;br /&gt;
======Example without tag======&lt;br /&gt;
&lt;br /&gt;
Command execution.&lt;br /&gt;
&lt;br /&gt;
 /ping&lt;br /&gt;
 =address=google.com&lt;br /&gt;
&lt;br /&gt;
Reply itself.&lt;br /&gt;
&lt;br /&gt;
 !re&lt;br /&gt;
 =host=77.252.2.103&lt;br /&gt;
 =size=56&lt;br /&gt;
 =ttl=60&lt;br /&gt;
 =time=00:00:00.022&lt;br /&gt;
 =sent=1&lt;br /&gt;
 =received=1&lt;br /&gt;
 =packet-loss=0&lt;br /&gt;
 =min-rtt=00:00:00.022&lt;br /&gt;
 =avg-rtt=00:00:00.022&lt;br /&gt;
 =max-rtt=00:00:00.022&lt;br /&gt;
 &lt;br /&gt;
 !re&lt;br /&gt;
 =host=77.252.2.103&lt;br /&gt;
 =size=56&lt;br /&gt;
 =ttl=60&lt;br /&gt;
 =time=00:00:00.026&lt;br /&gt;
 =sent=2&lt;br /&gt;
 =received=2&lt;br /&gt;
 =packet-loss=0&lt;br /&gt;
 =min-rtt=00:00:00.022&lt;br /&gt;
 =avg-rtt=00:00:00.024&lt;br /&gt;
 =max-rtt=00:00:00.026&lt;br /&gt;
&lt;br /&gt;
Cancel reply. Notice 2 !done words.&lt;br /&gt;
&lt;br /&gt;
 /cancel&lt;br /&gt;
 &lt;br /&gt;
 !trap&lt;br /&gt;
 =category=2&lt;br /&gt;
 =message=interrupted&lt;br /&gt;
 &lt;br /&gt;
 !done&lt;br /&gt;
 &lt;br /&gt;
 !done&lt;br /&gt;
&lt;br /&gt;
======Example with specified tag======&lt;br /&gt;
&lt;br /&gt;
Command execution.&lt;br /&gt;
&lt;br /&gt;
 /ping&lt;br /&gt;
 =address=google.com&lt;br /&gt;
 .tag=22&lt;br /&gt;
&lt;br /&gt;
Reply itself.&lt;br /&gt;
&lt;br /&gt;
 !re&lt;br /&gt;
 =host=5.226.127.144&lt;br /&gt;
 =size=56&lt;br /&gt;
 =ttl=61&lt;br /&gt;
 =time=00:00:00.008&lt;br /&gt;
 =sent=1&lt;br /&gt;
 =received=1&lt;br /&gt;
 =packet-loss=0&lt;br /&gt;
 =min-rtt=00:00:00.008&lt;br /&gt;
 =avg-rtt=00:00:00.008&lt;br /&gt;
 =max-rtt=00:00:00.008&lt;br /&gt;
 .tag=22&lt;br /&gt;
 &lt;br /&gt;
 !re&lt;br /&gt;
 =host=5.226.127.144&lt;br /&gt;
 =size=56&lt;br /&gt;
 =ttl=61&lt;br /&gt;
 =time=00:00:00.025&lt;br /&gt;
 =sent=2&lt;br /&gt;
 =received=2&lt;br /&gt;
 =packet-loss=0&lt;br /&gt;
 =min-rtt=00:00:00.008&lt;br /&gt;
 =avg-rtt=00:00:00.016&lt;br /&gt;
 =max-rtt=00:00:00.025&lt;br /&gt;
 .tag=22&lt;br /&gt;
&lt;br /&gt;
Cancel command.&lt;br /&gt;
&lt;br /&gt;
 /cancel&lt;br /&gt;
 =tag=22&lt;br /&gt;
 .tag=1&lt;br /&gt;
 &lt;br /&gt;
 !trap&lt;br /&gt;
 =category=2&lt;br /&gt;
 =message=interrupted&lt;br /&gt;
 .tag=22&lt;br /&gt;
 &lt;br /&gt;
 !done&lt;br /&gt;
 .tag=1&lt;br /&gt;
 &lt;br /&gt;
 !done&lt;br /&gt;
 .tag=22&lt;br /&gt;
&lt;br /&gt;
======Canceling with additional errors======&lt;br /&gt;
&lt;br /&gt;
Cancel failed /tool fetch via http. 3 is that tag of /tool/fetch, 7 is a /cancel tag itself.&lt;br /&gt;
&lt;br /&gt;
 /cancel&lt;br /&gt;
 =tag=3&lt;br /&gt;
 .tag=7&lt;br /&gt;
 &lt;br /&gt;
 !trap&lt;br /&gt;
 =category=2&lt;br /&gt;
 =message=interrupted&lt;br /&gt;
 .tag=3&lt;br /&gt;
 &lt;br /&gt;
 !done&lt;br /&gt;
 .tag=7&lt;br /&gt;
 &lt;br /&gt;
 !trap&lt;br /&gt;
 =message=failure: 301 Moved Permanently&lt;br /&gt;
 .tag=3&lt;br /&gt;
 &lt;br /&gt;
 !done&lt;br /&gt;
 .tag=3&lt;br /&gt;
&lt;br /&gt;
======Conclusions======&lt;br /&gt;
As you can see in above examples, tagging sentences lets you easilly determine which command have finished.&lt;br /&gt;
Please note that every time you cancel &lt;br /&gt;
 !trap&lt;br /&gt;
 =category=2&lt;br /&gt;
 =message=interrupted&lt;br /&gt;
is generated.&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
&lt;br /&gt;
[[API]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:API]]&lt;/div&gt;</summary>
		<author><name>Administrator</name></author>
	</entry>
</feed>