{"id":1465,"date":"2022-04-17T04:20:24","date_gmt":"2022-04-16T23:20:24","guid":{"rendered":"https:\/\/greenswamp.org\/?docs=gs-server-overview\/scripting-api"},"modified":"2022-09-24T16:19:41","modified_gmt":"2022-09-24T11:19:41","slug":"scripting-api","status":"publish","type":"docs","link":"https:\/\/greenswamp.org\/?docs=gs-server-overview\/scripting-api","title":{"rendered":"Scripting API"},"content":{"rendered":"\n<p>WARNING! \u2013 use the API at your own risk.&nbsp; It\u2019s recommended that you do not leave the amount alone while running scripts.&nbsp; Green Swamp Software is not responsible for any damage resulting from using the API interface.<\/p>\n\n\n\n<p>Running scripts requires that GSS be running and connected to the mount.&nbsp;&nbsp; You can start GSS on its own or by using other external programs that will load the GSS ASCOM driver such as CDC or SGP. Unless you\u2019re experienced with how GSS separates ASCOM commands from the API It\u2019s recommended that GSS be running on its own so no other external sources can interfere or interact with running scripts.<\/p>\n\n\n\n<p>GSS exposes a number of class members available to external programs and scripting languages.&nbsp; There are PowerShell example scripts located in the GSS Program files scripting directory. Find the installation section of this manual for directory locations.<\/p>\n\n\n\n<p>The example scripts we\u2019re created using the Windows 10 PowerShell ISE.&nbsp; To run PowerShell, type in the Windows search box \u201cPowerShell ISE\u201d and run either the 64 bit or X86 versions.&nbsp; You may run into problems executing scripts because of Windows security settings.&nbsp; There are a number of ways to correct this and you should search google for Microsoft\u2019s recommended approach.&nbsp; One way is to allow the current logged in user the ability to run script.&nbsp; The following command can be run within PowerShell by placing it on the first line and clicking execute or the run button. Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy Bypass -Force;<\/p>\n\n\n\n<pre class=\"wp-block-code has-luminous-vivid-amber-color has-ast-global-color-6-background-color has-text-color has-background\"><code>\/\/\/ Tells GSS not to process any AsCoM moment commands for external programs using the AsCoM driver. \n\/\/\/ &lt;returns&gt;bool&lt;\/returns&gt;\nbool AscomOn { get; set; }\n\n\n\/\/\/ Starts the AutoHome slew to home sensors\n\/\/\/ &lt;param name=\"degreelimit\"&gt;&lt;\/param&gt;\n\/\/\/ &lt;param name=\"offsetdec\"&gt;&lt;\/param&gt;\nvoid AutoHomeStart(int degreelimit = 100, int offsetdec = 0);\n\n\n\/\/\/ Stops Auto home from completing\nvoid AutoHomeStop();\n\n\n\/\/\/ Move axis number of micro steps, not marked as slewing\n\/\/\/ &lt;param name=\"axis\"&gt;&gt;axis number 1 or 2&lt;\/param&gt;\n\/\/\/ &lt;param name=\"steps\"&gt;number of micro steps&lt;\/param&gt;\n\/\/\/ &lt;returns&gt;nothing&lt;\/returns&gt;\nvoid AxisMoveSteps(int axis, long steps);\n\n\n\/\/\/ Send a pulse command\n\/\/\/ &lt;param name=\"axis\"&gt;Axis 1 or 2&lt;\/param&gt;\n\/\/\/ &lt;param name=\"guideRate\"&gt;GuideRate degrees, 15.041\/3600*.5, negative value denotes direction&lt;\/param&gt;\n\/\/\/ &lt;param name=\"duration\"&gt;length of pulse in milliseconds, always positive numbers&lt;\/param&gt;\n\/\/\/ &lt;param name=\"backlashSteps\"&gt;Positive micro steps added for backlash&lt;\/param&gt;\n\/\/\/ &lt;returns&gt;nothing&lt;\/returns&gt;\nvoid AxisPulse(int axis, double guideRate, int duration, int backlashSteps = 0);\n\n\n\/\/\/ Goto position in degree\n\/\/\/ &lt;param name=\"axis\"&gt;axis number 1 or 2&lt;\/param&gt;\n\/\/\/ &lt;param name=\"targetPosition\"&gt;position in degrees&lt;\/param&gt;\n\/\/\/ &lt;returns&gt;nothing&lt;\/returns&gt;\nvoid AxisGoToTarget(int axis, double targetPosition);\n\n\n\/\/\/ Slew axis based on a rate in degrees.  Use this for small movements\n\/\/\/ like pulse guiding, rate changes, guiding changes, not go tos\n\/\/\/ &lt;param name=\"axis\"&gt;axis number 1 or 2&lt;\/param&gt;\n\/\/\/ &lt;param name=\"rate\"&gt;rate\/sec in degrees&lt;\/param&gt;\n\/\/\/ &lt;returns&gt;nothing&lt;\/returns&gt;\nvoid AxisSlew(int axis, double rate);\n\n\n\/\/\/ K Slows to a stop movement of an Axis \n\/\/\/ &lt;param name=\"axis\"&gt;axis number 1 or 2&lt;\/param&gt;\nvoid AxisStop(int axis);\n\n\n\/\/\/ L Abruptly stops movement of an Axis\n\/\/\/ &lt;param name=\"axis\"&gt;axis number 1 or 2&lt;\/param&gt;\n\/\/\/ &lt;returns&gt;nothing&lt;\/returns&gt;\nvoid AxisStopInstant(int axis);\n\n\n\/\/\/ q Axes slews must start independently \nbool CanAxisSlewsIndependent { get; }\n\n\n\/\/\/ q Does mount support AZ\/EQ mode\nbool CanAzEq { get; }\n\n\n\/\/\/ q Does mount support dual encoders\nbool CanDualEncoders { get; }\n\n\n\/\/\/ q Does mount support half current tracking\nbool CanHalfTrack { get; }\n\n\n\/\/\/ q Does mount support home sensors\nbool CanHomeSensors { get; }\n\n\n\/\/\/ Test result if the mount can move Dec a single step in GoTo mode\nbool CanOneStepDec { get; }\n\n\n\/\/\/ Test result if the mount can move Ra a single step in GoTo mode\nbool CanOneStepRa { get; }\n\n\n\/\/\/ q Does mount support a polar LED\nbool CanPolarLed { get; }\n\n\n\/\/\/ q Does mount support PPec\nbool CanPPec { get; }\n\n\n\/\/\/ q Does mount support WiFi\nbool CanWifi { get; }\n\n\n\/\/\/ Sets the amount of steps added to Dec for reverse backlash pulse\nint DecBacklash { get; set; }\n\n\n\/\/\/ Gets the number of steps from the angle in rad\n\/\/\/ &lt;param name=\"axis\"&gt;&lt;\/param&gt;\n\/\/\/ &lt;param name=\"angleInRad\"&gt;&lt;\/param&gt;\n\/\/\/ &lt;returns&gt;Steps in rad&lt;\/returns&gt;\nlong GetAngleToStep(int axis, double angleInRad);\n\n\n\/\/\/ e Gets versions of axis in long format\n\/\/\/ &lt;param name=\"axis\"&gt;&lt;\/param&gt;\n\/\/\/ &lt;returns&gt;long axis version&lt;\/returns&gt;\nlong GetAxisVersion(int axis);\n\n\n\/\/\/ e Gets version of axis in string readable format\n\/\/\/ &lt;param name=\"axis\"&gt;&lt;\/param&gt;\n\/\/\/ &lt;returns&gt;string axis version as string&lt;\/returns&gt;\nstring GetAxisStringVersion(int axis);\n\n\n\/\/\/ j Gets current axis position in degrees\n\/\/\/ &lt;param name=\"axis\"&gt;axis number 1 or 2&lt;\/param&gt;\n\/\/\/ &lt;returns&gt;Get Current Axis position as double&lt;\/returns&gt;\ndouble GetAxisPosition(int axis);\n\n\n\/\/\/ j Gets axis position counter\n\/\/\/ &lt;param name=\"axis\"&gt;axis number 1 or 2&lt;\/param&gt;\n\/\/\/ &lt;returns&gt;Cardinal encoder count as long&lt;\/returns&gt;\nlong GetAxisPositionCounter(int axis);\n\n\n\/\/\/ d Gets Axis Current Encoder count\n\/\/\/ &lt;param name=\"axis\"&gt;axis number 1 or 2&lt;\/param&gt;\n\/\/\/ &lt;returns&gt;count as double&lt;\/returns&gt;\ndouble GetEncoderCount(int axis);\n\n\n\/\/\/ Multiply the value of radians\/second by this factor to get a 32-bit integer for the set speed used by the motor board.\n\/\/\/ &lt;param name=\"axis\"&gt;axis number 1 or 2&lt;\/param&gt;\n\/\/\/ &lt;returns&gt;factor used to get the speed&lt;\/returns&gt;\ndouble GetFactorRadRateToInt(int axis);\n\n\n\/\/\/ Inquire motor high speed ratio\n\/\/\/ &lt;param name=\"axis\"&gt;axis number 1 or 2&lt;\/param&gt;\n\/\/\/ &lt;returns&gt;Ratio used to determine high speed&lt;\/returns&gt;\nlong GetHighSpeedRatio(int axis);\n\n\n\/\/\/ q Get Home position \n\/\/\/ &lt;param name=\"axis\"&gt;axis number 1 or 2&lt;\/param&gt; \nlong GetHomePosition(int axis);\n\n\n\/\/\/ h Get Current \"goto\" target\n\/\/\/ &lt;param name=\"axis\"&gt;axis number 1 or 2&lt;\/param&gt;\ndouble GetLastGoToTarget(int axis);\n\n\n\/\/\/ i Get Current \"slew\" speed\n\/\/\/ &lt;param name=\"axis\"&gt;axis number 1 or 2&lt;\/param&gt;\nlong GetLastSlewSpeed(int axis);\n\n\n\/\/\/ Margin used to move from high speed to low speed\n\/\/\/ &lt;param name=\"axis\"&gt;axis number 1 or 2&lt;\/param&gt;\n\/\/\/ &lt;returns&gt;&lt;\/returns&gt;\nlong GetLowSpeedGotoMargin(int axis);\n\n\n\/\/\/ e Gets the complete version string\n\/\/\/ &lt;returns&gt;&lt;\/returns&gt;\nstring GetMotorCardVersion(int axis);\n\n\n\/\/\/ Runs a motor test to see of axis can move one step in GoTo mode\n\/\/\/ &lt;param name=\"axis\"&gt;axis number 1 or 2&lt;\/param&gt;\n\/\/\/ &lt;returns&gt;Result of each axis test&lt;\/returns&gt;\nbool GetOneStepIndicator(int axis);\n\n\n\/\/\/ s Inquire PEC Period \":s(*1)\", where *1: '1'= CH1, '2'= CH2, '3'= Both.\n\/\/\/ &lt;param name=\"axis\"&gt;axis number 1 or 2&lt;\/param&gt;\ndouble GetPecPeriod(int axis);\n\n\n\/\/\/ c Micro steps from target where the ramp down process begins\n\/\/\/ &lt;param name=\"axis\"&gt;axis number 1 or 2&lt;\/param&gt;\ndouble GetRampDownRange(int axis);\n\n\n\/\/\/ D Sidereal rate in axis speed\n\/\/\/ &lt;returns&gt;&lt;\/returns&gt;\n\/\/\/ &lt;param name=\"axis\"&gt;axis number 1 or 2&lt;\/param&gt;\nlong GetSiderealRate(int axis);\n\n\n\/\/\/ Gets the angle in rad from amount of steps\n\/\/\/ &lt;param name=\"axis\"&gt;&lt;\/param&gt;\n\/\/\/ &lt;param name=\"steps\"&gt;&lt;\/param&gt;\n\/\/\/ &lt;returns&gt;&lt;\/returns&gt;\ndouble GetStepToAngle(int axis, long steps);\n\n\n\/\/\/ a Steps per revolution\n\/\/\/ &lt;param name=\"axis\"&gt;axis number 1 or 2&lt;\/param&gt;\n\/\/\/ &lt;returns&gt;Step Count&lt;\/returns&gt;\nlong GetStepsPerRevolution(int axis);\n\n\n\/\/\/ b Frequency of stepping timer\n\/\/\/ &lt;param name=\"axis\"&gt;axis number 1 or 2&lt;\/param&gt;\n\/\/\/ &lt;returns&gt;Frequency of stepping timer&lt;\/returns&gt;\nlong GetStepTimeFreq(int axis);\n\n\n\/\/\/ The current Declination guide rate \ndouble GuideRateDeclination { get; set; }\n\n\n\/\/\/ The current Right Ascension guide rate \ndouble GuideRateRightAscension { get; set; }\n\n\n\/\/\/ F Initialize both Axes\nvoid InitializeAxes();\n\n\n\/\/\/ Is the auto home process running\nbool IsAutoHomeRunning { get; }\n\n\n\/\/\/ Is mount in a connected serial state\nbool IsConnected { get; }\n\n\n\/\/\/ Starts or Stops mount and connection\nbool IsMountRunning { get; set; }\n\n\n\/\/\/ Is mount parked\nbool IsParked { get; }\n\n\n\/\/\/ q Is the mount collecting PPec data\nbool IsPPecInTrainingOn { get; }\n\n\n\/\/\/ q Does the mount have PPec turned on\nbool IsPPecOn { get; }\n\n\n\/\/\/ j Is axis at full stop\n\n\/\/\/ &lt;param name=\"axis\"&gt;axis number 1 or 2&lt;\/param&gt;\n\/\/\/ &lt;returns&gt;&lt;\/returns&gt;\nbool IsFullStop(int axis);\n\n\n\/\/\/ j Is axis in high speed mode\n\/\/\/ &lt;param name=\"axis\"&gt;axis number 1 or 2&lt;\/param&gt;\n\/\/\/ &lt;returns&gt;&lt;\/returns&gt;\nbool IsHighSpeed(int axis);\n\n\n\/\/\/ Is mount type set to SkyWatcher\nbool IsServerSkyWatcher { get; }\n\n\n\/\/\/ f Is axis slewing normal mode\n\/\/\/ &lt;param name=\"axis\"&gt;axis number 1 or 2&lt;\/param&gt;\n\/\/\/ &lt;returns&gt;&lt;\/returns&gt;\nbool IsSlewing(int axis);\n\n\n\/\/\/ f Is axis slewing in a positive direction\n\/\/\/ &lt;param name=\"axis\"&gt;axis number 1 or 2&lt;\/param&gt;\n\/\/\/ &lt;returns&gt;&lt;\/returns&gt;\nbool IsSlewingForward(int axis);\n\n\n\/\/\/ f Is axis slewing in goto mode\n\/\/\/ &lt;param name=\"axis\"&gt;axis number 1 or 2&lt;\/param&gt;\n\/\/\/ &lt;returns&gt;&lt;\/returns&gt;\nbool IsSlewingTo(int axis);\n\n\n\/\/\/ Last known error from the AutoHome Process\nstring LastAutoHomeError { get; }\n\n\n\/\/\/ e Identify type of mount\nbool MountType { get; }\n\n\n\/\/\/ e Identify board version\nbool MountVersion { get; }\n\n\n\/\/\/ Park mount to the current selected park position\nvoid Park();\n\n\n\/\/\/ Get parked selected or Set to an existing park position name\nstring ParkPosition { get; set; }\n\n\n\/\/\/ Turns PPec off during movements and then back on for error correction moves\n\/\/\/ &lt;param name=\"on\"&gt;&lt;\/param&gt;\nvoid SkySetAlternatingPPec(bool on);\n\n\n\/\/\/ E Reset the position of an axis\n\/\/\/ &lt;param name=\"axis\"&gt;axis number 1 or 2&lt;\/param&gt;\n\/\/\/ &lt;param name=\"position\"&gt;degrees&lt;\/param&gt;\nvoid SetAxisPosition(int axis, double position);\n\n\n\/\/\/ M Set the break point increment\n\/\/\/ &lt;param name=\"axis\"&gt;axis number 1 or 2&lt;\/param&gt;\n\/\/\/ &lt;param name=\"stepsCount\"&gt;The steps count.&lt;\/param&gt;\nvoid SetBreakPointIncrement(int axis, long stepsCount);\n\n\n\/\/\/ Turns on or off converting a Dec pulse guide into a Dec GoTo\n\/\/\/ &lt;param name=\"on\"&gt;&lt;\/param&gt;\nvoid SetDecPulseToGoTo(bool on);\n\n\n\/\/\/ W 4-5 Turn on off encoders\n\/\/\/ &lt;param name=\"axis\"&gt;axis number 1 or 2&lt;\/param&gt;\n\/\/\/ &lt;param name=\"on\"&gt;&lt;\/param&gt;\nvoid SetEncoder(int axis, bool on);\n\n\n\/\/\/ W 6 Enable or Disable Full Current Low speed\n\/\/\/ &lt;param name=\"axis\"&gt;axis number 1 or 2&lt;\/param&gt;\n\/\/\/ &lt;param name=\"on\"&gt;&lt;\/param&gt;\nvoid SetFullCurrentLowSpeed(int axis, bool on);\n\n\n\/\/\/  H Set the goto target increment in steps\n\/\/\/ &lt;param name=\"axis\"&gt;axis number 1 or 2&lt;\/param&gt;\n\/\/\/ &lt;param name=\"stepsCount\"&gt;&lt;\/param&gt;\nvoid SetGotoTargetIncrement(int axis, long stepsCount);\n\n\n\/\/\/ W 8 Reset the home position index\n\/\/\/ &lt;param name=\"axis\"&gt;axis number 1 or 2&lt;\/param&gt;\nvoid SetHomePositionIndex(int axis);\n\n\n\/\/\/ J Start motion based on previous settings\n\/\/\/ &lt;param name=\"axis\"&gt;axis number 1 or 2&lt;\/param&gt;\nvoid StartMotion(int axis);\n\n\n\/\/\/ G Set a different motion mode\n\/\/\/ &lt;param name=\"axis\"&gt;Axis number 1 or 2&lt;\/param&gt;\n\/\/\/ &lt;param name=\"func\"&gt;'0' high speed GOTO slewing,'1' low speed slewing mode,'2' low speed GOTO mode,'3' High slewing mode&lt;\/param&gt;\n\/\/\/ &lt;param name=\"direction\"&gt;0=forward (CW) right, 1=backward (CCW) left, also based on observatory settings&lt;\/param&gt;\nvoid SetMotionMode(int axis, int func, int direction);\n\n\n\/\/\/ W 2-3 Turn on off PPec\n\/\/\/ &lt;param name=\"axis\"&gt;axis number 1 or 2&lt;\/param&gt;\n\/\/\/ &lt;param name=\"on\"&gt;&lt;\/param&gt;\nvoid SetPPec(int axis, bool on);\n\n\n\/\/\/ W 0-1 Turn on off PPEC training\n\/\/\/ &lt;param name=\"axis\"&gt;axis number 1 or 2&lt;\/param&gt;\n\/\/\/ &lt;param name=\"on\"&gt;&lt;\/param&gt;\nvoid SetPPecTrain(int axis, bool on);\n\n\n\/\/\/ I Set slewing rate, seems to relate to amount of skipped step counts.  \n\/\/\/ &lt;param name=\"axis\"&gt;axis number 1 or 2&lt;\/param&gt;\n\/\/\/ &lt;param name=\"stepSpeed\"&gt;StepSpeed = 1 motor step movement, higher counts means slower movements&lt;\/param&gt;\nvoid SetStepSpeed(int axis, long stepSpeed);\n\n\n\/\/\/ Set simulator goto rate \n\/\/\/ &lt;param name=\"rate\"&gt;1-20&lt;\/param&gt;\nvoid SetSimGotoSpeed(int rate);\n\n\n\/\/\/ S Set absolute goto target \n\/\/\/ &lt;param name=\"axis\"&gt;axis number 1 or 2&lt;\/param&gt;\n\/\/\/ &lt;param name=\"position\"&gt;&lt;\/param&gt;\nvoid SetTargetPosition(int axis, double position);\n\n\n\/\/\/ shutdown and close the server\nvoid ShutdownServer();\n\n\n\/\/\/ UnPark mount\nvoid UnPark();\n<\/code><\/pre>\n\n\n\n<script async=\"\" src=\"https:\/\/pagead2.googlesyndication.com\/pagead\/js\/adsbygoogle.js?client=ca-pub-8043655658877006\" crossorigin=\"anonymous\"><\/script>\n<!-- Display ad 2 -->\n<ins class=\"adsbygoogle\" style=\"display:block\" data-ad-client=\"ca-pub-8043655658877006\" data-ad-slot=\"6640042611\" data-ad-format=\"auto\" data-full-width-responsive=\"true\"><\/ins>\n<script>\n     (adsbygoogle = window.adsbygoogle || []).push({});\n<\/script><br>\n","protected":false},"featured_media":0,"parent":1049,"menu_order":12,"comment_status":"open","ping_status":"closed","template":"","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"doc_tag":[],"class_list":["post-1465","docs","type-docs","status-publish","hentry"],"aioseo_notices":[],"comment_count":0,"_links":{"self":[{"href":"https:\/\/greenswamp.org\/index.php?rest_route=\/wp\/v2\/docs\/1465","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/greenswamp.org\/index.php?rest_route=\/wp\/v2\/docs"}],"about":[{"href":"https:\/\/greenswamp.org\/index.php?rest_route=\/wp\/v2\/types\/docs"}],"replies":[{"embeddable":true,"href":"https:\/\/greenswamp.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1465"}],"version-history":[{"count":3,"href":"https:\/\/greenswamp.org\/index.php?rest_route=\/wp\/v2\/docs\/1465\/revisions"}],"predecessor-version":[{"id":2020,"href":"https:\/\/greenswamp.org\/index.php?rest_route=\/wp\/v2\/docs\/1465\/revisions\/2020"}],"up":[{"embeddable":true,"href":"https:\/\/greenswamp.org\/index.php?rest_route=\/wp\/v2\/docs\/1049"}],"next":[{"title":"Meridian Flips","link":"https:\/\/greenswamp.org\/?docs=gs-server-overview\/flips","href":"https:\/\/greenswamp.org\/index.php?rest_route=\/wp\/v2\/docs\/2047"}],"prev":[{"title":"Focuser Tab","link":"https:\/\/greenswamp.org\/?docs=gs-server-overview\/focuser-tab","href":"https:\/\/greenswamp.org\/index.php?rest_route=\/wp\/v2\/docs\/1461"}],"wp:attachment":[{"href":"https:\/\/greenswamp.org\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1465"}],"wp:term":[{"taxonomy":"doc_tag","embeddable":true,"href":"https:\/\/greenswamp.org\/index.php?rest_route=%2Fwp%2Fv2%2Fdoc_tag&post=1465"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}