$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=Manual%3AAPI</id>
	<title>Manual:API - 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=Manual%3AAPI"/>
	<link rel="alternate" type="text/html" href="https://www.cablefree.net/support/radio/software/index.php?title=Manual:API&amp;action=history"/>
	<updated>2026-04-25T14:13:51Z</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=Manual:API&amp;diff=807&amp;oldid=prev</id>
		<title>Administrator: /* Queries */</title>
		<link rel="alternate" type="text/html" href="https://www.cablefree.net/support/radio/software/index.php?title=Manual:API&amp;diff=807&amp;oldid=prev"/>
		<updated>2015-12-10T13:14:47Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Queries&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 13:14, 10 December 2015&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l263&quot;&gt;Line 263:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 263:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  /ip/route/print&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  /ip/route/print&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  ?&amp;gt;comment=&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  ?&amp;gt;comment=&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;* [http://forum.CableFree.com/viewtopic.php?f=2&amp;amp;t=72298 Forum thread with detailed explanation of use of queries]&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== OID ===&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== OID ===&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Administrator</name></author>
	</entry>
	<entry>
		<id>https://www.cablefree.net/support/radio/software/index.php?title=Manual:API&amp;diff=803&amp;oldid=prev</id>
		<title>Administrator: /* External sources */</title>
		<link rel="alternate" type="text/html" href="https://www.cablefree.net/support/radio/software/index.php?title=Manual:API&amp;diff=803&amp;oldid=prev"/>
		<updated>2015-12-10T10:22:06Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;External sources&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 10:22, 10 December 2015&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l719&quot;&gt;Line 719:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 719:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;===== External sources =====&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;===== External sources =====&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;*[https://github.com/danikf/tik4net in .NET (C#)  high-level api solution] &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[http://forum.CableFree.com/viewtopic.php?f=9&amp;amp;t=99954 forum thread] &lt;/del&gt;[https://github.com/danikf/tik4net/wiki additional info] by danikf&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;*[https://github.com/danikf/tik4net in .NET (C#)  high-level api solution]  &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;*[https://sourceforge.net/projects/netRadioOS/ in PHP] by boen_robot&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;*&lt;/ins&gt;[https://github.com/danikf/tik4net/wiki additional info] by danikf&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;*[https://github.com/haakonnessjoen/libRadioOS-api in C] by Håkon Nessjøen&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;*[https://github.com/GideonLeGrange/CableFree-java in Java] by Gideon LeGrange&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;*[https://github.com/comtihon/erotik in Erlang] by Valery Comtihon&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;*[https://github.com/comtihon/erotik in Erlang] by Valery Comtihon&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Administrator</name></author>
	</entry>
	<entry>
		<id>https://www.cablefree.net/support/radio/software/index.php?title=Manual:API&amp;diff=802&amp;oldid=prev</id>
		<title>Administrator: /* on the CableFree Forum */</title>
		<link rel="alternate" type="text/html" href="https://www.cablefree.net/support/radio/software/index.php?title=Manual:API&amp;diff=802&amp;oldid=prev"/>
		<updated>2015-12-10T10:20:59Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;on the CableFree Forum&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 10:20, 10 December 2015&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l716&quot;&gt;Line 716:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 716:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;*[[Manual:API_Python3|Python3]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;*[[Manual:API_Python3|Python3]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;*[[API_rust| in RUST]] GPL v3&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;*[[API_rust| in RUST]] GPL v3&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;===== on the CableFree Forum =====&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;* [http://forum.CableFree.com/viewtopic.php?f=9&amp;amp;t=22744 in Perl] by Hugh&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;* [http://forum.CableFree.com/viewtopic.php?f=9&amp;amp;t=28821 in Delphi] by Rodolfo&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;* [http://forum.CableFree.com/viewtopic.php?f=9&amp;amp;t=31555 in Delphi #2] by Chupaka&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;* [http://forum.CableFree.com/viewtopic.php?f=9&amp;amp;t=51861 in NodeJS] by Trakkasure&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;* [http://forum.CableFree.com/viewtopic.php?f=2&amp;amp;t=51584 in VB] by lucho512&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;* [http://forum.CableFree.com/viewtopic.php?f=9&amp;amp;t=56869 on  PHP for sparks framework] by vthinkteam&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;===== External sources =====&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;===== External sources =====&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Administrator</name></author>
	</entry>
	<entry>
		<id>https://www.cablefree.net/support/radio/software/index.php?title=Manual:API&amp;diff=801&amp;oldid=prev</id>
		<title>Administrator: /* See also */</title>
		<link rel="alternate" type="text/html" href="https://www.cablefree.net/support/radio/software/index.php?title=Manual:API&amp;diff=801&amp;oldid=prev"/>
		<updated>2015-12-10T10:20:35Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;See also&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 10:20, 10 December 2015&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l691&quot;&gt;Line 691:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 691:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== See also ==&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== See also ==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;*[[API command notes]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;*[[API command notes]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;*[http://forum.CableFree.com/viewtopic.php?f=2&amp;amp;t=72298| Forum topic explaining query in detail]&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;==== API examples ====&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;==== API examples ====&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Administrator</name></author>
	</entry>
	<entry>
		<id>https://www.cablefree.net/support/radio/software/index.php?title=Manual:API&amp;diff=795&amp;oldid=prev</id>
		<title>Administrator: Created page with &quot;==Summary==  Application Programmable Interface (API) allows users to create custom software solutions to communicate with RadioOS to gather information, adjust configuration...&quot;</title>
		<link rel="alternate" type="text/html" href="https://www.cablefree.net/support/radio/software/index.php?title=Manual:API&amp;diff=795&amp;oldid=prev"/>
		<updated>2015-12-10T10:16:45Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;==Summary==  Application Programmable Interface (API) allows users to create custom software solutions to communicate with RadioOS to gather information, adjust configuration...&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;
Application Programmable Interface (API) allows users to create custom software solutions to communicate with RadioOS to gather information, adjust configuration and manage router. API closely follows syntax from command line interface (CLI). It can be used to create translated or custom configuration tools to aid ease of use running and managing routers with RadioOS.&lt;br /&gt;
&lt;br /&gt;
To use API RadioOS version 3.x or newer is required.&lt;br /&gt;
&lt;br /&gt;
By default API uses port #&amp;#039;&amp;#039;8728&amp;#039;&amp;#039; and service is disabled. More on service management see in corresponding  [[Manual:IP/Services | manual section]]. Corresponding service name is &amp;#039;&amp;#039;&amp;#039;api&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
== Protocol ==&lt;br /&gt;
&lt;br /&gt;
Communication with router is done by sending sentences to the router and receiving one or more sentences in return. Sentence is sequence of words terminated by zero length word. Word is part of sentence encoded in certain way - encoded length and data. Communication happen by sending sentences to the router and receiving replies to sent sentences. Each sentence sent to router using API should contain command as a first word followed by words in no particular order, end of sentence is marked by zero length word. When router receives full sentence (command word, no or more attribute words and zero length word) it is evaluated and executed, then reply is formed and returned.&lt;br /&gt;
&lt;br /&gt;
===API words===&lt;br /&gt;
&lt;br /&gt;
Words are part of sentence. Each word has to be encoded in certain way - length of the word followed by word content. Length of the word should be given as count of bytes that are going to be sent.&lt;br /&gt;
&lt;br /&gt;
Length of the word is encoded as follows:&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;2&amp;quot; &lt;br /&gt;
!width=&amp;quot;200px&amp;quot; style=&amp;quot;background:#cccccc; border-bottom:1px solid gray;&amp;quot;| Value of length &lt;br /&gt;
!width=&amp;quot;100px&amp;quot; style=&amp;quot;background:#cccccc; border-bottom:1px solid gray;&amp;quot;|# of bytes&lt;br /&gt;
!width=&amp;quot;250px&amp;quot; style=&amp;quot;background:#cccccc; border-bottom:1px solid gray;&amp;quot;|Encoding&lt;br /&gt;
|- &lt;br /&gt;
|style=&amp;quot;border-bottom:1px solid gray;&amp;quot; valign=&amp;quot;top&amp;quot;| 0 &amp;lt;= len &amp;lt;= 0x7F&lt;br /&gt;
|style=&amp;quot;border-bottom:1px solid gray;&amp;quot; valign=&amp;quot;top&amp;quot;| 1&lt;br /&gt;
|style=&amp;quot;border-bottom:1px solid gray;&amp;quot; valign=&amp;quot;top&amp;quot;| len, lowest byte&lt;br /&gt;
|-  &lt;br /&gt;
|style=&amp;quot;border-bottom:1px solid gray;&amp;quot; valign=&amp;quot;top&amp;quot;| 0x80 &amp;lt;= len &amp;lt;= 0x3FFF&lt;br /&gt;
|style=&amp;quot;border-bottom:1px solid gray;&amp;quot; valign=&amp;quot;top&amp;quot;| 2&lt;br /&gt;
|style=&amp;quot;border-bottom:1px solid gray;&amp;quot; valign=&amp;quot;top&amp;quot;| &amp;lt;nowiki&amp;gt;len | 0x8000, two lower bytes&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;border-bottom:1px solid gray;&amp;quot; valign=&amp;quot;top&amp;quot;| 0x4000 &amp;lt;= len &amp;lt;= 0x1FFFFF&lt;br /&gt;
|style=&amp;quot;border-bottom:1px solid gray;&amp;quot; valign=&amp;quot;top&amp;quot;| 3&lt;br /&gt;
|style=&amp;quot;border-bottom:1px solid gray;&amp;quot; valign=&amp;quot;top&amp;quot;| &amp;lt;nowiki&amp;gt;len | 0xC00000, three lower bytes&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;border-bottom:1px solid gray;&amp;quot; valign=&amp;quot;top&amp;quot;| 0x200000 &amp;lt;= len &amp;lt;= 0xFFFFFFF&lt;br /&gt;
|style=&amp;quot;border-bottom:1px solid gray;&amp;quot; valign=&amp;quot;top&amp;quot;| 4&lt;br /&gt;
|style=&amp;quot;border-bottom:1px solid gray;&amp;quot; valign=&amp;quot;top&amp;quot;| &amp;lt;nowiki&amp;gt;len | 0xE0000000&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;border-bottom:1px solid gray;&amp;quot; valign=&amp;quot;top&amp;quot;| len &amp;gt;= 0x10000000&lt;br /&gt;
|style=&amp;quot;border-bottom:1px solid gray;&amp;quot; valign=&amp;quot;top&amp;quot;| 5&lt;br /&gt;
|style=&amp;quot;border-bottom:1px solid gray;&amp;quot; valign=&amp;quot;top&amp;quot;| 0xF0 and len as four bytes&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Each word is encoded as length, followed by that many bytes of content;&lt;br /&gt;
* Words are grouped into sentences. End of sentence is terminated by zero length word;&lt;br /&gt;
* Scheme allows encoding of length up to &amp;#039;&amp;#039;&amp;#039;0x7FFFFFFFFF&amp;#039;&amp;#039;&amp;#039;, only four byte length is supported;&lt;br /&gt;
* Bytes of &amp;#039;&amp;#039;&amp;#039;len&amp;#039;&amp;#039;&amp;#039; are sent most significant first (network order);&lt;br /&gt;
* If first byte of word is &amp;#039;&amp;#039;&amp;#039;&amp;gt;= 0xF8&amp;#039;&amp;#039;&amp;#039;, then it is a reserved control byte. After receiving unknown control byte API client cannot proceed, because it cannot know how to interpret following bytes;&lt;br /&gt;
* Currently control bytes are not used;&lt;br /&gt;
&lt;br /&gt;
In general &amp;#039;&amp;#039;words&amp;#039;&amp;#039; can be described like this &amp;lt;&amp;lt;&amp;#039;&amp;#039;encoded word length&amp;#039;&amp;#039;&amp;gt;&amp;lt;&amp;#039;&amp;#039;word content&amp;#039;&amp;#039;&amp;gt;&amp;gt;. &amp;#039;&amp;#039;Word content&amp;#039;&amp;#039; can be separated in 5 parts: &amp;#039;&amp;#039;[[Manual:API#Command_word| command word]]&amp;#039;&amp;#039;, &amp;#039;&amp;#039;[[Manual:API#Attribute_word |attribute word]]&amp;#039;&amp;#039;, &amp;#039;&amp;#039;[[Manual:API#API_attribute_word|API attribute word]]&amp;#039;&amp;#039;. &amp;#039;&amp;#039;[[Manual:API#Query_word|query word]]&amp;#039;&amp;#039; and &amp;#039;&amp;#039;[[Manual:API#Reply_word|reply word]]&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
====Command word====&lt;br /&gt;
First word in sentence has to be command followed by attribute words and zero length word or terminating word. Name of command word should begin with &amp;#039;/&amp;#039;. Names of commands closely follow CLI, with spaces replaced with &amp;#039;/&amp;#039;. There are commands that are specific to API;&lt;br /&gt;
&lt;br /&gt;
Command word structure in strict order:&lt;br /&gt;
* encoded length&lt;br /&gt;
* content prefix &amp;#039;&amp;#039;/&amp;#039;&amp;#039;&lt;br /&gt;
* CLI converted command&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
API specific commands:&lt;br /&gt;
 login&lt;br /&gt;
 cancel&lt;br /&gt;
&lt;br /&gt;
Command word concent examples:&lt;br /&gt;
 /login&lt;br /&gt;
&lt;br /&gt;
 /user/active/listen&lt;br /&gt;
&lt;br /&gt;
 /interface/vlan/remove&lt;br /&gt;
&lt;br /&gt;
 /system/reboot&lt;br /&gt;
&lt;br /&gt;
====Attribute word====&lt;br /&gt;
Each &amp;#039;&amp;#039;command word&amp;#039;&amp;#039;have its own list of &amp;#039;&amp;#039;attribute words&amp;#039;&amp;#039; depending on content.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Atribute word&amp;#039;&amp;#039; structure consists of 5 parts in this order:&lt;br /&gt;
* encoded length&lt;br /&gt;
* content prefix equals sigh - &amp;#039;&amp;#039;=&amp;#039;&amp;#039;&lt;br /&gt;
* attribute name&lt;br /&gt;
* separating equals sign - &amp;#039;&amp;#039;=&amp;#039;&amp;#039;&lt;br /&gt;
* value of attribute if there is one. It is possible that attribute does not have a value&lt;br /&gt;
&lt;br /&gt;
{{Note|Value can hold multiple &amp;#039;&amp;#039;equal&amp;#039;&amp;#039; signs in the value of &amp;#039;&amp;#039;attribute word&amp;#039;&amp;#039; since the way word is encoded}}&lt;br /&gt;
&lt;br /&gt;
{{Note| Value can be empty}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Examples without encoded length prefix:&lt;br /&gt;
 =address=10.0.0.1&lt;br /&gt;
&lt;br /&gt;
 =name=iu=c3Eeg&lt;br /&gt;
&lt;br /&gt;
 =disable-running-check=yes&lt;br /&gt;
&lt;br /&gt;
{{Warning | Order of attribute words and API parameters is not important and should not be relied on}}&lt;br /&gt;
&lt;br /&gt;
====API attribute word====&lt;br /&gt;
&lt;br /&gt;
API attribute word structure is in strict  order:&lt;br /&gt;
* encoded length&lt;br /&gt;
* content prefix with dot &amp;#039;&amp;#039;.&amp;#039;&amp;#039;&lt;br /&gt;
*attribute name&lt;br /&gt;
*name postfixed with equals &amp;#039;&amp;#039;=&amp;#039;&amp;#039;sign&lt;br /&gt;
*attribute value&lt;br /&gt;
&lt;br /&gt;
Currently the only such API attribute is &amp;#039;&amp;#039;tag&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
{{Note| If sentence contain &amp;#039;&amp;#039;API attribute word &amp;#039;&amp;#039; tag then each returned sentence in reply from router to that tagged sentence will be tagged with same tag.}}&lt;br /&gt;
&lt;br /&gt;
====Query word====&lt;br /&gt;
Senteces can have additional query paramteres that restrict their scope. They are explained in detail [[API#Queries|in separate section]]. &lt;br /&gt;
&lt;br /&gt;
Example of sentence using query word attributes:&lt;br /&gt;
 /interface/print&lt;br /&gt;
 ?type=ether&lt;br /&gt;
 ?type=vlan&lt;br /&gt;
 ?#|!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Query words begin with &amp;#039;?&amp;#039;.&lt;br /&gt;
* Currently only &amp;#039;&amp;#039;print&amp;#039;&amp;#039; command handles query words.&lt;br /&gt;
&lt;br /&gt;
{{Warning| Order of query words is significant}}&lt;br /&gt;
&lt;br /&gt;
====Reply word====&lt;br /&gt;
&lt;br /&gt;
It is sent only by the router. It is only sent in response to full sentence send by the client. &lt;br /&gt;
&lt;br /&gt;
* First word of reply begins with &amp;#039;!&amp;#039;;&lt;br /&gt;
* Each sentence sent generates at least one reply (if connection does not get terminated);&lt;br /&gt;
* Last reply for every sentence is reply that has first word &amp;lt;tt&amp;gt;!done&amp;lt;/tt&amp;gt;;&lt;br /&gt;
* Errors and exceptional conditions begin with &amp;lt;tt&amp;gt;!trap&amp;lt;/tt&amp;gt;;&lt;br /&gt;
* Data replies begin with &amp;lt;tt&amp;gt;!re&amp;lt;/tt&amp;gt;&lt;br /&gt;
* If API connection is closed, RadioOS sends &amp;lt;tt&amp;gt;!fatal&amp;lt;/tt&amp;gt; with reason as reply and then closes the connection;&lt;br /&gt;
&lt;br /&gt;
=== API sentences ===&lt;br /&gt;
&lt;br /&gt;
API sentence is main object of communication using API.&lt;br /&gt;
&lt;br /&gt;
* Empty sentences are ignored.&lt;br /&gt;
* Sentence is processed after receiving zero length word.&lt;br /&gt;
* There is a limit on number and size of sentences client can send before it has logged in.&lt;br /&gt;
* Order of attribute words should not be relied on. As order and count is changeable by &amp;#039;&amp;#039;.proplist&amp;#039;&amp;#039; attribute.&lt;br /&gt;
* Sentence structure is as follows:&lt;br /&gt;
** First word should contain &amp;#039;&amp;#039;command word&amp;#039;&amp;#039;;&lt;br /&gt;
** Should contain &amp;#039;&amp;#039;zero length word&amp;#039;&amp;#039; to terminate the sentence;&lt;br /&gt;
** Can contain none or several &amp;#039;&amp;#039;attribute words&amp;#039;&amp;#039;. There is no particular order at what attribute words has to be sent in the sentence, order is not important for &amp;#039;&amp;#039;attribute words&amp;#039;&amp;#039;;&lt;br /&gt;
** Can contain none or several &amp;#039;&amp;#039;query words&amp;#039;&amp;#039;. Order of &amp;#039;&amp;#039;query words&amp;#039;&amp;#039; in the sentence is important.&lt;br /&gt;
&lt;br /&gt;
{{Note| &amp;#039;&amp;#039;Zero length word&amp;#039;&amp;#039; terminates the sentence. If it is not provided router will not start to evaluate sent words and will consider all the input as part of the same sentence.}}&lt;br /&gt;
&lt;br /&gt;
== Initial login ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
{| style=&amp;quot;width: 500px&amp;quot;&lt;br /&gt;
{{apic|/login}}&lt;br /&gt;
{{apic|}}&lt;br /&gt;
{{apis|!done}}&lt;br /&gt;
{{apis|1==ret=ebddd18303a54111e2dea05a92ab46b4}}&lt;br /&gt;
{{apis|}}&lt;br /&gt;
{{apic|/login}}&lt;br /&gt;
{{apic|1==name=admin}}&lt;br /&gt;
{{apic|1==response=001ea726ed53ae38520c8334f82d44c9f2}}&lt;br /&gt;
{{apic|}}&lt;br /&gt;
{{apis|!done}}&lt;br /&gt;
{{apis|}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Note| that each command and response ends with an empty word.}}&lt;br /&gt;
&lt;br /&gt;
* First, clients sends &amp;lt;tt&amp;gt;/login&amp;lt;/tt&amp;gt; command.&lt;br /&gt;
* Reply contains &amp;lt;tt&amp;gt;=ret=&amp;#039;&amp;#039;challenge&amp;#039;&amp;#039;&amp;lt;/tt&amp;gt; argument.&lt;br /&gt;
* Client sends second &amp;lt;tt&amp;gt;/login&amp;lt;/tt&amp;gt; command, with &amp;lt;tt&amp;gt;=name=&amp;#039;&amp;#039;username&amp;#039;&amp;#039;&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;=response=&amp;#039;&amp;#039;response&amp;#039;&amp;#039;&amp;lt;/tt&amp;gt;.&lt;br /&gt;
* In case of error, reply contains &amp;lt;tt&amp;gt;=ret=&amp;#039;&amp;#039;error message&amp;#039;&amp;#039;&amp;lt;/tt&amp;gt;.&lt;br /&gt;
* In case of successful login client can start to issue commands.&lt;br /&gt;
&lt;br /&gt;
== Tags ==&lt;br /&gt;
&lt;br /&gt;
* It is possible to run several commands simultaneously, without waiting for previous one to complete. If API client is doing this and needs to differentiate command responses, it can use &amp;#039;tag&amp;#039; API parameter in command sentences.&lt;br /&gt;
* If you include &amp;#039;tag&amp;#039; parameter with non-empty value in command sentence, then &amp;#039;tag&amp;#039; parameter with exactly the same value will be included in all responses generated by this command.&lt;br /&gt;
* If you do not include &amp;#039;tag&amp;#039; parameter or it&amp;#039;s value is empty, then all responses for this command will not have &amp;#039;tag&amp;#039; parameter.&lt;br /&gt;
&lt;br /&gt;
== Command description ==&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tt&amp;gt;/cancel&amp;lt;/tt&amp;gt;&lt;br /&gt;
** optional argument: &amp;lt;tt&amp;gt;=tag=&amp;lt;i&amp;gt;tag of command to cancel&amp;lt;/i&amp;gt;&amp;lt;/tt&amp;gt;, without it cancels all running commands&lt;br /&gt;
** does not cancel itself&lt;br /&gt;
** all canceled commands are interruped and in the usual case generate &amp;#039;!trap&amp;#039; and &amp;#039;!done&amp;#039; responses&lt;br /&gt;
** please note that &amp;lt;tt&amp;gt;/cancel&amp;lt;/tt&amp;gt; is separate command and can have it&amp;#039;s own unique &amp;#039;.tag&amp;#039; parameter, that is not related to &amp;#039;=tag&amp;#039; argument of this command&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tt&amp;gt;listen&amp;lt;/tt&amp;gt;&lt;br /&gt;
** &amp;lt;tt&amp;gt;listen&amp;lt;/tt&amp;gt; command is avaliable where console print command is available, but it does not have expected effect everywhere (i.e. may not work)&lt;br /&gt;
** &amp;lt;tt&amp;gt;!re&amp;lt;/tt&amp;gt; sentences are generated as something changes in particular item list&lt;br /&gt;
** when item is deleted or dissapears in any other way, the &amp;#039;!re&amp;#039; sentence includes value &amp;#039;=.dead=yes&amp;#039;&lt;br /&gt;
** This command does not terminate. To terminate it use &amp;lt;tt&amp;gt;/cancel&amp;lt;/tt&amp;gt; command.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tt&amp;gt;getall&amp;lt;/tt&amp;gt;&lt;br /&gt;
** &amp;lt;tt&amp;gt;getall&amp;lt;/tt&amp;gt; command is available where console print command is available. Since version 3.21 &amp;lt;tt&amp;gt;getall&amp;lt;/tt&amp;gt; is an alias for &amp;lt;tt&amp;gt;print&amp;lt;/tt&amp;gt;.&lt;br /&gt;
** replies contain &amp;lt;tt&amp;gt;=.id=&amp;#039;&amp;#039;Item internal number&amp;#039;&amp;#039;&amp;lt;/tt&amp;gt; property.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tt&amp;gt;print&amp;lt;/tt&amp;gt;&lt;br /&gt;
** API &amp;lt;tt&amp;gt;print&amp;lt;/tt&amp;gt; command differs from the console counterpart in the following ways:&lt;br /&gt;
*** &amp;lt;tt&amp;gt;where&amp;lt;/tt&amp;gt; argument is not supported. Items can be filtered using query words (see below).&lt;br /&gt;
*** &amp;lt;tt&amp;gt;.proplist&amp;lt;/tt&amp;gt; argument is a comma separated list of property names that should be included for the returned items.&lt;br /&gt;
**** returned items may have additional properties.&lt;br /&gt;
**** order of returned properties is not defined.&lt;br /&gt;
**** if list contains duplicate entries, handling of such entries is not defined.&lt;br /&gt;
**** if propery is present in &amp;lt;tt&amp;gt;.proplist&amp;lt;/tt&amp;gt;, but absent from the item, then that item does not have this property value (?name will evaluate to false for that item).&lt;br /&gt;
**** if &amp;lt;tt&amp;gt;.proplist&amp;lt;/tt&amp;gt; is absent, all properties are included as requested by print command, even those that have slow access time (such as file contents and perfomance counters). Thus use of &amp;lt;tt&amp;gt;.proplist&amp;lt;/tt&amp;gt; is encouraged. Omission of &amp;lt;tt&amp;gt;.proplist&amp;lt;/tt&amp;gt; may have high perfomance penalty if =detail= argument is set.&lt;br /&gt;
&lt;br /&gt;
=== Queries ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;print&amp;lt;/tt&amp;gt; command accepts query words that limit set of returned sentences. This feature is available since RadioOS 3.21.&lt;br /&gt;
* Query words begin with &amp;#039;?&amp;#039;.&lt;br /&gt;
* Order of query words is significant. Query is evaluated starting from the first word.&lt;br /&gt;
* Query is evaluated for each item in the list. If query succeeds, item is processed, if query fails, item is ignored.&lt;br /&gt;
* Query is evaluated using a stack of boolean values. Initially stack contains infinite amount of &amp;#039;true&amp;#039; values. At the end of evaluation, if stack contains at least one &amp;#039;false&amp;#039; value, query fails.&lt;br /&gt;
* Query words operate according to the following rules:&lt;br /&gt;
{| cellpadding=&amp;quot;2&amp;quot; &lt;br /&gt;
!width=&amp;quot;300px&amp;quot; style=&amp;quot;background:#cccccc; border-bottom:1px solid gray;&amp;quot;| Query&lt;br /&gt;
!width=&amp;quot;450px&amp;quot; style=&amp;quot;background:#cccccc; border-bottom:1px solid gray;&amp;quot;| Desciption&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;border-bottom:1px solid gray;&amp;quot; valign=&amp;quot;top&amp;quot;| &amp;#039;&amp;#039;&amp;#039;?name&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|style=&amp;quot;border-bottom:1px solid gray;&amp;quot; valign=&amp;quot;top&amp;quot;|pushes &amp;#039;true&amp;#039; if item has value of property &amp;#039;&amp;#039;name&amp;#039;&amp;#039;, &amp;#039;false&amp;#039; if it does not.&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;border-bottom:1px solid gray;&amp;quot; valign=&amp;quot;top&amp;quot;|&amp;#039;&amp;#039;&amp;#039;?-name&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|style=&amp;quot;border-bottom:1px solid gray;&amp;quot; valign=&amp;quot;top&amp;quot;| pushes &amp;#039;true&amp;#039; if item does not have value of property &amp;#039;&amp;#039;name&amp;#039;&amp;#039;, &amp;#039;false&amp;#039; otherwise.&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;border-bottom:1px solid gray;&amp;quot; valign=&amp;quot;top&amp;quot;|&amp;#039;&amp;#039;&amp;#039;?&amp;#039;&amp;#039;name&amp;#039;&amp;#039;=&amp;#039;&amp;#039;x&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&amp;#039;&amp;#039;&amp;#039;?=&amp;#039;&amp;#039;name&amp;#039;&amp;#039;=&amp;#039;&amp;#039;x&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|style=&amp;quot;border-bottom:1px solid gray;&amp;quot; valign=&amp;quot;top&amp;quot;| pushes &amp;#039;true&amp;#039; if property &amp;#039;&amp;#039;name&amp;#039;&amp;#039; has value equal to &amp;#039;&amp;#039;x&amp;#039;&amp;#039;, &amp;#039;false&amp;#039; otherwise.&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;border-bottom:1px solid gray;&amp;quot; valign=&amp;quot;top&amp;quot;|&amp;#039;&amp;#039;&amp;#039;?&amp;lt;name=&amp;#039;&amp;#039;x&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|style=&amp;quot;border-bottom:1px solid gray;&amp;quot; valign=&amp;quot;top&amp;quot;| pushes &amp;#039;true&amp;#039; if property &amp;#039;&amp;#039;name&amp;#039;&amp;#039; has value less than &amp;#039;&amp;#039;x&amp;#039;&amp;#039;, &amp;#039;false&amp;#039; otherwise.&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;border-bottom:1px solid gray;&amp;quot; valign=&amp;quot;top&amp;quot;|&amp;#039;&amp;#039;&amp;#039;?&amp;gt;name=&amp;#039;&amp;#039;x&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|style=&amp;quot;border-bottom:1px solid gray;&amp;quot; valign=&amp;quot;top&amp;quot;| pushes &amp;#039;true&amp;#039; if property &amp;#039;&amp;#039;name&amp;#039;&amp;#039; has value greater than &amp;#039;&amp;#039;x&amp;#039;&amp;#039;, &amp;#039;false&amp;#039; otherwise.&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;border-bottom:1px solid gray;&amp;quot; valign=&amp;quot;top&amp;quot;|&amp;#039;&amp;#039;&amp;#039;?#&amp;#039;&amp;#039;operations&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|style=&amp;quot;border-bottom:1px solid gray;&amp;quot; valign=&amp;quot;top&amp;quot;| applies operations to the values in the stack.&lt;br /&gt;
* operation string is evaluated left to right.&lt;br /&gt;
* sequence of decimal digits followed by any other character or end of word is interpreted as a stack index. top value has index 0.&lt;br /&gt;
* index that is followed by a character pushes copy of value at that index.&lt;br /&gt;
* index that is followed by the end of word replaces all values with the value at that index.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;!&amp;lt;/tt&amp;gt; &amp;#039;&amp;#039;&amp;#039; character replaces top value with the opposite.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;&amp;amp;&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; pops two values and pushes result of logical &amp;#039;and&amp;#039; operation.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;|&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; pops two values and pushes result of logical &amp;#039;or&amp;#039; operation.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;.&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; after an index does nothing.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;.&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; after another character pushes copy of top value.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
* Get all ethernet and VLAN interfaces:&lt;br /&gt;
 /interface/print&lt;br /&gt;
 ?type=ether&lt;br /&gt;
 ?type=vlan&lt;br /&gt;
 ?#|&lt;br /&gt;
* Get all routes that have non-empty comment:&lt;br /&gt;
 /ip/route/print&lt;br /&gt;
 ?&amp;gt;comment=&lt;br /&gt;
&lt;br /&gt;
* [http://forum.CableFree.com/viewtopic.php?f=2&amp;amp;t=72298 Forum thread with detailed explanation of use of queries]&lt;br /&gt;
&lt;br /&gt;
=== OID ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;print&amp;lt;/tt&amp;gt; command can return OID values for properties that are available in SNMP. This feature appeared in 3.23 version.&lt;br /&gt;
&lt;br /&gt;
In console, OID values can be seen by running &amp;#039;print oid&amp;#039; command. In API, these properties have name that ends with &amp;quot;.oid&amp;quot;, and can be retrieved by adding their name to the value of &amp;#039;.proplist&amp;#039;. An example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
{| style=&amp;quot;width: 500px&amp;quot;&lt;br /&gt;
{{apic|/system/resource/print}}&lt;br /&gt;
{{apic|1==.proplist=uptime,cpu-load,uptime.oid,cpu-load.oid}}&lt;br /&gt;
{{apic|}}&lt;br /&gt;
{{apis|!re}}&lt;br /&gt;
{{apis|1==uptime=01:22:53}}&lt;br /&gt;
{{apis|1==cpu-load=0}}&lt;br /&gt;
{{apis|1==uptime.oid=.1.3.6.1.2.1.1.3.0}}&lt;br /&gt;
{{apis|1==cpu-load.oid=.1.3.6.1.2.1.25.3.3.1.2.1}}&lt;br /&gt;
{{apis|}}&lt;br /&gt;
{{apis|!done}}&lt;br /&gt;
{{apis|}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
===!trap===&lt;br /&gt;
When for some reason API sentence fails trap is sent in return accompanied with &amp;#039;&amp;#039;&amp;#039;message&amp;#039;&amp;#039;&amp;#039; attribute and on some occasions &amp;#039;&amp;#039;&amp;#039;category&amp;#039;&amp;#039;&amp;#039; argument.&lt;br /&gt;
&lt;br /&gt;
====message====&lt;br /&gt;
When API sentence fails some generic message or message from used internal process is return to give more details about failure&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;&amp;lt;&amp;lt; /ip/address/add&lt;br /&gt;
 &amp;lt;&amp;lt;&amp;lt; =address=192.168.88.1&lt;br /&gt;
 &amp;lt;&amp;lt;&amp;lt; =interface=asdf&lt;br /&gt;
 &amp;lt;&amp;lt;&amp;lt; &lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; !trap&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; =category=1&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; =message=input does not match any value of interface&lt;br /&gt;
&lt;br /&gt;
====category====&lt;br /&gt;
if it is a general error, it is categorized and error category is returned. possible values for this attribute are &lt;br /&gt;
*0 - missing item or command&lt;br /&gt;
*1 - argument value failure&lt;br /&gt;
*2 - execution of command interrupted&lt;br /&gt;
*3 - scripting related failure&lt;br /&gt;
*4 - general failure&lt;br /&gt;
*5 - API related failure&lt;br /&gt;
*6 - TTY related failure&lt;br /&gt;
*7 - value generated with :return command&lt;br /&gt;
&lt;br /&gt;
== Command examples ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;tt&amp;gt;/system/package/getall&amp;lt;/tt&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
{{bapi}}&lt;br /&gt;
{{apic|/system/package/getall}}&lt;br /&gt;
{{apic|}}&lt;br /&gt;
{{apis|!re}}&lt;br /&gt;
{{apis|1==.id=*5802}}&lt;br /&gt;
{{apis|1==disabled=no}}&lt;br /&gt;
{{apis|1==name=RadioOS-x86}}&lt;br /&gt;
{{apis|1==version=3.0beta2}}&lt;br /&gt;
{{apis|1==build-time=oct/18/2006 16:24:41}}&lt;br /&gt;
{{apis|1==scheduled=}}&lt;br /&gt;
{{apis|}}&lt;br /&gt;
{{apis|!re}}&lt;br /&gt;
{{apis|1==.id=*5805}}&lt;br /&gt;
{{apis|1==disabled=no}}&lt;br /&gt;
{{apis|1==name=system}}&lt;br /&gt;
{{apis|1==version=3.0beta2}}&lt;br /&gt;
{{apis|1==build-time=oct/18/2006 17:20:46}}&lt;br /&gt;
{{apis|1==scheduled=}}&lt;br /&gt;
{{apis|}}&lt;br /&gt;
|-&lt;br /&gt;
| ... more !re sentences ...&lt;br /&gt;
|-&lt;br /&gt;
{{apis|!re}}&lt;br /&gt;
{{apis|1==.id=*5902}}&lt;br /&gt;
{{apis|1==disabled=no}}&lt;br /&gt;
{{apis|1==name=advanced-tools}}&lt;br /&gt;
{{apis|1==version=3.0beta2}}&lt;br /&gt;
{{apis|1==build-time=oct/18/2006 17:20:49}}&lt;br /&gt;
{{apis|1==scheduled=}}&lt;br /&gt;
{{apis|}}&lt;br /&gt;
{{apis|!done}}&lt;br /&gt;
{{apis|}}&lt;br /&gt;
{{eapi}}&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;tt&amp;gt;/user/active/listen&amp;lt;/tt&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
{{bapi}}&lt;br /&gt;
{{apic|/user/active/listen}}&lt;br /&gt;
{{apic|}}&lt;br /&gt;
{{apis|!re}}&lt;br /&gt;
{{apis|1==.id=*68}}&lt;br /&gt;
{{apis|1==radius=no}}&lt;br /&gt;
{{apis|1==when=oct/24/2006 08:40:42}}&lt;br /&gt;
{{apis|1==name=admin}}&lt;br /&gt;
{{apis|1==address=0.0.0.0}}&lt;br /&gt;
{{apis|1==via=console}}&lt;br /&gt;
{{apis|}} &lt;br /&gt;
{{apis|!re}}&lt;br /&gt;
{{apis|1==.id=*68}}&lt;br /&gt;
{{apis|1==.dead=yes}}&lt;br /&gt;
{{apis|}}&lt;br /&gt;
|-&lt;br /&gt;
| ... more !re sentences ...&lt;br /&gt;
|-&lt;br /&gt;
{{eapi}}&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;tt&amp;gt;/cancel&amp;lt;/tt&amp;gt;, simultaneous commands ===&lt;br /&gt;
&lt;br /&gt;
{{bapi}}&lt;br /&gt;
{{apic|/login}}&lt;br /&gt;
{{apic|}}&lt;br /&gt;
{{apis|!done}}&lt;br /&gt;
{{apis|1==ret=856780b7411eefd3abadee2058c149a3}}&lt;br /&gt;
{{apis|}}&lt;br /&gt;
{{apic|/login}}&lt;br /&gt;
{{apic|1==name=admin}}&lt;br /&gt;
{{apic|1==response=005062f7a5ef124d34675bf3e81f56c556}}&lt;br /&gt;
{{apic|}}&lt;br /&gt;
{{apis|!done}}&lt;br /&gt;
{{apis|}}&lt;br /&gt;
{{apih|first start listening for interface changes (tag is 2)}}&lt;br /&gt;
{{apic|/interface/listen}}&lt;br /&gt;
{{apic|1=.tag=2}}&lt;br /&gt;
{{apic|}}&lt;br /&gt;
{{apih|disable interface (tag is 3)}}&lt;br /&gt;
{{apic|/interface/set}}&lt;br /&gt;
{{apic|1==disabled=yes}}&lt;br /&gt;
{{apic|1==.id=ether1}}&lt;br /&gt;
{{apic|1=.tag=3}}&lt;br /&gt;
{{apic|}}&lt;br /&gt;
{{apih|this is done for disable command (tag 3)}}&lt;br /&gt;
{{apis|!done}}&lt;br /&gt;
{{apis|1=.tag=3}}&lt;br /&gt;
{{apis|}}&lt;br /&gt;
{{apih|enable interface (tag is 4)}}&lt;br /&gt;
{{apic|/interface/set}}&lt;br /&gt;
{{apic|1==disabled=no}}&lt;br /&gt;
{{apic|1==.id=ether1}}&lt;br /&gt;
{{apic|1=.tag=4}}&lt;br /&gt;
{{apic|}}&lt;br /&gt;
{{apih|this update is generated by change made by first set command (tag 3)}}&lt;br /&gt;
{{apis|!re}}&lt;br /&gt;
{{apis|1==.id=*1}}&lt;br /&gt;
{{apis|1==disabled=yes}}&lt;br /&gt;
{{apis|1==dynamic=no}}&lt;br /&gt;
{{apis|1==running=no}}&lt;br /&gt;
{{apis|1==name=ether1}}&lt;br /&gt;
{{apis|1==mtu=1500}}&lt;br /&gt;
{{apis|1==type=ether}}&lt;br /&gt;
{{apis|1=.tag=2}}&lt;br /&gt;
{{apis|}}&lt;br /&gt;
{{apih|this is done for enable command (tag 4)}}&lt;br /&gt;
{{apis|!done}}&lt;br /&gt;
{{apis|1=.tag=4}}&lt;br /&gt;
{{apis|}}&lt;br /&gt;
{{apih|get interface list (tag is 5)}}&lt;br /&gt;
{{apic|/interface/getall}}&lt;br /&gt;
{{apic|1=.tag=5}}&lt;br /&gt;
{{apic|}}&lt;br /&gt;
{{apih|this update is generated by change made by second set command (tag 4)}}&lt;br /&gt;
{{apis|!re}}&lt;br /&gt;
{{apis|1==.id=*1}}&lt;br /&gt;
{{apis|1==disabled=no}}&lt;br /&gt;
{{apis|1==dynamic=no}}&lt;br /&gt;
{{apis|1==running=yes}}&lt;br /&gt;
{{apis|1==name=ether1}}&lt;br /&gt;
{{apis|1==mtu=1500}}&lt;br /&gt;
{{apis|1==type=ether}}&lt;br /&gt;
{{apis|1=.tag=2}}&lt;br /&gt;
{{apis|}}&lt;br /&gt;
{{apih|these are replies to getall command (tag 5)}}&lt;br /&gt;
{{apis|!re}}&lt;br /&gt;
{{apis|1==.id=*1}}&lt;br /&gt;
{{apis|1==disabled=no}}&lt;br /&gt;
{{apis|1==dynamic=no}}&lt;br /&gt;
{{apis|1==running=yes}}&lt;br /&gt;
{{apis|1==name=ether1}}&lt;br /&gt;
{{apis|1==mtu=1500}}&lt;br /&gt;
{{apis|1==type=ether}}&lt;br /&gt;
{{apis|1=.tag=5}}&lt;br /&gt;
{{apis|}}&lt;br /&gt;
{{apis|!re}}&lt;br /&gt;
{{apis|1==.id=*2}}&lt;br /&gt;
{{apis|1==disabled=no}}&lt;br /&gt;
{{apis|1==dynamic=no}}&lt;br /&gt;
{{apis|1==running=yes}}&lt;br /&gt;
{{apis|1==name=ether2}}&lt;br /&gt;
{{apis|1==mtu=1500}}&lt;br /&gt;
{{apis|1==type=ether}}&lt;br /&gt;
{{apis|1=.tag=5}}&lt;br /&gt;
{{apis|}}&lt;br /&gt;
{{apih|here interface getall ends (tag 5)}}&lt;br /&gt;
{{apis|!done}}&lt;br /&gt;
{{apis|1=.tag=5}}&lt;br /&gt;
{{apis|}}&lt;br /&gt;
{{apih|stop listening - request to cancel command with tag 2, cancel itself uses tag 7}}&lt;br /&gt;
{{apic|/cancel}}&lt;br /&gt;
{{apic|1==tag=2}}&lt;br /&gt;
{{apic|1=.tag=7}}&lt;br /&gt;
{{apic|}}&lt;br /&gt;
{{apih|listen command is interrupted (tag 2)}}&lt;br /&gt;
{{apis|!trap}}&lt;br /&gt;
{{apis|1==category=2}}&lt;br /&gt;
{{apis|1==message=interrupted}}&lt;br /&gt;
{{apis|1=.tag=2}}&lt;br /&gt;
{{apis|}}&lt;br /&gt;
{{apih|cancel command is finished (tag 7)}}&lt;br /&gt;
{{apis|!done}}&lt;br /&gt;
{{apis|1=.tag=7}}&lt;br /&gt;
{{apis|}}&lt;br /&gt;
{{apih|listen command is finished (tag 2)}}&lt;br /&gt;
{{apis|!done}}&lt;br /&gt;
{{apis|1=.tag=2}}&lt;br /&gt;
{{apis|}}&lt;br /&gt;
{{eapi}}&lt;br /&gt;
&lt;br /&gt;
== Example client ==&lt;br /&gt;
&lt;br /&gt;
* this is simple API client in Python2&lt;br /&gt;
* example for [[Manual:API_Python3|Python3]]&lt;br /&gt;
* usage: api.py &amp;#039;&amp;#039;ip-address&amp;#039;&amp;#039; &amp;#039;&amp;#039;username&amp;#039;&amp;#039; &amp;#039;&amp;#039;password&amp;#039;&amp;#039;&lt;br /&gt;
* after that type words from keyboard, terminating them with newline&lt;br /&gt;
* Since empty word terminates sentence, you should press enter &amp;#039;&amp;#039;&amp;#039;twice&amp;#039;&amp;#039;&amp;#039; after last word before sentence will be sent to router.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#!/usr/bin/python&lt;br /&gt;
&lt;br /&gt;
import sys, posix, time, md5, binascii, socket, select&lt;br /&gt;
&lt;br /&gt;
class ApiRos:&lt;br /&gt;
    &amp;quot;RadioOS api&amp;quot;&lt;br /&gt;
    def __init__(self, sk):&lt;br /&gt;
        self.sk = sk&lt;br /&gt;
        self.currenttag = 0&lt;br /&gt;
        &lt;br /&gt;
    def login(self, username, pwd):&lt;br /&gt;
        for repl, attrs in self.talk([&amp;quot;/login&amp;quot;]):&lt;br /&gt;
            chal = binascii.unhexlify(attrs[&amp;#039;=ret&amp;#039;])&lt;br /&gt;
        md = md5.new()&lt;br /&gt;
        md.update(&amp;#039;\x00&amp;#039;)&lt;br /&gt;
        md.update(pwd)&lt;br /&gt;
        md.update(chal)&lt;br /&gt;
        self.talk([&amp;quot;/login&amp;quot;, &amp;quot;=name=&amp;quot; + username,&lt;br /&gt;
                   &amp;quot;=response=00&amp;quot; + binascii.hexlify(md.digest())])&lt;br /&gt;
&lt;br /&gt;
    def talk(self, words):&lt;br /&gt;
        if self.writeSentence(words) == 0: return&lt;br /&gt;
        r = []&lt;br /&gt;
        while 1:&lt;br /&gt;
            i = self.readSentence();&lt;br /&gt;
            if len(i) == 0: continue&lt;br /&gt;
            reply = i[0]&lt;br /&gt;
            attrs = {}&lt;br /&gt;
            for w in i[1:]:&lt;br /&gt;
                j = w.find(&amp;#039;=&amp;#039;, 1)&lt;br /&gt;
                if (j == -1):&lt;br /&gt;
                    attrs[w] = &amp;#039;&amp;#039;&lt;br /&gt;
                else:&lt;br /&gt;
                    attrs[w[:j]] = w[j+1:]&lt;br /&gt;
            r.append((reply, attrs))&lt;br /&gt;
            if reply == &amp;#039;!done&amp;#039;: return r&lt;br /&gt;
&lt;br /&gt;
    def writeSentence(self, words):&lt;br /&gt;
        ret = 0&lt;br /&gt;
        for w in words:&lt;br /&gt;
            self.writeWord(w)&lt;br /&gt;
            ret += 1&lt;br /&gt;
        self.writeWord(&amp;#039;&amp;#039;)&lt;br /&gt;
        return ret&lt;br /&gt;
&lt;br /&gt;
    def readSentence(self):&lt;br /&gt;
        r = []&lt;br /&gt;
        while 1:&lt;br /&gt;
            w = self.readWord()&lt;br /&gt;
            if w == &amp;#039;&amp;#039;: return r&lt;br /&gt;
            r.append(w)&lt;br /&gt;
            &lt;br /&gt;
    def writeWord(self, w):&lt;br /&gt;
        print &amp;quot;&amp;lt;&amp;lt;&amp;lt; &amp;quot; + w&lt;br /&gt;
        self.writeLen(len(w))&lt;br /&gt;
        self.writeStr(w)&lt;br /&gt;
&lt;br /&gt;
    def readWord(self):&lt;br /&gt;
        ret = self.readStr(self.readLen())&lt;br /&gt;
        print &amp;quot;&amp;gt;&amp;gt;&amp;gt; &amp;quot; + ret&lt;br /&gt;
        return ret&lt;br /&gt;
&lt;br /&gt;
    def writeLen(self, l):&lt;br /&gt;
        if l &amp;lt; 0x80:&lt;br /&gt;
            self.writeStr(chr(l))&lt;br /&gt;
        elif l &amp;lt; 0x4000:&lt;br /&gt;
            l |= 0x8000&lt;br /&gt;
            self.writeStr(chr((l &amp;gt;&amp;gt; 8) &amp;amp; 0xFF))&lt;br /&gt;
            self.writeStr(chr(l &amp;amp; 0xFF))&lt;br /&gt;
        elif l &amp;lt; 0x200000:&lt;br /&gt;
            l |= 0xC00000&lt;br /&gt;
            self.writeStr(chr((l &amp;gt;&amp;gt; 16) &amp;amp; 0xFF))&lt;br /&gt;
            self.writeStr(chr((l &amp;gt;&amp;gt; 8) &amp;amp; 0xFF))&lt;br /&gt;
            self.writeStr(chr(l &amp;amp; 0xFF))&lt;br /&gt;
        elif l &amp;lt; 0x10000000:        &lt;br /&gt;
            l |= 0xE0000000         &lt;br /&gt;
            self.writeStr(chr((l &amp;gt;&amp;gt; 24) &amp;amp; 0xFF))&lt;br /&gt;
            self.writeStr(chr((l &amp;gt;&amp;gt; 16) &amp;amp; 0xFF))&lt;br /&gt;
            self.writeStr(chr((l &amp;gt;&amp;gt; 8) &amp;amp; 0xFF))&lt;br /&gt;
            self.writeStr(chr(l &amp;amp; 0xFF))&lt;br /&gt;
        else:                       &lt;br /&gt;
            self.writeStr(chr(0xF0))&lt;br /&gt;
            self.writeStr(chr((l &amp;gt;&amp;gt; 24) &amp;amp; 0xFF))&lt;br /&gt;
            self.writeStr(chr((l &amp;gt;&amp;gt; 16) &amp;amp; 0xFF))&lt;br /&gt;
            self.writeStr(chr((l &amp;gt;&amp;gt; 8) &amp;amp; 0xFF))&lt;br /&gt;
            self.writeStr(chr(l &amp;amp; 0xFF))&lt;br /&gt;
&lt;br /&gt;
    def readLen(self):              &lt;br /&gt;
        c = ord(self.readStr(1))    &lt;br /&gt;
        if (c &amp;amp; 0x80) == 0x00:      &lt;br /&gt;
            pass                    &lt;br /&gt;
        elif (c &amp;amp; 0xC0) == 0x80:    &lt;br /&gt;
            c &amp;amp;= ~0xC0              &lt;br /&gt;
            c &amp;lt;&amp;lt;= 8                 &lt;br /&gt;
            c += ord(self.readStr(1))    &lt;br /&gt;
        elif (c &amp;amp; 0xE0) == 0xC0:    &lt;br /&gt;
            c &amp;amp;= ~0xE0              &lt;br /&gt;
            c &amp;lt;&amp;lt;= 8                 &lt;br /&gt;
            c += ord(self.readStr(1))    &lt;br /&gt;
            c &amp;lt;&amp;lt;= 8                 &lt;br /&gt;
            c += ord(self.readStr(1))    &lt;br /&gt;
        elif (c &amp;amp; 0xF0) == 0xE0:    &lt;br /&gt;
            c &amp;amp;= ~0xF0              &lt;br /&gt;
            c &amp;lt;&amp;lt;= 8                 &lt;br /&gt;
            c += ord(self.readStr(1))    &lt;br /&gt;
            c &amp;lt;&amp;lt;= 8                 &lt;br /&gt;
            c += ord(self.readStr(1))    &lt;br /&gt;
            c &amp;lt;&amp;lt;= 8                 &lt;br /&gt;
            c += ord(self.readStr(1))    &lt;br /&gt;
        elif (c &amp;amp; 0xF8) == 0xF0:    &lt;br /&gt;
            c = ord(self.readStr(1))     &lt;br /&gt;
            c &amp;lt;&amp;lt;= 8                 &lt;br /&gt;
            c += ord(self.readStr(1))    &lt;br /&gt;
            c &amp;lt;&amp;lt;= 8                 &lt;br /&gt;
            c += ord(self.readStr(1))    &lt;br /&gt;
            c &amp;lt;&amp;lt;= 8                 &lt;br /&gt;
            c += ord(self.readStr(1))    &lt;br /&gt;
        return c                    &lt;br /&gt;
&lt;br /&gt;
    def writeStr(self, str):        &lt;br /&gt;
        n = 0;                      &lt;br /&gt;
        while n &amp;lt; len(str):         &lt;br /&gt;
            r = self.sk.send(str[n:])&lt;br /&gt;
            if r == 0: raise RuntimeError, &amp;quot;connection closed by remote end&amp;quot;&lt;br /&gt;
            n += r                  &lt;br /&gt;
&lt;br /&gt;
    def readStr(self, length):      &lt;br /&gt;
        ret = &amp;#039;&amp;#039;                    &lt;br /&gt;
        while len(ret) &amp;lt; length:    &lt;br /&gt;
            s = self.sk.recv(length - len(ret))&lt;br /&gt;
            if s == &amp;#039;&amp;#039;: raise RuntimeError, &amp;quot;connection closed by remote end&amp;quot;&lt;br /&gt;
            ret += s&lt;br /&gt;
        return ret&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)&lt;br /&gt;
    s.connect((sys.argv[1], 8728))  &lt;br /&gt;
    apiros = ApiRos(s);             &lt;br /&gt;
    apiros.login(sys.argv[2], sys.argv[3]);&lt;br /&gt;
&lt;br /&gt;
    inputsentence = []&lt;br /&gt;
&lt;br /&gt;
    while 1:&lt;br /&gt;
        r = select.select([s, sys.stdin], [], [], None)&lt;br /&gt;
        if s in r[0]:&lt;br /&gt;
            # something to read in socket, read sentence&lt;br /&gt;
            x = apiros.readSentence()&lt;br /&gt;
&lt;br /&gt;
        if sys.stdin in r[0]:&lt;br /&gt;
            # read line from input and strip off newline&lt;br /&gt;
            l = sys.stdin.readline()&lt;br /&gt;
            l = l[:-1]&lt;br /&gt;
&lt;br /&gt;
            # if empty line, send sentence and start with new&lt;br /&gt;
            # otherwise append to input sentence&lt;br /&gt;
            if l == &amp;#039;&amp;#039;:&lt;br /&gt;
                apiros.writeSentence(inputsentence)&lt;br /&gt;
                inputsentence = []&lt;br /&gt;
            else:&lt;br /&gt;
                inputsentence.append(l)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;#039;__main__&amp;#039;:&lt;br /&gt;
    main()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example run:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
debian@localhost:~/api-test$ ./api.py 10.0.0.1 admin &amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;&amp;lt;&amp;lt; /login&lt;br /&gt;
&amp;lt;&amp;lt;&amp;lt; &lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; !done&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; =ret=93b438ec9b80057c06dd9fe67d56aa9a&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; &lt;br /&gt;
&amp;lt;&amp;lt;&amp;lt; /login&lt;br /&gt;
&amp;lt;&amp;lt;&amp;lt; =name=admin&lt;br /&gt;
&amp;lt;&amp;lt;&amp;lt; =response=00e134102a9d330dd7b1849fedfea3cb57&lt;br /&gt;
&amp;lt;&amp;lt;&amp;lt; &lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; !done&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; &lt;br /&gt;
/user/getall&lt;br /&gt;
&lt;br /&gt;
&amp;lt;&amp;lt;&amp;lt; /user/getall&lt;br /&gt;
&amp;lt;&amp;lt;&amp;lt; &lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; !re&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; =.id=*1&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; =disabled=no&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; =name=admin&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; =group=full&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; =address=0.0.0.0/0&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; =netmask=0.0.0.0&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; &lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; !done&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
*[[API command notes]]&lt;br /&gt;
*[http://forum.CableFree.com/viewtopic.php?f=2&amp;amp;t=72298| Forum topic explaining query in detail]&lt;br /&gt;
==== API examples ====&lt;br /&gt;
&lt;br /&gt;
API implementations in different languages, provided by different sources. They are not ordered in any particular order.&lt;br /&gt;
&lt;br /&gt;
=====in the Wiki =====&lt;br /&gt;
&lt;br /&gt;
*[[API_PHP_package|in PHP]] #1 (recommended)&lt;br /&gt;
*[[API_PHP_class|in PHP]] #2&lt;br /&gt;
*[[RadioOS_PHP_class|in PHP]] #3&lt;br /&gt;
*[[API Delphi|in Delphi]] #1&lt;br /&gt;
*[[API_Delphi_Client|in Delphi]] #2&lt;br /&gt;
&lt;br /&gt;
*[[API_in_C| in C]] #1&lt;br /&gt;
*[[LibRadioOS| in C]] #2&lt;br /&gt;
*[[API_in_C_using_winsock | in C using winsock]]&lt;br /&gt;
*[[API_In_CPP|API in C++]]&lt;br /&gt;
*[[API_in_C_Sharp|in C#]]&lt;br /&gt;
&lt;br /&gt;
*[[API_ActionScript_3_class|in Flash Actionscript 3]]&lt;br /&gt;
*[[API_Ruby_class|in Ruby on rails]]&lt;br /&gt;
*[[API_in_VB_dot_NET|in VB .NET]]&lt;br /&gt;
*[[API_in_Java|in java]] see java client on github from Gideon LeGrange&lt;br /&gt;
*[[MikroNode|in NodeJS]]&lt;br /&gt;
*[[Manual:API_Python3|Python3]]&lt;br /&gt;
*[[API_rust| in RUST]] GPL v3&lt;br /&gt;
&lt;br /&gt;
===== on the CableFree Forum =====&lt;br /&gt;
&lt;br /&gt;
* [http://forum.CableFree.com/viewtopic.php?f=9&amp;amp;t=22744 in Perl] by Hugh&lt;br /&gt;
* [http://forum.CableFree.com/viewtopic.php?f=9&amp;amp;t=28821 in Delphi] by Rodolfo&lt;br /&gt;
* [http://forum.CableFree.com/viewtopic.php?f=9&amp;amp;t=31555 in Delphi #2] by Chupaka&lt;br /&gt;
* [http://forum.CableFree.com/viewtopic.php?f=9&amp;amp;t=51861 in NodeJS] by Trakkasure&lt;br /&gt;
* [http://forum.CableFree.com/viewtopic.php?f=2&amp;amp;t=51584 in VB] by lucho512&lt;br /&gt;
* [http://forum.CableFree.com/viewtopic.php?f=9&amp;amp;t=56869 on  PHP for sparks framework] by vthinkteam&lt;br /&gt;
&lt;br /&gt;
===== External sources =====&lt;br /&gt;
&lt;br /&gt;
*[https://github.com/danikf/tik4net in .NET (C#)  high-level api solution] [http://forum.CableFree.com/viewtopic.php?f=9&amp;amp;t=99954 forum thread] [https://github.com/danikf/tik4net/wiki additional info] by danikf&lt;br /&gt;
*[https://sourceforge.net/projects/netRadioOS/ in PHP] by boen_robot&lt;br /&gt;
*[https://github.com/haakonnessjoen/libRadioOS-api in C] by Håkon Nessjøen&lt;br /&gt;
*[https://github.com/GideonLeGrange/CableFree-java in Java] by Gideon LeGrange&lt;br /&gt;
*[https://github.com/comtihon/erotik in Erlang] by Valery Comtihon&lt;br /&gt;
&lt;br /&gt;
[[Category:API|A]]&lt;br /&gt;
[[Category:Manual|A]]&lt;br /&gt;
[[Category:System|A]]&lt;br /&gt;
[[Category:Case Studies|A]]&lt;/div&gt;</summary>
		<author><name>Administrator</name></author>
	</entry>
</feed>