CINXE.COM

Maritime 2.0 | Spire Maritime Documentation

<!doctype html><html class="no-js " lang="en"><head><meta charset="utf-8"><title>Maritime 2.0 | Spire Maritime Documentation</title><meta name="viewport" content="width=device-width, initial-scale=1"><link rel="preconnect" href="https://fonts.gstatic.com"><link rel="preconnect" href="https://cdn.jsdelivr.net"><meta name='robots' content='index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1' /><link rel="canonical" href="https://documentation.spire.com/maritime-2-0/" /><meta property="og:locale" content="en_US" /><meta property="og:type" content="article" /><meta property="og:title" content="Maritime 2.0 | Spire Maritime Documentation" /><meta property="og:description" content="Maritime 2.0 was introduced as an evolution of our existing REST APIs in 2020, as a response to the challenges in increasing data volume and quality. Maritime 2.0 was developed to be scalable. Spire chose to leverage GraphQL technology instead of REST for this newly enhanced service as GraphQL offers the client the ability to [&hellip;]" /><meta property="og:url" content="https://documentation.spire.com/maritime-2-0/" /><meta property="og:site_name" content="Spire Maritime Documentation" /><meta property="article:publisher" content="https://www.facebook.com/satelliteaisdata/" /><meta property="article:modified_time" content="2022-10-26T15:29:02+00:00" /><meta property="og:image" content="https://documentation.spire.com/wp-content/uploads/2022/10/spire-maritime-docs.jpg" /><meta property="og:image:width" content="1500" /><meta property="og:image:height" content="500" /><meta property="og:image:type" content="image/jpeg" /><meta name="twitter:card" content="summary_large_image" /><meta name="twitter:site" content="@aisdata" /><meta name="twitter:label1" content="Est. reading time" /><meta name="twitter:data1" content="1 minute" /><style media="all">img:is([sizes="auto" i],[sizes^="auto," i]){contain-intrinsic-size:3000px 1500px} /*! This file is auto-generated */ .wp-block-button__link{color:#fff;background-color:#32373c;border-radius:9999px;box-shadow:none;text-decoration:none;padding:calc(.667em + 2px) calc(1.333em + 2px);font-size:1.125em}.wp-block-file__button{background:#32373c;color:#fff;text-decoration:none}:root{--wp--preset--aspect-ratio--square:1;--wp--preset--aspect-ratio--4-3:4/3;--wp--preset--aspect-ratio--3-4:3/4;--wp--preset--aspect-ratio--3-2:3/2;--wp--preset--aspect-ratio--2-3:2/3;--wp--preset--aspect-ratio--16-9:16/9;--wp--preset--aspect-ratio--9-16:9/16;--wp--preset--color--black:#000;--wp--preset--color--cyan-bluish-gray:#abb8c3;--wp--preset--color--white:#fff;--wp--preset--color--pale-pink:#f78da7;--wp--preset--color--vivid-red:#cf2e2e;--wp--preset--color--luminous-vivid-orange:#ff6900;--wp--preset--color--luminous-vivid-amber:#fcb900;--wp--preset--color--light-green-cyan:#7bdcb5;--wp--preset--color--vivid-green-cyan:#00d084;--wp--preset--color--pale-cyan-blue:#8ed1fc;--wp--preset--color--vivid-cyan-blue:#0693e3;--wp--preset--color--vivid-purple:#9b51e0;--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple:linear-gradient(135deg,rgba(6,147,227,1) 0%,#9b51e0 100%);--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan:linear-gradient(135deg,#7adcb4 0%,#00d082 100%);--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange:linear-gradient(135deg,rgba(252,185,0,1) 0%,rgba(255,105,0,1) 100%);--wp--preset--gradient--luminous-vivid-orange-to-vivid-red:linear-gradient(135deg,rgba(255,105,0,1) 0%,#cf2e2e 100%);--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray:linear-gradient(135deg,#eee 0%,#a9b8c3 100%);--wp--preset--gradient--cool-to-warm-spectrum:linear-gradient(135deg,#4aeadc 0%,#9778d1 20%,#cf2aba 40%,#ee2c82 60%,#fb6962 80%,#fef84c 100%);--wp--preset--gradient--blush-light-purple:linear-gradient(135deg,#ffceec 0%,#9896f0 100%);--wp--preset--gradient--blush-bordeaux:linear-gradient(135deg,#fecda5 0%,#fe2d2d 50%,#6b003e 100%);--wp--preset--gradient--luminous-dusk:linear-gradient(135deg,#ffcb70 0%,#c751c0 50%,#4158d0 100%);--wp--preset--gradient--pale-ocean:linear-gradient(135deg,#fff5cb 0%,#b6e3d4 50%,#33a7b5 100%);--wp--preset--gradient--electric-grass:linear-gradient(135deg,#caf880 0%,#71ce7e 100%);--wp--preset--gradient--midnight:linear-gradient(135deg,#020381 0%,#2874fc 100%);--wp--preset--font-size--small:13px;--wp--preset--font-size--medium:20px;--wp--preset--font-size--large:36px;--wp--preset--font-size--x-large:42px;--wp--preset--spacing--20:.44rem;--wp--preset--spacing--30:.67rem;--wp--preset--spacing--40:1rem;--wp--preset--spacing--50:1.5rem;--wp--preset--spacing--60:2.25rem;--wp--preset--spacing--70:3.38rem;--wp--preset--spacing--80:5.06rem;--wp--preset--shadow--natural:6px 6px 9px rgba(0,0,0,.2);--wp--preset--shadow--deep:12px 12px 50px rgba(0,0,0,.4);--wp--preset--shadow--sharp:6px 6px 0px rgba(0,0,0,.2);--wp--preset--shadow--outlined:6px 6px 0px -3px rgba(255,255,255,1),6px 6px rgba(0,0,0,1);--wp--preset--shadow--crisp:6px 6px 0px rgba(0,0,0,1)}:where(.is-layout-flex){gap:.5em}:where(.is-layout-grid){gap:.5em}body .is-layout-flex{display:flex}.is-layout-flex{flex-wrap:wrap;align-items:center}.is-layout-flex>:is(*,div){margin:0}body .is-layout-grid{display:grid}.is-layout-grid>:is(*,div){margin:0}:where(.wp-block-columns.is-layout-flex){gap:2em}:where(.wp-block-columns.is-layout-grid){gap:2em}:where(.wp-block-post-template.is-layout-flex){gap:1.25em}:where(.wp-block-post-template.is-layout-grid){gap:1.25em}.has-black-color{color:var(--wp--preset--color--black) !important}.has-cyan-bluish-gray-color{color:var(--wp--preset--color--cyan-bluish-gray) !important}.has-white-color{color:var(--wp--preset--color--white) !important}.has-pale-pink-color{color:var(--wp--preset--color--pale-pink) !important}.has-vivid-red-color{color:var(--wp--preset--color--vivid-red) !important}.has-luminous-vivid-orange-color{color:var(--wp--preset--color--luminous-vivid-orange) !important}.has-luminous-vivid-amber-color{color:var(--wp--preset--color--luminous-vivid-amber) !important}.has-light-green-cyan-color{color:var(--wp--preset--color--light-green-cyan) !important}.has-vivid-green-cyan-color{color:var(--wp--preset--color--vivid-green-cyan) !important}.has-pale-cyan-blue-color{color:var(--wp--preset--color--pale-cyan-blue) !important}.has-vivid-cyan-blue-color{color:var(--wp--preset--color--vivid-cyan-blue) !important}.has-vivid-purple-color{color:var(--wp--preset--color--vivid-purple) !important}.has-black-background-color{background-color:var(--wp--preset--color--black) !important}.has-cyan-bluish-gray-background-color{background-color:var(--wp--preset--color--cyan-bluish-gray) !important}.has-white-background-color{background-color:var(--wp--preset--color--white) !important}.has-pale-pink-background-color{background-color:var(--wp--preset--color--pale-pink) !important}.has-vivid-red-background-color{background-color:var(--wp--preset--color--vivid-red) !important}.has-luminous-vivid-orange-background-color{background-color:var(--wp--preset--color--luminous-vivid-orange) !important}.has-luminous-vivid-amber-background-color{background-color:var(--wp--preset--color--luminous-vivid-amber) !important}.has-light-green-cyan-background-color{background-color:var(--wp--preset--color--light-green-cyan) !important}.has-vivid-green-cyan-background-color{background-color:var(--wp--preset--color--vivid-green-cyan) !important}.has-pale-cyan-blue-background-color{background-color:var(--wp--preset--color--pale-cyan-blue) !important}.has-vivid-cyan-blue-background-color{background-color:var(--wp--preset--color--vivid-cyan-blue) !important}.has-vivid-purple-background-color{background-color:var(--wp--preset--color--vivid-purple) !important}.has-black-border-color{border-color:var(--wp--preset--color--black) !important}.has-cyan-bluish-gray-border-color{border-color:var(--wp--preset--color--cyan-bluish-gray) !important}.has-white-border-color{border-color:var(--wp--preset--color--white) !important}.has-pale-pink-border-color{border-color:var(--wp--preset--color--pale-pink) !important}.has-vivid-red-border-color{border-color:var(--wp--preset--color--vivid-red) !important}.has-luminous-vivid-orange-border-color{border-color:var(--wp--preset--color--luminous-vivid-orange) !important}.has-luminous-vivid-amber-border-color{border-color:var(--wp--preset--color--luminous-vivid-amber) !important}.has-light-green-cyan-border-color{border-color:var(--wp--preset--color--light-green-cyan) !important}.has-vivid-green-cyan-border-color{border-color:var(--wp--preset--color--vivid-green-cyan) !important}.has-pale-cyan-blue-border-color{border-color:var(--wp--preset--color--pale-cyan-blue) !important}.has-vivid-cyan-blue-border-color{border-color:var(--wp--preset--color--vivid-cyan-blue) !important}.has-vivid-purple-border-color{border-color:var(--wp--preset--color--vivid-purple) !important}.has-vivid-cyan-blue-to-vivid-purple-gradient-background{background:var(--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple) !important}.has-light-green-cyan-to-vivid-green-cyan-gradient-background{background:var(--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan) !important}.has-luminous-vivid-amber-to-luminous-vivid-orange-gradient-background{background:var(--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange) !important}.has-luminous-vivid-orange-to-vivid-red-gradient-background{background:var(--wp--preset--gradient--luminous-vivid-orange-to-vivid-red) !important}.has-very-light-gray-to-cyan-bluish-gray-gradient-background{background:var(--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray) !important}.has-cool-to-warm-spectrum-gradient-background{background:var(--wp--preset--gradient--cool-to-warm-spectrum) !important}.has-blush-light-purple-gradient-background{background:var(--wp--preset--gradient--blush-light-purple) !important}.has-blush-bordeaux-gradient-background{background:var(--wp--preset--gradient--blush-bordeaux) !important}.has-luminous-dusk-gradient-background{background:var(--wp--preset--gradient--luminous-dusk) !important}.has-pale-ocean-gradient-background{background:var(--wp--preset--gradient--pale-ocean) !important}.has-electric-grass-gradient-background{background:var(--wp--preset--gradient--electric-grass) !important}.has-midnight-gradient-background{background:var(--wp--preset--gradient--midnight) !important}.has-small-font-size{font-size:var(--wp--preset--font-size--small) !important}.has-medium-font-size{font-size:var(--wp--preset--font-size--medium) !important}.has-large-font-size{font-size:var(--wp--preset--font-size--large) !important}.has-x-large-font-size{font-size:var(--wp--preset--font-size--x-large) !important}:where(.wp-block-post-template.is-layout-flex){gap:1.25em}:where(.wp-block-post-template.is-layout-grid){gap:1.25em}:where(.wp-block-columns.is-layout-flex){gap:2em}:where(.wp-block-columns.is-layout-grid){gap:2em}:root :where(.wp-block-pullquote){font-size:1.5em;line-height:1.6} /*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */ html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}main{display:block}h1{font-size:2em;margin:.67em 0}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none;max-width:100%;height:auto}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button}button::-moz-focus-inner,[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner{border-style:none;padding:0}button:-moz-focusring,[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}template{display:none}[hidden]{display:none}.spiregradient{background-image:-webkit-linear-gradient(0deg,#04060f,#be0000);background-image:-moz-linear-gradient(0deg,#04060f,#be0000);background-image:-ms-linear-gradient(0deg,#04060f,#be0000);background-image:-o-linear-gradient(0deg,#04060f,#be0000);background-image:linear-gradient(90deg,#04060f,#be0000)}.maritimegradient{background-image:-webkit-linear-gradient(0deg,#0f447a,#008081,#00806c) !important;background-image:-moz-linear-gradient(0deg,#0f447a,#008081,#00806c) !important;background-image:-ms-linear-gradient(0deg,#0f447a,#008081,#00806c) !important;background-image:-o-linear-gradient(0deg,#0f447a,#008081,#00806c) !important;background-image:linear-gradient(90deg,#0f447a,#008081,#00806c) !important}.aviationgradient{background-image:-webkit-linear-gradient(0deg,#80146e,#3c2680,#0f447a) !important;background-image:-moz-linear-gradient(0deg,#80146e,#3c2680,#0f447a) !important;background-image:-ms-linear-gradient(0deg,#80146e,#3c2680,#0f447a) !important;background-image:-o-linear-gradient(0deg,#80146e,#3c2680,#0f447a) !important;background-image:linear-gradient(90deg,#80146e,#3c2680,#0f447a) !important}.weathergradient{background-image:-webkit-linear-gradient(0deg,#00806c,#c7904b,#c85a3d) !important;background-image:-moz-linear-gradient(0deg,#00806c,#c7904b,#c85a3d) !important;background-image:-ms-linear-gradient(0deg,#00806c,#c7904b,#c85a3d) !important;background-image:-o-linear-gradient(0deg,#00806c,#c7904b,#c85a3d) !important;background-image:linear-gradient(90deg,#00806c,#c7904b,#c85a3d) !important}.spaceservicesgradient,.space-servicesgradient,.spacegradient,.orbitalgradient{background-image:-webkit-linear-gradient(0deg,#04060f,#485463,#2280c5) !important;background-image:-moz-linear-gradient(0deg,#04060f,#485463,#2280c5) !important;background-image:-ms-linear-gradient(0deg,#04060f,#485463,#2280c5) !important;background-image:-o-linear-gradient(0deg,#04060f,#485463,#2280c5) !important;background-image:linear-gradient(90deg,#04060f,#485463,#2280c5) !important}.federalgradient{background-image:-webkit-linear-gradient(0deg,#00806c,#04060f,#be0000) !important;background-image:-moz-linear-gradient(0deg,#00806c,#04060f,#be0000) !important;background-image:-ms-linear-gradient(0deg,#00806c,#04060f,#be0000) !important;background-image:-o-linear-gradient(0deg,#00806c,#04060f,#be0000) !important;background-image:linear-gradient(90deg,#00806c,#04060f,#be0000) !important}.earthintelligencegradient,.earth-intelligencegradient,.earthintelgradient,.earthinformationgradient,.earthinfogradient{background-image:-webkit-linear-gradient(0deg,#008081,#00806c,#2280c5) !important;background-image:-moz-linear-gradient(0deg,#008081,#00806c,#2280c5) !important;background-image:-ms-linear-gradient(0deg,#008081,#00806c,#2280c5) !important;background-image:-o-linear-gradient(0deg,#008081,#00806c,#2280c5) !important;background-image:linear-gradient(90deg,#008081,#00806c,#2280c5) !important}@font-face{font-family:"Apercu";src:url(//documentation.spire.com/wp-content/themes/docs/css/../font/apercu-mono-regular.woff2) format("woff2"),url(//documentation.spire.com/wp-content/themes/docs/css/../font/apercu-mono-regular.woff) format("woff");font-weight:400;font-display:swap}@font-face{font-family:"Apercu";src:url(//documentation.spire.com/wp-content/themes/docs/css/../font/apercu-mono-bold.woff2) format("woff2"),url(//documentation.spire.com/wp-content/themes/docs/css/../font/apercu-mono-bold.woff) format("woff");font-weight:700;font-display:swap} /*! HTML5 Boilerplate v8.0.0 | MIT License | https://html5boilerplate.com/ */ html{color:#04060f;font-size:1em;line-height:1.4;overflow-x:hidden;background-color:#fff;overscroll-behavior-y:none}::-moz-selection{background:#b3d4fc;text-shadow:none}::selection{background:#b3d4fc;text-shadow:none}hr{display:block;height:1px;border:0;border-top:1px solid #c6c7c8;margin:1em 0;padding:0}audio,canvas,iframe,img,svg,video{vertical-align:middle}fieldset{border:0;margin:0;padding:0}textarea{resize:vertical}a{color:inherit;text-decoration:none}nav ul{list-style:none;padding:0;margin:0}nav ul li+li{margin-top:0}dl,dt,dd{margin:0;padding:0}blockquote{padding:0;margin-left:0}.mobileonly{display:none}@media only screen and (max-width:750px){.desktoponly{display:none}.mobileonly{display:block}}.mobilehide{display:block}.desktophide{display:none}@media only screen and (max-width:750px){.desktophide{display:block}.mobilehide{display:none}}.clearfix .col{font-style:normal;float:left;margin:0 1.3%}.clearfix .col.col1{width:5.7%}.clearfix .col.col2{width:14%}.clearfix .col.col2five{width:17.363%}.clearfix .col.col3{width:22.3%}.clearfix .col.col4{width:30.6%}.clearfix .col.col5{width:38.9%}.clearfix .col.col6{width:47.2%}.clearfix .col.col7{width:55.5%}.clearfix .col.col8{width:63.8%}.clearfix .col.col9{width:72.1%}.clearfix .col.col10{width:80.4%}.clearfix .col.col11{width:88.7%}.clearfix .col.col12{width:97%}body{padding-top:50px}.wrapper{position:relative;max-width:1440px;width:100%;margin:0 auto}@media only screen and (max-width:1000px){.wrapper{width:97%}.clearfix .col.col5,.clearfix .col.col6,.clearfix .col.col7,.clearfix .col.col8,.clearfix .col.col9,.clearfix .col.col10,.clearfix .col.col11,.clearfix .col.col12{width:97.4%;float:none;clear:left}}@media only screen and (max-width:750px){.clearfix .col.col1,.clearfix .col.col2,.clearfix .col.col2five,.clearfix .col.col3,.clearfix .col.col4{width:97.4%;float:none}.clearfix .col.empty{display:none}}body{font-family:'Exo',sans-serif,sans-serif;letter-spacing:.02em;font-weight:400;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}h1,h2,h3,h4,h5,h6{font-weight:800;font-family:'Exo',sans-serif;letter-spacing:.02em;margin:0}h1 a,h2 a,h3 a,h4 a,h5 a,h6 a{color:#be0000;text-decoration:underline}h1 .beta_label,h2 .beta_label,h3 .beta_label,h4 .beta_label,h5 .beta_label,h6 .beta_label{background:#be0000;color:#fff;border-radius:.2em;display:inline-block;font-size:.6em;padding:.3em .3em .25em;text-transform:uppercase;margin-right:.7em;vertical-align:middle;line-height:1em;float:left;position:relative;top:.5em}*+h5,*+h6{margin-top:2em}h1{font-size:40px;line-height:1.1em}h1+p{margin-top:24px}h1+img,h1+figure{margin-top:32px}h2{font-size:34px;line-height:1.1em}h3{font-size:28px;line-height:1.2em}h2+p,h3+p{margin-top:16px}h2+figure,h3+figure,h2+img,h3+img{margin-top:32px}h4{font-size:24px;line-height:1.33em}h5,h6{font-size:18px;line-height:1.5em;font-weight:700}.lead p{font-size:18px;line-height:1.5em}p{font-size:15px;line-height:26px;letter-spacing:.02em;word-wrap:break-word}p.smaller{font-size:14px;line-height:22px}p.lead{font-size:18px;line-height:1.5em}p.lead+img,p.lead+figure{margin-top:24px}p.lead+.button,p.lead+button,p.lead+input[type=submit]{margin-top:32px}p:first-child{margin-top:0}p a{text-decoration:underline;font-weight:700;color:#be0000}p a.calltoaction,p a.arrowlink{text-decoration:none}caption,figcaption{font-family:'Apercu',monospace;font-size:13px;line-height:1.5em;font-weight:700;letter-spacing:0}.pagecontent li a{text-decoration:underline}ul{padding-left:1.1em;font-size:15px}ul li+li{margin-top:.75em}ul.advantages{list-style:none;padding-left:25px;font-size:14px;margin-bottom:2.5em}ul.advantages li{position:relative}ul.advantages li:before{content:'';left:-25px;top:3px;position:absolute;border-radius:100%;width:14px;height:14px;background:url(//documentation.spire.com/wp-content/themes/docs/css/../img/check.svg) #be0000 no-repeat center 3px;background-size:8px 8px}ul.advantages li+li{margin-top:1.5em}ol{padding-left:1.9em}ol li a{text-decoration:underline;font-weight:700;color:#be0000}ol li+li{margin-top:.75em}ol li+li ol,ol li+li ul{margin:1em 0}.postdate{font-size:13px;font-family:'Apercu',monospace;font-weight:700;display:block;margin-bottom:1em;text-align:center;color:#c6c7c8}.thepostauthor{text-align:center;color:#c6c7c8;font-weight:700}.thepostauthor img{width:50px;height:50px;border-radius:100%}pre,code{background:#f5f2f0;font-size:1em}@media only screen and (max-width:750px){h1{font-size:40px !important;line-height:1.1em}h2{font-size:32px;line-height:1.2em}h3,h4{font-size:20px;line-height:24px}}i[class^=icon]{display:inline-block;width:1em;height:1em;background-repeat:no-repeat;background-position:center center;background-size:100% 100%;text-indent:9999px;overflow:hidden;vertical-align:middle}i.icon-government{background-image:url(//documentation.spire.com/wp-content/themes/docs/css/../img/icon_government.svg?v2)}i.icon-port{background-image:url(//documentation.spire.com/wp-content/themes/docs/css/../img/icon_port.svg?v2)}i.icon-environment{background-image:url(//documentation.spire.com/wp-content/themes/docs/css/../img/icon_environment.svg?v2)}i.icon-insurance{background-image:url(//documentation.spire.com/wp-content/themes/docs/css/../img/icon_insurance.svg?v2)}i.icon-rig{background-image:url(//documentation.spire.com/wp-content/themes/docs/css/../img/icon_rig.svg?v2)}i.icon-container{background-image:url(//documentation.spire.com/wp-content/themes/docs/css/../img/icon_container.svg?v2)}i.icon-weather_white{background-image:url(//documentation.spire.com/wp-content/themes/docs/css/../img/icon_weather_white.svg?v2)}i.icon-aviation_white{background-image:url(//documentation.spire.com/wp-content/themes/docs/css/../img/icon_aviation_white.svg?v2)}i.icon-maritime_white{background-image:url(//documentation.spire.com/wp-content/themes/docs/css/../img/icon_maritime_white.svg?v2)}i.icon-wind{background-image:url(//documentation.spire.com/wp-content/themes/docs/css/../img/icon_wind.svg?v2)}i.icon-orbit{background-image:url(//documentation.spire.com/wp-content/themes/docs/css/../img/icon_orbit.svg?v2)}i.icon-atmosphere{background-image:url(//documentation.spire.com/wp-content/themes/docs/css/../img/icon_atmosphere.svg?v2)}i.icon-maritime{background-image:url(//documentation.spire.com/wp-content/themes/docs/css/../img/icon_maritime.svg?v2)}i.icon-database{background-image:url(//documentation.spire.com/wp-content/themes/docs/css/../img/icon_database.svg?v2)}i.icon-faq{background-image:url(//documentation.spire.com/wp-content/themes/docs/css/../img/icon_faq.svg?v2)}i.icon-api_cloud{background-image:url(//documentation.spire.com/wp-content/themes/docs/css/../img/icon_api_cloud.svg?v2)}i.icon-api{background-image:url(//documentation.spire.com/wp-content/themes/docs/css/../img/icon_api.svg?v2)}i.icon-weather{background-image:url(//documentation.spire.com/wp-content/themes/docs/css/../img/icon_weather.svg?v2)}i.icon-chat{background-image:url(//documentation.spire.com/wp-content/themes/docs/css/../img/icon_chat.svg?v2)}i.icon-coverage{background-image:url(//documentation.spire.com/wp-content/themes/docs/css/../img/icon_coverage.svg?v2)}i.icon-orbit{background-image:url(//documentation.spire.com/wp-content/themes/docs/css/../img/icon_orbit.svg?v2)}i.icon-satellite_red{background-image:url(//documentation.spire.com/wp-content/themes/docs/css/../img/icon_satellite_red.svg?v2)}i.icon-family_leave{background-image:url(//documentation.spire.com/wp-content/themes/docs/css/../img/icon_family_leave.svg?v2)}i.icon-screen{background-image:url(//documentation.spire.com/wp-content/themes/docs/css/../img/icon_screen.svg?v2)}i.icon-travel{background-image:url(//documentation.spire.com/wp-content/themes/docs/css/../img/icon_travel.svg?v2)}i.icon-benefits{background-image:url(//documentation.spire.com/wp-content/themes/docs/css/../img/icon_benefits.svg?v2)}i.icon-instagram{background-image:url(//documentation.spire.com/wp-content/themes/docs/css/../img/icon_instagram.svg?v2)}i.icon-linkedin{background-image:url(//documentation.spire.com/wp-content/themes/docs/css/../img/icon_linkedin.svg?v2)}i.icon-twitter{background-image:url(//documentation.spire.com/wp-content/themes/docs/css/../img/icon_twitter.svg?v2)}i.icon-facebook{background-image:url(//documentation.spire.com/wp-content/themes/docs/css/../img/icon_facebook.svg?v2)}i.icon-facebook{background-size:75% 75%}.calltoaction{background:#be0000;color:#fff;font-weight:700;font-size:14px;line-height:1.1em;position:relative;z-index:1;letter-spacing:.05em;padding:13px 20px;min-width:142px;display:inline-block;text-align:center;outline:none}.calltoaction:before,.calltoaction:after{z-index:-1;background:#be0000;position:absolute;left:0;top:0;width:100%;height:100%;content:''}.calltoaction:after{background:#04060f;width:0;transition:width .3s ease-in-out}.calltoaction:hover:after{width:100%}.calltoaction.inverted{background:0 0;color:#be0000;border:1px solid #be0000;padding-top:12px;padding-bottom:12px;transition:color .3s}.calltoaction.inverted:hover{color:#fff}.calltoaction.inverted:after{background:#be0000}.calltoaction.inverted:before{background:0 0}.calltoaction+.calltoaction{margin-left:1.5em}.arrowlink{color:#be0000;font-weight:700;font-size:14px;padding-right:1.6em;position:relative;display:inline-block;margin:0 2em 1em 0}.arrowlink:after,.arrowlink:before{content:'';position:absolute}.arrowlink:before{width:1em;height:1em;border-radius:100%;right:0;background:#be0000;top:50%;margin-top:-.55em}.arrowlink:after{right:.32em;width:.37em;height:.37em;top:50%;margin-top:-.22em;border-top:2px solid #fff;border-right:2px solid #fff;box-sizing:border-box;transform:rotateZ(45deg)}.arrowlink:last-child{margin-bottom:0}@media only screen and (max-width:750px){.calltoaction+.calltoaction{margin-top:1em;margin-left:0}}dl{margin:2em 0 2em;background:#f5f2f0;border-radius:10px;overflow:hidden;padding:1em}dl dt{font-weight:700;padding-left:10px}dl dt code{font-size:1em}dl dt em{font-weight:300;font-size:.85em;font-style:normal}dl dd{padding-left:10px;font-size:12px}dl dd+dt{margin-top:1em;border-top:1px solid #e2e2e2;padding-top:1em}dl dd+dd{padding-top:.5em}dl dd ul{margin-top:1em;font-size:12px}table{font-size:14px;border:1px solid #c6c7c8;border-collapse:collapse;width:100%;margin:2em auto}table th,table td{padding:.6em;border:1px solid #c6c7c8}.boxed{background:#fafafa;padding:1em;border-radius:5px;position:relative}#mobiletrigger{display:none}#relevanssi-live-search-status{display:none}#chooser{display:none}#searchpane{display:none;position:fixed;background:rgba(0,0,0,.8);left:0;top:0;width:100%;height:100%;z-index:9999999}#searchpane.active{display:block}#searchpane>div{left:50%;top:50%;position:absolute;transform:translate(-50%,-100%);max-width:500px;min-width:350px}#docmap{position:fixed;left:0;top:50px;width:300px;border-right:1px solid #e2e2e2;bottom:0;font-size:14px;color:#485463;background:#fafafa;font-weight:300}#docmap>div>ul>li:first-child a{font-size:1.25em;padding-left:0;padding-bottom:.5em;border-bottom:1px solid #e2e2e2;margin-bottom:.5em}#docmap li .beta_label{background:#485463;color:#fff;border-radius:.2em;text-transform:uppercase;font-size:13px;margin-left:.2em}#docmap li>a{padding-left:1em;position:relative;display:block;line-height:1em;padding-top:.2em;padding-bottom:.2em}#docmap li.active>ul{height:auto}#docmap li.has-sub-menu>a:before{content:'';position:absolute;left:0;top:.35em;height:.5em;width:.5em;transform:rotate(-45deg);border-bottom:1px solid #ccc;border-right:1px solid #ccc}#docmap li.has-sub-menu.current>a:before,#docmap li.has-sub-menu.active>a:before,#docmap li.has-sub-menu.forceopen>a:before{top:.15em;transform:rotate(45deg)}#docmap>div{padding:1em;position:absolute;left:0;top:0;width:100%;height:100%;box-sizing:border-box;overflow:scroll}#docmap>div>ul li.active>a{font-weight:700;color:#485463}#docmap>div>ul li.active>a.current{font-weight:800}#docmap>div>ul li.forceopen>ul{height:auto}#docmap>div>ul>li ul{padding-left:.5em;height:0;overflow:hidden}#docmap>div>ul>li ul.active{height:auto}.search section:first-child{padding:5vw 0 0}#content section{padding:5vw 0;border-bottom:1px solid #e2e2e2}#content section.titleonly{border-bottom:0;padding-bottom:0}#content section.titleonly+section{padding-top:1em}#content section ul li a{text-decoration:underline;font-weight:700;color:#be0000}.ctabox{background:#fafafa;border-radius:10px;margin:2em 0;padding:1em}.ctabox h1,.ctabox h2,.ctabox h3,.ctabox h4,.ctabox h5,.ctabox h6{font-weight:800;font-size:25px}.ctabox ul li a{text-decoration:underline;color:#be0000;font-weight:700}.codebox{border-radius:5px;overflow:hidden;font-size:13px;font-family:'Apercu',monospace;background:#f5f2f0;margin:1em 0}.codebox .title,.codebox .code{padding:.5em 1.5em}.codebox .title{background:#00806c;color:#fff;font-weight:700}.codebox .code{font-size:15px}main{min-height:calc(100vh - 176px)}main pre{padding:1em;margin:.5em 0;white-space:break-spaces;overflow:auto}main pre code{padding:0}main code[class*=language-],main pre[class*=language-]{white-space:break-spaces;border-radius:5px}.page-template-template-blog h1,.single h1{margin-bottom:.35em}.page-template-default .col4,.single #content .col4,.blog #content .col4{padding-top:2.2em;position:sticky;top:60px}.page-template-default .col4 pre[class],.single #content .col4 pre[class],.blog #content .col4 pre[class]{font-size:12px}.page-template-default .col7 ul li a,.single #content .col7 ul li a,.blog #content .col7 ul li a{text-decoration:underline;color:#be0000;font-weight:700}main{padding-left:330px}.home main{padding-left:0}.home main h1{font-size:30px}.home main h2{font-size:22px}.home main p+h2{margin-top:1.5em}.home main h3{font-size:19px}.home main .spirebadge{width:80px;height:80px;position:relative;display:block;margin:0 auto -40px auto;top:-40px}.embed-container{padding-bottom:56.25%;height:0;overflow:hidden;width:100%;position:relative}.embed-container iframe,.embed-container object,.embed-container embed,.embed-container img,.embed-container video{position:absolute;top:0;left:0;width:100%;height:100%;border:0}.bloglist{list-style:none;padding:0;margin:1em 0 0}.bloglist li{padding:0;margin:0}.bloglist li+li{margin-top:1em;padding-top:1em;border-top:1px solid #e2e2e2}.bloglist p{margin-top:0;font-weight:700}.bloglist .post_meta{font-size:.8em}.bloglist .product_tag{margin-right:1em;float:right}.post_meta{display:block;margin-bottom:.5em;font-family:Apercu,monospace;color:#04060f}.author_meta{margin-top:1em;margin-bottom:1em}.author_meta>div{display:inline-block;background:#f2f2f2;padding:10px;border-radius:40px}.author_meta img{float:left;width:2.9em;height:2.9em;border-radius:100%;border:2px solid #e2e2e2;margin-right:1em}.author_meta .cont{float:left}.author_meta span.name{font-weight:800}.author_meta span.job_title{font-size:.8em;display:block;line-height:1em;white-space:nowrap}.product_tag{background:#be0000;font-family:Apercu,monospace;color:#fff;padding:.2em .5em .1em;display:inline-block;border-radius:3px;font-size:.8em}.product_tag+.product_tag{margin-left:.25em}.product_tag.maritime-2-0{background:#185a8b}.product_tag.vessels-api,.product_tag.messages-api,.product_tag.historical-positions-api,.product_tag.routing-api{background:#00806c}.product_tag.tcp-stream-v2,.product_tag.uniproxy{background:#0f447a}.productlist{list-style:none;padding:0;margin:0}.productlist li{padding:0;margin:0;font-size:16px;clear:left}.productlist li+li{margin-top:.5em}.productlist li img{margin-right:.5em;margin-bottom:1em;float:left;width:auto;height:3em;transform:translateY(-.75em)}.productlist.legacy li{float:left;clear:none}.productlist.legacy li+li{margin-top:0;margin-left:2em}.productlist.legacy li img{height:1.5em;transform:none}.relevanssi-live-search-results-showing{left:0 !important;top:100% !important}.relevanssi-live-search-result{border-bottom:1px solid rgba(30,30,30,.1)}.relevanssi-live-search-result ul{padding:0 .9em .9em;margin:0;display:block}.relevanssi-live-search-result ul li{font-size:.7em;display:inline-block}.relevanssi-live-search-result ul li a span{text-decoration:underline}.relevanssi-live-search-result ul li+li{margin-top:0}.relevanssi-live-search-result ul li+li a:before{content:'»';display:inline-block;margin:0 .3em}.relevanssi-live-search-result p{padding-bottom:0 !important;border-bottom:0 !important}.searchresults{list-style:none;padding:0;margin:1em 0 5vw}.searchresults p,.searchresults p:first-child{padding:0;margin:0}.searchresults>li{padding:1em 0;border-bottom:1px solid #e2e2e2}.searchresults>li+li{margin-top:0}.result_breadcrumb{margin:0;padding:0;display:block;list-style:none}.result_breadcrumb li{font-size:.7em;display:inline-block}.result_breadcrumb li a span{text-decoration:underline}.result_breadcrumb li+li{margin-top:0}.result_breadcrumb li+li a:before{content:'»';display:inline-block;margin:0 .3em}body div.code-toolbar>.toolbar{top:-.7em;right:-.7em}html .rlv-has-spinner{border-color:#be0000}html .rlv-has-spinner:after{background:#be0000}@media only screen and (max-width:1000px){.tablewrapper{overflow-x:auto}main{padding-left:0}#docmap{position:static;top:auto;left:auto;width:100%;border-right:0;border-bottom:1px solid #f2f2f2}#docmap>div{position:static;display:none}#chooser{display:block;position:fixed;bottom:0;left:0;width:100%;z-index:10;background:#fff;padding:1em;box-sizing:border-box}#chooser select{width:100%}.home .col.col4,.home .col.col3{width:97.4%;clear:left;float:none}.home main .spirebadge{margin-top:40px}.productlist.legacy li+li{float:none;clear:left;margin-top:1em;margin-left:0}header.active #mobiletrigger{filter:invert(1)}header.active #mobilemenuwrapper{height:calc(100vh - 50px)}header #mobilemenuwrapper{position:fixed;top:50px;left:0;background:#fff;width:100%;height:0;overflow:scroll}header #mobiletrigger{display:block;position:absolute;right:50px;width:50px;height:50px;background:url(//documentation.spire.com/wp-content/themes/docs/css/../img/icon-menu.svg) #fff no-repeat center center/70% 70%;border-left:1px solid #f2f2f2;top:0;z-index:100;overflow:hidden;text-indent:-9999px;transition:filter .3s}header #darkmodetoggle{display:none}header #mainmenu{position:static;left:auto;top:auto;height:auto;border-top:1px solid #f2f2f2}header #mainmenu>ul{height:auto;padding-left:0}header #mainmenu>ul>li{display:block;white-space:initial;height:auto}header #mainmenu>ul>li.apis>ul>li{min-width:0;padding:0;border-top:1px solid #f2f2f2}header #mainmenu>ul>li.apis>ul>li ul li{border-top:1px solid #f2f2f2}header #mainmenu>ul>li.apis>ul>li ul li:before{left:-.3em;top:1em}header #mainmenu>ul>li.apis>ul>li:after{top:50%;right:1em;transform:translateY(-50%)}header #mainmenu>ul>li.apis>ul>li a:hover{font-weight:400}header #mainmenu>ul>li.apis>ul a{padding-left:1em;padding-bottom:1em;padding-top:1em;display:block}header #mainmenu>ul>li+li{border-top:1px solid #f2f2f2}header #mainmenu>ul>li>ul{display:block;position:relative;padding:0;box-shadow:none;top:auto;left:auto}header #mainmenu>ul>li:hover>ul{display:block}header #mainmenu>ul>li>a{display:block;height:auto;padding:1em;line-height:1.1em}header #mainmenu+nav{float:none;margin-right:0}header #mainmenu+nav ul{border-bottom:1px solid #f2f2f2}header #mainmenu+nav ul li{border-top:1px solid #f2f2f2;display:block;opacity:1;width:100%;height:auto;line-height:1.1em;padding:0}header #mainmenu+nav ul li>a{padding:1em;display:block;background:#fafafa}header #mainmenu+nav ul li.hasdm{display:none}header #mainmenu+nav ul li+li{margin-left:0;border-top:1px solid #f2f2f2}}@media only screen and (max-width:550px){header #logo{height:20px;margin-top:16px}}.hubspot_form_lazyloader.not_loaded{min-height:50px;background:url(https://insights.spire.com/hubfs/raw_assets/public/maritime_weather_tool_v2/img/loader.svg) no-repeat center center/50px 50px}form{display:block;font-size:14px}form>.field,form>.legal-consent-container{clear:both;margin-bottom:2em}form .inputs-list li{clear:left}form p{font-size:14px}form fieldset.form-columns-1,form fieldset.form-columns-2,form fieldset.form-columns-3{max-width:none}form fieldset.form-columns-1>.field,form fieldset.form-columns-2>.field,form fieldset.form-columns-3>.field,form fieldset.form-columns-1>.hs-dependent-field,form fieldset.form-columns-2>.hs-dependent-field,form fieldset.form-columns-3>.hs-dependent-field{margin-bottom:1em}form fieldset.form-columns-1 .input .hs-fieldtype-intl-phone.hs-input,form fieldset.form-columns-2 .input .hs-fieldtype-intl-phone.hs-input,form fieldset.form-columns-3 .input .hs-fieldtype-intl-phone.hs-input{width:100%}form fieldset.form-columns-3{display:table;margin-bottom:2em}form fieldset.form-columns-3 .field.hs-form-field{display:table-cell;border-right:1px solid #c6c7c8;padding:0 1em;float:none}form fieldset.form-columns-3 .field.hs-form-field:first-child{padding-left:0}form fieldset.form-columns-3 .field.hs-form-field:last-child{border-right:0;padding-right:0}form .multi-container{margin-top:1em}form label{font-weight:700}form label.hs-error-msg{color:#be0000;font-weight:400;margin-top:.5em;display:inline-block}form label .hs-form-required{color:#be0000}form select,form input[type=text],form input[type=email],form input[type=tel],form input[type=search]{box-sizing:border-box;height:40px;border-radius:0 !important;border:1px solid #c6c7c8;display:block;width:100%;margin-top:.5em}form input[type=search]{outline-color:#be0000;outline-offset:0;padding:1em}form select{background:#fafafa}form textarea{width:100%;margin-top:.5em;border:1px solid #c6c7c8;height:90px}form input[type=file]{margin-top:.5em}form fieldset.form-columns-1 .input select.hs-input,form fieldset.form-columns-1 .input input[type=text].hs-input,form fieldset.form-columns-1 .input input[type=email].hs-input,form fieldset.form-columns-1 .input input[type=tel].hs-input,form fieldset.form-columns-1 .input input[type=tel].hs-input,form fieldset.form-columns-1 .input textarea.hs-input{width:100%}form .hs-form-booleancheckbox{margin-bottom:1em}form .hs-form-booleancheckbox label,form .hs-form-radio label,form .hs-form-checkbox label{font-weight:400;cursor:pointer}form .hs-form-booleancheckbox p,form .hs-form-radio p,form .hs-form-checkbox p{display:inline;line-height:1em}form .hs-form-booleancheckbox input[type=radio],form .hs-form-radio input[type=radio],form .hs-form-checkbox input[type=radio],form .hs-form-booleancheckbox input[type=checkbox],form .hs-form-radio input[type=checkbox],form .hs-form-checkbox input[type=checkbox]{margin-right:.5em;position:relative;top:.15em}form .hs-form-booleancheckbox-display,form .hs-form-radio-display,form .hs-form-checkbox-display{display:flex;align-items:flex-start}form .legal-consent-container .hs-form-booleancheckbox-display p{line-height:1em}form .legal-consent-container .hs-form-booleancheckbox-display>span{margin-left:0;display:inline}form ul{list-style:none;margin:0;padding:0}form ul li{margin-left:0;padding-left:0}form input[type=submit],form button{border-radius:0 !important;appearance:none;background:#be0000;color:#fff;font-weight:700;font-size:14px;line-height:1.1em;position:relative;z-index:1;letter-spacing:.05em;padding:13px 20px;min-width:142px;display:inline-block;text-align:center;outline:none;margin-top:1em;border:0;cursor:pointer}form input[type=submit]:before,form button:before,form input[type=submit]:after,form button:after{z-index:-1;background:#be0000;position:absolute;left:0;top:0;width:100%;height:100%;content:''}form input[type=submit]:after,form button:after{background:#04060f;width:0;transition:width .3s ease-in-out}form input[type=submit]:hover:after,form button:hover:after{width:100%}form input[type=submit].inverted,form button.inverted{background:0 0;color:#be0000;border:1px solid #be0000;padding-top:12px;padding-bottom:12px;transition:color .3s}form input[type=submit].inverted:hover,form button.inverted:hover{color:#fff}form input[type=submit].inverted:after,form button.inverted:after{background:#be0000}form input[type=submit].inverted:before,form button.inverted:before{background:0 0}form input[type=submit],form input[type=submit].calltoaction{background:#be0000;background-size:0 100%;background-position:0 0;background-repeat:no-repeat;transition:all .3s;background-image:-webkit-linear-gradient(#56544b,#04060f) !important;background-image:-moz-linear-gradient(#56544b,#04060f) !important;background-image:-ms-linear-gradient(#56544b,#04060f) !important;background-image:-o-linear-gradient(#56544b,#04060f) !important;background-image:linear-gradient(#04060f,#04060f) !important}form input[type=submit]:hover,form input[type=submit].calltoaction:hover{background-size:100% 100%}form input[type=submit]:before,form input[type=submit].calltoaction:before,form input[type=submit]:after,form input[type=submit].calltoaction:after{display:none}form .hs_error_rollup .hs-error-msgs{margin:1em auto;color:#be0000}form .hs_recaptcha{margin:0 auto 1em}@media only screen and (max-width:750px){form fieldset.form-columns-3{display:block}form fieldset.form-columns-3>.field,form fieldset.form-columns-3>.hs-dependent-field{display:block}form fieldset.form-columns-3>.field.field.hs-form-field,form fieldset.form-columns-3>.hs-dependent-field.field.hs-form-field{display:block;padding:0;border:0}form fieldset.form-columns-3>.field.field.hs-form-field:first-child,form fieldset.form-columns-3>.hs-dependent-field.field.hs-form-field:first-child{display:block}form fieldset.form-columns-2 .field input[type=text],form fieldset.form-columns-3 .field input[type=text],form fieldset.form-columns-2 .field input[type=email],form fieldset.form-columns-3 .field input[type=email],form fieldset.form-columns-2 .field input[type=tel],form fieldset.form-columns-3 .field input[type=tel],form fieldset.form-columns-2 .field input[type=tel],form fieldset.form-columns-3 .field input[type=tel]{width:100% !important}}#darkmodetoggle{display:inline-block;border:1px solid #aeb1b4;height:20px;width:40px;border-radius:20px;margin-top:15px;overflow:hidden;position:relative}#darkmodetoggle:before{position:absolute;content:'';background:url(//documentation.spire.com/wp-content/themes/docs/css/../img/sun.svg) #be0000 no-repeat center center/78% 78%;height:16px;width:16px;left:2px;top:2px;border-radius:18px;box-sizing:border-box;box-shadow:0 0 5px -1px #000;transition:left .3s,background-color .3s}html.darkmode{background:#04060f;color:#fff}html.darkmode #darkmodetoggle:before{left:22px;background:url(//documentation.spire.com/wp-content/themes/docs/css/../img/moon.svg) #fff no-repeat center center/60% 60%}html.darkmode header{background:#04060f}html.darkmode #logo img{filter:invert(1) brightness(255)}html.darkmode #homepage_intro img.aligncenter{filter:invert(1)}html.darkmode #mainmenu+nav ul li img{filter:invert(1)}html.darkmode .boxed,html.darkmode dl,html.darkmode .ctabox,html.darkmode .codebox{background:rgba(255,255,255,.2)}html.darkmode .codebox pre[class*=language-]{background:0 0}html.darkmode .codebox .title{background:#fff;color:#04060f}html.darkmode footer{border-top:1px solid #fff}html.darkmode #docmap{background:rgba(255,255,255,.1);color:#fff}html.darkmode #docmap>div>ul li.active>a{color:#fff}html.darkmode pre,html.darkmode code{color:#04060f}html.darkmode #mainmenu>ul>li>ul{background:#04060f;border:1px solid #fff}html.darkmode #mainmenu li.apis>ul>li+li{border-top-color:#fff}html.darkmode #mainmenu>ul>li.current-menu-item>a:hover,html.darkmode #mainmenu>ul>li.current-menu-ancestor>a:hover,html.darkmode #mainmenu>ul>li.current-menu-parent>a:hover,html.darkmode #mainmenu>ul>li.current_page_parent>a:hover,html.darkmode #mainmenu>ul>li.current_page_ancestor>a:hover{background:#fff;color:#04060f}html.darkmode #mainmenu>ul>li:hover>a{background:#fff;color:#04060f}html.darkmode .calltoaction.inverted{background:#fff}html.darkmode pre[class*=language-]{background:rgba(255,255,255,.1)}html.darkmode pre[class*=language-] code{filter:invert(1)}html.darkmode :not(pre)>code[class*=language-]{background:rgba(0,0,0,.1);filter:invert(1)}html.darkmode form input[type=search]{background:0 0;color:#fff}html.darkmode .relevanssi-live-search-results{background:#04060f;border:1px solid #fff}html.darkmode .relevanssi-live-search-result,html.darkmode .relevanssi-live-search-result p,html.darkmode .relevanssi-live-search-result-status p{border-bottom:1px solid rgba(255,255,255,.3)}html.darkmode .post_meta{color:#fff}html.darkmode #searchpane .boxed{background:#343435}html.darkmode .home main .spirebadge{filter:invert(1) brightness(255)}body #onetrust-consent-sdk #onetrust-policy-title,body #onetrust-consent-sdk #onetrust-policy-text,body #onetrust-consent-sdk #onetrust-policy-text *:not(.onetrust-vendors-list-handler){font-weight:300}body #onetrust-consent-sdk .pc-logo-container,body #onetrust-consent-sdk .pc-footer-logo{display:none}body #onetrust-consent-sdk #onetrust-banner-sdk{background-color:#fff;border-top:1px solid #ccc}body #onetrust-consent-sdk #onetrust-banner-sdk a[href]{color:#be0000}body #onetrust-consent-sdk #onetrust-pc-btn-handler.cookie-setting-link{width:auto !important;color:#be0000}body #onetrust-consent-sdk #cookie-preferences .always-active{color:#be0000}body #onetrust-consent-sdk #onetrust-pc-sdk .privacy-notice-link,body #onetrust-consent-sdk #onetrust-pc-sdk .category-vendors-list-handler,body #onetrust-consent-sdk #onetrust-pc-sdk .category-host-list-handler,body #onetrust-consent-sdk #onetrust-pc-sdk .vendor-privacy-notice,body #onetrust-consent-sdk #onetrust-pc-sdk #hosts-list-container .host-title a,body #onetrust-consent-sdk #onetrust-pc-sdk #hosts-list-container .accordion-header .host-view-cookies,body #onetrust-consent-sdk #onetrust-pc-sdk #hosts-list-container .cookie-name-container a{color:#be0000}body #onetrust-consent-sdk #onetrust-pc-sdk h3,body #onetrust-consent-sdk #onetrust-pc-sdk h4,body #onetrust-consent-sdk #onetrust-pc-sdk h6,body #onetrust-consent-sdk #onetrust-pc-sdk p,body #onetrust-consent-sdk #onetrust-pc-sdk #pc-policy-text,body #onetrust-consent-sdk #onetrust-pc-sdk #pc-title{font-weight:300}body #onetrust-consent-sdk #onetrust-pc-sdk .switch-inner:before{background:#ffd8d8}body #onetrust-consent-sdk #onetrust-pc-sdk .switch-checkbox:checked+.switch-label{border-color:#be0000}body #onetrust-consent-sdk #onetrust-pc-sdk .switch-checkbox:checked+.switch-label .switch-nob{background-color:#be0000;border-color:#be0000}body #onetrust-consent-sdk #onetrust-banner-sdk.ot-buttons-fw:not(.ot-iab-2) #onetrust-button-group{margin-top:0}body #onetrust-consent-sdk #onetrust-accept-btn-handler,body #onetrust-consent-sdk #onetrust-pc-sdk button:not(.close-icon){width:auto !important;color:#fff;border-radius:0;font-weight:700;text-transform:uppercase;text-decoration:none;font-family:'Exo',sans-serif;z-index:1;border:3px solid #be0000;display:inline-block;padding:.6em 1.4em .5em;position:relative;line-height:1em;-webkit-appearance:none;appearance:none}body #onetrust-consent-sdk #onetrust-accept-btn-handler:after,body #onetrust-consent-sdk #onetrust-pc-sdk button:not(.close-icon):after,body #onetrust-consent-sdk #onetrust-accept-btn-handler:before,body #onetrust-consent-sdk #onetrust-pc-sdk button:not(.close-icon):before{width:100%;left:0;top:0;position:absolute;content:'';height:0;z-index:-1;background:#be0000}body #onetrust-consent-sdk #onetrust-accept-btn-handler:after,body #onetrust-consent-sdk #onetrust-pc-sdk button:not(.close-icon):after{transition:height .1s ease-out}body #onetrust-consent-sdk #onetrust-accept-btn-handler:before,body #onetrust-consent-sdk #onetrust-pc-sdk button:not(.close-icon):before{background:#be0000;height:100%}body #onetrust-consent-sdk #onetrust-accept-btn-handler:hover:after,body #onetrust-consent-sdk #onetrust-pc-sdk button:not(.close-icon):hover:after{height:100%}body #ot-sdk-cookie-policy{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}body #ot-sdk-cookie-policy div,body #ot-sdk-cookie-policy p,body #ot-sdk-cookie-policy table{line-height:1.5em;font-weight:300;color:#555}body #ot-sdk-cookie-policy-v2.ot-sdk-cookie-policy h6,body #ot-sdk-cookie-policy-v2.ot-sdk-cookie-policy li,body #ot-sdk-cookie-policy-v2.ot-sdk-cookie-policy p,body #ot-sdk-cookie-policy-v2.ot-sdk-cookie-policy a,body #ot-sdk-cookie-policy-v2.ot-sdk-cookie-policy span,body #ot-sdk-cookie-policy-v2.ot-sdk-cookie-policy #cookie-policy-description{color:#555;font-weight:300;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}body #ot-sdk-cookie-policy-v2.ot-sdk-cookie-policy a{color:#be0000}body #ot-sdk-cookie-policy-v2.ot-sdk-cookie-policy #cookie-policy-description,body #ot-sdk-cookie-policy-v2.ot-sdk-cookie-policy .ot-sdk-cookie-policy-group-desc,body #ot-sdk-cookie-policy-v2.ot-sdk-cookie-policy .ot-table-header,body #ot-sdk-cookie-policy-v2.ot-sdk-cookie-policy a,body #ot-sdk-cookie-policy-v2.ot-sdk-cookie-policy span{font-size:1em}body #ot-sdk-cookie-policy-v2.ot-sdk-cookie-policy #cookie-policy-title,body #ot-sdk-cookie-policy-v2.ot-sdk-cookie-policy .ot-sdk-cookie-policy-group{color:#04060f;text-transform:uppercase;font-family:'Exo',sans-serif;font-weight:400}@media only screen and (min-width:650px){body #onetrust-banner-sdk .ot-sdk-row{padding-right:90px}}.banner{background-color:#04060f;text-align:center;color:#fff;padding:60px 0 80px;margin-bottom:0}.banner h2{margin-bottom:.5em}.banner h3{margin-bottom:1em}.banner h4{margin-bottom:1em;width:90%;margin-left:auto;margin-right:auto}.banner .icon{width:auto;height:85px;margin:0 auto;margin-bottom:35px}.banner .icon img{width:100%;height:100%;display:block;max-height:85px}.banner .tag:only-child{margin-bottom:30px}.banner.default{background-image:none !important}.banner:not(.grey) .tag:not(.inverted){border:1px solid #fff;background:0 0}.banner.white{background-color:#fff;background-image:none !important;color:#04060f}.banner.light-grey{background-color:#fafafa;background-image:none !important;color:#04060f}.banner.grey{background-color:#f2f2f2;color:#04060f;text-align:left;margin-top:110px;background-image:none !important}.banner.grey#content-block_601a7c549f437{margin-bottom:0}.banner.bleedbottom{padding-bottom:230px}.banner.bleedtop{padding-top:145px}.banner .calltoaction.inverted{border-color:#fff;color:#fff;transition:color .3s}.banner .calltoaction.inverted:hover{color:#04060f}.banner .calltoaction.inverted:after{background:#fff}.banner p:last-child{margin-bottom:0}.banner p a.calltoaction{text-decoration:none}.banner.orbitalgradient:not(.bleedbottom){padding:95px 0 105px}.banner.orbitalgradient:not(.bleedbottom) .calltoaction:not(.inverted){transition:color .3s;color:#04060f}.banner.orbitalgradient:not(.bleedbottom) .calltoaction:not(.inverted):before{background:#fff}.banner.orbitalgradient:not(.bleedbottom) .calltoaction:not(.inverted):hover{color:#fff}.banner.verbose{text-align:left;padding-bottom:40px}.banner.verbose h5{margin-bottom:2em}.banner.verbose p{font-size:14px}.banner.verbose .wrapper+.wrapper{margin-top:56px}.banner.verbose .wrapper:last-child{padding-bottom:80px}.banner.verbose .wrapper:last-child .col{position:relative}.banner.verbose .wrapper:last-child hr:last-child{position:absolute;left:0;bottom:-80px;width:97.3%;margin:0}.banner.verbose .wrapper.solo,.banner.verbose .wrapper.solo:last-child{padding-bottom:0}.banner.verbose .wrapper.solo+.wrapper,.banner.verbose .wrapper.solo:last-child+.wrapper{margin-top:0}.banner.logos{text-align:left}.banner.logos .col8+.col7 .tag{margin-top:2.5em}.banner.logos ul{list-style:none;text-align:center;margin:1em 0 0;padding:0;height:110px;display:flex;justify-content:space-between;align-items:center;width:100%}.banner.logos ul li{display:inline}.banner.logos ul li img{max-width:120px}.banner.logos ul+ul{margin-top:70px}.banner.cta{background:#485463;background-image:none !important;color:#fff;padding:88px 0 60px}.banner.cta .calltoaction{margin-top:2em}.banner.banner-bg{padding:140px 0;position:relative}.banner.banner-bg:after{content:"";position:absolute;top:0;height:100%;z-index:0;background-color:#04060f;width:100%;opacity:.5;left:0}.banner.banner-bg .wrapper{z-index:1}@media only screen and (max-width:1000px){.banner{padding:40px 0}.banner#content-block_601a7c549f437 .col.col4 h2{font-size:20px}.banner.bleedtop{padding-top:80px}.banner.bleedbottom{padding-bottom:80px}.banner.cta{padding:40px 0}.banner.logos .col.col3{width:100%}.banner.logos .col.col3 ul{justify-content:flex-start;margin-bottom:1em}.banner.logos ul{flex-wrap:wrap;height:auto}.banner.logos ul li{width:25%}.banner.logos ul li img{height:auto}.banner .col.col1{display:none}.banner .col.col1+.col.col5,.banner .col.col1+.col.col5+.col.col5{width:47.4%;float:left;clear:none}.banner.verbose .col.col5{width:47.4%;float:left}.banner.verbose .wrapper:last-child{padding-bottom:40px}.banner#content-block_60198c8b97a67.logos ul li,.banner#content-block_60197c32db02a.logos ul li,.banner#content-block_60199674eb8fe.logos ul li,.banner#content-block_602145fb2d4f0.logos ul li{width:26%}.banner#content-block_601924416cfc4.logos ul li{width:33%;justify-content:space-around}}@media only screen and (max-width:750px){.banner p{width:100% !important}.banner.grey{margin-top:40px;margin-bottom:40px}.banner.orbitalgradient:not(.bleedbottom){padding:40px 0}.banner .icon{margin-bottom:10px}.banner .col5+.col5,.banner .col4+.col4,.banner .col2five+.col2five{margin-top:2em}.banner .col.col1+.col.col5,.banner .col.col1+.col.col5+.col.col5{width:97.4%;float:none}.banner.logos .col+.col,.banner#content-block_60198c8b97a67.logos .col+.col,.banner#content-block_60197c32db02a.logos .col+.col,.banner#content-block_60199674eb8fe.logos .col+.col,.banner#content-block_602145fb2d4f0.logos .col+.col{margin-top:2em}.banner.logos .col12+.col12,.banner#content-block_60198c8b97a67.logos .col12+.col12,.banner#content-block_60197c32db02a.logos .col12+.col12,.banner#content-block_60199674eb8fe.logos .col12+.col12,.banner#content-block_602145fb2d4f0.logos .col12+.col12{margin-top:0}.banner.logos .col12+.col12 ul,.banner#content-block_60198c8b97a67.logos .col12+.col12 ul,.banner#content-block_60197c32db02a.logos .col12+.col12 ul,.banner#content-block_60199674eb8fe.logos .col12+.col12 ul,.banner#content-block_602145fb2d4f0.logos .col12+.col12 ul{margin-top:0}.banner.logos ul li,.banner#content-block_60198c8b97a67.logos ul li,.banner#content-block_60197c32db02a.logos ul li,.banner#content-block_60199674eb8fe.logos ul li,.banner#content-block_602145fb2d4f0.logos ul li{width:50%}.banner.logos ul li img,.banner#content-block_60198c8b97a67.logos ul li img,.banner#content-block_60197c32db02a.logos ul li img,.banner#content-block_60199674eb8fe.logos ul li img,.banner#content-block_602145fb2d4f0.logos ul li img{width:75%}.banner.verbose .col.col5{float:none;width:97.4%}.banner.verbose .wrapper+.wrapper{margin-top:0}.banner.verbose .wrapper+.wrapper .col{margin-top:2.25em}.banner.verbose .wrapper+.wrapper .col.col10{margin-top:0}.banner.verbose .wrapper:last-child{padding-bottom:40px}}.feedback{opacity:0;transition:opacity .3s;margin-top:1.5em;padding:1em;background:#fafafa;font-size:.85em}.feedback form>.field{margin-bottom:1em}.feedback .hs-form-booleancheckbox-display{font-size:.85em}.feedback .hs-form-field{margin-top:1em}.feedback.active{opacity:1}.feedback .hubspot_form_lazyloader{margin-top:1.5em}.feedback .hubspot_form_lazyloader .legal-consent-container{display:none}.feedback a{border-radius:1em;padding:.1em .25em 0 1.75em;font-weight:800;display:inline-block;position:relative}.feedback a:first-child{margin-left:1em}.feedback a:first-child+a{margin-left:.5em}.feedback a:before{background:url(//documentation.spire.com/wp-content/themes/docs/css/../img/thumbsup.svg) no-repeat center center/1em 1em;width:1em;height:1em;position:absolute;content:'';left:.5em;top:.35em}.feedback a.yes:before{top:.2em}.feedback a.yes:hover{background:#00806c;color:#fff}.feedback a.yes:hover:before{filter:brightness(100)}.feedback a.no:before{top:.3em;transform:rotate(180deg);transform-origin:center center}.feedback a.no:hover{background:#be0000;color:#fff}.feedback a.no:hover:before{filter:brightness(100)}section:hover .feedback{opacity:1}.video_chapters{list-style:none;padding:0;margin:0 0 1em;border:1px solid #fafafa;border-top:0}.video_chapters li{padding:.5em}.video_chapters li+li{margin-top:0}.video_chapters li:nth-child(odd){background:#fafafa}.video_chapters li a{display:block;text-decoration:none}.video_chapters li a:hover{text-decoration:underline}.popup,.popupcontent{position:relative;background:#fff;max-width:600px;padding:56px 25px 25px;margin:2em auto}.popup h1:first-child,.popupcontent h1:first-child,.popup h2:first-child,.popupcontent h2:first-child,.popup h3:first-child,.popupcontent h3:first-child,.popup h4:first-child,.popupcontent h4:first-child,.popup h5:first-child,.popupcontent h5:first-child,.popup h6:first-child,.popupcontent h6:first-child{margin-top:0}.popup>*:last-child,.popupcontent>*:last-child{margin-bottom:0}.popup>p,.popupcontent>p{font-size:14px;line-height:1.5em}.popup *+form,.popupcontent *+form{border-top:1px solid #c6c7c8;padding-top:1.75em}body .mfp-bg{background:#04060f;opacity:.65}.leadinModal.leadinModal-v3 .leadin-button{position:relative}.mfp-wrap.hastcs .mfp-content{max-width:800px;max-height:80vh;overflow:hidden}.mfp-wrap.hastcs .mfp-content .popup{height:80vh;overflow:scroll;max-width:800px;padding-bottom:90px;padding-top:50px;box-sizing:border-box}.mfp-wrap.hastcs .mfp-content .popup h1,.mfp-wrap.hastcs .mfp-content .popup h2,.mfp-wrap.hastcs .mfp-content .popup h3,.mfp-wrap.hastcs .mfp-content .popup h4,.mfp-wrap.hastcs .mfp-content .popup h5,.mfp-wrap.hastcs .mfp-content .popup h6{font-size:1rem}.mfp-wrap.hastcs .mfp-content .title{text-align:center;background:#04060f;color:#fff;position:absolute;left:0;top:0;width:100%;padding:1em;box-sizing:border-box;box-shadow:0 0 5px 0px rgba(0,0,0,.4);z-index:2}.mfp-wrap.hastcs .mfp-content .title:after{content:''}.mfp-wrap.hastcs .mfp-content .acceptance{height:70px;position:absolute;left:0;bottom:0;width:100%;background:#fff;z-index:2;padding:1em;box-sizing:border-box;box-shadow:0 0 5px 0px rgba(0,0,0,.4);text-align:center}.mfp-wrap.hastcs .mfp-content .acceptance .calltoaction.inactive{opacity:.5;cursor:default}.mfp-wrap.hastcs .mfp-content .acceptance .calltoaction.inactive:hover:after{height:0}#fundamentalcontent{background:#f2f2f2;font-weight:500;padding:1em;font-size:.85em}#fundamentalcontent h1,#fundamentalcontent h2,#fundamentalcontent h3,#fundamentalcontent h4,#fundamentalcontent h5,#fundamentalcontent h6{font-family:'exo',sans-serif;text-transform:none}#fundamentalcontent ul{list-style:disc;padding-left:1.1em}.mfp-content .popup{background:#fff;padding:2em;border-bottom:0;max-width:600px;margin:0 auto}.mfp-content .popup>.question{text-align:center}.mfp-content .popup>.answer{display:none}.mfp-content .popup#todownload{text-align:center}.mfp-content .popup#cartaddconfirmation,.mfp-content .popup#cartupdateconfirmation{text-align:center}.mfp-content .popup#cartaddconfirmation h2,.mfp-content .popup#cartupdateconfirmation h2{margin-bottom:.25em;font-size:1.5em}.mfp-content .popup#cartaddconfirmation img,.mfp-content .popup#cartupdateconfirmation img{margin:0 auto 2em auto;width:100px;height:100px;border-radius:100%;display:block;border:3px solid #be0000}.mfp-content .popup#cartaddconfirmation p,.mfp-content .popup#cartupdateconfirmation p{font-weight:700;font-size:1.25em;color:#04060f}.mfp-content .popup h1,.mfp-content .popup h2,.mfp-content .popup h3,.mfp-content .popup h4,.mfp-content .popup h5,.mfp-content .popup h6{color:#04060f;font-size:2rem}.mfp-content .popup label,.mfp-content .popup legend{text-align:left}.mfp-content .popup label.hs-error-msg,.mfp-content .popup legend.hs-error-msg{color:#fff}.mfp-content .popup p{font-size:.85em}.mfp-content .popup .poploader{background:url(//documentation.spire.com/wp-content/themes/docs/css/../img/loader.svg) no-repeat center center;background-size:200px 200px;height:0;overflow:hidden;width:100%;padding-bottom:30%;position:relative}.mfp-content .popup .poploader span{position:absolute;left:0;top:50%;color:#fff;text-transform:uppercase;font-size:12px;font-weight:700;text-align:center;width:100%;margin-top:-.5em;background:#04060f}.mfp-content .popup #countdown{width:6em;height:6em;margin:0 auto;position:relative;font-family:'Apercu';font-weight:700}.mfp-content .popup #countdown span,.mfp-content .popup #countdown svg{position:absolute;top:0;width:100%;height:100%;left:0;z-index:1}.mfp-content .popup #countdown span{font-size:4.4rem;line-height:6.2rem;text-align:center;z-index:2}.mfp-close{right:.7em;top:.7em}.mfp-bg{top:0;left:0;width:100%;height:100%;z-index:1042;overflow:hidden;position:fixed;background:#0b0b0b;opacity:.8}.mfp-wrap{top:0;left:0;width:100%;height:100%;z-index:1043;position:fixed;outline:none !important;-webkit-backface-visibility:hidden}.mfp-container{text-align:center;position:absolute;width:100%;height:100%;left:0;top:0;padding:0 8px;box-sizing:border-box}.mfp-container:before{content:'';display:inline-block;height:100%;vertical-align:middle}.mfp-align-top .mfp-container:before{display:none}.mfp-content{position:relative;display:inline-block;vertical-align:middle;margin:0 auto;text-align:left;z-index:1045}.single-stories .mfp-content{position:absolute;left:0;top:8%}.mfp-inline-holder .mfp-content,.mfp-ajax-holder .mfp-content{width:100%;cursor:auto}.mfp-ajax-cur{cursor:progress}.mfp-zoom-out-cur,.mfp-zoom-out-cur .mfp-image-holder .mfp-close{cursor:-moz-zoom-out;cursor:-webkit-zoom-out;cursor:zoom-out}.mfp-zoom{cursor:pointer;cursor:-webkit-zoom-in;cursor:-moz-zoom-in;cursor:zoom-in}.mfp-auto-cursor .mfp-content{cursor:auto}.mfp-close,.mfp-arrow,.mfp-preloader,.mfp-counter{-webkit-user-select:none;-moz-user-select:none;user-select:none}.mfp-loading.mfp-figure{display:none}.mfp-hide{display:none !important}.mfp-preloader{color:#ccc;position:absolute;top:50%;width:auto;text-align:center;margin-top:-.8em;left:8px;right:8px;z-index:1044}.mfp-preloader a{color:#ccc}.mfp-preloader a:hover{color:#fff}.mfp-s-ready .mfp-preloader{display:none}.mfp-s-error .mfp-content{display:none}button.mfp-close,button.mfp-arrow{overflow:visible;cursor:pointer;background:0 0;border:0;-webkit-appearance:none;display:block;outline:none;padding:0;z-index:1046;box-shadow:none;touch-action:manipulation}button::-moz-focus-inner{padding:0;border:0}.mfp-close{width:44px;height:44px;line-height:44px;position:absolute;right:0;top:0;text-decoration:none;text-align:center;opacity:.65;padding:0 0 18px 10px;color:#fff;font-style:normal;font-size:28px;font-family:Arial,Baskerville,monospace}.mfp-close:hover,.mfp-close:focus{opacity:1}.mfp-close-btn-in .mfp-close{color:#333}.mfp-image-holder .mfp-close,.mfp-iframe-holder .mfp-close{color:#fff;right:-6px;text-align:right;padding-right:6px;width:100%}.mfp-counter{position:absolute;top:0;right:0;color:#ccc;font-size:12px;line-height:18px;white-space:nowrap}.mfp-arrow{position:absolute;opacity:.65;margin:0;top:50%;margin-top:-55px;padding:0;width:90px;height:110px;-webkit-tap-highlight-color:transparent}.mfp-arrow:active{margin-top:-54px}.mfp-arrow:hover,.mfp-arrow:focus{opacity:1}.mfp-arrow:before,.mfp-arrow:after{content:'';display:block;width:0;height:0;position:absolute;left:0;top:0;margin-top:35px;margin-left:35px;border:medium inset transparent}.mfp-arrow:after{border-top-width:13px;border-bottom-width:13px;top:8px}.mfp-arrow:before{border-top-width:21px;border-bottom-width:21px;opacity:.7}.mfp-arrow-left{left:0}.mfp-arrow-left:after{border-right:17px solid #fff;margin-left:31px}.mfp-arrow-left:before{margin-left:25px;border-right:27px solid #3f3f3f}.mfp-arrow-right{right:0}.mfp-arrow-right:after{border-left:17px solid #fff;margin-left:39px}.mfp-arrow-right:before{border-left:27px solid #3f3f3f}.mfp-iframe-holder{padding-top:40px;padding-bottom:40px}.mfp-iframe-holder .mfp-content{line-height:0;width:100%;max-width:900px}.mfp-iframe-holder .mfp-close{top:-40px}.mfp-iframe-scaler{width:100%;height:0;overflow:hidden;padding-top:56.25%}.mfp-iframe-scaler iframe{position:absolute;display:block;top:0;left:0;width:100%;height:100%;box-shadow:0 0 8px rgba(0,0,0,.6);background:#000}img.mfp-img{width:auto;max-width:100%;height:auto;display:block;line-height:0;box-sizing:border-box;padding:40px 0 40px;margin:0 auto}.mfp-figure{line-height:0}.mfp-figure:after{content:'';position:absolute;left:0;top:40px;bottom:40px;display:block;right:0;width:auto;height:auto;z-index:-1;box-shadow:0 0 8px rgba(0,0,0,.6);background:#444}.mfp-figure small{color:#bdbdbd;display:block;font-size:12px;line-height:14px}.mfp-figure figure{margin:0}.mfp-bottom-bar{margin-top:-36px;position:absolute;top:100%;left:0;width:100%;cursor:auto}.mfp-title{text-align:left;line-height:18px;color:#f3f3f3;word-wrap:break-word;padding-right:36px}.mfp-image-holder .mfp-content{max-width:100%}.mfp-gallery .mfp-image-holder .mfp-figure{cursor:pointer}@media screen and (max-width:800px) and (orientation:landscape),screen and (max-height:300px){.mfp-img-mobile .mfp-image-holder{padding-left:0;padding-right:0}.mfp-img-mobile img.mfp-img{padding:0}.mfp-img-mobile .mfp-figure:after{top:0;bottom:0}.mfp-img-mobile .mfp-figure small{display:inline;margin-left:5px}.mfp-img-mobile .mfp-bottom-bar{background:rgba(0,0,0,.6);bottom:0;margin:0;top:auto;padding:3px 5px;position:fixed;box-sizing:border-box}.mfp-img-mobile .mfp-bottom-bar:empty{padding:0}.mfp-img-mobile .mfp-counter{right:5px;top:3px}.mfp-img-mobile .mfp-close{top:0;right:0;width:35px;height:35px;line-height:35px;background:rgba(0,0,0,.6);position:fixed;text-align:center;padding:0}}@media all and (max-width:900px){.mfp-arrow{-webkit-transform:scale(.75);transform:scale(.75)}.mfp-arrow-left{-webkit-transform-origin:0;transform-origin:0}.mfp-arrow-right{-webkit-transform-origin:100%;transform-origin:100%}.mfp-container{padding-left:6px;padding-right:6px}}header{position:fixed;left:0;right:0;top:0;height:50px;background:#fff;z-index:11;border-bottom:1px solid #ccc;box-shadow:0 0 5px -3px #000}#homepage_intro{padding-top:3vw}#homepage_intro img{max-width:100%;height:auto;margin-bottom:.5em}#homepage_intro img.aligncenter{margin:0 auto .5em;display:block}#logo{float:left;display:block;height:25px;margin-top:12px;margin-left:15px;z-index:13;position:relative}#logo img{height:100%;width:auto;display:block}#searchtrigger{position:absolute;color:#fff;right:0;width:50px;height:50px;background:url(//documentation.spire.com/wp-content/themes/docs/css/../img/icon-search.svg) #be0000 no-repeat center center/50% 50%;top:0;z-index:100;overflow:hidden;text-indent:-9999px;transition:background .3s}#searchtrigger:hover{background-color:#04060f}#mainmenu{position:fixed;left:0;top:0;height:50px;width:100%;z-index:12}#mainmenu+nav{float:right;margin-right:50px;position:relative;z-index:13;font-weight:400}#mainmenu+nav ul li{white-space:nowrap;display:inline-block;height:50px;line-height:50px;padding-left:10px;padding-right:10px;overflow:hidden;font-weight:700;opacity:.5;position:relative;transition:background-color .3s,opacity .3s}#mainmenu+nav ul li.hasdm{opacity:1;padding-left:0}#mainmenu+nav ul li.sales{opacity:1}#mainmenu+nav ul li.sales a{background:#be0000;color:#fff;padding:.25em 1em .25em .5em;border-radius:30px;box-shadow:0 0 5px -3px rgba(0,0,0,.35)}#mainmenu+nav ul li.sales a img{filter:invert(1);transform:scale(.8)}#mainmenu+nav ul li.sales a:hover{background:#04060f}#mainmenu+nav ul li:hover{opacity:1}#mainmenu+nav ul li+li{margin-left:.5em}#mainmenu+nav ul li img{width:1.5em;height:auto;position:relative;top:-.075em;margin-right:.5em}#mainmenu li.apis>ul a{display:block;padding-right:80px}#mainmenu li.apis>ul>li{position:relative;min-width:420px;padding-top:.5em;padding-bottom:.5em}#mainmenu li.apis>ul>li+li{border-top:1px solid #f2f2f2}#mainmenu li.apis>ul>li ul{padding-top:.5em;padding-left:1em}#mainmenu li.apis>ul>li ul li{position:relative}#mainmenu li.apis>ul>li ul li a:hover{font-weight:700}#mainmenu li.apis>ul>li ul li:before{content:'';position:absolute;left:-1em;top:0;width:.8em;height:.7em;box-sizing:border-box;border-left:1px dashed #c6c7c8;border-bottom:1px dashed #c6c7c8}#mainmenu li.apis>ul>li>a{position:relative;z-index:1}#mainmenu li.apis>ul>li>a:hover{font-weight:700}#mainmenu li.apis>ul>li:after{content:'';position:absolute;right:0;top:1.2em;padding:.5em;border-radius:5px;color:#fff;text-transform:uppercase;font-weight:800;font-size:.5em}#mainmenu li.apis>ul>li.graphql:after{content:'GraphQL API';background:#2280c5}#mainmenu li.apis>ul>li.rest:after{content:'REST APIs';background:#00806c}#mainmenu li.apis>ul>li.webservice:after{content:'Web Service';background:#be0000}#mainmenu li.apis>ul>li.tcp:after{content:'NMEA feed';background:#0f447a}#mainmenu>ul{height:50px;position:relative;text-align:left;padding-left:300px}#mainmenu>ul>li{display:inline-block;position:relative;white-space:nowrap;height:50px}#mainmenu>ul>li>ul{padding:10px 20px;background:#fff;box-shadow:0 0 5px -3px #000;position:absolute;top:100%;left:0;display:none}#mainmenu>ul>li:hover>ul{display:block}#mainmenu>ul>li.current-menu-item>a,#mainmenu>ul>li.current-menu-ancestor>a,#mainmenu>ul>li.current-menu-parent>a,#mainmenu>ul>li.current_page_parent>a,#mainmenu>ul>li.current_page_ancestor>a{background:#be0000;color:#fff}#mainmenu>ul>li.current-menu-item>a:hover>a,#mainmenu>ul>li.current-menu-ancestor>a:hover>a,#mainmenu>ul>li.current-menu-parent>a:hover>a,#mainmenu>ul>li.current_page_parent>a:hover>a,#mainmenu>ul>li.current_page_ancestor>a:hover>a{color:#fff}#mainmenu>ul>li.current-menu-item.page-item-2>a{background:#fff;color:#04060f}#mainmenu>ul>li>a{display:inline-block;height:50px;line-height:50px;padding-left:20px;padding-right:20px;overflow:hidden;font-weight:700;position:relative;transition:background-color .3s}#mainmenu>ul>li>a:after{position:absolute;left:0;top:0;width:30px;height:100%;content:'';background-size:60% 60%;background-position:center center;background-repeat:no-repeat}#mainmenu>ul>li#main_search,#mainmenu>ul>li#main_logout{text-indent:-999px;float:right;width:50px}#mainmenu>ul>li#main_search a,#mainmenu>ul>li#main_logout a{display:block;padding:0;width:50px}#mainmenu>ul>li#main_search+li,#mainmenu>ul>li#main_logout+li{margin-left:0}#mainmenu>ul>li#main_search a:after,#mainmenu>ul>li#main_logout a:after{width:50px;background-image:url(//documentation.spire.com/wp-content/themes/docs/css/../img/icon_search.svg);background-size:35% 35%;background-position:center center;opacity:.5}#mainmenu>ul>li#main_logout a:after{background-image:url(//documentation.spire.com/wp-content/themes/docs/css/../img/icon_logout.svg)}#mainmenu>ul>li#domain_switcher{float:right;height:30px;background:#fff;position:relative;margin-top:11px;margin-right:20px;border:1px solid #ddd;border-radius:5px}#mainmenu>ul>li#domain_switcher>span,#mainmenu>ul>li#domain_switcher>a{display:inline-block;height:auto;box-sizing:border-box;padding:.5em .25em;line-height:16px}#mainmenu>ul>li#domain_switcher>span{float:left;background:#fafafa;border-right:1px solid #ddd;width:30px;border-radius:5px 0 0 5px;line-height:14px;font-weight:800;color:#ccc}#mainmenu>ul>li#domain_switcher>a{float:right;width:125px;text-align:left;padding-left:10px;border-radius:0 5px 5px 0;display:block;position:relative}#mainmenu>ul>li#domain_switcher>a:after{height:28px;width:15px;background:#fafafa;border-left:1px solid #ddd;right:0;top:0;content:'';position:absolute;left:auto;border-radius:0 5px 5px 0}#mainmenu>ul>li#domain_switcher>a>i{position:relative;top:-.15em}#mainmenu>ul>li#domain_switcher>a:hover{color:#04060f}#mainmenu>ul>li#domain_switcher:hover>a{color:#04060f}#mainmenu>ul>li#domain_switcher:hover ul{display:block}#mainmenu>ul>li#domain_switcher ul{display:none;position:absolute;left:29px;top:calc(100% - 2px);padding-left:10px;width:111px;text-align:left;background:#fff;border-right:1px solid #ddd;border-bottom:1px solid #ddd;border-left:1px solid #ddd;padding-top:.35em;padding-bottom:.35em}#mainmenu>ul>li#domain_switcher ul li{padding:.25em 0}#mainmenu>ul>li#domain_switcher ul li a{color:#fff}#mainmenu>ul>li#domain_switcher ul li a.tag{display:block;box-sizing:border-box;width:90px}#mainmenu>ul>li#domain_switcher ul li+li{margin-top:.25em}#mainmenu>ul>li.main_dashboard a:after{background-image:url(//documentation.spire.com/wp-content/themes/docs/css/../img/icon_dashboard.svg);background-size:50% 50%}#mainmenu>ul>li.main_customers a:after{background-image:url(//documentation.spire.com/wp-content/themes/docs/css/../img/icon_company.svg)}#mainmenu>ul>li.main_add_customer a:after{background-image:url(//documentation.spire.com/wp-content/themes/docs/css/../img/icon_company_add.svg)}#mainmenu>ul>li.main_users a:after{background-image:url(//documentation.spire.com/wp-content/themes/docs/css/../img/icon_user.svg);background-position:center 45%;background-size:50% 50%}#mainmenu>ul>li.main_add_user a:after{background-image:url(//documentation.spire.com/wp-content/themes/docs/css/../img/icon_account.svg)}#mainmenu>ul>li.main_tools a:after{background-image:url(//documentation.spire.com/wp-content/themes/docs/css/../img/icon_tools.svg);background-position:center 45%;background-size:50% 50%}#mainmenu>ul>li.main_create_token a:after{background-image:url(//documentation.spire.com/wp-content/themes/docs/css/../img/icon_new_token.svg);background-size:50% 50%}#mainmenu>ul>li.main_tokens a:after{background-image:url(//documentation.spire.com/wp-content/themes/docs/css/../img/icon_token.svg)}#extendedtoggle{position:absolute;left:50%;margin-left:-25px;width:50px;height:50px;bottom:0}#extendedtoggle:after{top:0;left:0;width:100%;height:100%;position:absolute;content:'';background:url(//documentation.spire.com/wp-content/themes/docs/css/../img/icon_arrow_left.svg) no-repeat center top;background-size:20px 20px;opacity:.3}#extendedtoggle span{color:rgba(255,255,255,.3);font-size:14px;position:absolute;left:0;text-align:center;width:100%;top:23px;font-weight:700;text-transform:uppercase}footer{background:#04060f;color:#fff;padding-top:80px;padding-bottom:155px;font-weight:700;position:relative;z-index:1}footer.simple{padding:0}footer.simple #postfooterlegal .col.col12{border-top:0;padding-bottom:30px;margin-top:0}footer img{width:70%;height:auto}footer #postfooterlegal .col.col12{border-top:1px solid #fff;padding-top:30px;margin-top:20px}footer #postfooterlegal .col.col12 a{transition:color .3s}footer #postfooterlegal .col.col12 a:hover{color:rgba(255,255,255,.7)}footer #postfooterlegal .col.col12>a{margin-right:1.5em}footer #postfooterlegal .col.col12 #legalmenu{padding-top:1em}footer #postfooterlegal .col.col12 #legalmenu li{display:inline-block;padding:0 1em;margin-bottom:.5em}footer #postfooterlegal .col.col12 #legalmenu li+li{border-left:1px solid #fff}footer #postfooterlegal .col.col12 #legalmenu li:first-child{padding-left:0}footer #postfooterlegal .col.col12 #socialicons{float:right;font-size:1.3em}footer #postfooterlegal .col.col12 #socialicons li{float:left;margin-left:1.2em}@media only screen and (max-width:1000px){footer{padding-top:50px;padding-bottom:120px}footer img{width:113px;height:33px;margin-bottom:35px}footer #postfooterlegal .col.col12>a{margin-bottom:1em}footer #postfooterlegal .col.col12 #legalmenu li:first-child{padding-left:0}footer #footermenu{grid-template-columns:31.5% 31.5% 31.5%}footer #footermenu>li{height:6em}footer #footermenu>li:nth-child(1){grid-area:1/1/8/1}footer #footermenu>li:nth-child(2){grid-area:4/1/4/1;height:22em}footer #footermenu>li:nth-child(3){grid-area:1/2/1/2}footer #footermenu>li:nth-child(4){grid-area:2/2/2/2}footer #footermenu>li:nth-child(5){grid-area:3/2/3/2}footer #footermenu>li:nth-child(6){grid-area:1/3/1/3}footer #footermenu>li:nth-child(7){grid-area:2/3/2/3;margin-top:-2em}footer #footermenu>li:nth-child(8){grid-area:3/3/3/3;margin-top:-4em}footer #footermenu>li:nth-child(6),footer #footermenu>li:nth-child(7),footer #footermenu>li:nth-child(8){height:4em;padding-top:0}}@media only screen and (max-width:750px){footer{padding-bottom:80px}footer.simple{padding-bottom:80px}footer #footermenu{grid-template-columns:48.75% 48.75%}footer #footermenu>li{height:auto}footer #footermenu>li:nth-child(1){grid-area:1/1/8/1}footer #footermenu>li:nth-child(2){grid-area:7/1/7/1;margin-top:-21em;height:auto}footer #footermenu>li:nth-child(3){grid-area:1/2/1/2}footer #footermenu>li:nth-child(4){grid-area:2/2/2/2}footer #footermenu>li:nth-child(5){grid-area:3/2/3/2}footer #footermenu>li:nth-child(6){grid-area:4/2/4/2}footer #footermenu>li:nth-child(7){grid-area:5/2/5/2;margin-top:0}footer #footermenu>li:nth-child(8){grid-area:6/2/6/2;margin-top:0}footer #footermenu>li:nth-child(9){grid-area:7/2/7/2}footer #footermenu>li:nth-child(7),footer #footermenu>li:nth-child(8),footer #footermenu>li:nth-child(9){height:auto;padding-top:0}footer #postfooterlegal .col.col12 #legalmenu li{padding:0;display:block}footer #postfooterlegal .col.col12 #legalmenu li+li{margin-top:.5em;border-left:0}footer.simple #postfooterlegal .col.col12{margin-top:0}}img.alignright{float:right;margin:0 0 1em 1em}img.alignleft{float:left;margin:0 1em 1em 0}img.aligncenter{display:block;margin-left:auto;margin-right:auto}.alignright{float:right}.alignleft{float:left}.aligncenter{display:block;margin-left:auto;margin-right:auto}.hidden,[hidden]{display:none !important}.sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:1px}.sr-only.focusable:active,.sr-only.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;white-space:inherit;width:auto}.invisible{visibility:hidden}.clearfix:before,.clearfix:after{content:" ";display:table}.clearfix:after{clear:both}@media print{*,*:before,*:after{background:#fff !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="#"]:after,a[href^="javascript:"]:after{content:""}pre{white-space:pre-wrap !important}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}}code[class*=language-],pre[class*=language-]{color:#000;background:0 0;text-shadow:0 1px #fff;font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow:none;background:#b3d4fc}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow:none;background:#b3d4fc}@media print{code[class*=language-],pre[class*=language-]{text-shadow:none}}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#f5f2f0}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#454f59}.token.punctuation{color:#4f4f4f}.token.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#344d00}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#9a6e3a;background:hsla(0,0%,100%,.5)}.token.atrule,.token.attr-value,.token.keyword{color:#00567a}.token.class-name,.token.function{color:#971c34}.token.important,.token.regex,.token.variable{color:#704900}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}pre[class*=language-].line-numbers{position:relative;padding-left:3.8em;counter-reset:linenumber}pre[class*=language-].line-numbers>code{position:relative;white-space:inherit}.line-numbers .line-numbers-rows{position:absolute;pointer-events:none;top:0;font-size:100%;left:-3.8em;width:3em;letter-spacing:-1px;border-right:1px solid #999;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.line-numbers-rows>span{display:block;counter-increment:linenumber}.line-numbers-rows>span:before{content:counter(linenumber);color:#999;display:block;padding-right:.8em;text-align:right}div.code-toolbar{position:relative}div.code-toolbar>.toolbar{position:absolute;z-index:10;top:.3em;right:.2em;transition:opacity .3s ease-in-out;opacity:0}div.code-toolbar:hover>.toolbar{opacity:1}div.code-toolbar:focus-within>.toolbar{opacity:1}div.code-toolbar>.toolbar>.toolbar-item{display:inline-block}div.code-toolbar>.toolbar>.toolbar-item>a{cursor:pointer}div.code-toolbar>.toolbar>.toolbar-item>button{background:0 0;border:0;color:inherit;font:inherit;line-height:normal;overflow:visible;padding:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}div.code-toolbar>.toolbar>.toolbar-item>a,div.code-toolbar>.toolbar>.toolbar-item>button,div.code-toolbar>.toolbar>.toolbar-item>span{color:#bbb;font-size:.8em;padding:0 .5em;background:#f5f2f0;background:rgba(224,224,224,.2);box-shadow:0 2px 0 0 rgba(0,0,0,.2);border-radius:.5em}div.code-toolbar>.toolbar>.toolbar-item>a:focus,div.code-toolbar>.toolbar>.toolbar-item>a:hover,div.code-toolbar>.toolbar>.toolbar-item>button:focus,div.code-toolbar>.toolbar>.toolbar-item>button:hover,div.code-toolbar>.toolbar>.toolbar-item>span:focus,div.code-toolbar>.toolbar>.toolbar-item>span:hover{color:inherit;text-decoration:none}.relevanssi-live-search-results{box-sizing:border-box;-moz-box-sizing:border-box;background:#fff;-webkit-box-shadow:0 0 2px 0 rgba(30,30,30,.4);box-shadow:0 0 2px 0 rgba(30,30,30,.4);border-radius:3px;width:315px;min-height:175px;max-height:300px}.relevanssi-live-search-result p,.relevanssi-live-search-result-status p{font-size:.9em;padding:1em;margin:0;border-bottom:1px solid rgba(30,30,30,.1)}.relevanssi-live-search-result-status p{font-size:.8em;padding:0 1em}.relevanssi-live-search-result--focused{background:#ddd}.relevanssi-live-search-result--focused a{color:#000}.relevanssi-live-search-result:last-of-type p{border-bottom:0}.relevanssi-live-search-result a{display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.relevanssi-live-search-instructions{border:0 !important;clip:rect(1px,1px,1px,1px) !important;-webkit-clip-path:inset(50%) !important;clip-path:inset(50%) !important;height:1px !important;overflow:hidden !important;padding:0 !important;position:absolute !important;width:1px !important;white-space:nowrap !important}.rlv-has-spinner{width:56px;height:56px;border:8px solid #0052ec;border-right-color:transparent;border-radius:50%;position:relative;animation:loader-rotate 1s linear infinite;margin:1em auto}.rlv-has-spinner:after{content:"";width:8px;height:8px;background:#0052ec;border-radius:50%;position:absolute;top:-1px;left:33px}@keyframes loader-rotate{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}.relevanssi-live-search-results{opacity:0;transition:opacity .25s ease-in-out;-moz-transition:opacity .25s ease-in-out;-webkit-transition:opacity .25s ease-in-out;height:0;overflow:hidden;z-index:9999995;position:absolute;display:none}.relevanssi-live-search-results-showing{display:block;opacity:1;height:auto;overflow:auto}.relevanssi-live-search-no-results,.relevanssi-live-search-didyoumean{padding:0 1em}</style><script type="application/ld+json" class="yoast-schema-graph">{"@context":"https://schema.org","@graph":[{"@type":"TechArticle","@id":"https://documentation.spire.com/maritime-2-0/#article","isPartOf":{"@id":"https://documentation.spire.com/maritime-2-0/"},"author":{"name":"Simão Oliveira","@id":"https://documentation.spire.com/#/schema/person/4df42cb1e6de22f486e7c397cbbb7878"},"headline":"Maritime 2.0","datePublished":"2022-08-31T15:50:50+00:00","dateModified":"2022-10-26T15:29:02+00:00","mainEntityOfPage":{"@id":"https://documentation.spire.com/maritime-2-0/"},"wordCount":118,"publisher":{"@id":"https://documentation.spire.com/#organization"},"inLanguage":"en-US"},{"@type":"WebPage","@id":"https://documentation.spire.com/maritime-2-0/","url":"https://documentation.spire.com/maritime-2-0/","name":"Maritime 2.0 | Spire Maritime Documentation","isPartOf":{"@id":"https://documentation.spire.com/#website"},"datePublished":"2022-08-31T15:50:50+00:00","dateModified":"2022-10-26T15:29:02+00:00","breadcrumb":{"@id":"https://documentation.spire.com/maritime-2-0/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https://documentation.spire.com/maritime-2-0/"]}]},{"@type":"BreadcrumbList","@id":"https://documentation.spire.com/maritime-2-0/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://documentation.spire.com/"},{"@type":"ListItem","position":2,"name":"Maritime 2.0"}]},{"@type":"WebSite","@id":"https://documentation.spire.com/#website","url":"https://documentation.spire.com/","name":"Spire Maritime Documentation","description":"Get started with Spire Maritime APIs and Web Services","publisher":{"@id":"https://documentation.spire.com/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://documentation.spire.com/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https://documentation.spire.com/#organization","name":"Spire Maritime","url":"https://documentation.spire.com/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https://documentation.spire.com/#/schema/logo/image/","url":"https://documentation.spire.com/wp-content/uploads/2022/10/maritime_icon.png","contentUrl":"https://documentation.spire.com/wp-content/uploads/2022/10/maritime_icon.png","width":512,"height":512,"caption":"Spire Maritime"},"image":{"@id":"https://documentation.spire.com/#/schema/logo/image/"},"sameAs":["https://www.facebook.com/satelliteaisdata/","https://twitter.com/aisdata","https://www.linkedin.com/showcase/spire-maritime/"]},{"@type":"Person","@id":"https://documentation.spire.com/#/schema/person/4df42cb1e6de22f486e7c397cbbb7878","name":"Simão Oliveira","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https://documentation.spire.com/#/schema/person/image/","url":"https://documentation.spire.com/wp-content/uploads/2022/10/T01T6C4676G-U01TB0PM6S2-ba6089b50aab-512-150x150.jpg","contentUrl":"https://documentation.spire.com/wp-content/uploads/2022/10/T01T6C4676G-U01TB0PM6S2-ba6089b50aab-512-150x150.jpg","caption":"Simão Oliveira"}}]}</script> <link rel='dns-prefetch' href='//spire.com' /><link rel='dns-prefetch' href='//cdn.jsdelivr.net' /><link rel='dns-prefetch' href='//cdnjs.cloudflare.com' /><link rel='dns-prefetch' href='//fonts.googleapis.com' /><link rel='preload' as='style' crossorigin='anonymous' id='exo-font-preload-css' href='https://fonts.googleapis.com/css2?family=Exo%3Awght%40300%3B400%3B500%3B700%3B800&#038;display=swap' type='text/css' media='' /><link rel='preload' as='font' type='font/woff2' crossorigin='anonymous' id='apercu-font-preload-css' href='https://documentation.spire.com/wp-content/themes/docs/font/apercu-mono-regular.woff2' type='text/css' media='' /><link rel='stylesheet' id='exo-font-css' href='https://fonts.googleapis.com/css2?family=Exo%3Awght%40300%3B400%3B500%3B700%3B800&#038;display=swap' type='text/css' media='' /><link rel='stylesheet' id='magnific-css' href='https://cdn.jsdelivr.net/npm/magnific-popup@1.1.0/dist/magnific-popup.css?ver=6.7.1' type='text/css' media='' /> <script defer type="text/javascript" src="https://documentation.spire.com/wp-includes/js/jquery/jquery.min.js?ver=3.7.1" id="jquery-core-js"></script> <script defer type="text/javascript" src="https://documentation.spire.com/wp-content/cache/autoptimize/js/autoptimize_single_5226652de4f7a179e760bf7e9a3d0232.js?ver=1679901433" id="darkmode_apply-js"></script> <link rel="EditURI" type="application/rsd+xml" title="RSD" href="https://documentation.spire.com/xmlrpc.php?rsd" /><link rel='shortlink' href='https://documentation.spire.com/?p=11' /><link rel="icon" href="https://documentation.spire.com/wp-content/uploads/2022/10/cropped-maritime_icon-32x32.png" sizes="32x32" /><link rel="icon" href="https://documentation.spire.com/wp-content/uploads/2022/10/cropped-maritime_icon-192x192.png" sizes="192x192" /><link rel="apple-touch-icon" href="https://documentation.spire.com/wp-content/uploads/2022/10/cropped-maritime_icon-180x180.png" /><meta name="msapplication-TileImage" content="https://documentation.spire.com/wp-content/uploads/2022/10/cropped-maritime_icon-270x270.png" /> <script defer src="data:text/javascript;base64,dmFyIGJ1c2luZXNzMT0nbWFyaXRpbWUnOw=="></script> <script defer type="text/javascript" src="https://cookie-cdn.cookiepro.com/consent/de7f49f2-6902-4173-9229-932c6d04aac7/OtAutoBlock.js" ></script> <script defer src="https://cookie-cdn.cookiepro.com/scripttemplates/otSDKStub.js" type="text/javascript" charset="UTF-8" data-domain-script="de7f49f2-6902-4173-9229-932c6d04aac7" ></script> <script defer src="data:text/javascript;base64,CiAgICBmdW5jdGlvbiBPcHRhbm9uV3JhcHBlcigpIHsgfQogICAg"></script> <script defer src="data:text/javascript;base64,KGZ1bmN0aW9uKHcsZCxzLGwsaSl7d1tsXT13W2xdfHxbXTt3W2xdLnB1c2goeydndG0uc3RhcnQnOgogICAgbmV3IERhdGUoKS5nZXRUaW1lKCksZXZlbnQ6J2d0bS5qcyd9KTt2YXIgZj1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKHMpWzBdLAogICAgaj1kLmNyZWF0ZUVsZW1lbnQocyksZGw9bCE9J2RhdGFMYXllcic/JyZsPScrbDonJztqLmFzeW5jPXRydWU7ai5zcmM9CiAgICAnaHR0cHM6Ly93d3cuZ29vZ2xldGFnbWFuYWdlci5jb20vZ3RtLmpzP2lkPScraStkbDtmLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGosZik7CiAgICB9KSh3aW5kb3csZG9jdW1lbnQsJ3NjcmlwdCcsJ2RhdGFMYXllcicsJ0dUTS1OMzI2M1ZDJyk7"></script> </head><body class="page-template-default page page-id-11 page-parent"> <script defer src="data:text/javascript;base64,dmFyIGFqYXh1cmw9J2h0dHBzOi8vZG9jdW1lbnRhdGlvbi5zcGlyZS5jb20vd3AtYWRtaW4vYWRtaW4tYWpheC5waHAnOw=="></script> <script defer src="data:text/javascript;base64,dmFyIHNpdGVUaXRsZT0nU3BpcmUgTWFyaXRpbWUgRG9jdW1lbnRhdGlvbic7"></script> <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-N3263VC" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript> <script id="hs-script-loader" type="text/plain" class="optanon-category-C0004" async defer src="//js.hs-scripts.com/6779491.js"></script> <header> <a href="https://documentation.spire.com" id="logo"><img width="249" height="25" src="https://documentation.spire.com/wp-content/themes/docs/img/spire_maritime_documentation_logo.svg" alt="Logo of the Spire Maritime Documentation platform"/></a><div id="mobilemenuwrapper"><nav id="mainmenu"><ul><li id="menu-item-84" class="apis menu-item menu-item-type-post_type menu-item-object-page menu-item-home current-menu-ancestor current-menu-parent current_page_parent current_page_ancestor menu-item-has-children menu-item-84"><a href="https://documentation.spire.com/"><span>APIs &#038; Solutions</span></a><ul class="sub-menu"><li id="menu-item-23" class="graphql menu-item menu-item-type-post_type menu-item-object-page current-menu-item page_item page-item-11 current_page_item menu-item-has-children menu-item-23"><a href="https://documentation.spire.com/maritime-2-0/" aria-current="page"><span>Maritime 2.0</span></a><ul class="sub-menu"><li id="menu-item-282" class="graphql menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children menu-item-282"><a href="https://documentation.spire.com/maritime-2-0/vessels/"><span>Vessels 2.0</span></a><ul class="sub-menu"><li id="menu-item-1448" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-1448"><a href="https://documentation.spire.com/maritime-2-0/vessels/output-objects/validated-static-data/"><span>Validated Static Data</span></a></li><li id="menu-item-1311" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-1311"><a href="https://documentation.spire.com/maritime-2-0/vessels/output-objects/vessel-characteristics/"><span>Vessel characteristics</span></a></li><li id="menu-item-1172" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-1172"><a href="https://documentation.spire.com/maritime-2-0/vessels/output-objects/vessel-to-port-eta/"><span>Vessel to Port ETA</span></a></li></ul></li><li id="menu-item-1101" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-1101"><a href="https://documentation.spire.com/maritime-2-0/port-events/"><span>Port Events</span></a></li><li id="menu-item-1424" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-1424"><a href="https://documentation.spire.com/maritime-2-0/port-congestion/"><span>Port Congestion</span></a></li><li id="menu-item-1480" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-1480"><a href="https://documentation.spire.com/routing-api/"><span>Routing</span></a></li></ul></li><li id="menu-item-115" class="webservice menu-item menu-item-type-post_type menu-item-object-page menu-item-115"><a href="https://documentation.spire.com/latest-vessel-information-lvi/"><span>Latest Vessel Information (LVI)</span></a></li><li id="menu-item-142" class="webservice menu-item menu-item-type-post_type menu-item-object-page menu-item-142"><a href="https://documentation.spire.com/historical-vessel-points-and-tracks-hvp-hvt/"><span>Historical Vessel Points / Tracks (HVP/HVT)</span></a></li><li id="menu-item-1321" class="webservice menu-item menu-item-type-post_type menu-item-object-page menu-item-1321"><a href="https://documentation.spire.com/ais-position-validation/"><span>AIS Position Validation</span></a></li><li id="menu-item-188" class="tcp menu-item menu-item-type-post_type menu-item-object-page menu-item-188"><a href="https://documentation.spire.com/tcp-stream-v2/"><span>TCP Stream v2</span></a></li><li id="menu-item-355" class="tcp menu-item menu-item-type-post_type menu-item-object-page menu-item-355"><a href="https://documentation.spire.com/uniproxy/"><span>UniProxy</span></a></li><li id="menu-item-663" class="rest menu-item menu-item-type-custom menu-item-object-custom menu-item-has-children menu-item-663"><a href="#"><span>Legacy</span></a><ul class="sub-menu"><li id="menu-item-26" class="rest menu-item menu-item-type-post_type menu-item-object-page menu-item-26"><a href="https://documentation.spire.com/vessels-api/"><span>Vessels API</span></a></li><li id="menu-item-208" class="rest menu-item menu-item-type-post_type menu-item-object-page menu-item-208"><a href="https://documentation.spire.com/messages-api/"><span>Messages API</span></a></li><li id="menu-item-189" class="rest menu-item menu-item-type-post_type menu-item-object-page menu-item-189"><a href="https://documentation.spire.com/historical-positions-api/"><span>Historical Positions API</span></a></li></ul></li></ul></li><li id="menu-item-187" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-187"><a href="https://documentation.spire.com/ais-fundamentals/"><span>AIS Fundamentals</span></a></li><li id="menu-item-366" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-366"><a href="https://documentation.spire.com/blog/"><span>Blog</span></a></li><li id="menu-item-1496" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-1496"><a href="https://spire.com/"><span>Visit Spire Global</span></a></li></ul></nav><nav><ul><li class="sales"><a href="https://spire.com/maritime/configure-your-ais-solution" target="_blank" title="Contact Spire sales for API access - opens in a new tab"><img height="23" width="23" src="https://documentation.spire.com/wp-content/themes/docs/img/icon-support.svg?v1" alt="Sales icon"/>Contact sales</a></li><li><a href="https://status.spire.com" target="_blank"><img height="23" width="23" src="https://documentation.spire.com/wp-content/themes/docs/img/icon-status.svg" alt="Status icon"/>Platform status</a></li><li><a href="https://documentation.spire.com/make-a-support-request/" target="_blank"><img height="23" width="23" src="https://documentation.spire.com/wp-content/themes/docs/img/icon-question.svg" alt="Support icon"/>Get support</a></li><li class="hasdm"> <a href="javascript:void(0)" id="darkmodetoggle" title="Toggle between light/dark mode"></a></li></ul></nav></div> <a href="javascript:void(0);" id="searchtrigger">Search</a> <a href="javascript:void(0);" id="mobiletrigger">Open menu</a></header><main><nav id="docmap"><div><ul><li><a href="#maritime-2-0">Maritime 2.0</a></li><li class="has-sub-menu"> <a href="#graphql">GraphQL Overview</a><ul class="sub-menu"><li class=""><a href="#writing-a-query">Writing a query</a></li><li class=""><a href="#running-your-first-graphql-query">Video: Your first GraphQL query</a></li><li class="has-sub-menu"><a href="#syntax">Syntax</a><ul class="sub-menu"><li class=""><a href="#named-and-unnamed-queries">Named and unnamed queries</a></li><li class=""><a href="#renaming-fields">Renaming fields</a></li><li class=""><a href="#multiple-root-fields">Multiple Root Fields</a></li><li class=""><a href="#fragments">Fragments</a></li><li class=""><a href="#unions">Unions</a></li></ul></li></ul></li><li class="has-sub-menu"> <a href="#making-calls">Making API calls</a><ul class="sub-menu"><li class=""><a href="#authentication">Authentication</a></li><li class="has-sub-menu"><a href="#supported-types">Supported types</a><ul class="sub-menu"><li class=""><a href="#default-scalar-types">Default scalar types</a></li><li class=""><a href="#maritime-2-0-scalar-types">Maritime 2.0 scalar types</a></li><li class=""><a href="#the-timeduration-field">The TimeDuration field</a></li></ul></li><li class="has-sub-menu"><a href="#writing-queries">Writing queries</a><ul class="sub-menu"><li class=""><a href="#return-all-vessels-globally">All vessels globally</a></li><li class=""><a href="#return-partial-fields-for-all-vessels-globally">Partial fields for all vessels globally</a></li></ul></li><li class=""><a href="#pagination">Pagination</a></li><li class="has-sub-menu"><a href="#filtering">Filtering</a><ul class="sub-menu"><li class=""><a href="#filter-by-a-specified-mmsi-list">Filter by MMSI</a></li><li class=""><a href="#filter-by-long-lists-of-mmsi">Filter by long lists of MMSI</a></li><li class=""><a href="#filter-by-a-specified-aoi">Filter by a specified AOI</a></li><li class=""><a href="#filter-by-a-specified-callsign">Filter by callsign</a></li><li class=""><a href="#filter-by-a-specified-vessel-flag">Filter by flag</a></li><li class=""><a href="#filter-by-a-specified-imo">Filter by IMO</a></li><li class=""><a href="#filter-by-specified-lastpositionupdate">Filter by lastPositionUpdate</a></li><li class=""><a href="#filter-by-specified-lastupdate">Filter by lastUpdate</a></li><li class=""><a href="#filter-by-specified-name">Filter by name</a></li><li class=""><a href="#filter-by-specified-shiptype">Filter by shipType</a></li><li class=""><a href="#filter-by-fleet">Filter by fleet</a></li><li class=""><a href="#filter-by-specified-lasttimestamp">Filter by lastTimestamp</a></li></ul></li><li class="has-sub-menu"><a href="#error-handling">Error handling</a><ul class="sub-menu"><li class=""><a href="#error-format">Error format</a></li><li class=""><a href="#standard-error-codes">Standard Error Codes</a></li><li class=""><a href="#troubleshooting">Troubleshooting</a></li></ul></li><li class="has-sub-menu"><a href="#rate-limiting">Rate limiting</a><ul class="sub-menu"><li class=""><a href="#rate-limiting-multi-root-queries">Multi-Root Queries</a></li></ul></li><li class="has-sub-menu"><a href="#best-practices-for-developers">Best practices</a><ul class="sub-menu"><li class=""><a href="#use-gzip-compression">Use gZip compression</a></li><li class=""><a href="#query-what-you-need">Query what you need</a></li></ul></li><li class="has-sub-menu"><a href="#tutorials">Tutorials</a><ul class="sub-menu"><li class=""><a href="#setting-up-an-api-connection-via-python">Setting up an API connection via Python</a></li></ul></li></ul></li><li class=""> <a href="#available-root-queries">Available root queries</a></li><li class="has-sub-menu"> <a href="#vessels">vessels</a><ul class="sub-menu"><li class="has-sub-menu"><a href="#query-arguments">Query arguments</a><ul class="sub-menu"><li class=""><a href="#areaofinterest">areaOfInterest</a></li><li class=""><a href="#timerange">TimeRange</a></li><li class=""><a href="#lastpositionupdate">lastPositionUpdate</a></li><li class=""><a href="#lasttimestamp">lastTimestamp</a></li><li class=""><a href="#lastupdate">lastUpdate</a></li><li class=""><a href="#shiptype">shipType</a></li></ul></li><li class="has-sub-menu"><a href="#output-objects">Output objects</a><ul class="sub-menu"><li class=""><a href="#voyage">Voyage</a></li><li class=""><a href="#lastpositionupdate-output">lastPositionUpdate</a></li><li class=""><a href="#vesselstaticdata">VesselStaticData</a></li><li class=""><a href="#pageinfo">pageInfo</a></li><li class=""><a href="#totalcount">totalCount</a></li><li class=""><a href="#validated-static-data">Validated Static Data</a></li><li class=""><a href="#vessel-characteristics">Vessel characteristics</a></li><li class=""><a href="#vessel-to-port-eta">Vessel to Port ETA</a></li></ul></li><li class="has-sub-menu"><a href="#data-dictionary">Data dictionary</a><ul class="sub-menu"><li class=""><a href="#vessel-characteristics-data-dictionary">Vessel characteristics data dictionary</a></li></ul></li><li class=""><a href="#quickstart-kit">Quickstart kit - vessels</a></li></ul></li><li class="has-sub-menu"> <a href="#port-events">Port Events</a><ul class="sub-menu"><li class=""><a href="#porteventsbyvessel">portEventsByVessel</a></li><li class=""><a href="#porteventsbylocation">portEventsByLocation</a></li><li class=""><a href="#porteventsbyshiptype">portEventsByShipType</a></li><li class=""><a href="#querying-multiple-locations-or-vessels">Querying multiple locations or vessels</a></li><li class="has-sub-menu"><a href="#port-events-query-arguments">Query arguments</a><ul class="sub-menu"><li class=""><a href="#port-events-vessel">vessel</a></li><li class=""><a href="#location">location</a></li><li class=""><a href="#port-events-shiptype">shipType</a></li><li class=""><a href="#state">state</a></li><li class=""><a href="#porteventstimerange">TimeRange</a></li></ul></li><li class="has-sub-menu"><a href="#port-events-output-objects">Output Objects</a><ul class="sub-menu"><li class=""><a href="#port-events-port-event-object">PortEvent</a></li></ul></li><li class=""><a href="#port-events_quickstart-kit">Quickstart kit - portEvents</a></li></ul></li><li class="has-sub-menu"> <a href="#port-congestion">Port Congestion<span class="beta_label">&nbsp;beta&nbsp;</span></a><ul class="sub-menu"><li class="has-sub-menu"><a href="#port-congestion-query-arguments">Query arguments</a><ul class="sub-menu"><li class=""><a href="#port">port</a></li><li class=""><a href="#portcongestionvessels">vessels</a></li><li class=""><a href="#daterange">dateRange</a></li></ul></li><li class=""><a href="#data-structure">Data Structure</a></li><li class="has-sub-menu"><a href="#metrics">Metrics</a><ul class="sub-menu"><li class=""><a href="#congestionindex">congestionIndex</a></li><li class=""><a href="#vesselsinport">vesselsInPort</a></li><li class=""><a href="#vesselsinanchorage">vesselsInAnchorage</a></li><li class=""><a href="#waitingtimeatport">waitingTimeAtPort</a></li><li class=""><a href="#portturnaroundtime">portTurnaroundTime</a></li></ul></li><li class="has-sub-menu"><a href="#data-objects">Data Objects</a><ul class="sub-menu"><li class=""><a href="#latestvalue">latestValue</a></li><li class=""><a href="#aggregate">aggregate</a></li><li class=""><a href="#portcongestionindexmetricbyshiptype">byShipType</a></li><li class=""><a href="#bytimeinterval">byTimeInterval</a></li></ul></li><li class=""><a href="#statistics">Statistics</a></li></ul></li><li class="has-sub-menu"> <a href="#matchedport">matchedPort</a><ul class="sub-menu"><li class=""><a href="#matchedport-query-arguments">Query arguments</a></li><li class=""><a href="#matchedport-output">Output</a></li></ul></li><li class="has-sub-menu"> <a href="#port">port</a><ul class="sub-menu"><li class=""><a href="#port-query-arguments">Query arguments</a></li><li class=""><a href="#port-output">Output</a></li></ul></li></ul></div> <label id="chooser"> <select name="sectionchooser" id="sectionchooser"></select> </label></nav><div id="content"><section data-id="11" id="maritime-2-0" class="level1 " data-url="https://documentation.spire.com/maritime-2-0/"><div class="wrapper clearfix"><div class="col col7"><h1>Maritime 2.0</h1><p class="lead">Maritime 2.0 was introduced as an evolution of our existing REST APIs in 2020, as a response to the challenges in increasing data volume and quality. Maritime 2.0 was developed to be scalable.</p><p>Spire chose to leverage GraphQL technology instead of REST for this newly enhanced service as GraphQL offers the client the ability to describe the data and get exactly the data that is needed through the use of queries.</p><p>Ultimately, Spire Maritime 2.0 delivers state of the art vessel data infrastructure that enables customers to unlock the value of the data and provide access to vessel data from various data sources, such as AIS, with more sources such as Vessel Characteristics and routing services to come in the future.</p></div><div class="col col1">&nbsp;</div><div class="col col4"><div class="ctabox" style="text-align: center;"><p><img decoding="async" style="width: 100px; height: 100px;" src="https://miro.medium.com/max/512/1*fVBL9mtLJmHIH6YpU7WvHQ.png" alt="Postman App Icon" /></p><h2>Get started now</h2><p>Download our open source Postman collection, drop in your access token and you will be making Maritime 2.0 API calls in seconds.</p><p><a class="calltoaction inverted" href="https://github.com/spireglobal/maritime/tree/main/spire-graphql-postman-collection" target="_blank" rel="noopener">Get started now</a></p><p><small>Don’t have a token yet? <a href="https://spire.com/maritime/get-started/" target="_blank" rel="noopener">Request a trial</a></small></p></div></div></div><div class="wrapper clearfix"><div class="col col7 feedback"> <span class="textlabel">Was this article useful?</span> <a class="givefeedback yes" href="#" data-section-id="11" data-value="1">Yes</a> <a class="givefeedback no" href="#" data-section-id="11" data-value="-1">No</a><div class="formcontainer" id="container-67b8a87941ef8"></div></div></div></section><section data-id="13" id="graphql" class="level2 " data-url="https://documentation.spire.com/maritime-2-0/graphql/"><div class="wrapper clearfix"><div class="col col7"><h2>GraphQL Overview</h2><p>GraphQL is an API technology developed by Facebook in 2015 and adopted over the world by top technological companies. In this guide we will show the benefits of GraphQL as a technology and also provide an overview of some powerful and advanced features of GraphQL query syntax. After this article you will understand what benefits GraphQL gives you as a customer as well as be able to use advanced features of GraphQL to power your queries.</p><p>GraphQL is an API technology which allows allows customers to query API in the requests. Contrary to REST where specific endpoints are used to identify the resource, the GraphQL exposes a single endpoint with a global GraphQL schema. GraphQL schema defines what is possible to query and underlying data types. Customers are sending queries against the schema to the GraphQL server as a POST request. You can query whatever you want using a single API endpoint (but according to the granted permissions) and the shape of the response will match the shape of the query.</p><p>For Spire, as<em> data provider</em>, the GraphQL gives following benefits:</p><ul><li><strong>Integrated API</strong> &#8211; in one query you can query multiple data sources at once. For example, querying for the vessel you can get vessel characteristics, destination port, predicted route and so on. Such kind of API is impossible to create with REST approach.</li><li><strong>Single API endpoint</strong> &#8211; single endpoint <code>api.spire.com/graphql</code> where all the operations are available. Integrating any new feature into GraphQL should be straightforward for Spire as well as for our customers.</li><li><strong>Flexibility</strong> &#8211; in the long term GraphQL allows more flexibility than REST. At first, GraphQL supports queries, mutations, subscriptions out of the box, where subscriptions are really promising for the Maritime domain. Second, GraphQL schema could be evolved in a way to integrate various data sources.</li><li><strong>Documentation</strong> &#8211; GraphQL schema serves as live documentation for our API.</li></ul><p>For you, as a <em>customer</em>, GraphQL gives a following benefits:</p><ul><li><strong>Query only what you need</strong> &#8211; as a customer you can focus only on a subset of the data you need therefore reducing the amount of transferred data which will lead to better performance.</li><li><strong>Parallel queries</strong> &#8211; you might sent a query with a multiple root fields which will be resolved in parallel.</li><li><strong>Typesafe queries</strong> &#8211; all queries are validated against GraphQL schema and safe to execute.</li><li><strong>API Playground</strong> &#8211; at api.spire.com/graphql there is a GraphQL playground available where you can play and prototype query of any complexity.</li></ul><p>GraphQL represents a massive leap forward for API development. Type safety, introspection, generated documentation, and predictable responses benefit both the data provider and customers of the API platform.</p></div><div class="col col1">&nbsp;</div><div class="col col4"><div class="ctabox" style="text-align: center;"><p><img fetchpriority="high" decoding="async" class="alignnone size-large wp-image-332" style="border: 1px solid #eee; border-radius: 5px;" src="https://documentation.spire.com/wp-content/uploads/2022/09/graphql-playground-c85f989e4a200019d1e4e22bab6303a1-1024x530.png" alt="GraphQL playground screenshot" width="1024" height="530" srcset="https://documentation.spire.com/wp-content/uploads/2022/09/graphql-playground-c85f989e4a200019d1e4e22bab6303a1-1024x530.png 1024w, https://documentation.spire.com/wp-content/uploads/2022/09/graphql-playground-c85f989e4a200019d1e4e22bab6303a1-300x155.png 300w, https://documentation.spire.com/wp-content/uploads/2022/09/graphql-playground-c85f989e4a200019d1e4e22bab6303a1-768x397.png 768w, https://documentation.spire.com/wp-content/uploads/2022/09/graphql-playground-c85f989e4a200019d1e4e22bab6303a1-1536x795.png 1536w, https://documentation.spire.com/wp-content/uploads/2022/09/graphql-playground-c85f989e4a200019d1e4e22bab6303a1-2048x1059.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /></p><h3>GraphQL playground</h3><p>All samples queries can be executed in our GraphQL playground, where you also have access to interactive Docs and Schema pages.</p><p><a class="calltoaction inverted" href="https://api.spire.com/graphql" target="_blank" rel="noopener">Access the playground</a></p><p><small>Don’t have a token yet? <a href="https://spire.com/maritime/get-started/" target="_blank" rel="noopener">Request a trial</a></small></p></div></div></div><div class="wrapper clearfix"><div class="col col7 feedback"> <span class="textlabel">Was this article useful?</span> <a class="givefeedback yes" href="#" data-section-id="13" data-value="1">Yes</a> <a class="givefeedback no" href="#" data-section-id="13" data-value="-1">No</a><div class="formcontainer" id="container-67b8a879426ed"></div></div></div></section><section data-id="256" id="writing-a-query" class="level3 " data-url="https://documentation.spire.com/maritime-2-0/graphql/writing-a-query/"><div class="wrapper clearfix"><div class="col col7"><h3>Writing a query</h3><p>To access the data through the Spire Maritime 2.0 API, you will need to execute a GraphQL query.</p><p>This query essentially asks for specific fields on one or more objects; in other words, a GraphQL query describes the shape of your data &#8220;graph&#8221;.</p><p>A query is generally structured based on the following outline:</p><pre><code data-prismjs-copy="Copy to clipboard">query { rootQuery( argument1:&lt;value&gt; ... argumentN:&lt;value&gt; ) { outputField1 ... outputFieldN } }</code></pre></div></div><div class="wrapper clearfix"><div class="col col7 feedback"> <span class="textlabel">Was this article useful?</span> <a class="givefeedback yes" href="#" data-section-id="256" data-value="1">Yes</a> <a class="givefeedback no" href="#" data-section-id="256" data-value="-1">No</a><div class="formcontainer" id="container-67b8a8794299e"></div></div></div></section><section data-id="1287" id="running-your-first-graphql-query" class="level3 " data-url="https://documentation.spire.com/maritime-2-0/graphql/running-your-first-graphql-query/"><div class="wrapper clearfix"><div class="col col7"><h3>Video tutorial: Running your first GraphQL query</h3><div class='embed-container' style='padding-bottom:56.75%'><!--[if lt IE 9]><script>document.createElement('video');</script><![endif]--><video playsinline class="wp-video-shortcode" id="video-11-1" width="1920" height="1080" preload="metadata" controls="controls"><source type="video/mp4" src="https://documentation.spire.com/wp-content/uploads/2023/03/Running-your-first-GraphQL-query.mp4?_=1" /><a href="https://documentation.spire.com/wp-content/uploads/2023/03/Running-your-first-GraphQL-query.mp4">https://documentation.spire.com/wp-content/uploads/2023/03/Running-your-first-GraphQL-query.mp4</a></video></div><ul class="video_chapters" data-video="https://documentation.spire.com/wp-content/uploads/2023/03/Running-your-first-GraphQL-query.mp4"><li><a href="#">00:00 &#8211; Introduction</a></li><li><a href="#">00:53 &#8211; Basic GraphQL query structure</a></li><li><a href="#">01:47 &#8211; GraphQL query example</a></li><li><a href="#">02:24 &#8211; How to run query on playground</a></li><li><a href="#">04:17 &#8211; Playground demo</a></li><li><a href="#">07:52 &#8211; How to run query on Postman</a></li><li><a href="#">09:36 &#8211; Postman demo</a></li></ul></div><div class="col col1">&nbsp;</div><div class="col col4"><pre><code data-prismjs-copy="Copy to clipboard">query FirstQuery {  vessels(imo: [9538907, 9726413]) {   nodes {    staticData {     name     mmsi     imo    }    lastPositionUpdate {     accuracy     collectionType     course     timestamp     updateTimestamp    }    currentVoyage {     draught    }   }  } }</code></pre><p>This is how you put your token in Playground:</p><pre><code data-prismjs-copy="Copy to clipboard">{  "Authorization": "Bearer &lt;your token&gt;” }</code></pre></div></div><div class="wrapper clearfix"><div class="col col7 feedback"> <span class="textlabel">Was this article useful?</span> <a class="givefeedback yes" href="#" data-section-id="1287" data-value="1">Yes</a> <a class="givefeedback no" href="#" data-section-id="1287" data-value="-1">No</a><div class="formcontainer" id="container-67b8a87943357"></div></div></div></section><section data-id="15" id="syntax" class="level3 titleonly" data-url="https://documentation.spire.com/maritime-2-0/graphql/syntax/"><div class="wrapper clearfix"><div class="col col7"><h3>Syntax</h3></div></div></section><section data-id="16" id="named-and-unnamed-queries" class="level4 " data-url="https://documentation.spire.com/maritime-2-0/graphql/syntax/named-and-unnamed-queries/"><div class="wrapper clearfix"><div class="col col7"><h4>Named and unnamed queries</h4><p>The basic GraphQL query to get <code>mmsi</code> and <code>name</code> for first 3 vessels might look like:</p><pre><code data-prismjs-copy="Copy to clipboard">{ vessels(first: 3) { nodes { staticData { mmsi name } } } }</code></pre><p>This is so-called <strong>unnamed</strong> query because query itself does not have his own name. Let&#8217;s compare with <strong>named</strong> query:</p><pre><code data-prismjs-copy="Copy to clipboard">query myVessels { vessels(first: 3) { nodes { staticData { mmsi name } } } }</code></pre><p>Named queries are more generic just because they can have a variables and <strong>variables</strong> can be passed to arguments:</p><pre><code data-prismjs-copy="Copy to clipboard">query myVessels($numOfVessels: Int!) { vessels(first: $numOfVessels) { nodes { staticData { mmsi name } } } }</code></pre><p>To execute the query you need to provide <strong>query variables</strong> alongside with query as json:</p><pre><code data-prismjs-copy="Copy to clipboard">{ "numOfVessels": 10 }</code></pre><p>On the network level named query with arguments are represented as extended version of <code>POST</code> request:</p><pre><code data-prismjs-copy="Copy to clipboard">POST https://api.spire.com/graphql { "operationName": "myVessels" "query": " query myVessels($numOfVessels: Int!) { ... } ", "variables": { "numOfVessels": 10 } }</code></pre><p>The more realistically looking example of the query with variables:</p><pre><code data-prismjs-copy="Copy to clipboard">query queryVesselsPositions( $limit: Int $after: String $startTime: DateTime! $endTime: DateTime! ) { vessels( first: $limit after: $after lastPositionUpdate: { startTime: $startTime, endTime: $endTime } ) { pageInfo { endCursor hasNextPage } nodes { id staticData { name mmsi imo } lastPositionUpdate { timestamp updateTimestamp latitude longitude heading speed rot accuracy course maneuver navigationalStatus collectionType } } } }</code></pre></div></div><div class="wrapper clearfix"><div class="col col7 feedback"> <span class="textlabel">Was this article useful?</span> <a class="givefeedback yes" href="#" data-section-id="16" data-value="1">Yes</a> <a class="givefeedback no" href="#" data-section-id="16" data-value="-1">No</a><div class="formcontainer" id="container-67b8a879438f2"></div></div></div></section><section data-id="17" id="renaming-fields" class="level4 " data-url="https://documentation.spire.com/maritime-2-0/graphql/syntax/renaming-fields/"><div class="wrapper clearfix"><div class="col col7"><h4>Renaming fields</h4><p>It&#8217;s possible to change the name of the field in GraphQL. You can rename any field, at any level of the query.</p><p>The syntax for renaming is always <code>newName: fieldName</code> for any field.</p><pre><code data-prismjs-copy="Copy to clipboard">query queryVessels { vessels(mmsi: [244234000]) { nodes { staticData { imo mmsi call_sign: callsign ship_type: shipType } } } }</code></pre><p>The response will look like:</p><pre><code data-prismjs-copy="Copy to clipboard">{ "data": { "vessels": { "nodes": [ { "staticData": { "imo": 9361354, "mmsi": 244234000, "call_sign": null, "ship_type": null } } ] } } }</code></pre><p>You can change the name of the field in the query, but you can&#8217;t change structure of the query. For example, <code>mmsi</code> will always be child of <code>staticData</code>.</p></div></div><div class="wrapper clearfix"><div class="col col7 feedback"> <span class="textlabel">Was this article useful?</span> <a class="givefeedback yes" href="#" data-section-id="17" data-value="1">Yes</a> <a class="givefeedback no" href="#" data-section-id="17" data-value="-1">No</a><div class="formcontainer" id="container-67b8a87943bb0"></div></div></div></section><section data-id="335" id="multiple-root-fields" class="level4 " data-url="https://documentation.spire.com/maritime-2-0/graphql/syntax/multiple-root-fields/"><div class="wrapper clearfix"><div class="col col7"><h4>Multiple Root Fields</h4><p>One query can contain multiple root fields. We need to use the renaming feature of GraphQL syntax to query multiple <code>vessels</code> fields. The two <strong>root queries</strong> <code>tankers</code> and <code>cargo</code> will be executed in parallel, but response will come when both of them are resolved.</p><pre><code data-prismjs-copy="Copy to clipboard">{ tankers: vessels(shipType: [TANKER_CRUDE, TANKER_PRODUCT, TANKER_CHEMICALS]) { nodes { staticData { mmsi name } } } cargo: vessels(shipType: [CONTAINER, GENERAL_CARGO]) { nodes { staticData { mmsi name } } } }</code></pre><p>The response will look like:</p><pre><code data-prismjs-copy="Copy to clipboard">{ "data": { "tankers": { ... }, "cargo": { ... } } }</code></pre><p>Notes:</p><ul><li>Each root query is resolved in parallel, but the entire result will come when all root queries will be resolved.</li><li>If you query multiple root queries, you might need to deal with multiple pagination cursors. Each sub query will have an independent pagination cursor.</li><li>Each root query counted once for <a class="scrolltoelement" href="#rate-limiting">rate limiter</a>.</li></ul></div></div><div class="wrapper clearfix"><div class="col col7 feedback"> <span class="textlabel">Was this article useful?</span> <a class="givefeedback yes" href="#" data-section-id="335" data-value="1">Yes</a> <a class="givefeedback no" href="#" data-section-id="335" data-value="-1">No</a><div class="formcontainer" id="container-67b8a87943e70"></div></div></div></section><section data-id="337" id="fragments" class="level4 " data-url="https://documentation.spire.com/maritime-2-0/graphql/syntax/fragments/"><div class="wrapper clearfix"><div class="col col7"><h4>Fragments</h4><p>A <strong>fragment</strong> is a reusable piece of GraphQL query. For example, for some vessels you are interested in last position, but for another vessels you are interested in the current route:</p><pre><code data-prismjs-copy="Copy to clipboard">query { vesselsWithPosition: vessels(mmsi: [244234000, 413801932, 259605000]) { nodes { id staticData { imo mmsi callsign shipType } lastPositionUpdate { collectionType latitude longitude } } } vesselsWithVoyage: vessels(mmsi: [412338057, 338164033, 710127102]) { nodes { id staticData { imo mmsi callsign shipType } currentVoyage { destination eta } } } }</code></pre><p>You can see that <code>staticData</code> part is duplicated across the queries and we can extract it to the fragment and reuse:</p><pre><code data-prismjs-copy="Copy to clipboard">query { vesselsWithPosition: vessels(mmsi: [244234000, 413801932, 259605000]) { nodes { id staticData { ...vesselStaticData } lastPositionUpdate { collectionType latitude longitude } } } vesselsWithVoyage: vessels(mmsi: [412338057, 338164033, 710127102]) { nodes { id staticData { ...vesselStaticData } currentVoyage { destination eta } } } } # NOTE: fragment declared outside of the query brackets query { ... } # Declare fragment on type fragment vesselStaticData on VesselStaticData { imo mmsi callsign shipType }</code></pre><p><strong>Notes</strong>:</p><p>A fragment must be used within the query, otherwise a <code>GRAPHQL_VALIDATION_FAILED</code> error will be returned.<br /> You can have several fragments on one type and use them at the same time.</p></div></div><div class="wrapper clearfix"><div class="col col7 feedback"> <span class="textlabel">Was this article useful?</span> <a class="givefeedback yes" href="#" data-section-id="337" data-value="1">Yes</a> <a class="givefeedback no" href="#" data-section-id="337" data-value="-1">No</a><div class="formcontainer" id="container-67b8a879440b3"></div></div></div></section><section data-id="339" id="unions" class="level4 " data-url="https://documentation.spire.com/maritime-2-0/graphql/syntax/unions/"><div class="wrapper clearfix"><div class="col col7"><h4>Unions</h4><p>Usually when you query a field it has a single possible type. GraphQL <strong>unions</strong> are used to represent scenario scenarios when there are several possible return types for the same field.</p><p>For example, when you query <code>predictedVesselRoute</code>, depending on the <code>origin</code> argument, the route could start from a point or from a port. In the query only one of these branches will have a result depending how <code>origin</code> is specified:</p><p>If the <code>origin</code> is provided as unlocode then it will resolve to <code>... on Port</code> branch.<br /> If the <code>origin</code> is provided as coordinates then it will resolve to <code>... on GeoPoint</code> branch.</p><pre><code data-prismjs-copy="Copy to clipboard">{ predictedVesselRoute( vessel: { mmsi: 205283000 } origin: { unlocode: "TTPTS" } destination: { unlocode: "COBAQ" } ) { journey { origin { # if origin is geo point (NO) ... on GeoPoint { latitude longitude } # if origin is port (YES) ... on Port { name unlocode centerPoint { latitude longitude } } } } } }</code></pre><p>Will result in:</p><pre><code data-prismjs-copy="Copy to clipboard">{ "data": { "predictedVesselRoute": { "journey": { "origin": { "name": "Point Lisas Ports", "unlocode": "TTPTS", "centerPoint": { "latitude": 10.400300025939941, "longitude": -61.49700164794922 } } } } } }</code></pre></div></div><div class="wrapper clearfix"><div class="col col7 feedback"> <span class="textlabel">Was this article useful?</span> <a class="givefeedback yes" href="#" data-section-id="339" data-value="1">Yes</a> <a class="givefeedback no" href="#" data-section-id="339" data-value="-1">No</a><div class="formcontainer" id="container-67b8a879442e1"></div></div></div></section><section data-id="248" id="making-calls" class="level2 titleonly" data-url="https://documentation.spire.com/maritime-2-0/making-calls/"><div class="wrapper clearfix"><div class="col col7"><h2>Making API calls</h2></div></div></section><section data-id="14" id="authentication" class="level3 " data-url="https://documentation.spire.com/maritime-2-0/making-calls/authentication/"><div class="wrapper clearfix"><div class="col col7"><h3>Authentication</h3><p>The Maritime 2.0 API uses <a href="https://swagger.io/docs/specification/authentication/bearer-authentication/" target="_blank" rel="noopener">Bearer tokens</a> to authenticate requests. Attempting to make requests to the API without a valid API Key <a class="scrolltoelement" href="#error-handling">will result in the return of an error message</a>.</p><p>In addition, to ensure transport layer security, all access or communication with the APIs must be made over HTTPS.</p><div class="ctabox"><h3>Not a Spire customer yet?</h3><p>You&#8217;ll need a token to start using the API. Get in touch with our team to purchase an API plan or request a trial token.</p><p><a class="calltoaction" href="https://documentation.spire.com/#">Get a token</a></p></div></div><div class="col col1">&nbsp;</div><div class="col col4"><div class="codebox"><div class="title">Base URL</div><div class="code"><pre><code data-prismjs-copy="Copy to clipboard">https://api.spire.com/graphql</code></pre></div></div><p>All requests should contain following header:</p><div class="codebox"><div class="code"><pre><code data-prismjs-copy="Copy to clipboard">Authorization: Bearer &lt;token&gt;</code></pre></div></div><div class="codebox"><div class="title">Authentication bash example</div><div class="code"><pre><code data-prismjs-copy="Copy to clipboard"> curl \ --request POST \ --url https://api.spire.com/graphql \ --header "Content-Type: application/json" \ --header "Authorization: Bearer " \ --data '{ "query": "{ vessels(first: 1) { nodes { id staticData { name mmsi imo } lastPositionUpdate { timestamp latitude longitude collectionType } } } } " }' </code></pre></div></div></div></div><div class="wrapper clearfix"><div class="col col7 feedback"> <span class="textlabel">Was this article useful?</span> <a class="givefeedback yes" href="#" data-section-id="14" data-value="1">Yes</a> <a class="givefeedback no" href="#" data-section-id="14" data-value="-1">No</a><div class="formcontainer" id="container-67b8a879446d2"></div></div></div></section><section data-id="259" id="supported-types" class="level3 titleonly" data-url="https://documentation.spire.com/maritime-2-0/making-calls/supported-types/"><div class="wrapper clearfix"><div class="col col7"><h3>Supported types</h3></div></div></section><section data-id="260" id="default-scalar-types" class="level4 " data-url="https://documentation.spire.com/maritime-2-0/making-calls/supported-types/default-scalar-types/"><div class="wrapper clearfix"><div class="col col7"><h4>Default scalar types</h4><dl><dt><code>Boolean</code></dt><dd>The Boolean scalar type represents <code>true</code> or <code>false</code>.</dd><dt><code>Float</code></dt><dd>The Float scalar type represents signed double-precision fractional values as specified by IEEE 754.</dd><dt><code>Integer</code></dt><dd>The Int scalar type represents non-fractional signed whole numeric values.<br /> Int can represent values between <code>-(2^31)</code> and <code>2^31 - 1</code>.</dd><dt><code>String</code></dt><dd>The String scalar type represents textual data, represented as UTF-8 character sequences.<br /> The String type is most often used by GraphQL to represent free-form human-readable text.</dd><dt><code>ID</code></dt><dd>The ID scalar type represents a unique identifier, often used to fetch an object or as the key for a cache.<br /> The ID type is serialized in the same way as a String; however, defining it as an ID signifies that it is not intended to be human‐readable.<br /> When expected as an input type, any string (such as <code>"4"</code>) or integer (such as <code>4</code>) input value will be accepted as an ID.</dd></dl><p><a href="https://graphql.org/learn/schema/#type-system" target="_blank" rel="noopener">Read more about the GraphQL type system.</a></p></div></div><div class="wrapper clearfix"><div class="col col7 feedback"> <span class="textlabel">Was this article useful?</span> <a class="givefeedback yes" href="#" data-section-id="260" data-value="1">Yes</a> <a class="givefeedback no" href="#" data-section-id="260" data-value="-1">No</a><div class="formcontainer" id="container-67b8a87944ba6"></div></div></div></section><section data-id="263" id="maritime-2-0-scalar-types" class="level4 " data-url="https://documentation.spire.com/maritime-2-0/making-calls/supported-types/maritime-2-0-scalar-types/"><div class="wrapper clearfix"><div class="col col7"><h4>Maritime 2.0 scalar types</h4><dl><dt><code>IMO</code></dt><dd>Vessel&#8217;s IMO number</dd><dt><code>MMSI</code></dt><dd>Vessel&#8217;s MMSI number</dd><dt><code>DateTime</code></dt><dd>A date-time string at UTC, such as <code>2007-12-03T10:15:30Z</code>, compliant with the <code>date-time</code> format outlined in section 5.6 of the RFC 3339 profile of the ISO 8601 standard for representation of dates and times using the Gregorian calendar.</dd><dt><code>GeoJsonPosition</code></dt><dd>Represents a pair of coordinates in a decimal format: <code>[number, number]</code></dd><dt><code>WKT</code></dt><dd>Geometry in a Well-Known Text format.</dd><dt><code>UNLOCODE</code></dt><dd>UN/LOCODE <a href="https://www.unece.org/cefact/locode/service/location.html" target="_blank" rel="noopener">as defined by the UNECE</a></dd></dl></div></div><div class="wrapper clearfix"><div class="col col7 feedback"> <span class="textlabel">Was this article useful?</span> <a class="givefeedback yes" href="#" data-section-id="263" data-value="1">Yes</a> <a class="givefeedback no" href="#" data-section-id="263" data-value="-1">No</a><div class="formcontainer" id="container-67b8a87944e7c"></div></div></div></section><section data-id="265" id="the-timeduration-field" class="level4 " data-url="https://documentation.spire.com/maritime-2-0/making-calls/supported-types/the-timeduration-field/"><div class="wrapper clearfix"><div class="col col7"><h4>The <code>TimeDuration</code> field</h4><p>We defined the <code>TimeDuration</code> field to represent the time duration in various formats.</p><p>The type has 3 properties each representing a different format:</p><dl><dt><code>iso</code></dt><dd>Represents duration in ISO 8601 format; e.g. <code>PT24H5M30S</code> represents 24 hours, 5 minutes, 30 seconds.</dd><dt><code>seconds</code></dt><dd>Represents duration in seconds</dd><dt><code>text</code></dt><dd>represents duration in human-readable text, e.g. <code>1h1m45s</code></dd></dl></div></div><div class="wrapper clearfix"><div class="col col7 feedback"> <span class="textlabel">Was this article useful?</span> <a class="givefeedback yes" href="#" data-section-id="265" data-value="1">Yes</a> <a class="givefeedback no" href="#" data-section-id="265" data-value="-1">No</a><div class="formcontainer" id="container-67b8a879451d1"></div></div></div></section><section data-id="314" id="writing-queries" class="level3 " data-url="https://documentation.spire.com/maritime-2-0/making-calls/writing-queries/"><div class="wrapper clearfix"><div class="col col7"><h3>Writing queries</h3><p>To access the data, you will need to execute a query against the Spire Maritime 2.0 service.</p><p>Each query is mapped to a specific object type, and each object type has certain fields that can be included or excluded in the query schema to get the desired results.</p><p>For more information about each object type, please refer to the Output section of the Fundamentals page.</p><p>To filter the results returned in the query (ie. getting information for a specified list of MMSI or limiting results to a confined area of interest), you will need to specify arguments in parentheses next to the query name.</p><p>The queries below are intended to be run in the Playground environment:</p></div></div><div class="wrapper clearfix"><div class="col col7 feedback"> <span class="textlabel">Was this article useful?</span> <a class="givefeedback yes" href="#" data-section-id="314" data-value="1">Yes</a> <a class="givefeedback no" href="#" data-section-id="314" data-value="-1">No</a><div class="formcontainer" id="container-67b8a879453da"></div></div></div></section><section data-id="315" id="return-all-vessels-globally" class="level4 " data-url="https://documentation.spire.com/maritime-2-0/making-calls/writing-queries/return-all-vessels-globally/"><div class="wrapper clearfix"><div class="col col7"><h4>Return all vessels globally</h4><p>Sample of a query that returns all vessels globally.</p><p>The sample below includes some, but not all available fields:</p><pre><code data-prismjs-copy="Copy to clipboard">query { vessels { pageInfo { hasNextPage endCursor } totalCount { relation value } nodes { id updateTimestamp staticData { name imo mmsi } lastPositionUpdate { latitude longitude navigationalStatus timestamp updateTimestamp } currentVoyage { destination draught eta timestamp updateTimestamp } } } }</code></pre></div></div><div class="wrapper clearfix"><div class="col col7 feedback"> <span class="textlabel">Was this article useful?</span> <a class="givefeedback yes" href="#" data-section-id="315" data-value="1">Yes</a> <a class="givefeedback no" href="#" data-section-id="315" data-value="-1">No</a><div class="formcontainer" id="container-67b8a879455e1"></div></div></div></section><section data-id="317" id="return-partial-fields-for-all-vessels-globally" class="level4 " data-url="https://documentation.spire.com/maritime-2-0/making-calls/writing-queries/return-partial-fields-for-all-vessels-globally/"><div class="wrapper clearfix"><div class="col col7"><h4>Return partial fields for all vessels globally</h4><p>In order to modify what fields are returned in the response, simply modify which fields you request in the request schema.</p><p>For example, if you would like to only get positional information about the vessels (no static information), you would use this sample query:</p><pre><code data-prismjs-copy="Copy to clipboard">query { vessels { nodes { id lastPositionUpdate { accuracy collectionType course heading latitude longitude maneuver navigationalStatus rot speed timestamp updateTimestamp } } } }</code></pre><p>To further specify which data you would like returned in the response, you would add/delete the fields in the request schema.</p><p>It is important to note that for GraphQL queries you do not need to make multiple requests to access different resources.</p><p>For example, if you are only interested in the following fields:</p><ul><li><code>id</code> and <code>updateTimestamp</code> fields</li><li>the vessel <code>name</code>, <code>mmsi</code>, and <code>imo</code> fields of the <code>staticData</code> type</li><li>the <code>collectionType</code>, <code>latitude</code>, <code>longitude</code>, and <code>timestamp</code> of the <code>lastPositionUpdate</code> type</li><li>all pagination-related fields from the <code>pageInfo</code> type</li></ul><p>&#8230; the query schema would look like this:</p><pre><code data-prismjs-copy="Copy to clipboard">query { vessels { pageInfo { hasNextPage endCursor } totalCount { relation value } nodes { id updateTimestamp staticData { name mmsi imo } lastPositionUpdate { collectionType latitude longitude timestamp } } } }</code></pre></div></div><div class="wrapper clearfix"><div class="col col7 feedback"> <span class="textlabel">Was this article useful?</span> <a class="givefeedback yes" href="#" data-section-id="317" data-value="1">Yes</a> <a class="givefeedback no" href="#" data-section-id="317" data-value="-1">No</a><div class="formcontainer" id="container-67b8a87945853"></div></div></div></section><section data-id="319" id="pagination" class="level3 " data-url="https://documentation.spire.com/maritime-2-0/making-calls/pagination/"><div class="wrapper clearfix"><div class="col col7"><h3>Pagination</h3><p>There are two arguments in the query used for pagination:</p><dl><dt><code>first</code><em>Int</em></dt><dd>Identify how many elements per page you are requesting</dd><dt><code>after</code><em>String</em></dt><dd>Cursor value identifying position to continue pagination.</dd></dl><p>To query specific number of vessels provide a first argument to the query. The following example returns the first 10 vessels with the recent timestamp:</p><pre><code data-prismjs-copy="Copy to clipboard">query { vessels(first: 10) { nodes { staticData { name mmsi imo } lastPositionUpdate { timestamp latitude longitude collectionType } } } }</code></pre><p>To enable pagination you need to provide a after argument to the query. The <code>after</code> is equal to the <code>endCursor</code> value from your most recent API request.</p><p>Thus, to determine the <code>after</code> value, first make your initial query and request the <code>endCursor</code> field:</p><pre><code data-prismjs-copy="Copy to clipboard">query { vessels(first: 10) { # pagination information pageInfo { hasNextPage endCursor } nodes { staticData { name mmsi imo } lastPositionUpdate { timestamp latitude longitude collectionType } } } }</code></pre><p>This should return results similar to:</p><pre><code data-prismjs-copy="Copy to clipboard">{ "data": { "vessels": { "pageInfo": { "hasNextPage": true, "endCursor": "28a3e8d2-6404-4bd0-9d73-5446c70b78fe@99" }, "nodes": [ ... ] } } }</code></pre><p>Now that you have the <code>endCursor</code> value of your last API request, use this value as the <code>after</code> value in your next request.</p><pre><code data-prismjs-copy="Copy to clipboard">query { vessels(first: 10, after: "28a3e8d2-6404-4bd0-9d73-5446c70b78fe@99") { pageInfo { hasNextPage endCursor } nodes { staticData { name mmsi imo } lastPositionUpdate { timestamp latitude longitude collectionType } } } }</code></pre><p>The <code>hasNextPage</code> value controls the pagination. If it&#8217;s <code>false</code> than next page is not available and <code>endCursor: null</code>.</p></div></div><div class="wrapper clearfix"><div class="col col7 feedback"> <span class="textlabel">Was this article useful?</span> <a class="givefeedback yes" href="#" data-section-id="319" data-value="1">Yes</a> <a class="givefeedback no" href="#" data-section-id="319" data-value="-1">No</a><div class="formcontainer" id="container-67b8a87945b1d"></div></div></div></section><section data-id="321" id="filtering" class="level3 " data-url="https://documentation.spire.com/maritime-2-0/making-calls/filtering/"><div class="wrapper clearfix"><div class="col col7"><h3>Filtering</h3><p>You can pass arguments to fields in order to filter the API results. What you can filter on is determined by the query schema.</p><p>For example, in the <code>vessels</code> query, the schema looks like this:</p><pre><code data-prismjs-copy="Copy to clipboard">vessels( after: String areaOfInterest: AreaOfInterest callsign: [String!] first: Int = 100 flag: [String!] imo: [IMO!] lastPositionUpdate: TimeRange mmsi: [MMSI!] name: [String!] shipType: [ShipType!] lastTimestamp: TimeRange ): VesselConnection!</code></pre><p>In the schema above, all the keywords (ie. <code>mmsi</code>, <code>imo</code>, etc.) are the arguments you can pass to the vessels query within the parenthesis.</p><p>For more information about arguments <a href="https://graphql.org/learn/queries/#arguments" target="_blank" rel="noopener">check out GraphQL’s documentation</a>.</p></div></div><div class="wrapper clearfix"><div class="col col7 feedback"> <span class="textlabel">Was this article useful?</span> <a class="givefeedback yes" href="#" data-section-id="321" data-value="1">Yes</a> <a class="givefeedback no" href="#" data-section-id="321" data-value="-1">No</a><div class="formcontainer" id="container-67b8a87945dcb"></div></div></div></section><section data-id="323" id="filter-by-a-specified-mmsi-list" class="level4 " data-url="https://documentation.spire.com/maritime-2-0/making-calls/filtering/filter-by-a-specified-mmsi-list/"><div class="wrapper clearfix"><div class="col col7"><h4>Filter by a specified MMSI list</h4><p>Use the MMSI filter in the sample of a query to return data for a given MMSI list.</p><p>You can see in the sample query that an argument is used to filter on the vessels field, as denoted by the parentheses <code>()</code> next to vessels before the response schema is described in the curly brackets  <code>{}</code>:</p><pre><code data-prismjs-copy="Copy to clipboard">query { vessels(mmsi: [412219791, 338153238, 414403750]) { nodes { staticData { aisClass flag name callsign mmsi callsign dimensions { a b c d width length } } lastPositionUpdate { latitude longitude } currentVoyage { destination draught eta timestamp updateTimestamp } } } }</code></pre></div></div><div class="wrapper clearfix"><div class="col col7 feedback"> <span class="textlabel">Was this article useful?</span> <a class="givefeedback yes" href="#" data-section-id="323" data-value="1">Yes</a> <a class="givefeedback no" href="#" data-section-id="323" data-value="-1">No</a><div class="formcontainer" id="container-67b8a87946044"></div></div></div></section><section data-id="741" id="filter-by-long-lists-of-mmsi" class="level4 " data-url="https://documentation.spire.com/maritime-2-0/making-calls/filtering/filter-by-long-lists-of-mmsi/"><div class="wrapper clearfix"><div class="col col7"><h4>Filter by long lists of MMSI</h4><p>Maritime 2.0 GraphQL allows queries up to 10Kb in size. This means that it is in theory possible to query up to 10,000 IMO or MMSI numbers.</p><p>If you want to query information for a specific fleet of vessels identified by IMO number or MMSI number then it is possible to query up to 10,000 at a time.</p><p>The <code>vessels</code> root query of Maritime 2.0 GraphQL will return up to 1,000 vessels per page of results, however using an advanced GraphQL technique to request multiple lists of vessels will potentially return more results in each combined result set.</p><p>The query below shows how to submit a query for 2,948 vessels filtered by <code>imo</code>. A similar query structure can be used to query any list of IMO or MMSI numbers that you need to construct.</p><div><pre><code data-prismjs-copy="Copy to clipboard">query { part1: vessels( imo:[ 9926934,9928085,9789037,9928097,9941520,9940320,9778923,9918420,9918157,9929194,9918418,9938573,9938535,9925667,9931862,9937957,9903425,9889916,9938511,9926946,9938523,9789049,9884473,9789051,9927316,9937945,9931874,9943920,9903451,9945203,9941518,9928073,9938585,9934668,9903437,9937969,9888766,9889904,9941221,9924869,9945198,9894416,9903449,9918145,9936549,9941219,9928061,9931850,8766179,9820881,9914058,9933444,9939917,9929209,9555008,9934486,9934474,9925679,9915806,9831684,9739185,9757694,9915105,9915090,9901362,9937115,9932323,9918767,9862293,9936288,9436161,7830038,9687904,9870757,7368231,9746968,7229447,7320344,7400704,7382720,7302172,8029686,8613384,7900883,7823645,7718723,7929798,8013962,7913866,7353236,7926447,7238682,7924023,8027688,7921887,7232717,7909011,8016184,8029674,8108925,7331587,7909839,9402380,7830026,7122687,8920000,7022502,9112143,8022212,8511249,7301714,8014057,9074858,7718694,7230604,7405015,7915993,7603332,7335686,7010664,7107699,7931090,8323525,7701562,8004313,9016698,8011043,7422374,7921875,7623631,8005692,8029698,7930448,9914228,8029662,8208426,7326570,7611743,7434482,8319043,7401198,8317382,7821556,7514505,7109403,7025700,8919908,8515879,8516897,7353509,7238096,7810569,7033329,7116119,7718412,8004014,8504222,7022148,9564657,7349613,7359955,8121458,8801046,7723704,8111855,7921899,8419805,9007570,8111843,7405041,8506426,8903131,7924035,8024040,9020479,9020481,7904205,9596856,8811754,7928201,7405003,8217910,8024038,7343267,8005393,7522382,7405039,8812825,8821682,7905522,7928641,7640201,7924047,7224100,9176694,9886794,9000481,7904190,7708687,8111867,8813104,8013625,7700855,8217908,7383499,7405053,8002664,8012281,9170597,7640196,7405027,8027690,7708675,8506438,7640184,8108731,8303654,8821670,8821694,8005408,8903129,8804725,8311297,8715883,8908569,8810188,8608456,7113674,8715895,9129718,7211921,8511964,8013223,7531345,8123688,8100765,7350973,8705711,8705723,8013259,8013247,7373365,7411088,7411076,8030192,7379773,8955378,7044158,7501376,8105052,7373353,7391874,8206612,7402269,7415204,7415216,7352672,7226902,8417261,9010797,7909346,8501531,8501543,8712570,8409630,8902747,8511031,8919752,8912194,8026012,7106944,8325315,7211361,8325327,7126164,7508520,7348968,7040982,7311604,7348970,7424528,9005479,8203232,9039743,9008471,9008469,7315260,7424516,8002951,9112155,9005481,9201906,7600275,7707724,8012865,7328097,8002133,8402345,8222214,8914300,9007087,7509184,8324634,8716514,9007099,7419107,7611793,7419092,7102209,7026716,8016196,8515453,8515465,9034511,7604867,9034509,7522112,7211359,8008383,8400165,7601047,7020097,7038197,7408861,8400177,7931105,8411700,7514361,7811331,7357452,7533707,7817268,9771470,7319711,7414145,8814756,8003010,7120756,8128975,7384481,7712925,7638337,7411557,9002491,8010738,7379761,7327976,8114716,7723857,8128963,7321544,7359917,8406054,8912182,7405625,8116570,7401186,7112058,8807650,7347665,9021667,7383516,7417642,8016809,7411064,8403416,9009023,7414028,7214454,7235965,7411571,8017061,7354840,7384493,8116582,8123626,8814768,7223077,7402506,7907453,7420077,7016852,8001763,8302985,8131104,7383528,8406767,7411052,7420297,7420302,7403067,8102505,8405971,8110552,7422221,8323173,7401174,7901540,7218539,7379711,7411533,7413244,9005508,7034971,7223065,7411545,7359864,7400687,8414178,8716215,8123638,7723869,7383475,8803381,7414133,8008474,8107141,7121310,8000989,7414121,8416334,7721081,7405326,9900485,9765251,7326568,8910811,8029442,7354151,7530638,7626695,7501522,8017932,7818298,8029753,9313838,8014112,9867138,7904229,7204904,7927130,9866017,7916181,9881184,8911188,9901269,9539028,9699402,9887554,7114692,7629635,8028943,7016008,8413007,8001957,8710170,8018077,8604486,7916258,7909138,9889069,7714545,9005728,8016835,7352282,8520587,8518663,7330741,8805119,8795285,7391197,7368841,8210209,7428433,8013950,9030840,7391202,7391214,7428445,7359670,7121633,7347732,7217896,7428471,7235939,7428469,7347794,7347768,8700577,8922357,9017252,8818817,9228887,8903208,8818805,9228875,8026373,9003067,9013696,8705955,7369144,9003043,9003079,9016064,8012114,7325394,7304326,8532736,9625308,8124515,7401203,7359876,7403079,8206624,7363243,7383504,7727346,8109395,9005015,9009190,9128661,7354163,8902797,8717922,9032264,8817992,9014779,8913215,7402257,8818001,8718720,9006693,9016739,8009387,8906810,9014781,8718469,8219932,8904056,8806216,8129814,7126712,7633117,9015759,8024337,8110394,8619405,8910720,9165011,8125832,8702941,8110203,8014409,7411961,7360124,7702401,7035494,7708948,7229459,7359785,8014473,7039074,8828343,9282429,7328243,7390179,7400675,7390155,7400663,7619587,7390208,7619575,7390167,7413232,7390143,7048453,7038692,8972132,9829590,9943499,9540089,9943504,9918353,9908360,9889590,9317200,8515063,9132648,9152337,9146845,9597458,7823762,7903811,8709004,9056521,9239680,7709473,8322002,9003990,9239965,9523586,9693305,7916569,9009827,9157583,9537305,9632674,9715957,7626918,7904176,8915079,8904989,9136759,9196333,9889588,9165047,9380984,9372779,9540754,9781798,9233909,8921511,9691333,7620756,8005630,9128867,9277876,9005168,9114646,9380946,9442079,9874882,8013376,9191242,9365051,9469998,9606572,9682198,9749283,9203239,9197624,7706392,9031753,9066502,9135559,9266217,9473614,9523732,9673745,9798624,8820688,9309552,9523744,8513857,8822284,9016284,9528550,7405431,7913854,9201126,9888780,7921643,7927489,8820171,8921535,8609101,8801709,9088627,7429566,9715969,9035668,9268021,9448853,9852250,9143128,9300702,7930187,9046887,9157557,9873723,7124166,8415392,8510063,9523330,8319196,9202132,9218129,9512874,9644768,7921679,9058830,9134361,8021880,9046875,9402988,8021878,8204561,8609096,9119256,9146235,9183879,9368170,7908677,9176280,9296688,9317286,9343704,8911164,9163116,9893541,9926570,9360295,8313154,9151448,9682227,7810674,7810727,7913878,9132882,9228631,9622722,9805398,8217128,8822258,7921411,8114259,8613372,9109574,9288629,8416619,9132636,9189976,9380996,7376173,8014899,9154177,8022028,8025410,9128881,9333096,9368089,9512836,9682215,9882712,9009994,9185580,9597460,9890343,8608987,9166936,9392200,7916272,8114247,9005962,9058555,9136747,9197210,9195274,9890367,9606687,9015319,9911161,9912206,9898022,9854416,9907691,8955366,9183805,9482005,9854428,9572551,9466403,9618408,9898010,9799305,9260603,9469235,9554729,9433884,9675200,9110092,9217967,9512886,8920127,9168283,7429449,8514277,8605143,9047283,9392042,9909390,7909152,9355305,8921884,9189017,9912579,9203241,9110066,9142277,7629568,9364174,7909140,9046801,9219953,9314416,9571222,8005642,8616685,8002195,7930230,8916322,9054717,9216793,9691321,7823774,9003641,7616559,9009803,9072757,9737541,9021411,9167394,7810739,8915316,8312502,7334498,7535535,7908665,9363522,7700752,9152313,9810161,8816261,9810147,7714973,9217450,9256896,7016228,9088677,9207144,9078660,9622095,7820760,9020833,9837585,9005716,9113991,7322380,9711262,8223543,8609216,9597965,7923067,8717726,9496197,8514186,9634878,9392030,9601871,9309564,9063512,9020857,7706299,8202587,8910330,9364162,9564853,9355290,7914030,9145891,9226607,9152349,9184146,7927427,9447378,9826861,9379234,9810159,8401705,9012159,9124275,9388429,9020704,9743863,7000059,9122253,9771937,8103901,9330123,9805958,8704248,9805960,9058660,7009172,9749477,7428457,8125868,9627930,9468047,9050474,7330179,8005666,8514198,8110215,9111503,8605674,8801682,8610473,9894076,8416633,7818925,8005678,8106422,7044237,8710156,9565833,7912898,9627942,9894040,9820415,9845881,9515814,7331290,8608896,9606481,9627734,9672480,8122995,8608638,7035119,7623708,9491446,7916064,9894064,9378266,9370666,9370654,9089968,8215819,9003275,8521488,8700541,9003287,9654878,9630004,9654880,9810367,9810379,9630028,9743916,9743928,9690157,7390181,9064073,9064085,7382732,7361934,7382744,7361922,8008280,9031973,9031985,9404584,8910902,7411569,9193733,9306548,9290270,8910897,7420089,9195494,9257395,9108099,9193721,8917807,9002908,9177545,9402562,9378163,9402574,9177583,9177569,9358682,9147394,7230666,9155626,9173070,9177571,9177557,9155341,9888194,7624805,7521273,9352860,9768394,9744025,9888481,9878876,9886732,9918781] ){ pageInfo{ endCursor hasNextPage } totalCount{ relation value } nodes{ staticData{ name flag aisClass callsign timestamp mmsi imo shipType shipSubType updateTimestamp } currentVoyage{ eta draught timestamp destination updateTimestamp } lastPositionUpdate{ timestamp latitude longitude collectionType heading speed course updateTimestamp } } } part2: vessels( imo:[9434266,9627485,9693161,9861031,9870159,9943853,9892298,9917543,9333620,9412880,9413327,9682605,9819650,9414632,9661869,9759240,9810549,9877133,9629598,9636735,9682588,9693173,9349019,9892456,9369899,9401295,9600530,9723801,9915894,9892121,9355379,9627954,9869942,9904699,9306495,9878723,9874466,9878711,9640645,9738569,9857365,9872949,9874040,9904170,9624914,9633173,9610767,9810020,9834325,9872999,9879698,9902756,9922976,9917567,9333606,9361990,9501186,9658238,9690169,9791212,9383900,9658240,9707510,9834313,9884021,9390185,9680188,9779238,9857377,9606948,9765079,9862906,9918793,9682590,9875800,9368302,9626027,9626285,9636711,9654701,9680190,9926910,9496305,9626273,9892133,9919890,9896440,9269207,9640023,9862475,9918834,9516129,9490961,9617698,9768368,9862918,9902902,9922988,9737187,9709491,9834296,9874480,9869306,9904194,9320075,9636723,9627497,9690145,9744013,9845776,9872901,9903920,9917579,9761243,9760770,9636785,9654696,9640437,9633161,9637492,9864746,9862920,9902926,9904687,9904675,9331660,9864916,9877145,9943841,9904704,9655042,9750696,9750725,9863182,9909613,9360922,9491812,9650054,9750701,9758832,9895238,9905980,9333632,9634086,9629586,9636797,9634098,9650042,9692014,9690171,9761267,9736092,9834301,9905978,9929106,9918846,9355604,9600528,9637325,9864667,9864784,9918808,9692002,9758844,9853137,9886744,9926908,9774628,9748904,9361639,9369904,9610779,9768382,9855812,9864796,9904182,9339260,9732371,9759252,9336737,9331672,9816763,9896452,9496317,9750672,9862346,9862891,9876737,9878888,9904209,9918822,9904546,9926714,9645970,9637507,9624938,9638903,9696266,9638915,9682552,9748899,9750660,9876660,9885996,9627966,9659725,9880192,9862463,9915909,9490959,9682576,9752565,9917555,9918860,9333618,9425277,9624926,9750737,9791200,9368314,9655444,9810551,9893606,9627502,9750713,9333591,9477593,9626039,9636747,9633422,9709489,9750658,9874454,9606950,9760782,9849887,9852975,9851787,9884174,9918779,9696735,9870525,9864928,9872987,9902938,9918858,9926922,9707508,9750749,9769855,9845764,9904651,9918810,9768526,9349007,9377547,9342487,9520376,9475208,9633434,9845788,9915911,9336749,9635315,9655456,9768370,9774135,9693719,9760768,9862487,9869265,9902914,9885855,9762039,9772852,9869241,9883819,9849631,9869253,9809552,9849629,9772826,9847956,9822451,9823883,9655808,9837066,9780354,9854935,9778313,9820013,9724946,9785500,9859820,9684495,9868974,9880764,9870472,9769128,9850680,9750024,9886756,9909285,9830898,9819882,9888182,9870628,9830903,9868962,9886768,9859636,9715701,8915421,9715713,7901277,8915419,9653678,9674907,9633991,9629536,9629524,9762962,9390680,9385673,9624940,9480409,9685504,9402586,9008500,9070072,9417361,9744960,9158240,9378151,9771511,9744958,9512848,9480382,9566306,9685451,9040118,9129392,9566289,9685437,9685449,9013701,9129380,9566291,9402598,9358670,9685425,9053816,9771523,9654971,8705943,9685499,9941568,9830757,9830745,9523823,9564073,9642033,9584528,9688178,9629421,9233674,9584516,9486946,7525736,9629354,9642150,9630353,9610107,9635092,7904164,8608901,9761607,9532018,9651735,9629433,9635107,9710804,9578878,9655949,9519690,9584530,9640487,8304244,9615016,9613408,9817743,9655937,9819430,9569580,8319134,9634074,9642124,9651747,9847152,9351866,9537123,9537111,9413030,9351854,9877341,9779226,9874492,9864837,9809540,9770531,9560467,9792515,7611781,7617814,7649855,7808994,8905830,9130494,9337963,9742819,9360879,9825439,9904211,9431135,9613147,9798167,9360843,9397339,9694751,9914632,9762273,9431111,9431214,9687019,9694749,9753026,9750256,9932581,9758064,9781918,9753014,9681699,9850678,9360881,9881201,9862308,9859739,9909388,9468437,9732369,9613161,9705653,9785158,9388821,9443413,9941245,9337717,9681687,9766566,9337987,9397298,9761839,9879674,9431123,9672832,9709025,9922782,9433717,9851646,9873852,9896921,9901350,9337729,9397341,9397353,9443683,9761853,9761803,9851634,9859753,9880477,9924857,9918054,9932608,9907926,9372743,9770945,9854363,9887217,9850666,9914644,9337755,9672818,9854612,9388819,9770933,9929871,9337975,9721724,9672844,9761815,9918004,9337705,9360805,9360829,9761827,9766530,9360867,9904091,9397303,9701229,9845013,9892717,9918030,9613135,9721401,9770921,9825427,9918016,9372731,9397315,9687021,9698123,9767962,9896933,9649328,9705641,9859741,9337951,9337731,9443401,9929132,9360831,9672820,9831220,9922770,9360817,9337743,9418365,9873840,9907782,9750244,9766554,9781920,9854765,9360855,9701217,9892822,9750220,9854624,9431147,9761841,9388833,9750232,9766578,9468449,9360790,9613159,9767950,9874820,9338266,9792606,9883742,9941233,9922768,9360908,9918028,9721736,9909417,9926752,9709037,9742807,9766889,9844863,9762261,9766580,9825568,9397286,9892834,9360893,9766542,9771913,9918042,9397327,9758076,9880465,9854375,9771080,9687485,9686376,9780732,9735036,9726114,9232503,9409302,9659103,9689926,9733325,9791224,9835185,9852133,9901984,9901996,9938054,9451991,9721138,9732527,9749788,9800491,9933468,9537032,9732515,9722223,9765457,9919175,9935480,9307750,9346122,9448487,9631682,9802293,9914620,8917845,9445954,9643348,9726061,9735062,9719305,9903073,9645358,9710385,9739977,9763813,9687502,9743722,9765550,9780005,9409168,9689914,9682447,9721140,9735282,9797876,9795919,9372420,9405875,9590668,9734680,9725500,9847425,9810044,9409156,9536363,9701786,9703007,9852145,9656888,9706516,9722792,9739989,9726073,9776341,9789166,9810032,9876490,9919187,9937062,9350422,9666675,9685217,9659139,9667540,9699995,9732503,9787352,9792747,9923097,9415686,9447809,9479929,9649146,9735787,9867102,9906269,9307762,9405083,9706487,9733337,9734513,9719410,9735660,9774197,9897547,9350288,9703019,9752711,9897092,9393682,9388687,9415662,9701798,9744843,9789726,9879703,9916812,9364382,9350599,9352963,9347516,9686388,9738234,9741827,9719290,9849617,9849277,9908839,9447794,9534810,9706499,9790220,9840867,9933781,9346134,9398307,9714393,9702015,9789324,9887451,9935507,9387762,9531478,9739953,9722807,9840879,9847944,9412086,9531519,9590670,9734678,9674842,9687514,9725495,9794288,9903085,9540091,9916824,9933767,9377793,9415703,9537044,9659115,9678525,9730139,9726085,9719408,9732539,9780641,9940605,9630755,9659127,9804253,9779991,9900851,9933509,9369760,9407122,9731042,9855941,9937074,9377078,9415698,9625152,9702039,9689548,9793246,9835173,9839739,9534614,9611955,9670004,9702041,9710397,9744128,9800099,9719276,9543081,9543079,9892951,9405887,9719501,9734525,9773234,9839727,9916836,9386304,9471018,9735658,9789154,9471032,9847437,9906922,9897559,9292113,9354624,9531507,9689536,9694622,9735048,9739965,9743734,9759185,9900849,9412062,9354935,9666974,9903762,9923085,9351919,9454010,9793260,9789312,9790232,9933511,9307748,9353242,9372432,9369461,9406269,9738246,9793258,9810056,9853864,9832793,9621584,9694634,9703837,9902172,9394208,9699517,9711846,9765562,9778478,9796585,9895771,9935492,9359454,9332066,9350290,9470088,9536375,9699505,9723681,9754824,9722780,9797864,9875408,9893656,9902809,9938066,9670016,9702027,9762118,9744831,9778480,9795672,9850367,9666663,9706504,9386299,9604392,9719496,9674854,9793234,9859882,9902794,9364394,9415648,9471123,9656747,9693549,9714381,9734692,9788992,9789714,9800506,9895305,9933779,9307736,9292759,9336658,9370537,9667564,9763045,9763033,9832808,9903140,9336660,9448504,9531466,9608300,9729269,9687497,9940447,9852949,9849289,9902512,9350604,9359466,9359478,9377224,9702003,9726126,9852951,9933523,9930296,9229233,9711834,9752723,9787340,9364966,9726102,9748227,9795543,9748215,9794135,9448499,9735050,9719288,9895317,9897107,9902782,9902160,9411733,9713105,9861811,9820843,9861809,9792591,9864318,9918171,9918183,9864966,9799379,9752307,9752606,9864306,9752292,9864954,9901403,9752278,9864978,9752280,9901398,9752618,7382691,9525194,9577991,9796169,9713612,9743241,9846328,9867281,9523794,9624809,9658367,9715921,9699256,9719513,9743253,9733569,9707182,9774898,9392250,9519676,9713648,9448865,9514303,9578012,9789532,9664938,9658355,9746774,9837793,9474553,9861201,9596234,9519688,9715945,9364198,9733533,9341902,9359557,9758818,9798636,9907794,9525170,9578024,9733545,9851610,9580182] ){ pageInfo{ endCursor hasNextPage } totalCount{ relation value } nodes{ staticData{ name flag aisClass callsign timestamp mmsi imo shipType shipSubType updateTimestamp } currentVoyage{ eta draught timestamp destination updateTimestamp } lastPositionUpdate{ timestamp latitude longitude collectionType heading speed course updateTimestamp } } } part3: vessels( imo:[9711482,9926283,9525211,9713545,9713624,9796171,9514298,9507740,9346407,9507726,9943229,9341897,9442184,9519535,9649768,9710309,9687667,9719525,9596868,9892808,9578036,9698367,9715933,9710323,9710335,9733571,9196450,9474541,9523809,9519523,9641041,9527013,9578048,9707194,9521588,9711470,9733557,9578000,9699244,9715555,9596820,9883558,9926582,9474539,9525209,9507752,9717412,9596832,9806720,9894088,9523811,9507764,9859698,9559640,9525182,9520132,9507738,9726827,9359569,9525223,9892793,9333137,9559652,9726815,9733624,9851622,9690121,9697507,9710311,9837808,9089982,9392236,9515981,9747065,9798947,9893383,9559731,9652753,9891854,9089994,9558945,9448877,9612844,9713557,9748978,9515266,9364186,9698355,9691345,9826407,9232321,9480370,9572563,9806732,9172131,9652741,9746786,9596844,9596870,9875719,9664926,9739549,9649770,9655509,9675078,9704518,9712565,9506162,9856476,9458169,9704520,9734850,9407328,9522257,9368792,9407330,9522269,9618848,9618850,9506186,9711511,9734848,9624005,9745512,9746671,9800178,9788980,9675066,9368780,9390953,9744790,9374569,9543043,9798179,9511650,9615092,9662019,9342396,9346914,9346940,9353979,9682265,9744946,9853577,9922225,9404792,9623984,9553660,9864291,9671216,9761164,9374911,9662021,9755658,9833199,9342384,9441685,9368194,9342425,9366940,9553634,9726322,9799381,9540003,9318618,9404807,9796705,9682253,9676228,9745536,9320855,9425241,9711494,9742326,9922213,9346926,9458171,9482574,9746683,9034729,9373735,9704506,9694373,9834715,9522271,9409314,9404780,9545211,9675080,9744910,9800166,9834727,9542984,9712553,9877470,9342401,9368778,9373591,9337793,9506150,9759264,9714630,9935478,9458157,9796339,9034717,9704532,9383338,9390965,9694385,9403786,9552719,9034705,9346902,9404819,9506198,9545209,9661807,9711535,9714654,9827205,9425253,9551777,9711523,9318620,9356919,9344203,9694397,9586679,9678989,9671228,9744934,9745524,9356921,9482586,9661558,9788966,9403774,9744922,9403762,9346938,9371660,9827217,9655511,9677612,9711509,9342413,9809045,9788978,9349928,9623996,9742302,9208148,9347736,9374557,9761176,9344198,9553646,9734836,9714642,9744776,9410624,9506174,9553622,9755646,9618862,9704491,9742314,7534579,7037076,9008512,9250713,9326689,9330745,9324435,9341299,9482304,9255854,9303560,9271248,9266994,9320386,9275335,9325702,9319404,9293844,9038440,9030838,9256793,9275347,9308431,9311579,9321744,9334284,9300817,9326603,9035864,9157739,9256597,9311567,9373008,9247364,9321756,9186584,9666986,9238040,9317315,9338797,9325893,9060534,9293832,9311581,9256767,9180243,9253703,9321653,9308481,9246578,9583677,9236420,9325685,9321665,9305116,9269960,9331048,9372963,9274226,9329679,9369473,9405588,9329291,9375721,9307205,9749609,9238038,9256200,9323687,9259276,9277620,9315393,9030814,9157624,9230050,9246621,9403669,9483877,9540716,9030802,9247194,9307190,9321768,9350927,9302499,9305128,9403671,9243148,9236418,9321770,9006681,9230048,9267003,9482299,9269180,9349942,9250191,9284192,9317999,9475600,9038452,9267015,9373010,9341689,9180231,9250725,9157636,9236432,9256602,9308479,9035852,9245720,9275359,9307188,9315692,9253715,9230062,9266982,9030826,9403645,9691137,9253105,9276389,9325697,9403657,9320374,9321732,9355264,9294264,7373327,9322255,9361445,9638525,9381134,9389643,9444649,9361079,9239616,9252539,7423914,9187837,9043457,9034523,9177466,8026385,8899720,9014951,9853383,9124005,7008685,9572587,7376197,9175884,8002157,8419441,9017135,8605090,8712831,8118346,9119115,8626123,7231816,9494981,9824590,9298040,9269374,9261578,9261566,9925461,9318321,9052331,9284025,9315680,9354612,9889552,9329722,9892406,9238284,9379399,9377236,9031519,8912546,9237747,9889576,8519966,9247819,9277943,9293430,9347504,9240421,8818207,9412074,9332042,9332030,9356892,8216007,9223540,9295581,9892391,9379404,8912558,9133836,9253818,9249049,9102198,9208239,9264908,9308493,9134165,9131539,9242209,8818843,9014420,9292773,9113379,9176369,9332078,9889564,9247807,9284013,9320738,9274563,9292101,9320752,9377781,8902993,9133824,9377248,9292761,9385685,9387750,9006679,9292216,9208227,9232515,9102203,9284831,9240419,9014432,9253820,9282106,9000883,9247209,9369772,9324746,9275426,9320764,9403877,9324734,9343118,9012886,9317987,9176357,9329710,9326598,9320740,9179270,9375460,9128685,9139945,9172129,9892779,9132820,9423126,9152351,9137595,9251183,9161065,9116230,9143130,9148609,9191785,9189859,9245081,9151149,9161077,9882889,9891127,9235842,9882891,9108843,9264192,9146572,9229142,9228253,9194658,9133707,9119725,9267962,9143142,9142318,9194646,9267974,9250505,9250517,9902067,9175846,9194672,9260366,9109885,9291224,9134359,9263966,9220421,9142966,9140126,9251171,9249685,9200469,9254264,9136486,8812837,9116228,9128879,9238131,9251121,9143154,9135781,9354222,9267950,9194660,8813087,9256535,9045807,9183568,9131096,9174359,9269269,9183570,9173068,9250684,8908557,9220794,9131101,9034690,9202039,9178678,9103398,9185346,9212462,9197727,8813099,8813116,9103403,9133109,9143506,8813063,9207039,9227261,9173056,9220809,9157478,9212577,9240158,8813075,9133094,9181900,9268394,9174361,9262948,8850918,9378292,9378280,9783124,9378307,9378278,9625140,9135793,9268679,9268681,9268693,9135779,9176125,8810700,9050187,9601742,9274379,9560168,9371672,9251781,9601754,9005493,8800298,9130456,9133549,9404625,9204922,9251779,8817693,9160475,9401570,9130468,9350898,8922292,9269271,9008483,8012853,8411243,9371684,9160487,9350886,9040170,9560170,9015010,9040883,9006150,9215141,9374882,9601730,8303240,9177959,7710678,7423897,7423885,9240122,9240146,9240134,9014963,9254953,9254941,9264910,9324332,9247962,9155078,9262235,9621077,9074640,9176008,9229647,9262211,9666560,9714288,9018555,9155145,9253222,8913150,9132791,9187356,9155157,9210816,9261205,9331658,9265500,9315719,9666998,8913174,9285952,9912880,9351971,9085651,9376294,9338955,9645748,9332054,9796793,9061928,9743875,9074626,9334076,9210828,9287948,9343106,9038816,9132741,9020766,9086746,9241267,9200316,9236614,9085625,9248502,9262209,9322803,8701791,9161510,9298399,9645736,9696149,9714276,9698111,8608872,8706155,8608884,9796781,9074638,9132818,9236626,9245031,9307176,9075333,9322815,9666558,9262223,9323675,9338929,9714290,9714305,9085637,9324277,9770440,9183269,9211872,9324344,9213416,9134323,9216303,9176010,9179581,9756389,9770438,8608705,9045132,9085613,9216298,9315707,9001784,9085649,9074652,9331634,9372999,9001772,9016492,9331646,9086734,9275074,9522415,9607758,8902371,9005053,9738545,9127033,9255701,9321225,9041655,9139696,9114581,9134294,9132789,9225342,9238272,9423322,9007386,9397080,9415650,9249336,9349784,9008108,9014456,9870513,9206384,9046784,9166766,9395501,9003859,9115303,9005065,9607069,9322657,9194969,9317298,9629873,9723679,9206396,9088536,9255713,9142150,8818219,9172636,9265548,9177806,9172739,9043677,9253284,9256614,9436159,8717934,9020455,9710294,9857016,8814225,9015149,9900174,9526980,9377951,9202821,9368924,9368936,9005182,9241176,9244415,9392858,9615341,9015137,9698290,9113927,9643972,9392860,9655016,9883560,9125994,9020132,9038763,9113939,9172753,9392884,9353981,9129691,9167409,9235270,9238959,9156797,9448841,9507582,9615353,9293600,9355123,9643960,9125401,9141962,9186948,9371189,9140592,9142136,9552721,8908246,9128673,9766619,9347475,9140607,9256729,8811766,9140633,9249697,9371177,9434541,9655004,8822143,9109304,9237890,9527001,9005106,9113941,9227118,9236901,9424754,9355135,9643984,9185827,9269312,9244403,9371165,9526992,9643996,9109603,9353993,9507594,9125413,9392872,9371191,9135561,9238129,9691319,9883572,9167411,9134971,9140449,9857004,9130391,9371153,9697492,9005118,9109316,9124744,9699608,9047116,9698288,9326201,9595539,9205574,9321885] ){ pageInfo{ endCursor hasNextPage } totalCount{ relation value } nodes{ staticData{ name flag aisClass callsign timestamp mmsi imo shipType shipSubType updateTimestamp } currentVoyage{ eta draught timestamp destination updateTimestamp } lastPositionUpdate{ timestamp latitude longitude collectionType heading speed course updateTimestamp } } } }</code></pre><p>If you wanted to query a list of vessels by MMSI instead then you would simply replace the <code>imo</code> list with an <code>mmsi</code> list and the corresponding query filter.</p></div></div></div><div class="wrapper clearfix"><div class="col col7 feedback"> <span class="textlabel">Was this article useful?</span> <a class="givefeedback yes" href="#" data-section-id="741" data-value="1">Yes</a> <a class="givefeedback no" href="#" data-section-id="741" data-value="-1">No</a><div class="formcontainer" id="container-67b8a879463cf"></div></div></div></section><section data-id="324" id="filter-by-a-specified-aoi" class="level4 " data-url="https://documentation.spire.com/maritime-2-0/making-calls/filtering/filter-by-a-specified-aoi/"><div class="wrapper clearfix"><div class="col col7"><h4>Filter by AOI</h4><p>Use the <code>areaOfInterest</code> argument to filter the data using an AOI.</p><p>This could either be a GeoJSON or WKT formatted AOI (there is no need to include both geoJson AND WKT in the same request).</p><pre><code data-prismjs-copy="Copy to clipboard">query { vessels( areaOfInterest: { polygon: { type: "Polygon" coordinates: [ [ [-122.662353515625, 37.54239958054064] [-122.13226318359375, 37.54239958054064] [-122.13226318359375, 37.8813571797486] [-122.662353515625, 37.8813571797486] [-122.662353515625, 37.54239958054064] ] ] } } ) { nodes { staticData { name mmsi } lastPositionUpdate { heading latitude longitude } } } }</code></pre></div></div><div class="wrapper clearfix"><div class="col col7 feedback"> <span class="textlabel">Was this article useful?</span> <a class="givefeedback yes" href="#" data-section-id="324" data-value="1">Yes</a> <a class="givefeedback no" href="#" data-section-id="324" data-value="-1">No</a><div class="formcontainer" id="container-67b8a8794662e"></div></div></div></section><section data-id="325" id="filter-by-a-specified-callsign" class="level4 " data-url="https://documentation.spire.com/maritime-2-0/making-calls/filtering/filter-by-a-specified-callsign/"><div class="wrapper clearfix"><div class="col col7"><h4>Filter by a specified callsign</h4><p>Returns data for the vessel with the callsign of <code>"BOAG9"</code>.</p><pre><code data-prismjs-copy="Copy to clipboard">query { vessels(callsign: "BOAG9") { nodes { staticData { name mmsi imo } lastPositionUpdate { timestamp latitude longitude collectionType } } } }</code></pre></div></div><div class="wrapper clearfix"><div class="col col7 feedback"> <span class="textlabel">Was this article useful?</span> <a class="givefeedback yes" href="#" data-section-id="325" data-value="1">Yes</a> <a class="givefeedback no" href="#" data-section-id="325" data-value="-1">No</a><div class="formcontainer" id="container-67b8a87946826"></div></div></div></section><section data-id="326" id="filter-by-a-specified-vessel-flag" class="level4 " data-url="https://documentation.spire.com/maritime-2-0/making-calls/filtering/filter-by-a-specified-vessel-flag/"><div class="wrapper clearfix"><div class="col col7"><h4>Filter by a specified vessel flag</h4><p>Returns data for vessels with the flag of <code>"US"</code>.</p><pre><code data-prismjs-copy="Copy to clipboard">query { vessels(flag: "US") { nodes { staticData { name mmsi imo } lastPositionUpdate { timestamp latitude longitude collectionType } } } }</code></pre></div></div><div class="wrapper clearfix"><div class="col col7 feedback"> <span class="textlabel">Was this article useful?</span> <a class="givefeedback yes" href="#" data-section-id="326" data-value="1">Yes</a> <a class="givefeedback no" href="#" data-section-id="326" data-value="-1">No</a><div class="formcontainer" id="container-67b8a87946a05"></div></div></div></section><section data-id="327" id="filter-by-a-specified-imo" class="level4 " data-url="https://documentation.spire.com/maritime-2-0/making-calls/filtering/filter-by-a-specified-imo/"><div class="wrapper clearfix"><div class="col col7"><h4>Filter by a specified IMO</h4><p>Returns data for the vessel with the imo of <code>9538907</code>.</p><pre><code data-prismjs-copy="Copy to clipboard">query { vessels(imo: [9538907]) { nodes { staticData { name mmsi imo } lastPositionUpdate { timestamp latitude longitude collectionType } } } }</code></pre></div></div><div class="wrapper clearfix"><div class="col col7 feedback"> <span class="textlabel">Was this article useful?</span> <a class="givefeedback yes" href="#" data-section-id="327" data-value="1">Yes</a> <a class="givefeedback no" href="#" data-section-id="327" data-value="-1">No</a><div class="formcontainer" id="container-67b8a87946bd2"></div></div></div></section><section data-id="328" id="filter-by-specified-lastpositionupdate" class="level4 " data-url="https://documentation.spire.com/maritime-2-0/making-calls/filtering/filter-by-specified-lastpositionupdate/"><div class="wrapper clearfix"><div class="col col7"><h4>Filter by specified <code>lastPositionUpdate</code></h4><p>Returns data for vessels with last position updated between timestamps <code>"2021-08-02T00:31:42.780Z"</code> and <code>"2021-08-04T00:31:42.780Z"</code>.</p><pre><code data-prismjs-copy="Copy to clipboard">query { vessels( lastPositionUpdate: { startTime: "2021-08-02T00:31:42.780Z" endTime: "2021-08-04T00:31:42.780Z" } ) { nodes { staticData { name mmsi imo } lastPositionUpdate { timestamp latitude longitude collectionType } } } }</code></pre></div></div><div class="wrapper clearfix"><div class="col col7 feedback"> <span class="textlabel">Was this article useful?</span> <a class="givefeedback yes" href="#" data-section-id="328" data-value="1">Yes</a> <a class="givefeedback no" href="#" data-section-id="328" data-value="-1">No</a><div class="formcontainer" id="container-67b8a87946e11"></div></div></div></section><section data-id="679" id="filter-by-specified-lastupdate" class="level4 " data-url="https://documentation.spire.com/maritime-2-0/making-calls/filtering/filter-by-specified-lastupdate/"><div class="wrapper clearfix"><div class="col col7"><h4>Filter by specified lastUpdate</h4><p>The <code>lastUpdate</code> filter, added in August 2022 to Maritime 2.0, allows vessels to be queried for any update that was made within the filter time window.</p><p><code>lastUpdate</code> is different from <code>lastPositionUpdate</code> because it will also return vessels that have non positional updates in the period requested. This will allow for vessels with static data or voyage updates to be returned as well as those with positional updates.</p><p>Here is an example, comparing its use with that of the <code>lastPositionUpdate</code> filter:</p><pre><code data-prismjs-copy="Copy to clipboard">query { vessels( lastPositionUpdate:{ startTime:"2022-07-15T09:00:00.00Z" } shipType:[TANKER_CRUDE] ){ totalCount{ relation value } } }</code></pre><p>In the example above, requesting vessels with position updates returns an estimated 2208 vessels:</p><pre><code data-prismjs-copy="Copy to clipboard">{ "data": { "vessels": { "totalCount": { "relation": "LOWER_OR_EQUAL", "value": 2208 } } } }</code></pre><p>Let&#8217;s compare with the usage of the <code>lastUpdate</code> filter:</p><pre><code data-prismjs-copy="Copy to clipboard">query { vessels( lastUpdate:{ startTime:"2022-07-15T09:00:00.00Z" } shipType:[TANKER_CRUDE] ){ totalCount{ relation value } } }</code></pre><p>In the example above, requesting vessels with any update returns a higher estimated number of 2667 vessels:</p><pre><code data-prismjs-copy="Copy to clipboard">{ "data": { "vessels": { "totalCount": { "relation": "LOWER_OR_EQUAL", "value": 2667 } } } }</code></pre></div></div><div class="wrapper clearfix"><div class="col col7 feedback"> <span class="textlabel">Was this article useful?</span> <a class="givefeedback yes" href="#" data-section-id="679" data-value="1">Yes</a> <a class="givefeedback no" href="#" data-section-id="679" data-value="-1">No</a><div class="formcontainer" id="container-67b8a87947066"></div></div></div></section><section data-id="329" id="filter-by-specified-name" class="level4 " data-url="https://documentation.spire.com/maritime-2-0/making-calls/filtering/filter-by-specified-name/"><div class="wrapper clearfix"><div class="col col7"><h4>Filter by specified name</h4><p>Returns data for vessels with a vessel name of <code>"EAGLE"</code>.</p><pre><code data-prismjs-copy="Copy to clipboard">query { vessels(name: "EAGLE") { nodes { staticData { name mmsi imo } lastPositionUpdate { timestamp latitude longitude collectionType } } } }</code></pre></div></div><div class="wrapper clearfix"><div class="col col7 feedback"> <span class="textlabel">Was this article useful?</span> <a class="givefeedback yes" href="#" data-section-id="329" data-value="1">Yes</a> <a class="givefeedback no" href="#" data-section-id="329" data-value="-1">No</a><div class="formcontainer" id="container-67b8a87947271"></div></div></div></section><section data-id="330" id="filter-by-specified-shiptype" class="level4 " data-url="https://documentation.spire.com/maritime-2-0/making-calls/filtering/filter-by-specified-shiptype/"><div class="wrapper clearfix"><div class="col col7"><h4>Filter by specified <code>shipType</code></h4><p>Returns data for all General Cargo and Container vessels.</p><pre><code data-prismjs-copy="Copy to clipboard">query { vessels(shipType: [GENERAL_CARGO, CONTAINER]) { nodes { staticData { name mmsi imo } lastPositionUpdate { timestamp latitude longitude collectionType } } } }</code></pre></div></div><div class="wrapper clearfix"><div class="col col7 feedback"> <span class="textlabel">Was this article useful?</span> <a class="givefeedback yes" href="#" data-section-id="330" data-value="1">Yes</a> <a class="givefeedback no" href="#" data-section-id="330" data-value="-1">No</a><div class="formcontainer" id="container-67b8a8794748a"></div></div></div></section><section data-id="734" id="filter-by-fleet" class="level4 " data-url="https://documentation.spire.com/maritime-2-0/making-calls/filtering/filter-by-fleet/"><div class="wrapper clearfix"><div class="col col7"><h4>Filter by fleet</h4><p>In legacy <a href="https://documentation.spire.com/vessels-api/" target="_blank" rel="noopener">Vessels API</a> it was possible to filter only on the general AIS <code>ship_type</code> values like Tanker or Cargo.</p><p>Maritime 2.0 graphQL filters vessels on specific commercial ship types instead &#8211; <a href="#shipType">a full list is available under the <code>vesselStaticData</code> section</a>. If you want to receive the equivalent filter results as were provided in Vessels API then the filters in Maritime 2.0 for Cargo and Tanker are shown below:</p><p><strong>Cargo Vessels </strong></p><pre><code data-prismjs-copy="Copy to clipboard">shipType:[CAR_CARRIER,COMBINATION_CARRIER,CONTAINER,DRY_BULK,GENERAL_CARGO,LIVESTOCK,REEFER,ROLL_ON_ROLL_OFF]</code></pre><p><strong>Tanker Vessels </strong></p><pre><code data-prismjs-copy="Copy to clipboard">shipType:[GAS_CARRIER,GENERAL_TANKER,LNG_CARRIER,TANKER_CHEMICALS,TANKER_CRUDE,TANKER_PRODUCT]</code></pre><p><strong>Merchant Fleet </strong></p><pre><code data-prismjs-copy="Copy to clipboard">shipType:[CAR_CARRIER,COMBINATION_CARRIER,CONTAINER,DRY_BULK,GENERAL_CARGO,LIVESTOCK,REEFER,ROLL_ON_ROLL_OFF,VEHICLE_PASSENGER,PASSENGER,GAS_CARRIER,GENERAL_TANKER,LNG_CARRIER,TANKER_CHEMICALS,TANKER_CRUDE,TANKER_PRODUCT]</code></pre></div></div><div class="wrapper clearfix"><div class="col col7 feedback"> <span class="textlabel">Was this article useful?</span> <a class="givefeedback yes" href="#" data-section-id="734" data-value="1">Yes</a> <a class="givefeedback no" href="#" data-section-id="734" data-value="-1">No</a><div class="formcontainer" id="container-67b8a879476b9"></div></div></div></section><section data-id="331" id="filter-by-specified-lasttimestamp" class="level4 " data-url="https://documentation.spire.com/maritime-2-0/making-calls/filtering/filter-by-specified-lasttimestamp/"><div class="wrapper clearfix"><div class="col col7"><h4>Filter by specified <code>lastTimestamp</code></h4><p>Unlike the filter <code>lastPositionUpdate</code> which filters for vessels by the time when a position update was received, the filter <code>lastTimestamp</code> filters vessels on the message timestamp of any update from AIS static or position messages.</p><p>If the <code>lastTimestamp</code> filter is not specified in a query then it will be set by default to filter out vessels with no AIS message in the last 30 days.</p><p>Returns data for all vessels updated after <code>"2022-01-01T00:00:00.00Z"</code>:</p><pre><code data-prismjs-copy="Copy to clipboard">query { vessels( lastTimestamp: { startTime:"2022-01-01T00:00:00.00Z" } ) { nodes { staticData { name mmsi imo } lastPositionUpdate { timestamp latitude longitude collectionType } } } }</code></pre></div></div><div class="wrapper clearfix"><div class="col col7 feedback"> <span class="textlabel">Was this article useful?</span> <a class="givefeedback yes" href="#" data-section-id="331" data-value="1">Yes</a> <a class="givefeedback no" href="#" data-section-id="331" data-value="-1">No</a><div class="formcontainer" id="container-67b8a879478d4"></div></div></div></section><section data-id="253" id="error-handling" class="level3 " data-url="https://documentation.spire.com/maritime-2-0/making-calls/error-handling/"><div class="wrapper clearfix"><div class="col col7"><h3>Error handling</h3><p>Handling errors in GraphQL is different compare to other API styles in a several aspects:</p><ul><li>GraphQL response is always <code>HTTP 200 OK</code></li><li>GraphQL errors is just data, it&#8217;s not linked to HTTP error statuses and does not inherit HTTP semantics at all</li><li>It&#8217;s possible to return query data as well as an array of errors. In this case query data will contain <strong>partial results</strong></li></ul><p>The successful GraphQL response contains just a <code>data</code> field with result of the query:</p><pre><code data-prismjs-copy="Copy to clipboard">{ "data": { ... }, }</code></pre><p>When an error occurs, the GraphQL response will contain an <code>errors</code> array. In this case <code>data</code> might be <code>null</code> or might be an object, but with a complete or partial results, depending on the nature of the error:</p><pre><code data-prismjs-copy="Copy to clipboard">{ "data": { ... } | null, "errors": [...], }</code></pre><p>For example, the following query contains an invalid cursor value:</p><pre><code data-prismjs-copy="Copy to clipboard">{ vessels(first: 3, after: "bla-bla") { nodes { id staticData { mmsi callsign } } } }</code></pre><p>&#8230;which yields the the following response:</p><pre><code data-prismjs-copy="Copy to clipboard">{ "data": null, "errors": [ { "message": "Invalid cursor provided for the after parameter: a", "locations": [{ "line": 2, "column": 3 }], "path": ["vessels"], "extensions": { "code": "BAD_USER_INPUT" } } ], "extensions": { "requestId": "7246b710-145d-4528-9c74-972287dc713a" } }</code></pre></div></div><div class="wrapper clearfix"><div class="col col7 feedback"> <span class="textlabel">Was this article useful?</span> <a class="givefeedback yes" href="#" data-section-id="253" data-value="1">Yes</a> <a class="givefeedback no" href="#" data-section-id="253" data-value="-1">No</a><div class="formcontainer" id="container-67b8a87947b23"></div></div></div></section><section data-id="341" id="error-format" class="level4 " data-url="https://documentation.spire.com/maritime-2-0/making-calls/error-handling/error-format/"><div class="wrapper clearfix"><div class="col col7"><h4>Error format</h4><p>We use a standard error format for errors, which means that all errors have the same structure.</p><p>Let&#8217;s explore the error from the previous example:</p><pre><code data-prismjs-copy="Copy to clipboard">{ "message": "Invalid cursor provided for the after parameter: a", "locations": [{ "line": 2, "column": 3 }], "path": ["vessels"], "extensions": { "code": "BAD_USER_INPUT" } }</code></pre><p>&#8230;where:</p><ul><li><code>message</code> is the <code>string</code> which describes the error</li><li><code>locations</code> shows where in the query string document this happened</li><li><code>path</code> is an array of paths leading to the field in error from the root of the query</li><li><code>extensions</code> is an object with any additional metadata about an error such as an error code.</li></ul><p><strong>Note that:</strong></p><ul><li>The object <code>errors.extensions</code> (described above) is not to be confused with the top-level object <code>extensions</code> that provides additional useful information about the request itself such as <code>requestId</code></li><li>The contents of both <code>extensions</code> fields may be subject to change in the future releases of GraphQL API.</li></ul></div></div><div class="wrapper clearfix"><div class="col col7 feedback"> <span class="textlabel">Was this article useful?</span> <a class="givefeedback yes" href="#" data-section-id="341" data-value="1">Yes</a> <a class="givefeedback no" href="#" data-section-id="341" data-value="-1">No</a><div class="formcontainer" id="container-67b8a87947dea"></div></div></div></section><section data-id="342" id="standard-error-codes" class="level4 " data-url="https://documentation.spire.com/maritime-2-0/making-calls/error-handling/standard-error-codes/"><div class="wrapper clearfix"><div class="col col7"><h4>Standard Error Codes</h4><p>Spire provides <strong>standard error codes</strong> similar to the HTTP error codes where each error code indicates a specific class of errors.</p><dl><dt><code>GRAPHQL_PARSE_FAILED</code></dt><dd>The GraphQL operation string contains a syntax error.</dd><dt><code>GRAPHQL_VALIDATION_FAILED</code></dt><dd>The GraphQL operation is not valid against the server&#8217;s schema.</dd><dt><code>BAD_USER_INPUT</code></dt><dd>The GraphQL operation includes an invalid value for a field argument. Error with this code most commonly occurs:</p><ul><li>Arguments have incorrect type. For example <code>mmsi</code> was submitted as a string instead of an integer.</li><li>Validation failed on the value. For example WKT strings contain syntax errors.</li><li>Impossible to perform an operation for given arguments. For example, it is impossible to calculate routes for given arguments.</li></ul></dd><dt><code>UNAUTHENTICATED</code></dt><dd>The server failed to authenticate a user. For example when the <code>Authorization</code> header doesn&#8217;t present in the request.</dd><dt><code>FORBIDDEN</code></dt><dd>Query contains a request to the data which is not authorized by the provided token. For example when you are trying to query vessel characteristics but you don&#8217;t have access to it.</dd><dt><code>TIMEOUT_ERROR</code></dt><dd>Query result didn&#8217;t come within the timeout limit.</dd><dt><code>CLIENT_CLOSED_REQUEST</code></dt><dd>This error indicates that request was closed by the calling party on the fly and wasn&#8217;t fully completed</dd><dt><code>SERVICE_UNAVAILABLE</code></dt><dd>One of our services is temporarily unavailable due to some (network) issues. This error code is analogue of <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/503" target="_blank" rel="noopener">HTTP 503 Service Unavailable code</a> and customers might try to retry in this case.</dd><dd></dd><dt><code>TOO_MANY_REQUESTS</code></dt><dd>The request was <a class="scrolltoelement" href="#rate-limiting">rate-limited</a>. This error is added alongside with response in case it was rate-limited by the GraphQL server.</dd></dl><dl><dt><code>INTERNAL_SERVER_ERROR</code></dt></dl><dl><dd>An unspecified error occurred.</dd><dd></dd></dl><p><strong>Node</strong>: the list of error codes is subject to change in the future releases of GraphQL API. Some codes may be added or removed.</p></div></div><div class="wrapper clearfix"><div class="col col7 feedback"> <span class="textlabel">Was this article useful?</span> <a class="givefeedback yes" href="#" data-section-id="342" data-value="1">Yes</a> <a class="givefeedback no" href="#" data-section-id="342" data-value="-1">No</a><div class="formcontainer" id="container-67b8a8794815e"></div></div></div></section><section data-id="343" id="troubleshooting" class="level4 " data-url="https://documentation.spire.com/maritime-2-0/making-calls/error-handling/troubleshooting/"><div class="wrapper clearfix"><div class="col col7"><h4>Troubleshooting</h4><ul><li><code>GRAPHQL_PARSE_FAILED</code> or <code>GRAPHQL_VALIDATION_FAILED</code> please check the correctness of the GraphQL query. You can easily do it in the <a href="https://api.spire.com/graphql" target="_blank" rel="noopener noreferrer">playground</a>.</li><li><code>UNAUTHENTICATED</code> please verify your authentication token. Please, check if your token is correct and valid.</li><li><code>FORBIDDEN</code> the query contains access to non-authorized parts of the schema.</li><li><code>BAD_USER_INPUT</code> please check the query arguments. Be sure that argument variables for scalars has correct <a class="scrolltoelement" href="#default-scalar-types" target="_blank" rel="noopener noreferrer">format</a>.</li><li><code>TIMEOUT_ERROR</code> or <code>SERVICE_UNAVAILABLE</code> you may try to retry request</li><li><code>INTERNAL_SERVER_ERROR</code> please communicate it with the query and <code>requestId</code> to the Data Operations team for investigation.</li><li><code>TOO_MANY_REQUESTS</code> please adjust the request rate per minute. See <a class="scrolltoelement" href="#rate-limiting">rate limiting</a>.</li></ul></div></div><div class="wrapper clearfix"><div class="col col7 feedback"> <span class="textlabel">Was this article useful?</span> <a class="givefeedback yes" href="#" data-section-id="343" data-value="1">Yes</a> <a class="givefeedback no" href="#" data-section-id="343" data-value="-1">No</a><div class="formcontainer" id="container-67b8a87948411"></div></div></div></section><section data-id="41" id="rate-limiting" class="level3 " data-url="https://documentation.spire.com/maritime-2-0/making-calls/rate-limiting/"><div class="wrapper clearfix"><div class="col col7"><h3>Rate limiting</h3><p>To prevent DDoS attacks to Spire API and handle load gracefully we implemented query rate limiting using <a href="https://en.wikipedia.org/wiki/Leaky_bucket" target="_blank" rel="noopener noreferrer">Leaky Bucket Algorithm</a> algorithm.</p><p>Each request that goes to <a href="https://api.spire.com/graphql" target="_blank" rel="noopener noreferrer">api.spire.com/graphql</a> is being rate limited according to the available quota:</p><ul><li>If the quota is not yet exceeded, then the response will be returned as soon as it&#8217;s processed by the Spire API without any limitations.</li><li>If the quota was already exceeded, the processing of the request will be delayed. When request finally got processed the client will receive response alongside with the <code>TOO_MANY_REQUESTS</code> error.</li><li>Quota gains back as soon as time goes according to moving time window.</li><li>If the request is waiting for too long in the rate limiter queue it will timeout eventually. In this case client will receive <strong>empty response</strong> alongside with the <code>TIMEOUT_ERROR</code> error.</li></ul><p>The current request quota is up to 60 requests per minute per token.</p><p>We expect our customers wont be affected by the rate limiter unless they are doing a lot of parallel requests with the same token. If you are querying spire API sequentially then you likely won&#8217;t be affected by the rate limiter at all.</p></div><div class="col col1">&nbsp;</div><div class="col col4"><p>Each non-rate-limited response will contain a <code>requestQuota</code> field in the response&#8217;s <code>extensions</code> with data about the remaining quota to allow customers to adjust the request rate before making the next request.</p><pre><code data-prismjs-copy="Copy to clipboard">{ "data": { ... }, "extensions": { "requestQuota": { "limit": "60 req/m (burst 60)", "remaining": 59 } } }</code></pre><p>Where:</p><dl><dt>limit</dt><dd>textual description of current rate limiter policy.</dd><dt>remaining</dt><dd>number of requests per minute left for current quota.<br /> Reaching <code>0</code> indicates the query was rate-limited.</dd></dl></div></div><div class="wrapper clearfix"><div class="col col7 feedback"> <span class="textlabel">Was this article useful?</span> <a class="givefeedback yes" href="#" data-section-id="41" data-value="1">Yes</a> <a class="givefeedback no" href="#" data-section-id="41" data-value="-1">No</a><div class="formcontainer" id="container-67b8a87948762"></div></div></div></section><section data-id="346" id="rate-limiting-multi-root-queries" class="level4 " data-url="https://documentation.spire.com/maritime-2-0/making-calls/rate-limiting/rate-limiting-multi-root-queries/"><div class="wrapper clearfix"><div class="col col7"><h4>Rate limiting multi-root queries</h4><p><a class="scrolltoelement" href="#multiple-root-fields">Requests with multi-root queries</a> are treated as several independent requests from the rate limiter perspective.</p><p>Each root query executed in parallel and represented independent self-sufficient request to our underlying infrastructure.</p><p>For example, the following query <strong>will be counted as 2 standalone queries</strong>:</p><pre><code data-prismjs-copy="Copy to clipboard">{ tankers: vessels(shipType: [TANKER_CRUDE, TANKER_PRODUCT, TANKER_CHEMICALS]) { nodes { staticData { mmsi name } } } cargo: vessels(shipType: [CONTAINER, GENERAL_CARGO]) { nodes { staticData { mmsi name } } } }</code></pre></div><div class="col col1">&nbsp;</div><div class="col col4"><p>The rate limiter quota will be decreased by <code>2</code> and will look in the following way:</p><pre><code data-prismjs-copy="Copy to clipboard">{ "data": { "tankers": { ... }, "cargo": { ... } }, "extensions": { "requestQuota": { "limit": "60 req/m (burst 60)", "remaining": 58 } } }</code></pre></div></div><div class="wrapper clearfix"><div class="col col7 feedback"> <span class="textlabel">Was this article useful?</span> <a class="givefeedback yes" href="#" data-section-id="346" data-value="1">Yes</a> <a class="givefeedback no" href="#" data-section-id="346" data-value="-1">No</a><div class="formcontainer" id="container-67b8a87948a0e"></div></div></div></section><section data-id="347" id="best-practices-for-developers" class="level3 titleonly" data-url="https://documentation.spire.com/maritime-2-0/making-calls/best-practices-for-developers/"><div class="wrapper clearfix"><div class="col col7"><h3>Best practices</h3></div></div></section><section data-id="348" id="use-gzip-compression" class="level4 " data-url="https://documentation.spire.com/maritime-2-0/making-calls/best-practices-for-developers/use-gzip-compression/"><div class="wrapper clearfix"><div class="col col7"><h4>Use gZip compression</h4><p>The Maritime 2.0 API supports gZip compression of the output. Since JSON payload is mostly text, it compresses exceptionally well with gZip.</p><p>You can gain up to 20% reduction in payload size using gZip compression in production.</p><p>We encourage our clients to send the header alongside with requests:</p><pre><code data-prismjs-copy="Copy to clipboard">Accept-Encoding: gzip, deflate</code></pre></div><div class="col col1">&nbsp;</div><div class="col col4"><pre><code data-prismjs-copy="Copy to clipboard">curl --request POST \ ~/Dev/maritime-customer-documentation --url https://api.spire.com/graphql \ --header 'Accept-Encoding: gzip,deflate' \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/json' \ --data '{"query":"query{ vessels(first: 99) { nodes{ staticData { name mmsi imo } } } }"}'</code></pre></div></div><div class="wrapper clearfix"><div class="col col7 feedback"> <span class="textlabel">Was this article useful?</span> <a class="givefeedback yes" href="#" data-section-id="348" data-value="1">Yes</a> <a class="givefeedback no" href="#" data-section-id="348" data-value="-1">No</a><div class="formcontainer" id="container-67b8a87948e5f"></div></div></div></section><section data-id="349" id="query-what-you-need" class="level4 " data-url="https://documentation.spire.com/maritime-2-0/making-calls/best-practices-for-developers/query-what-you-need/"><div class="wrapper clearfix"><div class="col col7"><h4>Query what you need</h4><p>Unlike REST, where the endpoint defines the resource and the received data, the GraphQL exposes a single endpoint with a global schema where you can query whatever you want.</p><p>The ability to define precisely the data you want — <strong>and only the data you want</strong> — is a powerful advantage over traditional REST API endpoints.</p><p>By making focused queries you can focus on data you need and omit unimportant one. If you need just vessel positions, then query for vessel positions and omit everything else. If you need vessel characteristics, then query for vessel positions and omit everything else.</p><p>The following example shows the query focused only on getting only positional information about the vessels:</p><pre><code data-prismjs-copy="Copy to clipboard">query queryVesselsPositions( $limit: Int $after: String $startTime: DateTime! $endTime: DateTime! ) { vessels( first: $limit after: $after lastPositionUpdate: { startTime: $startTime, endTime: $endTime } ) { pageInfo { endCursor hasNextPage } nodes { id staticData { mmsi } lastPositionUpdate { timestamp latitude longitude heading speed rot accuracy course maneuver navigationalStatus } } } }</code></pre><p>Querying only what you need, <a href="#use-gzip-compression" class="scrolltoelement">along with using gZip compression</a>, could significantly reduce the amount of transferred data and therefore increase the performance.</p></div></div><div class="wrapper clearfix"><div class="col col7 feedback"> <span class="textlabel">Was this article useful?</span> <a class="givefeedback yes" href="#" data-section-id="349" data-value="1">Yes</a> <a class="givefeedback no" href="#" data-section-id="349" data-value="-1">No</a><div class="formcontainer" id="container-67b8a87949066"></div></div></div></section><section data-id="250" id="tutorials" class="level3 titleonly" data-url="https://documentation.spire.com/maritime-2-0/making-calls/tutorials/"><div class="wrapper clearfix"><div class="col col7"><h3>Tutorials</h3></div></div></section><section data-id="251" id="setting-up-an-api-connection-via-python" class="level4 " data-url="https://documentation.spire.com/maritime-2-0/making-calls/tutorials/setting-up-an-api-connection-via-python/"><div class="wrapper clearfix"><div class="col col7"><h4>Setting up an API connection via Python</h4><p>In this tutorial, we will go through the steps necessary to connect to the Spire Maritime 2.0 API using a sample Python client. With this sample program, you may execute the following queries:</p><ul><li>Return data for all vessels globally</li><li>Return data for a specific MMSI list</li><li>Return data for all vessels in a specified AOI</li></ul><p>We recommend using a virtual environment, such as pipenv, when completing this tutorial. <a href="https://pypi.org/project/pipenv/" target="_blank" rel="noopener">Read the instructions to start a Pipenv virtual environment to get started</a>.</p><h5>Installing the requirements</h5><p>Once you have the virtual environment running, install the requirements found in the <a href="https://github.com/spireglobal/maritime/blob/main/sample_code/python/vessels_v2_graphql/requirements.txt" target="_blank" rel="noopener noreferrer">requirements.txt</a> file:</p><pre><code data-prismjs-copy="Copy to clipboard">pip3 install -r requirements.txt</code></pre><h5>Modify the settings</h5><p>Next, edit the <a href="https://github.com/spireglobal/maritime/blob/main/sample_code/python/vessels_v2_graphql/settings.yaml" target="_blank" rel="noopener">settings.yaml</a> file to reflect your environment.</p><p>Note: all files are assumed to be in the same directory as the program.</p><p>Below are descriptions of each variable in the setting file:</p><dl><dt><code>endpoint</code></dt><dd>The URL to the service</dd><dt><code>token</code></dt><dd>Authentication token</dd><dt><code>name_of_gql_query_file</code></dt><dd>Name of file containing query to execute. Currently there are three: <b>sample_1.txt</b>, <b>sample_2.txt</b>, and <b>sample_3.txt</b>. See descriptions below.</dd><dt><code>name_of_raw_ouput_file</code></dt><dd>Name of raw output log. If blank, no log is produced</dd><dt><code>name_of_csv_file</code></dt><dd>Name of csv file. If blank, no file is produced</dd><dt><code>pages_to_process</code></dt><dd>Max number of pages to process. A helpful setting for debugging. If set to 0, all pages are processed</dd></dl><p>There are three sample queries provided in the program that are set in the <code>name_of_gql_query_file</code> variable:</p><dl><dt><strong>sample_1.txt</strong></dt><dd>Returns all available Vessel, Voyage, and PositionUpdates fields for all vessels globally</dd><dt><strong>sample_2.txt</strong></dt><dd>Returns all available Vessel, Voyage, and PositionUpdates fields for a specific MMSI list</dd><dt><strong>sample_3.txt</strong></dt><dd>Returns all available Vessel, Voyage, and PositionUpdates fields for all vessels in a specified AOI (Indian Ocean)</dd></dl><h5>Important Note &#8211; <code>pageInfo</code></h5><p>This client requires each query to include a section to request <code>pageInfo</code>. For example:</p><pre><code data-prismjs-copy="Copy to clipboard">query{ pageInfo { hasNextPage endCursor } nodes { id updateTimestamp staticData { imo (. . .)</code></pre><h6>Creating a new query</h6><p>To create a custom query, follow the steps below:</p><ol><li>Create a text file (file with .txt extension) in the same folder that you saved the sample python client files in your Pipenv virtual environment.</li><li>Write a query using the samples as a guide (<a class="scrolltoelement" href="#syntax">more information about writing queries</a>). Please review the the important note regarding <code>pageInfo</code> above.</li><li>Edit the <strong>settings.yaml</strong> file and add the name of the file you created after <code>name_of_gql_query_file</code>. Example: <code>name_of_gql_query_file: 'my-new_query.txt'</code></li></ol><p>When writing a custom query file, it is important that you do not place any comments or text that does not represent a query in the newly created file.</p><h5>Run the Program</h5><p>The <a href="https://github.com/spireglobal/maritime/blob/main/sample_code/python/vessels_v2_graphql/run.py" target="_blank" rel="noopener noreferrer">run.py</a> program will read the <a href="https://github.com/spireglobal/maritime/blob/main/sample_code/python/vessels_v2_graphql/settings.yaml" target="_blank" rel="noopener noreferrer">settings.yaml</a> file and execute a query based on the fields listed in the specified file in <code>name_of_gql_query_file</code> variable. To run the program, execute the following code in the virtual environment.</p><pre><code data-prismjs-copy="Copy to clipboard">pipenv run python3 run.py</code></pre><p>Virtual environment example:</p><ul><li><code>my_virtual_env</code> as the directory containing the Python virtual environment</li><li><code>vessels_v2_graphql</code> as the directory containing this repository</li></ul><pre><code data-prismjs-copy="Copy to clipboard">source my_virtual_env/bin/activate [ENTER] cd vessels_v2_graphql [ENTER] python3 run.py</code></pre><p>If you specified the desired name of the CSV file in the <code>name_of_csv_file</code> variable and/or the name of the output log in the <code>name_of_raw_output_file</code> variable, these files can be accessed in your directory once the program completes.</p><p>All log information for debugging purposes can be found in the file <code>demo_client.log</code>.</p><p>Congratulations! You have successfully executed your first GraphQL query using the Spire Maritime 2.0 API.</p></div><div class="col col1">&nbsp;</div><div class="col col4"><p>The tutorial code is for demonstation purposes and should not be used in production.</p><p>The code is not included in a customer support contract unless explicately documented elsewhere.</p><p><a class="calltoaction" href="https://github.com/spireglobal/maritime/tree/main/sample_code/python/vessels_v2_graphql">Download the source code for this tutorial</a></p></div></div><div class="wrapper clearfix"><div class="col col7 feedback"> <span class="textlabel">Was this article useful?</span> <a class="givefeedback yes" href="#" data-section-id="251" data-value="1">Yes</a> <a class="givefeedback no" href="#" data-section-id="251" data-value="-1">No</a><div class="formcontainer" id="container-67b8a8794973e"></div></div></div></section><section data-id="257" id="available-root-queries" class="level2 " data-url="https://documentation.spire.com/maritime-2-0/available-root-queries/"><div class="wrapper clearfix"><div class="col col7"><h2>Available root queries</h2><dl><dt><a href="#vessels"><code>vessels</code></a></dt><dd>Get static vessel data and some enhanced data</dd><dt><a href="#port-events"><code>portEventsByVessel</code></a></dt><dd>Get live and historical port events for a vessel</dd><dt><a href="#port-events"><code>portEventsByLocation</code></a></dt><dd>Get live and historical events for a port</dd><dt><a href="#port"><code>port</code></a></dt><dd>Given a UNLOCODE, get port latitude, longitude and name</dd><dt><a href="#matchedport"><code>matchedPort</code></a></dt><dd>Given a string such as port name, get the matching port UNLOCODE and other port data</dd></dl></div></div><div class="wrapper clearfix"><div class="col col7 feedback"> <span class="textlabel">Was this article useful?</span> <a class="givefeedback yes" href="#" data-section-id="257" data-value="1">Yes</a> <a class="givefeedback no" href="#" data-section-id="257" data-value="-1">No</a><div class="formcontainer" id="container-67b8a8794997a"></div></div></div></section><section data-id="249" id="vessels" class="level2 " data-url="https://documentation.spire.com/maritime-2-0/vessels/"><div class="wrapper clearfix"><div class="col col7"><h2>The <code>vessels</code> root query</h2><p>The <code>vessels</code> root query, also called Vessels 2.0, was designed to return only the most recent information provided for each vessel.</p><p>It joins the position reports and static voyage reports which are <a href="https://documentation.spire.com/ais-fundamentals/ais-message-types/" target="_blank" rel="noopener">transmitted in separate AIS messages</a> into a single record, making development more efficient, clean, and clear.</p></div></div><div class="wrapper clearfix"><div class="col col7 feedback"> <span class="textlabel">Was this article useful?</span> <a class="givefeedback yes" href="#" data-section-id="249" data-value="1">Yes</a> <a class="givefeedback no" href="#" data-section-id="249" data-value="-1">No</a><div class="formcontainer" id="container-67b8a87949b9f"></div></div></div></section><section data-id="267" id="query-arguments" class="level3 " data-url="https://documentation.spire.com/maritime-2-0/vessels/query-arguments/"><div class="wrapper clearfix"><div class="col col7"><h3>Query arguments</h3><p>All arguments for the <code>vessels</code> query:</p><pre><code data-prismjs-copy="Copy to clipboard">vessels( after: String first: Int = 100 areaOfInterest: AreaOfInterest callsign: [String!] flag: [String!] imo: [IMO!] lastPositionUpdate: TimeRange lastTimestamp: TimeRange lastUpdate: TimeRange mmsi: [MMSI!] name: [String!] partialNameSearch: Boolean shipType: [ShipType!] ): VesselConnection!</code></pre><p>More information about the GraphQL Object Types of the arguments fields can be found below. All fields should resolve to a <a class="scrolltoelement" href="#default-scalar-types">scalar type</a>.</p><p>Further details about all the fields can be found in the <a class="scrolltoelement" href="#data-dictionary">Data Dictionary</a> section.</p></div></div><div class="wrapper clearfix"><div class="col col7 feedback"> <span class="textlabel">Was this article useful?</span> <a class="givefeedback yes" href="#" data-section-id="267" data-value="1">Yes</a> <a class="givefeedback no" href="#" data-section-id="267" data-value="-1">No</a><div class="formcontainer" id="container-67b8a87949ddb"></div></div></div></section><section data-id="269" id="areaofinterest" class="level4 " data-url="https://documentation.spire.com/maritime-2-0/vessels/query-arguments/areaofinterest/"><div class="wrapper clearfix"><div class="col col7"><h4>areaOfInterest</h4><p>If provided, only vessels with their most recent position being within the area of interest defined by polygon(s) will be returned.</p><p>The area of interest is either a GeoJSON object or a WKT string; in either case representing a closed polygon or multiple polygons. It is an error to set both the <code>geoJson</code> and <code>wkt</code> fields, or to leave areaOfInterest filter empty.</p><dl><dt><code>polygon</code></dt><dd>Polygon geometry in GeoJSON format only.</dd><dt><code>multiPolygon</code></dt><dd>MultiPolygon geometry in GeoJSON format only.</dd><dt><code>wkt</code></dt><dd>Geometry in a Well-Known Text format. This can contain either Polygon or Multiple-Polygons.</dd></dl><p>NOTE: Users whose service is already restricted to a fixed Area of Interest can only filter within the fixed area or a subset of it.</p></div><div class="col col1">&nbsp;</div><div class="col col4"><pre><code data-prismjs-copy="Copy to clipboard">type AreaOfInterest { polygon: GeoJsonPolygonInput wkt: WKT }</code></pre><div class="codebox"><div class="title">Example query of using Multipolygon AOI</div><div class="code"><pre><code data-prismjs-copy="Copy to clipboard">query multiPolygon { vessels(areaOfInterest: { multiPolygon: { type: "MultiPolygon", coordinates: [ [ [ [30,20], [45,40], [10,40], [30,20] ] ], [ [ [ 15,5], [40,10], [10, 20], [5, 10], [15, 5] ] ] ] } }) { nodes { id staticData { imo mmsi name } } } }</code></pre></div></div></div></div><div class="wrapper clearfix"><div class="col col7 feedback"> <span class="textlabel">Was this article useful?</span> <a class="givefeedback yes" href="#" data-section-id="269" data-value="1">Yes</a> <a class="givefeedback no" href="#" data-section-id="269" data-value="-1">No</a><div class="formcontainer" id="container-67b8a8794a07a"></div></div></div></section><section data-id="270" id="timerange" class="level4 " data-url="https://documentation.spire.com/maritime-2-0/vessels/query-arguments/timerange/"><div class="wrapper clearfix"><div class="col col7"><h4>TimeRange</h4><p>There are 3 <code>TimeRange</code> filters applicable to the vessels query which each use a <code>TimeRange</code> as defined below.</p><p>The 3 <code>TimeRange</code> filters are:</p><ol><li><code>lastPositionUpdate</code> which filters on the timestamp of when a position update is record in the API system. Note this is different from the position timestamp which is when the AIS position report is transmitted.</li><li><code>lastTimestamp</code> which filters on the timestamp of the last reported AIS message for a vessel.</li><li><code>lastUpdate</code> which filters on the time when any updated was last made to a vessel.</li></ol><dl><dt><code>endTime</code></dt><dd>Timestamp of the end of the time range (RFC 3339 format); if omitted, the current time is used.</dd><dt><code>startTime</code></dt><dd>Timestamp of the beginning of the time range (RFC 3339 format).</dd></dl></div><div class="col col1">&nbsp;</div><div class="col col4"><pre><code data-prismjs-copy="Copy to clipboard">type TimeRange { endTime: DateTime startTime: DateTime! }</code></pre></div></div><div class="wrapper clearfix"><div class="col col7 feedback"> <span class="textlabel">Was this article useful?</span> <a class="givefeedback yes" href="#" data-section-id="270" data-value="1">Yes</a> <a class="givefeedback no" href="#" data-section-id="270" data-value="-1">No</a><div class="formcontainer" id="container-67b8a8794a30c"></div></div></div></section><section data-id="271" id="lastpositionupdate" class="level4 " data-url="https://documentation.spire.com/maritime-2-0/vessels/query-arguments/lastpositionupdate/"><div class="wrapper clearfix"><div class="col col7"><h4>lastPositionUpdate</h4><p>If provided, only vessels having their most recent position update time within the provided time range will be returned.</p><p><strong>Example use of <code>lastPositionUpdate</code> : requesting all vessels with position updates since a specified time</strong></p><pre><code data-prismjs-copy="Copy to clipboard">lastPositionUpdate:{ startTime:"2022-08-12T11:00:00.00Z" }</code></pre><p><strong>Example use of <code>lastPositionUpdate</code> : requesting all vessels with position updates between specified start and end times</strong></p><pre><code data-prismjs-copy="Copy to clipboard">lastPositionUpdate:{ startTime:"2022-08-12T11:00:00.00Z" endTime:"2022-08-12T11:09:59.99Z" }</code></pre></div></div><div class="wrapper clearfix"><div class="col col7 feedback"> <span class="textlabel">Was this article useful?</span> <a class="givefeedback yes" href="#" data-section-id="271" data-value="1">Yes</a> <a class="givefeedback no" href="#" data-section-id="271" data-value="-1">No</a><div class="formcontainer" id="container-67b8a8794a4fd"></div></div></div></section><section data-id="273" id="lasttimestamp" class="level4 " data-url="https://documentation.spire.com/maritime-2-0/vessels/query-arguments/lasttimestamp/"><div class="wrapper clearfix"><div class="col col7"><h4>lastTimestamp</h4><p>If provided, only vessels having their most recent AIS message timestamp within the provided time range will be returned.</p><p><strong>Example use of <code>lastTimestamp</code> : requesting all vessels where the transmission timestamp of the most recent AIS message is since a specified time</strong></p><pre><code data-prismjs-copy="Copy to clipboard">lastTimestamp:{ startTime:"2022-08-12T11:00:00.00Z" }</code></pre><p><strong>Example use of <code>lastTimestamp</code> : requesting all vessels where the transmission timestamp of the most recent AIS message is between specified start and end times</strong></p><pre><code data-prismjs-copy="Copy to clipboard">lastTimestamp:{ startTime:"2022-08-12T11:00:00.00Z" endTime:"2022-08-12T11:09:59.99Z" }</code></pre></div></div><div class="wrapper clearfix"><div class="col col7 feedback"> <span class="textlabel">Was this article useful?</span> <a class="givefeedback yes" href="#" data-section-id="273" data-value="1">Yes</a> <a class="givefeedback no" href="#" data-section-id="273" data-value="-1">No</a><div class="formcontainer" id="container-67b8a8794a6f3"></div></div></div></section><section data-id="274" id="lastupdate" class="level4 " data-url="https://documentation.spire.com/maritime-2-0/vessels/query-arguments/lastupdate/"><div class="wrapper clearfix"><div class="col col7"><h4>lastUpdate</h4><p>If provided, only vessels having their most recent update time within the provided time range will be returned.</p><p><strong>Note</strong>: <code>lastUpdate</code> filter is available from 2022-08-30</p><p><strong>Example use of <code>lastUpdate</code> &#8211; requesting all vessels with updates since a specified time</strong></p><pre><code data-prismjs-copy="Copy to clipboard">lastUpdate:{ startTime:"2022-08-12T11:00:00.00Z" }</code></pre><p><strong>Example use of <code>lastUpdate</code> &#8211; requesting all vessels with updates between specified start and end times</strong></p><pre><code data-prismjs-copy="Copy to clipboard">lastUpdate:{ startTime:"2022-08-12T11:00:00.00Z" endTime:"2022-08-12T11:09:59.99Z" }</code></pre></div></div><div class="wrapper clearfix"><div class="col col7 feedback"> <span class="textlabel">Was this article useful?</span> <a class="givefeedback yes" href="#" data-section-id="274" data-value="1">Yes</a> <a class="givefeedback no" href="#" data-section-id="274" data-value="-1">No</a><div class="formcontainer" id="container-67b8a8794a924"></div></div></div></section><section data-id="275" id="shiptype" class="level4 " data-url="https://documentation.spire.com/maritime-2-0/vessels/query-arguments/shiptype/"><div class="wrapper clearfix"><div class="col col7"><h4>shipType</h4><p>Only return vessels having one of the specified vessel types. <code>ShipType</code> must be specified in all capital letters.</p><p><strong>Note</strong>: Several <code>shipType</code> values were only reported in Maritime 2.0 after 2022-08-10 and prior to that they were reported as <code>OTHER</code>. Most of these types are smaller, non-IMO vessels with types reported by AIS that are not covered by Spire Vessel Characteristics data.</p><p>Valid <code>shipType</code> values are shown below:</p><dl><dt><code>ANTI_POLLUTION</code></dt><dd>Anti Pollution Vessel</dd><dd>previously reported as <code>OTHER</code> up to 2022-08-30</dd><dt><code>CAR_CARRIER</code></dt><dd>Car Carrier</dd><dt><code>COMBINATION_CARRIER</code></dt><dd>Combination Carrier</dd><dt><code>CONTAINER</code></dt><dd>Container</dd><dt><code>DIVE_VESSEL</code></dt><dd>Dive Vessel</dd><dd>previously reported as <code>OTHER</code> up to 2022-08-30</dd><dt><code>DREDGER</code></dt><dd>Dredger</dd><dd>previously reported as <code>OTHER</code> up to 2022-08-30</dd><dt><code>DRY_BULK</code></dt><dd>Dry Bulk Cargo</dd><dt><code>FISHING</code></dt><dd>Fishing</dd><dt><code>GAS_CARRIER</code></dt><dd>Gas Carrier</dd><dt><code>GENERAL_CARGO</code></dt><dd>General Cargo</dd><dt><code>GENERAL_TANKER</code></dt><dd>General Tanker</dd><dt><code>HIGH_SPEED_CRAFT</code></dt><dd>High Speed Craft</dd><dd>previously reported as <code>OTHER</code> up to 2022-08-30</dd><dt><code>LAW_ENFORCEMENT</code></dt><dd>Law Enforcement</dd><dd>previously reported as <code>OTHER</code> up to 2022-08-30</dd><dt><code>LIVESTOCK</code></dt><dd>Livestock Carrier</dd><dt><code>LNG_CARRIER</code></dt><dd>LNG Carrier</dd><dt><code>MEDICAL_TRANS</code></dt><dd>Medical Transport</dd><dd>previously reported as <code>OTHER</code> up to 2022-08-30</dd><dt><code>MILITARY_OPS</code></dt><dd>Military Operations</dd><dd>previously reported as <code>OTHER</code> up to 2022-08-30</dd><dt><code>OFFSHORE</code></dt><dd>Offshore Vessel</dd><dt><code>OTHER</code></dt><dd>Other</dd><dt><code>PASSENGER</code></dt><dd>Passenger</dd><dd>previously reported as <code>VEHICLE_PASSENGER</code> up to 2022-08-30</dd><dt><code>PILOT_VESSEL</code></dt><dd>Pilot Vessel</dd><dd>previously reported as <code>OTHER</code> up to 2022-08-30</dd><dt><code>PLEASURE_CRAFT</code></dt><dd>Pleasure Craft</dd><dd>previously reported as <code>OTHER</code> up to 2022-08-30</dd><dt><code>PORT_TENDER</code></dt><dd>Port Tender</dd><dd>previously reported as <code>OTHER</code> up to 2022-08-30</dd><dt><code>REEFER</code></dt><dd>Reefer Cargo</dd><dt><code>ROLL_ON_ROLL_OFF</code></dt><dd>Roll-on Roll-off Cargo</dd><dt><code>SAILING</code></dt><dd>Sailing</dd><dd>previously reported as <code>OTHER</code> up to 2022-08-30</dd><dt><code>SEARCH_AND_RESCUE</code></dt><dd>Search and Rescue</dd><dd>previously reported as <code>OTHER</code> up to 2022-08-30</dd><dt><code>SPECIAL_CRAFT</code></dt><dd>Special Craft</dd><dd>previously reported as <code>OTHER</code> up to 2022-08-30</dd><dt><code>TANKER_CHEMICALS</code></dt><dd>Tanker &#8211; Chemicals</dd><dt><code>TANKER_CRUDE</code></dt><dd>Tanker &#8211; Crude</dd><dt><code>TANKER_PRODUCT</code></dt><dd>Tanker &#8211; Product Tanker</dd><dt><code>TUG</code></dt><dd>Tug</dd><dt><code>VEHICLE_PASSENGER</code></dt><dd>Vehicle/Passenger</dd><dd></dd></dl></div></div><div class="wrapper clearfix"><div class="col col7 feedback"> <span class="textlabel">Was this article useful?</span> <a class="givefeedback yes" href="#" data-section-id="275" data-value="1">Yes</a> <a class="givefeedback no" href="#" data-section-id="275" data-value="-1">No</a><div class="formcontainer" id="container-67b8a8794aeb4"></div></div></div></section><section data-id="277" id="output-objects" class="level3 " data-url="https://documentation.spire.com/maritime-2-0/vessels/output-objects/"><div class="wrapper clearfix"><div class="col col7"><h3>Output objects</h3><p>Combined <code>vessel</code>, <code>characteristics</code>, <code>voyage</code>, and <code>position</code> objects.</p><p>All values represent the latest information available on the vessel.</p><p><a href="https://www.navcen.uscg.gov/?pageName=AISMessagesA" target="_blank" rel="noopener">More details on the field meanings.</a></p><pre><code data-prismjs-copy="Copy to clipboard">type Vessel { id: ID! updateTimestamp: DateTime staticData: VesselStaticData! lastPositionUpdate: lastPositionUpdate currentVoyage: Voyage characteristics: VesselCharacteristics }</code></pre></div></div><div class="wrapper clearfix"><div class="col col7 feedback"> <span class="textlabel">Was this article useful?</span> <a class="givefeedback yes" href="#" data-section-id="277" data-value="1">Yes</a> <a class="givefeedback no" href="#" data-section-id="277" data-value="-1">No</a><div class="formcontainer" id="container-67b8a8794b12b"></div></div></div></section><section data-id="279" id="voyage" class="level4 " data-url="https://documentation.spire.com/maritime-2-0/vessels/output-objects/voyage/"><div class="wrapper clearfix"><div class="col col7"><h4>Voyage</h4><pre><code data-prismjs-copy="Copy to clipboard">type Voyage { destination: String draught: Float eta: DateTime matchedPort: MatchedPort timestamp: DateTime updateTimestamp: DateTime }</code></pre><h5>MatchedPort</h5><p>Port matched based on <code>destination</code>.</p><p>matchScore is the confidence value of the match and ranges between 0 and 1 .</p><p>The match with the highest matchScore is returned.</p><pre><code data-prismjs-copy="Copy to clipboard">type MatchedPort { matchScore: Float! port: Port }</code></pre><h5>Port</h5><p>Matched port with the best confidence value.</p><pre><code data-prismjs-copy="Copy to clipboard">type Port { centerPoint: GeoPoint name: String! unlocode: UNLOCODE! }</code></pre><h5>GeoPoint</h5><p>Port central point.</p><pre><code data-prismjs-copy="Copy to clipboard">type GeoPoint { latitude: Float! longitude: Float! }</code></pre></div><div class="col col1">&nbsp;</div><div class="col col4"><div class="codebox"><div class="title">Example query for getting current Voyage</div><div class="code"><pre><code data-prismjs-copy="Copy to clipboard">query getVoyage { vessels(imo: [9282742]) { nodes { staticData { imo mmsi } currentVoyage { destination draught eta timestamp updateTimestamp matchedPort { matchScore port { unlocode name centerPoint { latitude longitude } } } } } } }</code></pre></div></div></div></div><div class="wrapper clearfix"><div class="col col7 feedback"> <span class="textlabel">Was this article useful?</span> <a class="givefeedback yes" href="#" data-section-id="279" data-value="1">Yes</a> <a class="givefeedback no" href="#" data-section-id="279" data-value="-1">No</a><div class="formcontainer" id="container-67b8a8794b454"></div></div></div></section><section data-id="281" id="lastpositionupdate-output" class="level4 " data-url="https://documentation.spire.com/maritime-2-0/vessels/output-objects/lastpositionupdate-output/"><div class="wrapper clearfix"><div class="col col7"><h4>lastPositionUpdate</h4><p>Latest vessel position update.</p><pre><code data-prismjs-copy="Copy to clipboard">type lastPositionUpdate { accuracy: AisAccuracy collectionType: PositionCollectionType course: Float heading: Float latitude: Float longitude: Float maneuver: AisManeuverIndicator navigationalStatus: AisNavigationStatus rot: Float speed: Float timestamp: DateTime updateTimestamp: DateTime }</code></pre><h5>AisAccuracy</h5><p>Vessel position accuracy flag. The position accuracy flag indicates the accuracy of the fix.</p><pre><code data-prismjs-copy="Copy to clipboard">enum AisAccuracy { "Indicates a DGPS-quality fix with an accuracy of &lt; 10ms" HIGH "Default accuracy, indicates an unaugmented GNSS fix with accuracy &gt; 10m" LOW }</code></pre><h5>PositionCollectionType</h5><p>Data source of position update.</p><pre><code data-prismjs-copy="Copy to clipboard">enum PositionCollectionType { DYNAMIC SATELLITE TERRESTRIAL }</code></pre><h5>AisManeuverIndicator</h5><p>Vessel special maneuver indicator.</p><pre><code data-prismjs-copy="Copy to clipboard">enum AisManeuverIndicator { "Special maneuver (such as regional passing arrangement)" ENGAGED_IN_SPECIAL_MANEUVER "Not available (default)" NOT_AVAILABLE "No special maneuver" NOT_ENGAGED_IN_SPECIAL_MANEUVER }</code></pre><h5>AisNavigationStatus</h5><p>Navigational Status in an AIS message. <a href="https://documentation.spire.com/ais-fundamentals/how-to-interpret-navigational-status-codes/">See our AIS Fundamentals article on how to interpret navigational statuses</a>.</p><dl><dt><code>AGROUND</code></dt><dd>6 : Aground</dd><dt><code>AIS_SART_IS_ACTIVE</code></dt><dd>14 : Any of the following are active: AIS-SART (Search and Rescue Transmitter), AIS-MOB (Man Overboard), AIS-EPIRB (Emergency Position Indicating Radio Beacon)</dd><dt><code>AT_ANCHOR</code></dt><dd>1 : Anchored</dd><dt><code>CONSTRAINED_BY_HER_DRAUGHT</code></dt><dd>4 : Ship draught is limiting its movement</dd><dt><code>ENGAGED_IN_FISHING</code></dt><dd>7 : Engaged in fishing</dd><dt><code>MOORED</code></dt><dd>5 : Moored (tied to another object to limit free movement)</dd><dt><code>NOT_DEFINED_DEFAULT</code></dt><dd>15 : Undefined (default)</dd><dt><code>NOT_UNDER_COMMAND</code></dt><dd>2 : Not under command</dd><dt><code>POWER_DRIVEN_VESSEL_PUSHING_AHEAD_TOWING_ALONGSIDE</code></dt><dd>12 : Power-driven vessel pushing ahead/towing alongside</dd><dt><code>POWER_DRIVEN_VESSEL_TOWING_ASTERN</code></dt><dd>11 : Power-driven vessel towing astern</dd><dt><code>RESERVED_FOR_FUTURE_AMENDMENT_OF_NAVIGATIONAL_STATUS_FOR_HSC</code></dt><dd>9 : Number reserved for modifying reported status of ships carrying dangerous goods/harmful substances/marine pollutants</dd><dt><code>RESERVED_FOR_FUTURE_AMENDMENT_OF_NAVIGATIONAL_STATUS_FOR_WIG</code></dt><dd>10 : Number reserved for modifying reported status of ships carrying dangerous goods/harmful substances/marine pollutants</dd><dt><code>RESERVED_FOR_FUTURE_USE</code></dt><dd>13 : Reserved for future use</dd><dt><code>RESTRICTED_MANEUVERABILITY</code></dt><dd>3 : Has restricted maneuverability</dd><dt><code>UNDER_WAY_SAILING</code></dt><dd>8 : Under way sailing</dd><dt><code>UNDER_WAY_USING_ENGINE</code></dt><dd>0 : Under way using its engine</dd></dl></div></div><div class="wrapper clearfix"><div class="col col7 feedback"> <span class="textlabel">Was this article useful?</span> <a class="givefeedback yes" href="#" data-section-id="281" data-value="1">Yes</a> <a class="givefeedback no" href="#" data-section-id="281" data-value="-1">No</a><div class="formcontainer" id="container-67b8a8794b7d8"></div></div></div></section><section data-id="283" id="vesselstaticdata" class="level4 " data-url="https://documentation.spire.com/maritime-2-0/vessels/output-objects/vesselstaticdata/"><div class="wrapper clearfix"><div class="col col7"><h4>VesselStaticData</h4><p>Vessel static information.</p><pre><code data-prismjs-copy="Copy to clipboard">type VesselStaticData { aisClass: AisClass callsign: String dimensions: VesselDimensions flag: String imo: IMO mmsi: MMSI name: String shipSubType: ShipSubType shipType: ShipType timestamp: DateTime updateTimestamp: DateTime validated: VesselValidatedStaticData }</code></pre><h5>AisClass</h5><p>Vessel AIS class, A or B.</p><pre><code data-prismjs-copy="Copy to clipboard">enum AisClass { "AIS information from a class A transponder" A "AIS information from a class B transponder" B }</code></pre><h5>VesselDimensions</h5><p>Vessel Dimensions.</p><p>type VesselDimensions { a: Int b: Int c: Int d: Int length: Int width: Int }</p><h5><a id="VesselValidatedStaticData"></a>VesselValidatedStaticData</h5><p>Note: VesselValidatedStaticData was released in November 2023.</p><p>type VesselValidatedStaticData {<br /> imo: IMO<br /> name: String<br /> callSign: String<br /> shipType: ShipType<br /> dimensions: { width: int length: int }<br /> }</p><h5><a id="ShipSubType"></a>ShipSubType</h5><p>Subtype of the ship and cargo. Valid values are listed below:</p><dl><dt><code>AGGREGATES_CARRIER</code></dt><dd>General Cargo: Aggregates Carrier</dd><dt><code>ALUMINIUM_CARRIER</code></dt><dd>Dry Bulk: Aluminium Carrier</dd><dt><code>BITUMEN_CARRIER</code></dt><dd>General Cargo: Bitumen Carrier</dd><dt><code>CABU_CARRIER</code></dt><dd>Dry Bulk: Bulk/Caustic Soda Carrier (CABU)</dd><dt><code>CARBON_DIOXIDE</code></dt><dd>General Tanker: Carbon Dioxide Tanker</dd><dt><code>CAR_CARRIER</code></dt><dd>Car Carrier</dd><dt><code>CEMENT_CARRIER</code></dt><dd>Dry Bulk: Cement Carrier</dd><dt><code>COAL</code></dt><dd>Dry Bulk: Coal Carrier</dd><dt><code>COMBINATION_CARRIER</code></dt><dd>Combination Carrier</dd><dt><code>CONTAINER</code></dt><dd>Container</dd><dt><code>CONTAINER_BULK</code></dt><dd>Dry Bulk: Container Bulk Carrier</dd><dt><code>CONTAINER_REEFER</code></dt><dd>Container: Reefer</dd><dt><code>DECK_CARGO</code></dt><dd>General Cargo: Deck-Cargo</dd><dt><code>DRY_BULK</code></dt><dd>Dry Bulk: Dry Bulk Carrier</dd><dt><code>EFFLUENT_TANKER</code></dt><dd>General Tanker: Effluent Tanker</dd><dt><code>FISHING</code></dt><dd>Fishing</dd><dt><code>FISH_CARRIER</code></dt><dd>General Cargo: Fish Carrier</dd><dt><code>GENERAL_TANKER</code></dt><dd>General Tanker</dd><dt><code>GREAT_LAKES</code></dt><dd>Dry Bulk: Great Lakes Carrier</dd><dt><code>GYPSUM_CARRIER</code></dt><dd>Dry Bulk: Gypsum Carrier</dd><dt><code>HEAVY_LIFT</code></dt><dd>General Cargo: Heavy Lift</dd><dt><code>HEAVY_LIFT_SEMI_SUBMERSIBLE</code></dt><dd>General Cargo: Heavy Lift &#8211; Semi Submersible</dd><dt><code>LIMESTONE_CARRIER</code></dt><dd>Dry Bulk: Limestone Carrier</dd><dt><code>LIVESTOCK</code></dt><dd>Livestock Carrier</dd><dt><code>LNG_CARRIER</code></dt><dd>LNG Carrier: LNG Carrier</dd><dt><code>LOGS</code></dt><dd>General Cargo: Logs</dd><dt><code>LOG_CARRIER</code></dt><dd>Dry Bulk: Log Carrier</dd><dt><code>LPG_CARRIER</code></dt><dd>Gas Carrier: LPG Carrier</dd><dt><code>LUMBER_CARRIER</code></dt><dd>Dry Bulk: Lumber Carrier</dd><dt><code>MISCELLANEOUS</code></dt><dd>General Cargo: Miscellaneous</dd><dt><code>MOLASSES_CARRIER</code></dt><dd>General Tanker: Molasses Carrier</dd><dt><code>MULTI_PURPOSE_CARRIER</code></dt><dd>General Cargo: Multi-purpose Carrier</dd><dt><code>null</code></dt><dd>No vessel subtype</dd><dt><code>NUCLEAR_FUEL_CARRIER</code></dt><dd>General Cargo: Nuclear Fuel Carrier</dd><dt><code>OFFSHORE</code></dt><dd>Offshore Vessel</dd><dt><code>OPEN_HATCH</code></dt><dd>Dry Bulk: Open Hatch Carrier</dd><dt><code>ORE_BULK_OIL_CARRIER</code></dt><dd>Combination Carrier: Ore/Bulk/Oil Carrier</dd><dt><code>ORE_CARRIER</code></dt><dd>Dry Bulk: Ore Carrier</dd><dt><code>ORE_OIL_CARRIER</code></dt><dd>Combination Carrier: Ore/Oil Carrier</dd><dt><code>OTHER</code></dt><dd>Other</dd><dt><code>PALLET_CARRIER</code></dt><dd>General Cargo: Pallet Carrier</dd><dt><code>PROBO</code></dt><dd>General Tanker: PROBO Tanker</dd><dt><code>REEFER</code></dt><dd>Reefer Cargo</dd><dt><code>REPLENISHMENT</code></dt><dd>General Tanker: Replenishment</dd><dt><code>ROLL_ON_ROLL_OFF</code></dt><dd>General Cargo: Roll-on Roll-off</dd><dt><code>SEA_RIVER_TYPE</code></dt><dd>General Cargo: Sea River Type</dd><dt><code>SELF_DISCHARGING</code></dt><dd>Self Discharging</dd><dt><code>SLOPS</code></dt><dd>General Tanker: Slops</dd><dt><code>STONE_CARRIER</code></dt><dd>General Cargo: Stone Carrier</dd><dt><code>TANKER_CHEMICALS</code></dt><dd>Tanker &#8211; Chemicals</dd><dt><code>TANKER_CRUDE</code></dt><dd>Tanker &#8211; Crude</dd><dt><code>TANKER_PRODUCT</code></dt><dd>Tanker &#8211; Product Tanker</dd><dt><code>TUG</code></dt><dd>Tug</dd><dt><code>TWEEN_DECKER</code></dt><dd>General Cargo: Tween Decker</dd><dt><code>VEG_OIL_CARRIER</code></dt><dd>General Tanker: Vegetable Oil Carrier</dd><dt><code>VEHICLE_PASSENGER</code></dt><dd>Vehicle/Passenger</dd><dt><code>WATER_CARRIER</code></dt><dd>General Tanker: Water Carrier</dd><dt><code>WINE_CARRIER</code></dt><dd>General Tanker: Wine Carrier</dd><dt><code>WOOD_CHIP_CARRIER</code></dt><dd>Dry Bulk: Wood Chip Carrier</dd><dt><code>WOOD_PULP</code></dt><dd>Dry Bulk: Wood Pulp Carrier</dd></dl><h5><a id="shipType"></a>ShipType</h5><p>Only return vessels having one of the provided vessel types.</p><p><code>ShipType</code> must be specified in all capital letters.</p><p><strong>Note</strong>: Several <code>shipType</code> values were only reported in Maritime 2.0 after 2022-08-10 and prior to that they were reported as OTHER. Most of these types are smaller, non-IMO vessels with types reported by AIS that are not covered by Spire Vessel Characteristics data.</p><p>Valid <code>shipType</code> values are shown below:</p><dl><dt><code>ANTI_POLLUTION</code></dt><dd>Anti Pollution Vessel</dd><dd>previously reported as <code>OTHER</code> up to 2022-08-30</dd><dt><code>CAR_CARRIER</code></dt><dd>Car Carrier</dd><dt><code>COMBINATION_CARRIER</code></dt><dd>Combination Carrier</dd><dt><code>CONTAINER</code></dt><dd>Container</dd><dt><code>DIVE_VESSEL</code></dt><dd>Dive Vessel</dd><dd>previously reported as <code>OTHER</code> up to 2022-08-30</dd><dt><code>DREDGER</code></dt><dd>Dredger</dd><dd>previously reported as <code>OTHER</code> up to 2022-08-30</dd><dt><code>DRY_BULK</code></dt><dd>Dry Bulk Cargo</dd><dt><code>FISHING</code></dt><dd>Fishing</dd><dt><code>GAS_CARRIER</code></dt><dd>Gas Carrier</dd><dt><code>GENERAL_CARGO</code></dt><dd>General Cargo</dd><dt><code>GENERAL_TANKER</code></dt><dd>General Tanker</dd><dt><code>HIGH_SPEED_CRAFT</code></dt><dd>High Speed Craft</dd><dd>previously reported as <code>OTHER</code> up to 2022-08-30</dd><dt><code>LAW_ENFORCEMENT</code></dt><dd>Law Enforcement</dd><dd>previously reported as <code>OTHER</code> up to 2022-08-30</dd><dt><code>LIVESTOCK</code></dt><dd>Livestock Carrier</dd><dt><code>LNG_CARRIER</code></dt><dd>LNG Carrier</dd><dt><code>MEDICAL_TRANS</code></dt><dd>Medical Transport</dd><dd>previously reported as <code>OTHER</code> up to 2022-08-30</dd><dt><code>MILITARY_OPS</code></dt><dd>Military Operations</dd><dd>previously reported as <code>OTHER</code> up to 2022-08-30</dd><dt><code>OFFSHORE</code></dt><dd>Offshore Vessel</dd><dt><code>OTHER</code></dt><dd>Other</dd><dt><code>PASSENGER</code></dt><dd>Passenger</dd><dd>previously reported as <code>VEHICLE_PASSENGER</code> up to 2022-08-30</dd><dt><code>PILOT_VESSEL</code></dt><dd>Pilot Vessel</dd><dd>previously reported as <code>OTHER</code> up to 2022-08-30</dd><dt><code>PLEASURE_CRAFT</code></dt><dd>Pleasure Craft</dd><dd>previously reported as <code>OTHER</code> up to 2022-08-30</dd><dt><code>PORT_TENDER</code></dt><dd>Port Tender</dd><dd>previously reported as <code>OTHER</code> up to 2022-08-30</dd><dt><code>REEFER</code></dt><dd>Reefer Cargo</dd><dt><code>ROLL_ON_ROLL_OFF</code></dt><dd>Roll-on Roll-off Cargo</dd><dt><code>SAILING</code></dt><dd>Sailing</dd><dd>previously reported as <code>OTHER</code> up to 2022-08-30</dd><dt><code>SEARCH_AND_RESCUE</code></dt><dd>Search and Rescue</dd><dd>previously reported as <code>OTHER</code> up to 2022-08-30</dd><dt><code>SPECIAL_CRAFT</code></dt><dd>Special Craft</dd><dd>previously reported as <code>OTHER</code> up to 2022-08-30</dd><dt><code>TANKER_CHEMICALS</code></dt><dd>Tanker &#8211; Chemicals</dd><dt><code>TANKER_CRUDE</code></dt><dd>Tanker &#8211; Crude</dd><dt><code>TANKER_PRODUCT</code></dt><dd>Tanker &#8211; Product Tanker</dd><dt><code>TUG</code></dt><dd>Tug</dd><dt><code>VEHICLE_PASSENGER</code></dt><dd>Vehicle/Passenger</dd></dl></div></div><div class="wrapper clearfix"><div class="col col7 feedback"> <span class="textlabel">Was this article useful?</span> <a class="givefeedback yes" href="#" data-section-id="283" data-value="1">Yes</a> <a class="givefeedback no" href="#" data-section-id="283" data-value="-1">No</a><div class="formcontainer" id="container-67b8a8794c180"></div></div></div></section><section data-id="285" id="pageinfo" class="level4 " data-url="https://documentation.spire.com/maritime-2-0/vessels/output-objects/pageinfo/"><div class="wrapper clearfix"><div class="col col7"><h4>pageInfo</h4><p>Information about pagination in a connection.</p><pre><code data-prismjs-copy="Copy to clipboard">type PageInfo { endCursor: String hasNextPage: Boolean! }</code></pre></div></div><div class="wrapper clearfix"><div class="col col7 feedback"> <span class="textlabel">Was this article useful?</span> <a class="givefeedback yes" href="#" data-section-id="285" data-value="1">Yes</a> <a class="givefeedback no" href="#" data-section-id="285" data-value="-1">No</a><div class="formcontainer" id="container-67b8a8794c367"></div></div></div></section><section data-id="286" id="totalcount" class="level4 " data-url="https://documentation.spire.com/maritime-2-0/vessels/output-objects/totalcount/"><div class="wrapper clearfix"><div class="col col7"><h4>totalCount</h4><p>Information about the amount of results in a query. The indicated value might be a lower bound if the total isn&#8217;t known when there are too many results.</p><pre><code data-prismjs-copy="Copy to clipboard">type ResultCount { relation: ResultCountRelation! value: Int! }</code></pre><h5>ResultCountRelation</h5><pre><code data-prismjs-copy="Copy to clipboard">enum ResultCountRelation { EQUAL LOWER_OR_EQUAL }</code></pre></div></div><div class="wrapper clearfix"><div class="col col7 feedback"> <span class="textlabel">Was this article useful?</span> <a class="givefeedback yes" href="#" data-section-id="286" data-value="1">Yes</a> <a class="givefeedback no" href="#" data-section-id="286" data-value="-1">No</a><div class="formcontainer" id="container-67b8a8794c53a"></div></div></div></section><section data-id="1445" id="validated-static-data" class="level4 " data-url="https://documentation.spire.com/maritime-2-0/vessels/output-objects/validated-static-data/"><div class="wrapper clearfix"><div class="col col7"><h4>Validated Static Data</h4><p>Recognising that AIS messages can sometimes report incorrect or missing information for vessels, Spire Maritime uses its database of researched Vessel Characteristics (VC) information to report what we consider to be validated values for key information.</p><p>Validated values are available for a vessel’s  <code class="hljs language-undefined">name</code>, <code class="hljs language-undefined">imo</code>, <code class="hljs language-undefined">callsign</code>, <code class="hljs language-undefined">width</code>, <code class="hljs language-undefined">length</code> and <code class="hljs language-undefined">shipType</code>. They are returned from the VC database when we are confident that a vessel can be identified correctly, and included in a new validated section of the <code class="hljs language-undefined">staticData</code> query response. The validated values will often be the same as those reported by the vessel in it’s AIS messages but sometimes will be different, and will be those from the VC database. Note that matching to VC data, and returning of validated values, is <strong>only applicable to vessels with IMO numbers and those reporting AIS using class A AIS</strong>.</p><p>Also, when running API calls that are filtered on a vessel’s <code class="hljs language-undefined">imo</code>, <code class="hljs language-undefined">name</code> or <code class="hljs language-undefined">callsign</code> , if the <code class="hljs language-undefined">staticData.validated</code> data is matched by the parameters of the API call, the entry will be included in the API call results (even if the non-validated data does not match).</p><p>One of the most valuable use cases of this feature is the recognition of a vessel’s correct <code class="hljs language-undefined">imo</code> number when either the wrong IMO or no IMO number is being reported by the vessel in its AIS messages.<br /> Below is an example output of a Maritime 2.0 GraphQL <code class="hljs language-undefined">vessels</code> query, correcting the IMO number returned by AIS &#8211; the query to obtain this result can be found on the right:</p><h6>Available fields</h6><dl><dt>callsign: <code>String</code></dt><dd>Validated vessel call sign</dd><dt>callsignTimestamp: <code>DateTime</code></dt><dd>Timestamp when validated callsign was last updated in Vessel Characteristics</dd><dt>dimensions: <code>VesselValidatedDimensions</code></dt><dd>Validated vessel dimensions (width and length)</dd><dt>imo: <code>IMO</code></dt><dd>Validated vessel IMO</dd><dt>name: <code>String</code></dt><dd>Validate vessel name</dd><dt>nameTimestamp: <code>DateTime</code></dt><dd>Timestamp when validated name was last updated in Vessel Characteristics</dd><dt>shipType: <code>ShipType</code></dt><dd>Validated vessel ship type</dd></dl></div><div class="col col1">&nbsp;</div><div class="col col4"><div class="codebox"><div class="title">Example query including Validated Vessel Data</div><div class="code"><pre class="language-graphql"><code data-prismjs-copy="Copy to clipboard">query VslIMO { vessels( imo:9250995 lastUpdate : {startTime:"2023-07-01T00:00:00Z" } ) { nodes { id staticData { name imo mmsi aisClass callsign flag shipType updateTimestamp dimensions { length width } validated { name imo callsign shipType dimensions { length width } } } } } } </code></pre></div></div><div class="codebox"><div class="title">Example output including Validated Vessel Data</div><div class="code"><pre class="language-graphql"><code data-prismjs-copy="Copy to clipboard">{ "data": { "vessels": { "nodes": [ { "id": "4db14c7d-0728-3b4f-845c-36c02f671b73", "staticData": { "name": "DIMITRA C", "imo": 92500995, "mmsi": 256058000, "aisClass": "A", "callsign": "9HA3802", "flag": "MT", "shipType": "CONTAINER", "updateTimestamp": "2023-07-24T04:37:24.675Z", "dimensions": { "length": 294, "width": 40, }, "validated": { "name": "DIMITRA C", "imo": 9250995, "callsign": "9HA3802", "shipType": "CONTAINER", "dimensions": { "length": 294, "width": 40 } } } } ] } } } </code></pre></div></div></div></div><div class="wrapper clearfix"><div class="col col7 feedback"> <span class="textlabel">Was this article useful?</span> <a class="givefeedback yes" href="#" data-section-id="1445" data-value="1">Yes</a> <a class="givefeedback no" href="#" data-section-id="1445" data-value="-1">No</a><div class="formcontainer" id="container-67b8a8794c875"></div></div></div></section><section data-id="287" id="vessel-characteristics" class="level4 " data-url="https://documentation.spire.com/maritime-2-0/vessels/output-objects/vessel-characteristics/"><div class="wrapper clearfix"><div class="col col7"><h4>Vessel characteristics</h4><p><strong>NOTE</strong>: Basic characteristics are available to all customers. Extended characteristics are available through an additional licensing.</p><p>All Vessel Characteristics data fields and their meanings can be found in the <a class="scrolltoelement" href="#vessel-characteristics-data-dictionary" target="_blank" rel="noopener">Vessel Characteristics data dictionary</a> and in the <a href="https://spire.com/maritime/solutions/vessel-characteristics/#content-block_61dd5c73247ac" target="_blank" rel="noopener">Spire Maritime product page for Vessel Characteristics</a>.</p><pre><code data-prismjs-copy="Copy to clipboard">type VesselCharacteristics { basic: VesselCharacteristicsBasic extended: VesselCharacteristicsExtended }</code></pre><h5>VesselCharacteristicsBasic</h5><pre><code data-prismjs-copy="Copy to clipboard">type VesselCharacteristicsBasic { capacity: VesselCapacityBasic history: VesselHistoryBasic vesselTypeAndTrading: VesselTypeAndTradingBasic }</code></pre><h5>VesselCapacityBasic</h5><pre><code data-prismjs-copy="Copy to clipboard">type VesselCapacityBasic { deadweight: Int grossTonnage: Int }</code></pre><h5>VesselHistoryBasic</h5><pre><code data-prismjs-copy="Copy to clipboard">type VesselHistoryBasic { builtYear: Int }</code></pre><h5>VesselTypeAndTradingBasic</h5><pre><code data-prismjs-copy="Copy to clipboard">type VesselTypeAndTradingBasic { vesselSubtype: String }</code></pre><h5>VesselCharacteristicsExtended</h5><pre><code data-prismjs-copy="Copy to clipboard">type VesselCharacteristicsExtended { capacity: VesselCapacityExtended design: VesselDesignExtended dimensions: VesselDimensionsExtended history: VesselHistoryExtended propulsion: VesselPropulsionExtended registration: VesselRegistrationExtended vesselTypeAndTrading: VesselTypeAndTradingExtended bunker: VesselBunker }</code></pre><h5>VesselCapacityExtended</h5><pre><code data-prismjs-copy="Copy to clipboard">type VesselCapacityExtended { deadweight: Int tpcmi: Float grossTonnage: Int netTonnage: Int displacement: Int liquidCubic98Percent: Int grainCubicCapacity: Int teu: Int holdCount: Int holdDimensions: String hatchCount: Int hatchDimensions: String feu: Int teuSurplus: Int teu14t: Int laneMeters: Int cars: Int passengers: Int reeferCubic: Int }</code></pre><h5>VesselDesignExtended</h5><pre><code data-prismjs-copy="Copy to clipboard">type VesselDesignExtended { isCoated: Boolean isGearless: Boolean isSelfUnloading: Boolean gearDisplay: String gearMaxSwl: Float reeferPointCount: Int hullTypeCode: String }</code></pre><h5>VesselDimensionsExtended</h5><pre><code data-prismjs-copy="Copy to clipboard">type VesselDimensionsExtended { draught: Float lengthOverall: Float airDraught: Float keelToManifold: Float depth: Float beamMoulded: Float berthCount: Int }</code></pre><h5>VesselHistoryExtended</h5><pre><code data-prismjs-copy="Copy to clipboard">type VesselHistoryExtended { vesselNameDate: DateTime builtYear: Int deadYear: Int shipBuilder: String hullNumber: String registeredOwner: String commercialOwner: String keelLaidYear: Int launchYear: Int }</code></pre><h5>VesselPropulsionExtended</h5><pre><code data-prismjs-copy="Copy to clipboard">type VesselPropulsionExtended { mainEngineCount: Int mainEngineDesigner: String propulsionType: String engineDesignation: String mcoRpm: Int mcoKw: Int mcoHp: Int propellerCount: Int propellerType: String bowThrusterCount: Int sternThrusterCount: Int }</code></pre><h5>VesselRegistrationExtended</h5><pre><code data-prismjs-copy="Copy to clipboard">type VesselRegistrationExtended { class1Code: String class2Code: String classDetails: String isIceClassed: Boolean iceClass: String certificates: String }</code></pre><h5>VesselTypeAndTradingExtended</h5><pre><code data-prismjs-copy="Copy to clipboard">type VesselTypeAndTradingExtended { vesselSubtype: String tradingCategoryCode: TradingCategoryCode tradingStatusCode: TradingStatusCode }</code></pre><h5>VesselBunker</h5><pre><code data-prismjs-copy="Copy to clipboard">type VesselBunker { bunkers: [VesselFuelBunker!] range: Int }</code></pre><h5>VesselFuelBunker</h5><pre><code data-prismjs-copy="Copy to clipboard">type VesselFuelBunker { capacity: Int fuelTypeCode: String fuelUnitCode: String tankCount: Int }</code></pre></div></div><div class="wrapper clearfix"><div class="col col7 feedback"> <span class="textlabel">Was this article useful?</span> <a class="givefeedback yes" href="#" data-section-id="287" data-value="1">Yes</a> <a class="givefeedback no" href="#" data-section-id="287" data-value="-1">No</a><div class="formcontainer" id="container-67b8a8794cb6c"></div></div></div></section><section data-id="1103" id="vessel-to-port-eta" class="level4 " data-url="https://documentation.spire.com/maritime-2-0/vessels/output-objects/vessel-to-port-eta/"><div class="wrapper clearfix"><div class="col col7"><h4>Vessel to Port ETA</h4><p>The Vessel to Port ETA output is provided under the <code>predictedRoute</code> field and provides information about the predicted next port of a vessel and the expected route it will take, along with the corresponding calculated ETA. The route and ETA is continuously updated to provide the most accurate ETA possible even when a vessel deviates from the expected route, slows down or otherwise changes its expected behaviour.<br /> Vessels are being tracked along the expected route and its progress is being validated every 15 minutes otherwise the route and ETA are recalculated.</p><p>Prediction of next port and calculation of routes and ETAs is carried out for vessels of following criteria:</p><dl><dt>IMO</dt><dd>Only vessels with a valid IMO number are supported</dd><dt>Underway</dt><dd>The vessel must be underway to have valid ETA calculation</dd><dt>shipType</dt><dd>Vessels of the following shipTypes are supported: CONTAINER, DRY_BULK, GENERAL_CARGO, GENERAL_TANKER, TANKER_CHEMICALS, TANKER_CRUDE, TANKER_PRODUCT, CAR_CARRIER, GAS_CARRIER, LNG_CARRIER, LIVESTOCK, ROLL ON ROLL OFF, REEFER</dd></dl><p>&nbsp;</p><h5>destinationPort: <code>Port!</code></h5><p>Predicted destination port</p><pre><code data-prismjs-copy="Copy to clipboard">centerPoint: GeoPoint Port central point name: String! Port name unlocode: UNLOCODE! Port UN/LOCODE</code></pre><h5>distance: <code>Float</code></h5><p>The distance (in NM) from the vessel position to the to the destination port (in nautical miles) at the time of route calculation</p><h5>duration: <code>TimeDuration!</code></h5><p>Route duration</p><h5>eta: <code>DateTime!</code></h5><p>Predicted Estimated Time of Arrival (ETA) for the route</p><h5>waypoints: <code>Waypoints</code></h5><p>Waypoints delineating the predicted route of the vessels to the destination port</p><dl><dt><strong>geoJson: <code>GeoJsonLineString</code></strong></dt><dd>Linestring Geometry in GeoJson format</dd><dt><strong>wkt: <code>WKT!</code></strong></dt><dd>Linestring Geometry in WKT format</dd></dl></div><div class="col col1">&nbsp;</div><div class="col col4"><div class="codebox"><div class="title">Example query of Vessel to Port ETA for container vessels</div><div class="code"><pre class="language-graphql"><code data-prismjs-copy="Copy to clipboard">query{ vessels(shipType: CONTAINER) { nodes { id staticData { timestamp mmsi imo name shipType shipSubType } lastPositionUpdate { latitude longitude navigationalStatus } currentVoyage { predictedRoute { eta destinationPort { unlocode name centerPoint { latitude longitude } } waypoints { wkt geoJson { coordinates } } distance timestamp updateTimestamp } } } } } </code></pre></div></div></div></div><div class="wrapper clearfix"><div class="col col7 feedback"> <span class="textlabel">Was this article useful?</span> <a class="givefeedback yes" href="#" data-section-id="1103" data-value="1">Yes</a> <a class="givefeedback no" href="#" data-section-id="1103" data-value="-1">No</a><div class="formcontainer" id="container-67b8a8794ce96"></div></div></div></section><section data-id="289" id="data-dictionary" class="level3 " data-url="https://documentation.spire.com/maritime-2-0/vessels/data-dictionary/"><div class="wrapper clearfix"><div class="col col7"><h3>Data dictionary</h3><p>Spire Maritime 2.0 API includes the highest-level information about a ship in our vessels database. The information contained here is a combination of data from AIS messages and external data sources. The records within provide an up-to-date snapshot of the ship when possible.</p><div class="tablewrapper"><table style="width: 100%; height: 1704px;"><thead><tr style="height: 48px;"><th style="height: 48px; width: 6.31001%;">Argument / Output</th><th style="height: 48px; width: 12.6886%;">Field</th><th style="height: 48px; width: 15.3635%;">Type or Object Name</th><th style="height: 48px; width: 64.7462%;">Description</th></tr></thead><tbody><tr style="height: 48px;"><td style="height: 48px; width: 6.31001%;">Argument</td><td style="height: 48px; width: 12.6886%;"><code>after</code></td><td style="height: 48px; width: 15.3635%;"><code>string</code></td><td style="height: 48px; width: 64.7462%;">When paging through results, returns the elements in the result set that come after the specified cursor. The value of the <code>after</code> argument can be obtained from <code>pageInfo.endCursor</code>. <a href="https://shopify.dev/api/usage/pagination-graphql" target="_blank" rel="noopener">Read more about cursor-based pagination</a>.</td></tr><tr style="height: 72px;"><td style="height: 72px; width: 6.31001%;">Argument</td><td style="height: 72px; width: 12.6886%;"><code>areaOfInterest</code></td><td style="height: 72px; width: 15.3635%;"><code>AreaOfInterest</code></td><td style="height: 72px; width: 64.7462%;">The area of interest is either a GeoJSON object or a WKT string; in either case representing a closed polygon. It is an error to set both the geoJson and wkt fields, or to set neither. If provided, only vessels with their most recent position being within the area of interest defined by the polygon will be returned.</td></tr><tr style="height: 24px;"><td style="height: 24px; width: 6.31001%;">Argument</td><td style="height: 24px; width: 12.6886%;"><code>polygon</code></td><td style="height: 24px; width: 15.3635%;"><code>GeoJsonPolygonInput</code></td><td style="height: 24px; width: 64.7462%;">Polygon geometry in GeoJSON format.</td></tr><tr style="height: 24px;"><td style="height: 24px; width: 6.31001%;">Argument</td><td style="height: 24px; width: 12.6886%;"><code>coordinates</code></td><td style="height: 24px; width: 15.3635%;"><code>GeoJsonPosition</code></td><td style="height: 24px; width: 64.7462%;">Polygon coordinates in format <code>[[[number, number]...]...]</code></td></tr><tr style="height: 24px;"><td style="height: 24px; width: 6.31001%;">Argument</td><td style="height: 24px; width: 12.6886%;"><code>type</code></td><td style="height: 24px; width: 15.3635%;"><code>String</code></td><td style="height: 24px; width: 64.7462%;">Must be &#8220;Polygon&#8221;</td></tr><tr style="height: 24px;"><td style="height: 24px; width: 6.31001%;">Argument</td><td style="height: 24px; width: 12.6886%;"><code>wkt</code></td><td style="height: 24px; width: 15.3635%;"><code>String</code></td><td style="height: 24px; width: 64.7462%;">Represents linestring geometry in Well-Known Text</td></tr><tr style="height: 48px;"><td style="height: 48px; width: 6.31001%;">Argument / Output</td><td style="height: 48px; width: 12.6886%;"><code>callsign</code></td><td style="height: 48px; width: 15.3635%;"><code>String</code></td><td style="height: 48px; width: 64.7462%;">Vessel call sign &#8211; Only return vessels having one of the provided call signs.</td></tr><tr style="height: 120px;"><td style="height: 120px; width: 6.31001%;">Argument</td><td style="height: 120px; width: 12.6886%;"><code>first</code></td><td style="height: 120px; width: 15.3635%;"><code>Int</code></td><td style="height: 120px; width: 64.7462%;">Maximum number of records to return. The default is 100 and valid values are <code>1–1000</code>. Anything less than 1 is converted to the default. Anything greater than the maximum is converted to the maximum. Due to how matches are collected, the number of records returned may be less than this value even when there are more matches in the total result set. In other words, use only the <code>pageInfo.hasNextPage</code> property in the response metadata to determine whether to fetch more results, do not test whether the number of records returned is less than this value.</td></tr><tr style="height: 48px;"><td style="height: 48px; width: 6.31001%;">Argument / Output</td><td style="height: 48px; width: 12.6886%;"><code>flag</code></td><td style="height: 48px; width: 15.3635%;"><code>string</code></td><td style="height: 48px; width: 64.7462%;">Only return vessels sailing under one of the provided countries. The countries must be provided as ISO 3166 alpha-2 codes. Flag string must be capitalized in argument.</td></tr><tr style="height: 48px;"><td style="height: 48px; width: 6.31001%;">Argument / Output</td><td style="height: 48px; width: 12.6886%;"><code>imo</code></td><td style="height: 48px; width: 15.3635%;"><code>Int</code></td><td style="height: 48px; width: 64.7462%;">Vessel unique International Maritime Organization number</td></tr><tr style="height: 24px;"><td style="height: 24px; width: 6.31001%;">Argument</td><td style="height: 24px; width: 12.6886%;"><code>lastPositionUpdate</code></td><td style="height: 24px; width: 15.3635%;"><code>TimeRange</code></td><td style="height: 24px; width: 64.7462%;">If provided, only vessels having their most recent position update time within the provided time range will be returned.</td></tr><tr style="height: 24px;"><td style="height: 24px; width: 6.31001%;">Argument</td><td style="height: 24px; width: 12.6886%;"><code>endTime</code></td><td style="height: 24px; width: 15.3635%;"><code>DateTime</code></td><td style="height: 24px; width: 64.7462%;">Timestamp of the end of the time range (ISO 8601 format); if omitted, the current time is used.</td></tr><tr style="height: 24px;"><td style="height: 24px; width: 6.31001%;">Argument</td><td style="height: 24px; width: 12.6886%;"><code>startTime</code></td><td style="height: 24px; width: 15.3635%;"><code>DateTime</code></td><td style="height: 24px; width: 64.7462%;">Timestamp of the beginning of the time range (ISO 8601 format).</td></tr><tr style="height: 48px;"><td style="height: 48px; width: 6.31001%;">Argument / Output</td><td style="height: 48px; width: 12.6886%;"><code>mmsi</code></td><td style="height: 48px; width: 15.3635%;"><code>Int</code></td><td style="height: 48px; width: 64.7462%;">Vessel Maritime Mobile Service Identity</td></tr><tr style="height: 48px;"><td style="height: 48px; width: 6.31001%;">Argument / Output</td><td style="height: 48px; width: 12.6886%;"><code>name</code></td><td style="height: 48px; width: 15.3635%;"><code>String</code></td><td style="height: 48px; width: 64.7462%;">Vessel name. When using this as an argument, the vessel name must be an exact match, but it is case insensitive (meaning the name does not have to be in all capital letters).</td></tr><tr style="height: 48px;"><td style="height: 48px; width: 6.31001%;">Argument / Output</td><td style="height: 48px; width: 12.6886%;"><code>partialNameSearch</code></td><td style="height: 48px; width: 15.3635%;"><code>Boolean</code></td><td style="height: 48px; width: 64.7462%;">When using this argument and setting the boolean to <code>TRUE</code> the matching function for the <code>name</code> argument will be altered to match on partial names instead of exact name matches. When setting the value to <code>TRUE</code> only one name can be used in the <code>name</code> argument. The default value of <code>partialNameSearch</code> is set to <code>FALSE</code></td></tr><tr style="height: 48px;"><td style="height: 48px; width: 6.31001%;"> , Argument / Output</td><td style="height: 48px; width: 12.6886%;"><code>shipType</code></td><td style="height: 48px; width: 15.3635%;"><code>ShipType</code></td><td style="height: 48px; width: 64.7462%;">Category of vessel. Only return vessels having one of the provided vessel types. See <code>shipType</code> in the Output section for the ShipType enumeration details.</td></tr><tr style="height: 48px;"><td style="height: 48px; width: 6.31001%;">Output</td><td style="height: 48px; width: 12.6886%;"><code>nodes</code></td><td style="height: 48px; width: 15.3635%;"><code>Vessel</code></td><td style="height: 48px; width: 64.7462%;">Combined vessel, voyage and position object. All values represent the latest information available for the vessel. See <a href="https://www.navcen.uscg.gov/?pageName=AISMessagesA" target="_blank" rel="noopener noreferrer">this link</a> for more details on the field meanings.</td></tr><tr style="height: 24px;"><td style="height: 24px; width: 6.31001%;">Output</td><td style="height: 24px; width: 12.6886%;"><code>currentVoyage</code></td><td style="height: 24px; width: 15.3635%;"><code>Voyage</code></td><td style="height: 24px; width: 64.7462%;">Latest/current vessel voyage</td></tr><tr style="height: 24px;"><td style="height: 24px; width: 6.31001%;">Output</td><td style="height: 24px; width: 12.6886%;"><code>id</code></td><td style="height: 24px; width: 15.3635%;"><code>ID</code></td><td style="height: 24px; width: 64.7462%;">Spire internal vessel identifier.</td></tr><tr style="height: 24px;"><td style="height: 24px; width: 6.31001%;">Output</td><td style="height: 24px; width: 12.6886%;"><code>lastPositionUpdate</code></td><td style="height: 24px; width: 15.3635%;"><code>lastPositionUpdate</code></td><td style="height: 24px; width: 64.7462%;">Latest vessel position update.</td></tr><tr style="height: 24px;"><td style="height: 24px; width: 6.31001%;">Output</td><td style="height: 24px; width: 12.6886%;"><code>accuracy</code></td><td style="height: 24px; width: 15.3635%;"><code>AisAccuracy</code></td><td style="height: 24px; width: 64.7462%;">Vessel position accuracy flag. The position accuracy flag indicates the accuracy of the fix.</td></tr><tr style="height: 24px;"><td style="height: 24px; width: 6.31001%;">Output</td><td style="height: 24px; width: 12.6886%;"><code>collectionType</code></td><td style="height: 24px; width: 15.3635%;"><code>PositionCollectionType</code></td><td style="height: 24px; width: 64.7462%;">Data source of position update. Three possible values: DYNAMIC, SATELLITE, TERRESTRIAL.</td></tr><tr style="height: 24px;"><td style="height: 24px; width: 6.31001%;">Output</td><td style="height: 24px; width: 12.6886%;"><code>course</code></td><td style="height: 24px; width: 15.3635%;"><code>Float</code></td><td style="height: 24px; width: 64.7462%;">Vessel course</td></tr><tr style="height: 24px;"><td style="height: 24px; width: 6.31001%;">Output</td><td style="height: 24px; width: 12.6886%;"><code>heading</code></td><td style="height: 24px; width: 15.3635%;"><code>Float</code></td><td style="height: 24px; width: 64.7462%;">Vessel directional heading (°)</td></tr><tr style="height: 24px;"><td style="height: 24px; width: 6.31001%;">Output</td><td style="height: 24px; width: 12.6886%;"><code>latitude</code></td><td style="height: 24px; width: 15.3635%;"><code>Float</code></td><td style="height: 24px; width: 64.7462%;">Geographical position &#8211; latitude (°)</td></tr><tr style="height: 24px;"><td style="height: 24px; width: 6.31001%;">Output</td><td style="height: 24px; width: 12.6886%;"><code>longitude</code></td><td style="height: 24px; width: 15.3635%;"><code>Float</code></td><td style="height: 24px; width: 64.7462%;">Geographical position &#8211; longitude (°)</td></tr><tr style="height: 24px;"><td style="height: 24px; width: 6.31001%;">Output</td><td style="height: 24px; width: 12.6886%;"><code>maneuver</code></td><td style="height: 24px; width: 15.3635%;"><code>AisManeuverIndicator</code></td><td style="height: 24px; width: 64.7462%;">Vessel special maneuver indicator. See <code>maneuver</code> in the Output section for the AisManeuverIndicator enumeration details.</td></tr><tr style="height: 48px;"><td style="height: 48px; width: 6.31001%;">Output</td><td style="height: 48px; width: 12.6886%;"><code>navigationalStatus</code></td><td style="height: 48px; width: 15.3635%;"><code>AisNavigationStatus</code></td><td style="height: 48px; width: 64.7462%;">Navigational Status in an AIS message. See this FAQ for more information: <a href="https://faq.spire.com/how-to-interpret-navigational-status" target="_blank" rel="noopener noreferrer">https://faq.spire.com/how-to-interpret-navigational-status</a>. See <code>AisNavigationStatus</code> in the Output section for the AisNavigationStatus enumeration details.</td></tr><tr style="height: 24px;"><td style="height: 24px; width: 6.31001%;">Output</td><td style="height: 24px; width: 12.6886%;"><code>rot</code></td><td style="height: 24px; width: 15.3635%;"><code>Float</code></td><td style="height: 24px; width: 64.7462%;">Vessel rate of turn (°/min)</td></tr><tr style="height: 24px;"><td style="height: 24px; width: 6.31001%;">Output</td><td style="height: 24px; width: 12.6886%;"><code>speed</code></td><td style="height: 24px; width: 15.3635%;"><code>Float</code></td><td style="height: 24px; width: 64.7462%;">Vessel speed (knots)</td></tr><tr style="height: 24px;"><td style="height: 24px; width: 6.31001%;">Output</td><td style="height: 24px; width: 12.6886%;"><code>timestamp</code></td><td style="height: 24px; width: 15.3635%;"><code>DateTime</code></td><td style="height: 24px; width: 64.7462%;">Timestamp of the static or position update (ISO 8601 format).</td></tr><tr style="height: 24px;"><td style="height: 24px; width: 6.31001%;">Output</td><td style="height: 24px; width: 12.6886%;"><code>updateTimestamp</code></td><td style="height: 24px; width: 15.3635%;"><code>DateTime</code></td><td style="height: 24px; width: 64.7462%;">Timestamp of the update being processed (ISO 8601 format).</td></tr><tr style="height: 24px;"><td style="height: 24px; width: 6.31001%;">Output</td><td style="height: 24px; width: 12.6886%;"><code>staticData</code></td><td style="height: 24px; width: 15.3635%;"><code>VesselStaticData</code></td><td style="height: 24px; width: 64.7462%;">Vessel static information.</td></tr><tr style="height: 24px;"><td style="height: 24px; width: 6.31001%;">Output</td><td style="height: 24px; width: 12.6886%;"><code>aisClass</code></td><td style="height: 24px; width: 15.3635%;"><code>AisClass</code></td><td style="height: 24px; width: 64.7462%;">Vessel AIS class, A or B. See <code>AisClass</code> in the Output section for the AisClass enumeration details.</td></tr><tr style="height: 24px;"><td style="height: 24px; width: 6.31001%;">Output</td><td style="height: 24px; width: 12.6886%;"><code>dimensions</code></td><td style="height: 24px; width: 15.3635%;"><code>VesselDimensions</code></td><td style="height: 24px; width: 64.7462%;">Vessel dimensions</td></tr><tr style="height: 24px;"><td style="height: 24px; width: 6.31001%;">Output</td><td style="height: 24px; width: 12.6886%;"><code>a</code></td><td style="height: 24px; width: 15.3635%;"><code>Int</code></td><td style="height: 24px; width: 64.7462%;">Antenna distance to bow (meters)</td></tr><tr style="height: 24px;"><td style="height: 24px; width: 6.31001%;">Output</td><td style="height: 24px; width: 12.6886%;"><code>b</code></td><td style="height: 24px; width: 15.3635%;"><code>Int</code></td><td style="height: 24px; width: 64.7462%;">Antenna distance to stern (meters)</td></tr><tr style="height: 24px;"><td style="height: 24px; width: 6.31001%;">Output</td><td style="height: 24px; width: 12.6886%;"><code>c</code></td><td style="height: 24px; width: 15.3635%;"><code>Int</code></td><td style="height: 24px; width: 64.7462%;">Antenna distance to port (meters)</td></tr><tr style="height: 24px;"><td style="height: 24px; width: 6.31001%;">Output</td><td style="height: 24px; width: 12.6886%;"><code>d</code></td><td style="height: 24px; width: 15.3635%;"><code>Int</code></td><td style="height: 24px; width: 64.7462%;">Antenna distance to starboard (meters)</td></tr><tr style="height: 24px;"><td style="height: 24px; width: 6.31001%;">Output</td><td style="height: 24px; width: 12.6886%;"><code>length</code></td><td style="height: 24px; width: 15.3635%;"><code>Int</code></td><td style="height: 24px; width: 64.7462%;">Vessel length (meters)</td></tr><tr style="height: 24px;"><td style="height: 24px; width: 6.31001%;">Output</td><td style="height: 24px; width: 12.6886%;"><code>width</code></td><td style="height: 24px; width: 15.3635%;"><code>Int</code></td><td style="height: 24px; width: 64.7462%;">Vessel width (meters)</td></tr><tr style="height: 24px;"><td style="height: 24px; width: 6.31001%;">Output</td><td style="height: 24px; width: 12.6886%;"><code>shipSubType</code></td><td style="height: 24px; width: 15.3635%;"><code>ShipSubType</code></td><td style="height: 24px; width: 64.7462%;">Subtype of the ship and cargo. See <code>ShipSubType</code> in the Output section for the ShipSubType enumeration details.</td></tr><tr style="height: 24px;"><td style="height: 24px; width: 6.31001%;">Output</td><td style="height: 24px; width: 12.6886%;"><code>pageInfo</code></td><td style="height: 24px; width: 15.3635%;"><code>PageInfo</code></td><td style="height: 24px; width: 64.7462%;">Information to aid in pagination.</td></tr><tr style="height: 48px;"><td style="height: 48px; width: 6.31001%;">Output</td><td style="height: 48px; width: 12.6886%;"><code>endCursor</code></td><td style="height: 48px; width: 15.3635%;"><code>String</code></td><td style="height: 48px; width: 64.7462%;">When paginating forwards, the cursor continues. This is a cursor pointing to the last element in <code>nodes</code>. Pass this value to <code>after</code> argument to continue pagination on next page.</td></tr><tr style="height: 48px;"><td style="height: 48px; width: 6.31001%;">Output</td><td style="height: 48px; width: 12.6886%;"><code>hasNextPage</code></td><td style="height: 48px; width: 15.3635%;"><code>Boolean</code></td><td style="height: 48px; width: 64.7462%;">The <code>hasNextPage</code> property indicates whether there are more results to paginate through. Use the <code>endCursor</code> to page through the next results.</td></tr><tr style="height: 24px;"><td style="height: 24px; width: 6.31001%;">Output</td><td style="height: 24px; width: 12.6886%;"><code>totalCount </code></td><td style="height: 24px; width: 15.3635%;"><code>ResultCount</code></td><td style="height: 24px; width: 64.7462%;">Indicates how many results match the query.</td></tr><tr style="height: 24px;"><td style="height: 24px; width: 6.31001%;">Output</td><td style="height: 24px; width: 12.6886%;"><code>relation </code></td><td style="height: 24px; width: 15.3635%;"><code>ResultCountRelation</code></td><td style="height: 24px; width: 64.7462%;">Either <code>EQUAL</code> or <code>LOWER_OR_EQUAL</code></td></tr><tr style="height: 48px;"><td style="height: 48px; width: 6.31001%;">Output</td><td style="height: 48px; width: 12.6886%;"><code>value </code></td><td style="height: 48px; width: 15.3635%;"><code>Int</code></td><td style="height: 48px; width: 64.7462%;">Information about the amount of results in a query. The indicated value might be a lower bound if the total isn&#8217;t known when there are too many results.</td></tr><tr style="height: 24px;"><td style="height: 24px; width: 6.31001%;">Output</td><td style="height: 24px; width: 12.6886%;"><code>destination</code></td><td style="height: 24px; width: 15.3635%;"><code>String</code></td><td style="height: 24px; width: 64.7462%;">Reported destination of the vessel as entered by the captain or crew of the vessel</td></tr><tr style="height: 24px;"><td style="height: 24px; width: 6.31001%;">Output</td><td style="height: 24px; width: 12.6886%;"><code>draught</code></td><td style="height: 24px; width: 15.3635%;"><code>Float</code></td><td style="height: 24px; width: 64.7462%;">Vessel draught expressed in 1/10 meters</td></tr><tr style="height: 24px;"><td style="height: 24px; width: 6.31001%;">Output</td><td style="height: 24px; width: 12.6886%;"><code>eta</code></td><td style="height: 24px; width: 15.3635%;"><code>DateTime</code></td><td style="height: 24px; width: 64.7462%;">Estimated time of arrival reported by the vessel as entered by the captain or crew of the vessel</td></tr></tbody></table></div></div></div><div class="wrapper clearfix"><div class="col col7 feedback"> <span class="textlabel">Was this article useful?</span> <a class="givefeedback yes" href="#" data-section-id="289" data-value="1">Yes</a> <a class="givefeedback no" href="#" data-section-id="289" data-value="-1">No</a><div class="formcontainer" id="container-67b8a8794db89"></div></div></div></section><section data-id="841" id="vessel-characteristics-data-dictionary" class="level4 " data-url="https://documentation.spire.com/maritime-2-0/vessels/data-dictionary/vessel-characteristics-data-dictionary/"><div class="wrapper clearfix"><div class="col col7"><h4>Vessel characteristics data dictionary</h4><h5><code>VesselCapacity</code> fields</h5><dl><dt><code>deadweight</code> <em>integer</em></dt><dd>The difference between displacement and the empty vessel (lightweight) at any given draught</dd><dd>Available in <code>VesselCapacityBasic</code> and <code>VesselCapacityExtended</code></dd><dt><code>tpcmi</code> <em>float</em></dt><dd>Tons per Centimeter Immersion &#8211; how many tons are required to increase the draught by 1cm (useful for trying to estimate the volume of cargo onboard)</dd><dd>Available in <code>VesselCapacityExtended</code></dd><dt><code>grossTonnage</code> <em>integer</em></dt><dd>Tonnage measure of vessels based on the moulded volume of internal spaces</dd><dd>Available in <code>VesselCapacityBasic</code> and <code>VesselCapacityExtended</code></dd><dt><code>netTonnage</code> <em>integer</em></dt><dd>Vessel net tonnage</dd><dt><code>displacement</code> <em>integer</em></dt><dd>The amount of water (in tons) displaced by the ship.</dd><dd>Available in <code>VesselCapacityExtended</code></dd><dt><code>liquidCubic98Percent</code> <em>integer</em></dt><dd>The liquid cubic capacity of the cargo tanks when filled to 98% of capacity</dd><dd>Available in <code>VesselCapacityExtended</code></dd><dt><code>grainCubicCapacity</code> <em>integer</em></dt><dd>Cubic capacity (in cubic meters) of cargo holds for grain (and other loose dry commodities)</dd><dd>Available in <code>VesselCapacityExtended</code></dd><dt><code>teu</code> <em>integer</em></dt><dd>Twentyfoot Equivalent Unit (measurement of container carrying capacity)</dd><dd>Available in <code>VesselCapacityExtended</code></dd><dt><code>holdCount</code> <em>integer</em></dt><dd>No. of holds</dd><dd>Available in <code>VesselCapacityExtended</code></dd><dt><code>holdDimensions</code> <em>string</em></dt><dd>Dimensions of holds</dd><dd>Available in <code>VesselCapacityExtended</code></dd><dt><code>hatchCount</code> <em>integer</em></dt><dd>No. of hatches</dd><dd>Available in <code>VesselCapacityExtended</code></dd><dt><code>hatchDimensions</code> <em>string</em></dt><dd>Dimensions of hatches</dd><dd>Available in <code>VesselCapacityExtended</code></dd><dt><code>feu</code> <em>integer</em></dt><dd>Fortyfoot Equivalent Unit (capacity of containers of that size)</dd><dd>Available in <code>VesselCapacityExtended</code></dd><dt><code>teuSurplus</code> <em>integer</em></dt><dd>Spare TEU capacity</dd><dd>Available in <code>VesselCapacityExtended</code></dd><dt><code>teu14t</code> <em>integer</em></dt><dd>Capacity for containers of 14 tons (measurement of container carrying capacity)</dd><dd>Available in <code>VesselCapacityExtended</code></dd><dt><code>laneMeters</code> <em>integer</em></dt><dd>Lane meter capacity</dd><dd>Available in <code>VesselCapacityExtended</code></dd><dt><code>cars</code> <em>integer</em></dt><dd>Car carrying capacity</dd><dd>Available in <code>VesselCapacityExtended</code></dd><dt><code>passengers</code> <em>integer</em></dt><dd>Passenger capacity</dd><dd>Available in <code>VesselCapacityExtended</code></dd><dt><code>reeferCubic</code> <em>integer</em></dt><dd>Cubic meter capacity of the refrigerated cargo space</dd><dd>Available in <code>VesselCapacityExtended</code></dd></dl><h5><code>VesselDesign</code> fields</h5><dl><dt><code>isCoated</code> <em>boolean</em></dt><dd>Indicates if the vessel tanks are coated (Yes/No)</dd><dd>Available in <code>VesselCapacityExtended</code></dd><dt><code>isGearless</code> <em>boolean</em></dt><dd>Indicates if the vessel has no lifting gear (Yes/No)</dd><dd>Available in <code>VesselCapacityExtended</code></dd><dt><code>isSelfUnloading</code> <em>boolean</em></dt><dd>Indicates if the vessel is self-unloading (Yes/No)</dd><dd>Available in <code>VesselCapacityExtended</code></dd><dt><code>gearDisplay</code> <em>string</em></dt><dd>Details of lifting gear</dd><dd>Available in <code>VesselCapacityExtended</code></dd><dt><code>gearMaxSwl</code> <em>float</em></dt><dd>Safe working load (lifting capacity) of the lifting gear</dd><dd>Available in <code>VesselCapacityExtended</code></dd><dt><code>reeferPointCount</code> <em>integer</em></dt><dd>No. of plug-in points for refrigerated containers</dd><dd>Available in <code>VesselCapacityExtended</code></dd><dt><code>hullTypeCode</code> <em>string</em></dt><dd>Indicates if single or double hull or bottom</dd><dd>Available in <code>VesselCapacityExtended</code></dd></dl><h5><code>VesselDimensions</code> fields</h5><dl><dt><code>draught</code> <em>float</em></dt><dd> Distance between the waterline and keel</dd><dd>Available in <code>VesselCapacityExtended</code></dd><dt><code>lengthOverall</code> <em>float</em></dt><dd>Length overall</dd><dd>Available in <code>VesselCapacityExtended</code></dd><dt><code>airDraught</code> <em>float</em></dt><dd>Distance from the waterline to highest point on vessel</dd><dd>Available in <code>VesselCapacityExtended</code></dd><dt><code>keelToManifold</code> <em>float</em></dt><dd>Distance from the keel to the manifold</dd><dd>Available in <code>VesselCapacityExtended</code></dd><dt><code>depth</code> <em>float</em></dt><dd>Depth (from the deck to keel)</dd><dd>Available in <code>VesselCapacityExtended</code></dd><dt><code>beamMoulded</code> <em>float</em></dt><dd>Beam moulded</dd><dd>Available in <code>VesselCapacityExtended</code></dd><dt><code>berthCount</code> <em>integer</em></dt><dd>No. of sleeping berths</dd><dd>Available in <code>VesselCapacityExtended</code></dd></dl><h5><code>vesselHistory</code> fields</h5><dl><dt><code>vesselNameDate</code> <em>datetime</em></dt><dd>Date vessel&#8217;s name became active (for history of name changes, etc.)</dd><dd>Available in <code>VesselCapacityExtended</code></dd><dt><code>builtYear</code> <em>integer</em></dt><dd>Year the vessel was delivered from the shipyard to its owner</dd><dd>Available in <code>VesselCapacityBasic</code> and <code>VesselCapacityExtended</code></dd><dt><code>deadYear</code> <em>integer</em></dt><dd>Year the vessels was broken or lost</dd><dd>Available in <code>VesselCapacityExtended</code></dd><dt><code>shipBuilder</code> <em>string</em></dt><dd>Name of the ship builder</dd><dd>Available in <code>VesselCapacityExtended</code></dd><dt><code>hullNumber</code> <em>string</em></dt><dd>Hull number assigned by the shipyard</dd><dd>Available in <code>VesselCapacityExtended</code></dd><dt><code>registeredOwner</code> <em>string</em></dt><dd>Registered owner</dd><dd>Available in <code>VesselCapacityExtended</code></dd><dt><code>commercialOwner</code> <em>string</em></dt><dd>Commercial owner</dd><dd>Available in <code>VesselCapacityExtended</code></dd><dt><code>keelLaidYear</code> <em>integer</em></dt><dd>Date keel laid (keel laying is when construction of the vessel begins)</dd><dd>Available in <code>VesselCapacityExtended</code></dd><dt><code>launchYear</code> <em>integer</em></dt><dd>Launch year (year the vessel was launched from the shipyard for sea trials)</dd><dd>Available in <code>VesselCapacityExtended</code></dd></dl><h5><code>VesselPropulsion</code> fields</h5><dl><dt><code>mainEngineCount</code> <em>integer</em></dt><dd>Number of main engines</dd><dd>Available in <code>VesselCapacityExtended</code></dd><dt><code>mainEngineDesigner</code> <em>string</em></dt><dd>Engine designer</dd><dd>Available in <code>VesselCapacityExtended</code></dd><dt><code>propulsionType</code> <em>string</em></dt><dd>Propulsion type code</dd><dd>Available in <code>VesselCapacityExtended</code></dd><dt><code>engineDesignation</code> <em>string</em></dt><dd>Engine design identifier</dd><dd>Available in <code>VesselCapacityExtended</code></dd><dt><code>mcoRpm</code> <em>integer</em></dt><dd>Maximum continuous output in RPM (rotations per minute)</dd><dd>Available in <code>VesselCapacityExtended</code></dd><dt><code>mcoKw</code> <em>integer</em></dt><dd>Maximum continuous output in KW (kiloWatts)</dd><dd>Available in <code>VesselCapacityExtended</code></dd><dt><code>mcoHp</code> <em>integer</em></dt><dd>Maximum continuous output in HP (horsepower)</dd><dd>Available in <code>VesselCapacityExtended</code></dd><dt><code>propellerCount</code> <em>integer</em></dt><dd>Number of propellers</dd><dd>Available in <code>VesselCapacityExtended</code></dd><dt><code>propellerType</code> <em>string</em></dt><dd>Propeller type</dd><dd>Available in <code>VesselCapacityExtended</code></dd><dt><code>bowThrusterCount</code> <em>integer</em></dt><dd>No. of bow thrusters</dd><dd>Available in <code>VesselCapacityExtended</code></dd><dt><code>sternThrusterCount</code> <em>integer</em></dt><dd>No. of stern thrusters</dd><dd>Available in <code>VesselCapacityExtended</code></dd></dl><h5><code>VesselRegistration</code> fields</h5><dl><dt><code>class1Code</code> <em>string</em></dt><dd>The name of the classification society who inspects the vessel and awards statutory certificates</dd><dd>Available in <code>VesselCapacityExtended</code></dd><dt><code>class2Code</code> <em>string</em></dt><dd>The name of the secondary classification society who certificates dual classed vessels</dd><dd>Available in <code>VesselCapacityExtended</code></dd><dt><code>classDetails</code> <em>string</em></dt><dd>Vessel class details</dd><dd>Available in <code>VesselCapacityExtended</code></dd><dt><code>isIceClassed</code> <em>boolean</em></dt><dd>Indicates if the vessel is ice classed (Yes/No)</dd><dd>Available in <code>VesselCapacityExtended</code></dd><dt><code>iceClass</code> <em>string</em></dt><dd>Ice class type</dd><dd>Available in <code>VesselCapacityExtended</code></dd><dt><code>certificates</code> <em>string</em></dt><dd>Details of any certificates issued</dd><dd>Available in <code>VesselCapacityExtended</code></dd></dl><h5><code>VesselTypeAndTrading</code> fields</h5><dl><dt><code>vesselSubType</code> <em>string</em></dt><dd>Specific subtype of vessel</dd><dd>Available in <code>VesselCapacityBasic</code> and <code>VesselCapacityExtended</code></dd><dt><code>tradingCategoryCode</code> <em>TradingCategoryCode</em></dt><dd>Identifies if a vessel is In Service, Dead or Newbuilding</dd><dd>Available in <code>VesselCapacityExtended</code></dd><dt><code>tradingStatusCode</code> <em>TradingStatusCode</em></dt><dd>Vessel trading status</dd><dd>Available in <code>VesselCapacityExtended</code></dd></dl><h5><code>VesselBunker</code> fields</h5><dl><dt><code>bunkers</code> <em>array of VesselFuelBunker</em></dt><dd>Array containing one or multiple bunker (fuel tank) characteristics. Contains the following information for each available bunker:</p><ul><li><code>capacity</code> <em>integer</em>: Bunker (fuel tank) capacity</li><li><code>fuelTypeCode</code> <em>string</em>: Bunker fuel type. Possible values include:<ul><li><strong>MGO (Marine gas oil)</strong>: Roughly equivalent to no. 2 fuel oil, made from distillate only</li><li><strong>MDO (Marine diesel oil)</strong>: Roughly equivalent to no. 3 fuel oil, a blend of heavy gasoil that may contain very small amounts of black refinery feed stocks, but has a low viscosity up to 12 cSt so it need not be heated for use in internal combustion engines</li><li><strong>IFO (Intermediate fuel oil)</strong>: Roughly equivalent no. 4 fuel oil, a blend of gasoil and heavy fuel oil, with less gasoil than marine diesel oil</li><li><strong>HFO (Heavy fuel oil)</strong>: Pure or nearly pure residual oil, roughly equivalent to no. 5 and no. 6 fuel oil</li><li><strong>NSFO (Navy special fuel oil)</strong>: Another name for no. 5 HFO</li><li><strong>MFO (Marine fuel oil)</strong>: Another name for no. 6 HFO</li></ul></li><li><code>fuelUnitCode</code> <em>string</em>: Bunker fuel unit (e.g. tonnes, litres)</li><li><code>tankCount</code> <em>integer</em>: Number of bunker fuel tanks</li></ul></dd><dd>Available in <code>VesselCapacityExtended</code></dd><dt><code>range</code> <em>integer</em></dt><dd>Sailing range of the vessel assuming full fuel tanks</dd><dd>Available in <code>VesselCapacityExtended</code></dd></dl></div></div><div class="wrapper clearfix"><div class="col col7 feedback"> <span class="textlabel">Was this article useful?</span> <a class="givefeedback yes" href="#" data-section-id="841" data-value="1">Yes</a> <a class="givefeedback no" href="#" data-section-id="841" data-value="-1">No</a><div class="formcontainer" id="container-67b8a8794ea98"></div></div></div></section><section data-id="1278" id="quickstart-kit" class="level3 " data-url="https://documentation.spire.com/maritime-2-0/vessels/quickstart-kit/"><div class="wrapper clearfix"><div class="col col7"><h3>Quickstart kit - vessels</h3><p>Get started by copying, editing (remove unnecessary fields, change example arguments), and using these Maritime 2.0 request bodies. Each is presented here in fully formatted JSON for legibility; though, this formatting is not required in actual usage.</p><div class="codebox"><div class="title">All &#8216;vessels&#8217; query arguments with examples</div><div class="code"><pre><code data-prismjs-copy="Copy to clipboard">query {   query_name: vessels(       mmsi: [372934000,477652300,477056400]       imo: [9335173,9516428,9334923]       name: ["COSCO BOSTON","COSCO ENGLAND","COSCO OCEANIA"]       callsign: ["3ELF2","VRML8","VRDQ5"]       shipType: [CONTAINER,DRY_BULK]       flag: ["PA","HK"]       lastTimestamp:{           startTime:"2023-03-01T12:00:00.00Z"           endTime:"2023-03-01T23:59:59.00Z" #optional       }       lastUpdate:{           startTime:"2023-03-01T00:00:00.00Z"           endTime:"2023-03-01T23:59:59.00Z" #optional       }       lastPositionUpdate:{           startTime:"2023-03-01T00:00:00.00Z"           endTime:"2023-03-01T23:59:59.00Z" #optional       }       areaOfInterest:{           polygon:{ #GeoJSON example               type:"Polygon"               coordinates:[                   [                       [-130.2018527535319,36.178716438196346],                       [-133.424291441762,31.52165477752115],                       [-122.92259393101197,28.00084022579476],                       [-114.49246414840994,29.58924671251927],                       [-118.11770767266884,34.867432471412144],                       [-130.2018527535319,36.178716438196346]                 ]             ]           }       }       after: "ZTAyODg0Yzkt..." #endCursor from previous call       first: 100   )   { nodes { id staticData { name } } } }</code></pre></div></div><p>&nbsp;</p><div class="codebox"><div class="title">All response fields for &#8216;vessels&#8217; root query</div><div class="code"><div><pre><code data-prismjs-copy="Copy to clipboard">query { query_name: vessels( first: 10 ) { pageInfo { #pagination details hasNextPage endCursor } totalCount { #recordset details value relation } nodes { id staticData { imo mmsi flag name callsign timestamp shipType dimensions { a b c d width length } } lastPositionUpdate { collectionType course heading latitude longitude navigationalStatus rot speed timestamp updateTimestamp } currentVoyage { destination draught eta timestamp } characteristics { basic { capacity { deadweight grossTonnage } history { builtYear } vesselTypeAndTrading { vesselSubtype } } } } } } </code></pre></div></div></div><p>&nbsp;</p><div class="codebox"><div class="title">All response fields for &#8216;vessels&#8217; extended vessel characteristics</div><div class="code"><div><pre><code data-prismjs-copy="Copy to clipboard">query { query_name: vessels( first:10 shipType:[CONTAINER] ) { nodes { staticData {mmsi} characteristics { extended { capacity { deadweight tpcmi netTonnage grossTonnage displacement liquidCubic98Percent grainCubicCapacity teu holdCount holdDimensions hatchCount hatchDimensions feu teuSurplus teu14t laneMeters cars passengers reeferCubic } design { isCoated isGearless isSelfUnloading gearDisplay gearMaxSwl reeferPointCount hullTypeCode } dimensions { draught lengthOverall airDraught keelToManifold depth beamMoulded berthCount } history { vesselNameDate builtYear deadYear shipBuilder hullNumber registeredOwner commercialOwner #available from 2022-01-26 keelLaidYear launchYear } propulsion { mainEngineCount mainEngineDesigner propulsionType engineDesignation mcoRpm mcoKw mcoHp propellerCount propellerType bowThrusterCount sternThrusterCount } registration { class1Code class2Code classDetails isIceClassed iceClass certificates } vesselTypeAndTrading { vesselSubtype tradingCategoryCode tradingStatusCode } bunker { bunkers { capacity fuelTypeCode fuelUnitCode tankCount } range } } } } } } </code></pre></div></div></div></div><div class="col col1">&nbsp;</div><div class="col col4"><div class="codebox"><div class="title">All &#8216;vessels&#8217; query arguments (reduced formatting)</div><div class="code"><div><pre><code data-prismjs-copy="Copy to clipboard">query {   vessels(mmsi: [] imo: [] name: [] callsign: [] shipType: [] flag: []       lastTimestamp:{startTime:"" endTime:""}       lastUpdate:{startTime:"" endTime:""}       lastPositionUpdate:{startTime:"" endTime:""}       areaOfInterest:{polygon:{type:"Polygon" coordinates:[[]]}}       after: ""       first: 100)   {nodes {id staticData{name}}} }</code></pre></div></div></div><p>&nbsp;</p><div class="codebox"><div class="title">All response fields for &#8216;vessels&#8217; root query (reduced formatting)</div><div class="code"><div><pre><code data-prismjs-copy="Copy to clipboard">query { vessels( first: 10) { pageInfo {hasNextPage endCursor} totalCount {value relation} nodes {id staticData {imo mmsi flag name callsign timestamp shipType dimensions {a b c d width length}} lastPositionUpdate {collectionType course heading latitude longitude navigationalStatus rot speed timestamp updateTimestamp} currentVoyage {destination draught eta timestamp} characteristics {basic {capacity {deadweight grossTonnage} history {builtYear} vesselTypeAndTrading {vesselSubtype}}} } } } </code></pre></div></div></div><p>&nbsp;</p><div class="codebox"><div class="title">All response fields for &#8216;vessels&#8217; extended vessel characteristics (reduced formatting)</div><div class="code"><div><pre><code data-prismjs-copy="Copy to clipboard">query { vessels(first:10 shipType:[CONTAINER]) { nodes {staticData {mmsi} characteristics {extended { capacity {deadweight tpcmi netTonnage grossTonnage displacement liquidCubic98Percent grainCubicCapacity teu holdCount holdDimensions hatchCount hatchDimensions feu teuSurplus teu14t laneMeters cars passengers reeferCubic} design {isCoated isGearless isSelfUnloading gearDisplay gearMaxSwl reeferPointCount hullTypeCode} dimensions {draught lengthOverall airDraught keelToManifold depth beamMoulded berthCount} history {vesselNameDate builtYear deadYear shipBuilder hullNumber registeredOwner commercialOwner keelLaidYear launchYear} propulsion {mainEngineCount mainEngineDesigner propulsionType engineDesignation mcoRpm mcoKw mcoHp propellerCount propellerType bowThrusterCount sternThrusterCount} registration {class1Code class2Code classDetails isIceClassed iceClass certificates} vesselTypeAndTrading {vesselSubtype tradingCategoryCode tradingStatusCode} bunker {bunkers {capacity fuelTypeCode fuelUnitCode tankCount} range}}} } } } </code></pre></div></div></div></div></div><div class="wrapper clearfix"><div class="col col7 feedback"> <span class="textlabel">Was this article useful?</span> <a class="givefeedback yes" href="#" data-section-id="1278" data-value="1">Yes</a> <a class="givefeedback no" href="#" data-section-id="1278" data-value="-1">No</a><div class="formcontainer" id="container-67b8a8794ef10"></div></div></div></section><section data-id="937" id="port-events" class="level2 " data-url="https://documentation.spire.com/maritime-2-0/port-events/"><div class="wrapper clearfix"><div class="col col7"><h2>Port Events</h2><p><span dir="ltr" role="presentation">With the Port Events API you can </span><span dir="ltr" role="presentation">monitor live and historical (going back up to 6th September 2022) vessel </span><span dir="ltr" role="presentation">arrival and departure times in ports, </span><span dir="ltr" role="presentation">anchorages, terminals and canals. Port Events are captured for the aforementioned locations and all vessel types.</span></p><p>There are two root queries for port events that can be called. The queries are as follows:</p><dl><dt><a href="#porteventsbyvessel"><code>portEventsByVessel</code></a></dt><dd>Get open/closed/all port events for specific vessel, in provided locations and time range</dd><dt><a href="#porteventsbylocation"><code>portEventsByLocation</code></a></dt><dd>Get open/closed/all port events in specific location, for provided ships or ship types and time range</dd><dt><a href="#porteventsbyshiptype"><code>portEventsByShipType</code></a></dt><dd>Get open/closed/all port events for a specific shipType, for provided time range or last 24 hours</dd></dl><p>The <a href="https://api.spire.com/graphql" target="_blank" rel="noopener noreferrer">GraphQL Playground</a> can be used to navigate the documentation and see the full definition of input and output types.</p></div><div class="col col1">&nbsp;</div><div class="col col4"><div class="page" title="Page 7"><div class="section"><a href="https://documentation.spire.com/wp-content/uploads/2022/11/Screenshot-2022-11-14-at-11.10.53.png"><img decoding="async" class="aligncenter wp-image-1091" src="https://documentation.spire.com/wp-content/uploads/2022/11/Screenshot-2022-11-14-at-11.10.53.png" alt="" width="600" height="557" srcset="https://documentation.spire.com/wp-content/uploads/2022/11/Screenshot-2022-11-14-at-11.10.53.png 2474w, https://documentation.spire.com/wp-content/uploads/2022/11/Screenshot-2022-11-14-at-11.10.53-300x279.png 300w, https://documentation.spire.com/wp-content/uploads/2022/11/Screenshot-2022-11-14-at-11.10.53-1024x951.png 1024w, https://documentation.spire.com/wp-content/uploads/2022/11/Screenshot-2022-11-14-at-11.10.53-768x713.png 768w, https://documentation.spire.com/wp-content/uploads/2022/11/Screenshot-2022-11-14-at-11.10.53-1536x1427.png 1536w, https://documentation.spire.com/wp-content/uploads/2022/11/Screenshot-2022-11-14-at-11.10.53-2048x1902.png 2048w" sizes="(max-width: 600px) 100vw, 600px" /></a></div></div></div></div><div class="wrapper clearfix"><div class="col col7 feedback"> <span class="textlabel">Was this article useful?</span> <a class="givefeedback yes" href="#" data-section-id="937" data-value="1">Yes</a> <a class="givefeedback no" href="#" data-section-id="937" data-value="-1">No</a><div class="formcontainer" id="container-67b8a8794f6c0"></div></div></div></section><section data-id="942" id="porteventsbyvessel" class="level3 " data-url="https://documentation.spire.com/maritime-2-0/port-events/porteventsbyvessel/"><div class="wrapper clearfix"><div class="col col7"><h3>The <code>portEventsByVessel</code> root query</h3><p>The <code>portEventsByVessel</code> query is able to provide port events for a given vessel. One vessel can be queried at a time and filters can be applied to narrow down the result.</p><p>In order to the get the best result for a request, it is recommended to be as specific as possible with the query. The best way to do that is to use any of the available filters if applicable. In the provided example on the right the past events for a set time range for a specific type of location are requested. This would provide a more coherent history of the vessels previous ports by filtering out events from other locations such as anchorage and terminal events with each of the ports.</p></div><div class="col col1">&nbsp;</div><div class="col col4"><div class="codebox"><div class="title">Example query for a vessel</div><div class="code"><pre><code data-prismjs-copy="Copy to clipboard">query { portEventsByVessel( vessel: { mmsi: 244150617 } locations: { locationType: [PORT] } timeRange: { startTime: "2022-10-21T00:00:00Z" endTime: "2022-10-28T23:59:59Z" } state: CLOSED ) { ... } </code></pre></div></div></div></div><div class="wrapper clearfix"><div class="col col7 feedback"> <span class="textlabel">Was this article useful?</span> <a class="givefeedback yes" href="#" data-section-id="942" data-value="1">Yes</a> <a class="givefeedback no" href="#" data-section-id="942" data-value="-1">No</a><div class="formcontainer" id="container-67b8a8794fa19"></div></div></div></section><section data-id="951" id="porteventsbylocation" class="level3 " data-url="https://documentation.spire.com/maritime-2-0/port-events/porteventsbylocation/"><div class="wrapper clearfix"><div class="col col7"><h3>The <code>portEventsByLocation</code> root query</h3><p>The <code>portEventsByLocation</code> query is able to provide port events for a given location. One location can be queried at a time and filters can be applied to narrow down the result.</p><p>For the location query especially, it is recommended to use filters and be as specific as possible in the query to get the desired result. As port events for all vessel and location types are captured it is advisable to use the the shipType filter when querying a location for events of cargo vessels to exclude e.g. pilot vessels, tug boats etc. that might not be of concern. Similarly when querying for all vessels in port the location type should be specified to PORT to exclude all the separate terminal events.</p></div><div class="col col1">&nbsp;</div><div class="col col4"><div class="codebox"><div class="title">Example query for a location</div><div class="code"><pre><code data-prismjs-copy="Copy to clipboard">query { portEventsByLocation( location: { unlocode: "NLRTM", locationType: ANCHORAGE } vessels: { shipType: [GAS_CARRIER,TANKER_CHEMICALS] } timeRange: { startTime: "2022-01-28T00:00:00Z" endTime: "2022-09-10T23:59:59Z" } state: CLOSED ) { ... }</code></pre></div></div></div></div><div class="wrapper clearfix"><div class="col col7 feedback"> <span class="textlabel">Was this article useful?</span> <a class="givefeedback yes" href="#" data-section-id="951" data-value="1">Yes</a> <a class="givefeedback no" href="#" data-section-id="951" data-value="-1">No</a><div class="formcontainer" id="container-67b8a8794fd0f"></div></div></div></section><section data-id="1234" id="porteventsbyshiptype" class="level3 " data-url="https://documentation.spire.com/maritime-2-0/port-events/porteventsbyshiptype/"><div class="wrapper clearfix"><div class="col col7"><h3>The <code>portEventsByShipType</code> root query</h3><p>The <code>portEventsByShipType</code> query is able to provide port events for a given type of vessels. One shipType can be queried at a time and filters can be applied to narrow down the result.</p><p>The shipType query allows broader queries to get events for all ships of a certain type in all ports globally and can be used to track in more frequent intervals all events for e.g. CONTAINER vessels without having to indicate specific vessels or ports in the query. The returned data volumes returned by a <code>portEventsByShipType</code> query can be significantly larger than for the <code>portEventsByLocation</code> or <code>portEventsByVessel</code> and care should therefore be taken when defining a time range in the query. To ensure optimal performance, the maximum allowed time range per query is 24 hours. If no time range is specified in the query, data for the last 24 hours will be returned by default.</p></div><div class="col col1">&nbsp;</div><div class="col col4"><div class="codebox"><div class="title">Example query for a shipType</div><div class="code"><pre><code data-prismjs-copy="Copy to clipboard">query { portEventsByShipType( vessels: { shipType: GAS_CARRIER } timeRange: { startTime: "2023-01-25T23:00:00Z" endTime: "2023-01-25T23:59:59Z" } state: CLOSED ) { ... }</code></pre></div></div></div></div><div class="wrapper clearfix"><div class="col col7 feedback"> <span class="textlabel">Was this article useful?</span> <a class="givefeedback yes" href="#" data-section-id="1234" data-value="1">Yes</a> <a class="givefeedback no" href="#" data-section-id="1234" data-value="-1">No</a><div class="formcontainer" id="container-67b8a87950005"></div></div></div></section><section data-id="1075" id="querying-multiple-locations-or-vessels" class="level3 " data-url="https://documentation.spire.com/maritime-2-0/port-events/querying-multiple-locations-or-vessels/"><div class="wrapper clearfix"><div class="col col7"><h3>Querying multiple locations or vessels</h3><p>While the above queries allow the request for one location or one vessel each, the power of GraphQL can be used to combine queries and get port events for multiple vessels or locations.<br /> For more detailed information see <a href="#multiple-root-fields">GraphQL Overview Syntax -&gt; Multiple Root Queries</a>. Using <a href="#fragments">GraphQL fragments</a> can help to keep queries easier to read.</p><p>As an example you can query <strong>port events for ARA</strong> (Amsterdam, Rotterdam, Antwerp Range) by combining multiple root queries in one request.<br /> In the example the query looks for:</p><p>Locations:</p><ul><li>Port -&gt; NLAMS &#8211; <strong>Amsterdam</strong></li><li>Port -&gt; NLRTM &#8211; <strong>Rotterdam</strong></li><li>Port -&gt; BEANR &#8211; <strong>Antwerp</strong></li></ul><p>Vessels</p><ul><li><strong>Gas/Chemical Tankers</strong><ul><li>GENERAL_TANKER</li><li>TANKER_PRODUCT</li><li>GAS_CARRIER</li><li>TANKER_CHEMICALS</li></ul></li></ul><p>Date</p><ul><li><strong>10th November 2022</strong></li></ul><p>State</p><ul><li>OPEN &#8211; By default all vessels that are <strong>currently in port in the ARA range</strong> since.</li></ul></div><div class="col col1">&nbsp;</div><div class="col col4"><div class="codebox"><div class="title">Example query for multiple locations</div><div class="code"><pre><code data-prismjs-copy="Copy to clipboard">query { <strong>Amsterdam</strong>: portEventsByLocation( location: { unlocode: "NLAMS", locationType: PORT } vessels: { shipType: [GENERAL_TANKER, TANKER_PRODUCT, GAS_CARRIER, TANKER_CHEMICALS] } timeRange: { startTime: "2022-11-10T00:00:00Z", endTime: "2022-11-10T23:59:59Z" } ) { totalCount # ... } <strong>Rotterdam</strong>: portEventsByLocation( location: { unlocode: "NLRTM", locationType: PORT } vessels: { shipType: [GENERAL_TANKER, TANKER_PRODUCT, GAS_CARRIER, TANKER_CHEMICALS] } timeRange: { startTime: "2022-11-10T00:00:00Z", endTime: "2022-11-10T23:59:59Z" } ) { totalCount #... } <strong>Antwerp</strong>: portEventsByLocation( location: { unlocode: "BEANR", locationType: PORT } vessels: { shipType: [GENERAL_TANKER, TANKER_PRODUCT, GAS_CARRIER, TANKER_CHEMICALS] } timeRange: { startTime: "2022-11-10T00:00:00Z", endTime: "2022-11-10T23:59:59Z" } ) { totalCount # ... } } </code></pre></div></div></div></div><div class="wrapper clearfix"><div class="col col7 feedback"> <span class="textlabel">Was this article useful?</span> <a class="givefeedback yes" href="#" data-section-id="1075" data-value="1">Yes</a> <a class="givefeedback no" href="#" data-section-id="1075" data-value="-1">No</a><div class="formcontainer" id="container-67b8a879503f6"></div></div></div></section><section data-id="975" id="port-events-query-arguments" class="level3 " data-url="https://documentation.spire.com/maritime-2-0/port-events/port-events-query-arguments/"><div class="wrapper clearfix"><div class="col col7"><h3>Query arguments</h3><p>All arguments for the port events queries:</p><pre><code data-prismjs-copy="Copy to clipboard">portEventsByLocation( location: <a href="#location">PortEventsLocationsInput</a> vessel: <a href="#vessel">PortEventsVesselInput</a> timeRange: <a href="#timerange">TimeRange</a> lastUpdate: <a href="#timerange">TimeRange</a> ataTimeRange: <a href="#timerange">TimeRange</a> atdTimeRange: <a href="#timerange">TimeRange</a> state: <a href="#state">PortEventStateInput</a>! = OPEN first: Int = 5000 after: String ): VesselRouteResponse</code></pre></div></div><div class="wrapper clearfix"><div class="col col7 feedback"> <span class="textlabel">Was this article useful?</span> <a class="givefeedback yes" href="#" data-section-id="975" data-value="1">Yes</a> <a class="givefeedback no" href="#" data-section-id="975" data-value="-1">No</a><div class="formcontainer" id="container-67b8a879505e0"></div></div></div></section><section data-id="979" id="port-events-vessel" class="level4 " data-url="https://documentation.spire.com/maritime-2-0/port-events/port-events-query-arguments/port-events-vessel/"><div class="wrapper clearfix"><div class="col col7"><h4>vessel: <code>PortEventsVesselInput</code></h4><p>Required when querying <code>portEventsByVessel</code></p><pre><code data-prismjs-copy="Copy to clipboard">portEventsByVessel( vessel: { mmsi: 244234000 } ... )</code></pre><p>When using <code>portEventsByLocation</code> it can be used as a filter and then needs to be used as an argument called <code>vessels</code></p></div></div><div class="wrapper clearfix"><div class="col col7 feedback"> <span class="textlabel">Was this article useful?</span> <a class="givefeedback yes" href="#" data-section-id="979" data-value="1">Yes</a> <a class="givefeedback no" href="#" data-section-id="979" data-value="-1">No</a><div class="formcontainer" id="container-67b8a8795079f"></div></div></div></section><section data-id="983" id="location" class="level4 " data-url="https://documentation.spire.com/maritime-2-0/port-events/port-events-query-arguments/location/"><div class="wrapper clearfix"><div class="col col7"><h4>location: <code>PortEventsLocationsInput </code></h4><p>A UNLOCODE is required when querying <code>portEventsByLocation</code>. All the available location types are listed in the Output Objects section type: PortLocationType</p><pre><code data-prismjs-copy="Copy to clipboard">portEventsByLocation( location: { unlocode: "NLRTM" locationType: CONTAINER_TERMINAL } ... ) </code></pre><p>When using <code>portEventsByVessel</code> it can be used as a filter and then needs to be used as an argument called <code>locations</code>.</p></div></div><div class="wrapper clearfix"><div class="col col7 feedback"> <span class="textlabel">Was this article useful?</span> <a class="givefeedback yes" href="#" data-section-id="983" data-value="1">Yes</a> <a class="givefeedback no" href="#" data-section-id="983" data-value="-1">No</a><div class="formcontainer" id="container-67b8a87950977"></div></div></div></section><section data-id="1304" id="port-events-shiptype" class="level4 " data-url="https://documentation.spire.com/maritime-2-0/port-events/port-events-query-arguments/port-events-shiptype/"><div class="wrapper clearfix"><div class="col col7"><h4>vessel: <code>PortEventsVesselInput</code></h4><p>Required when querying <code>portEventsByShipType</code>. All the available ship types are listed <a href="https://documentation.spire.com/maritime-2-0/vessels/query-arguments/shiptype/">here</a></p><pre><code data-prismjs-copy="Copy to clipboard">portEventsByShipType( vessels: { shipType: CONTAINER } ... )</code></pre><p>When using <code>portEventsByLocation</code> it can be used as a filter and then needs to be used as an argument within <code>vessels</code></p></div></div><div class="wrapper clearfix"><div class="col col7 feedback"> <span class="textlabel">Was this article useful?</span> <a class="givefeedback yes" href="#" data-section-id="1304" data-value="1">Yes</a> <a class="givefeedback no" href="#" data-section-id="1304" data-value="-1">No</a><div class="formcontainer" id="container-67b8a87950b3c"></div></div></div></section><section data-id="992" id="state" class="level4 " data-url="https://documentation.spire.com/maritime-2-0/port-events/port-events-query-arguments/state/"><div class="wrapper clearfix"><div class="col col7"><h4>state: <code>PortEventStateInput</code></h4><p>With <code>state</code> the query  can be narrowed to down to only get events in a certain state OPEN, CLOSED or ALL.</p><dl><dt><code>OPEN</code></dt><dd>Get events where a vessel has arrived at a location but not yet departed. This can be used e.g. to get vessels currently at a port.</dd><dt><code>CLOSED</code></dt><dd>Get events where a vessel has arrived at and departed from a location. This can be used e.g. to get past events.</dd><dt><code>ALL</code></dt><dd>Get all events, regardless of whether a vessels has departed from the location or not.</dd></dl><p>&nbsp;</p><p><strong>Example for querying vessels currently in port in Rotterdam</strong></p><pre><code data-prismjs-copy="Copy to clipboard">portEventsByLocation( location: { unlocode: "NLRTM" } state: OPEN ... )</code></pre></div></div><div class="wrapper clearfix"><div class="col col7 feedback"> <span class="textlabel">Was this article useful?</span> <a class="givefeedback yes" href="#" data-section-id="992" data-value="1">Yes</a> <a class="givefeedback no" href="#" data-section-id="992" data-value="-1">No</a><div class="formcontainer" id="container-67b8a87950d61"></div></div></div></section><section data-id="1008" id="porteventstimerange" class="level4 " data-url="https://documentation.spire.com/maritime-2-0/port-events/port-events-query-arguments/porteventstimerange/"><div class="wrapper clearfix"><div class="col col7"><h4>TimeRange</h4><p>There are 4 <code>TimeRange</code> filters applicable to the port events queries which each use a <code>TimeRange</code> as defined below.</p><p>The 4 <code>TimeRange</code> filters are:</p><ol><li><code>timeRange</code> which filters on the timestamp of when a position update is record in the API system. Note this is different from the position timestamp which is when the AIS position report is transmitted.</li><li><code>lastUpdate</code> which filters on the timestamp of the last reported AIS message for a vessel.</li><li><code>ataTimeRange</code> is the <b>A</b>ctual <b>T</b>ime of <b>A</b>rrival time range. With the <code>ataTimeRange</code> the query can be narrowed down to get events where a vessel arrived within the specified TimeRange.</li><li><code>atdTimeRange</code> is the <b>A</b>ctual <b>T</b>ime of <b>D</b>eparture time range. With the <code class="hljs language-undefined">atdTimeRange</code> the query can be narrowed down to get events where a vessel departed within the specified TimeRange.</li></ol><dl><dt><code>endTime</code></dt><dd>Timestamp of the end of the time range (RFC 3339 format); if omitted, the current time is used.</dd><dt><code>startTime</code></dt><dd>Timestamp of the beginning of the time range (RFC 3339 format).</dd></dl><pre><code data-prismjs-copy="Copy to clipboard">portEventsByLocation( location: { unlocode: "NLRTM" } timeRange: { startTime: "2022-10-28T00:00:00Z" endTime: "2022-10-28T23:59:59Z" } ) </code></pre><p><strong>Note! </strong><br /> For the <code>portEventsByShipType</code> query the maximum allowed time range is a duration of 24 hours between start and end date.</p></div></div><div class="wrapper clearfix"><div class="col col7 feedback"> <span class="textlabel">Was this article useful?</span> <a class="givefeedback yes" href="#" data-section-id="1008" data-value="1">Yes</a> <a class="givefeedback no" href="#" data-section-id="1008" data-value="-1">No</a><div class="formcontainer" id="container-67b8a87950fc3"></div></div></div></section><section data-id="1044" id="port-events-output-objects" class="level3 " data-url="https://documentation.spire.com/maritime-2-0/port-events/port-events-output-objects/"><div class="wrapper clearfix"><div class="col col7"><h3>Output Objects</h3><p>Available fields in the <code>PortEvent</code> output:</p><dl><dt><strong>ata</strong>: <code>DateTime</code></dt><dd>Actual time of arrival</dd><dt><strong>atd</strong>: <code>DateTime</code></dt><dd>Actual time of departure</dd><dt><strong>draughtAta</strong>: <code>Float</code></dt><dd>Vessel&#8217;s draught at the time of arrival</dd><dt><strong>draughtAtd</strong>: <code>Float</code></dt><dd>Vessel&#8217;s draught at the time of departure</dd><dt><strong>draughtChange</strong>: <code>Float</code></dt><dd>Change in draught</dd><dt><strong>duration</strong>: <code>TimeDuration</code></dt><dd>Duration of the port event</dd><dt><strong>id</strong>: <code>ID</code></dt><dd>Port event ID</dd><dt><strong>location</strong>: <code><a href="#port-events-port-event-object">PortEventLocation</a>!</code></dt><dd>Port event location</dd><dt><strong>state</strong>: <code><a href="#port-events-port-event-object">PortEventState</a>!</code></dt><dd>Port event state &#8211; open or closed</dd><dt><strong>timestamp</strong>: <code>DateTime</code></dt><dd>Time when port event was created</dd><dt><strong>updateTimestamp</strong>: <code>DateTime</code></dt><dd>Time when port event was last updated</dd><dt><strong>vessel</strong>: <code><a href="#port-events-port-event-object">PortEventVesselInfo</a>!</code></dt><dd>Vessel info at the moment of the event</dd></dl></div></div><div class="wrapper clearfix"><div class="col col7 feedback"> <span class="textlabel">Was this article useful?</span> <a class="givefeedback yes" href="#" data-section-id="1044" data-value="1">Yes</a> <a class="givefeedback no" href="#" data-section-id="1044" data-value="-1">No</a><div class="formcontainer" id="container-67b8a879512c9"></div></div></div></section><section data-id="1049" id="port-events-port-event-object" class="level4 " data-url="https://documentation.spire.com/maritime-2-0/port-events/port-events-output-objects/port-events-port-event-object/"><div class="wrapper clearfix"><div class="col col7"><h4>PortEvent</h4><p>Both root queries <code>portEventsByVessel</code> and <code>portEventsByLocation</code> return a <code>PortEvent</code> object. The non-standard objects returned in a <code>PortEvent</code> are listed below.</p><h5>location: <code>PortEventLocation</code></h5><pre><code data-prismjs-copy="Copy to clipboard">type PortEventLocation { centerPoint: GeoPoint country: String id: ID! name: String type: PortLocationType! unlocode: UNLOCODE } </code></pre><h5>vessel: <code>PortEventVesselInfo</code></h5><pre><code data-prismjs-copy="Copy to clipboard">type PortEventVesselInfo { id: ID! staticData: PortEventVesselStaticData } </code></pre><h5>staticData: <code>PortEventVesselStaticData</code></h5><pre><code data-prismjs-copy="Copy to clipboard">type PortEventVesselStaticData { callsign: String imo: IMO mmsi: MMSI name: String shipType: <a href="#shiptype">ShipType</a> } </code></pre><h5>state: <code>PortEventState</code></h5><dl><dt>OPEN</dt><dd>Port events where a vessel has arrived a location and not yet departed.</dd><dt>CLOSED</dt><dd>Port events where a vessel has completed its port stay and departed from the location</dd></dl><h5>type: <code>PortLocationType</code></h5><dl><dt>PORT</dt><dd>Port</dd><dt>ANCHORAGE</dt><dd>Anchorage</dd><dt>CONTAINER_TERMINAL</dt><dd>Container Terminal</dd><dt>DRY_BULK_TERMINAL</dt><dd>Dry Bulk Terminal</dd><dt>GAS_TERMINAL</dt><dd>Gas Terminal</dd><dt>GENERAL_CARGO_TERMINAL</dt><dd>General Cargo Terminal</dd><dt>LIQUID_BULK_TERMINAL</dt><dd>Liquid Bulk Terminal</dd><dt>PASSENGER_TERMINAL</dt><dd>Passenger Terminal</dd><dt>ROLL_ON_ROLL_OFF_TERMINAL</dt><dd>Roll On Roll Off Terminal</dd><dt>SHIPYARD</dt><dd>Shipyard</dd><dt>CANAL</dt><dd>Canal</dd></dl></div></div><div class="wrapper clearfix"><div class="col col7 feedback"> <span class="textlabel">Was this article useful?</span> <a class="givefeedback yes" href="#" data-section-id="1049" data-value="1">Yes</a> <a class="givefeedback no" href="#" data-section-id="1049" data-value="-1">No</a><div class="formcontainer" id="container-67b8a8795160e"></div></div></div></section><section data-id="1284" id="port-events_quickstart-kit" class="level3 " data-url="https://documentation.spire.com/maritime-2-0/port-events/port-events_quickstart-kit/"><div class="wrapper clearfix"><div class="col col7"><h3>Quickstart kit - portEvents</h3><p>Get started by copying, editing (remove unnecessary fields, change example arguments), and using these Maritime 2.0 request bodies. Each is presented here in fully formatted JSON for legibility; though, this formatting is not required in actual usage.</p><div class="codebox"><div class="title">All &#8216;portEventsByVessel&#8217; query arguments with examples</div><div class="code"><pre><code data-prismjs-copy="Copy to clipboard">query { by_vessel: portEventsByVessel( vessel: { #mmsi required for portEventsByVessel mmsi: 372934000 } locations: { unlocode: ["NLRTM","USLAX"] locationType: [PORT, CONTAINER_TERMINAL] area: { polygon:{ #GeoJSON example type:"Polygon" coordinates:[ [ [-130.2018527535319,36.178716438196346], [-133.424291441762,31.52165477752115], [-122.92259393101197,28.00084022579476], [-114.49246414840994,29.58924671251927], [-118.11770767266884,34.867432471412144], [-130.2018527535319,36.178716438196346] ] ] } } } timeRange: { startTime: "2023-03-01T00:00:00Z" endTime: "2023-03-01T23:59:59Z" #optional } lastUpdate: { startTime: "2023-03-01T00:00:00Z" endTime: "2023-03-01T23:59:59Z" #optional } ataTimeRange: { startTime: "2023-03-01T00:00:00Z" endTime: "2023-03-01T23:59:59Z" #optional } atdTimeRange: { startTime: "2023-03-01T00:00:00Z" endTime: "2023-03-01T23:59:59Z" #optional } state: CLOSED after: "ZTAyODg0Yzkt..." #endCursor from previous call first: 100 ) { nodes { id location { name } } } } </code></pre></div></div><p>&nbsp;</p><div class="codebox"><div class="title">All &#8216;portEventsByLocation&#8217; query arguments with examples</div><div class="code"><pre><code data-prismjs-copy="Copy to clipboard">query { by_location: portEventsByLocation( location: { #unlocode required for portEventsByLocation unlocode: "NLRTM" locationType: [PORT, CONTAINER_TERMINAL] #optional } vessels: { mmsi: [372934000,477652300,477056400] shipType: [CONTAINER,DRY_BULK] } timeRange: { startTime: "2023-03-01T00:00:00Z" endTime: "2023-03-01T23:59:59Z" #optional } lastUpdate: { startTime: "2023-03-01T00:00:00Z" endTime: "2023-03-01T23:59:59Z" #optional } ataTimeRange: { startTime: "2023-03-01T00:00:00Z" endTime: "2023-03-01T23:59:59Z" #optional } atdTimeRange: { startTime: "2023-03-01T00:00:00Z" endTime: "2023-03-01T23:59:59Z" #optional } state: ALL after: "ZTAyODg0Yzkt..." #endCursor from previous call first: 100 ) { nodes { id location { name } } } } </code></pre></div></div><p>&nbsp;</p><div class="codebox"><div class="title">All &#8216;portEventsByShipType&#8217; query arguments with examples</div><div class="code"><pre><code data-prismjs-copy="Copy to clipboard">query { by_shipType: portEventsByShipType( vessels: { #shipType required for portEventsByShipType shipType: CONTAINER } locations: { unlocode: ["NLRTM","USLAX"] locationType: [PORT, CONTAINER_TERMINAL] area: { polygon:{ #GeoJSON example type:"Polygon" coordinates:[ [ [-130.2018527535319,36.178716438196346], [-133.424291441762,31.52165477752115], [-122.92259393101197,28.00084022579476], [-114.49246414840994,29.58924671251927], [-118.11770767266884,34.867432471412144], [-130.2018527535319,36.178716438196346] ] ] } } } timeRange: { startTime: "2023-03-01T00:00:00Z" endTime: "2023-03-01T23:59:59Z" #optional } lastUpdate: { startTime: "2023-03-01T00:00:00Z" endTime: "2023-03-01T23:59:59Z" #optional } ataTimeRange: { startTime: "2023-03-01T00:00:00Z" endTime: "2023-03-01T23:59:59Z" #optional } atdTimeRange: { startTime: "2023-03-01T00:00:00Z" endTime: "2023-03-01T23:59:59Z" #optional } state: CLOSED #after: "ZTAyODg0Yzkt..." #endCursor from previous call first: 100 ) { nodes { id location { name } } } } </code></pre></div></div><p>&nbsp;</p><div class="codebox"><div class="title">All response fields for any ‘portEvents&#8230;’ root query</div><div class="code"><pre><code data-prismjs-copy="Copy to clipboard">query { query_name: portEventsByLocation( location: { unlocode: "NLRTM" } state: CLOSED first: 10 ) { pageInfo { #pagination details hasNextPage endCursor } totalCount #recordset details nodes { id timestamp updateTimestamp location { id name type country unlocode centerPoint { longitude latitude } } vessel { id staticData { mmsi imo name callsign shipType } } state ata atd duration { iso seconds text } draughtChange draughtAta draughtAtd } } } </code></pre></div></div></div><div class="col col1">&nbsp;</div><div class="col col4"><div class="codebox"><div class="title">All &#8216;portEventsByVessel&#8217; query arguments (reduced formatting)</div><div class="code"><pre><code data-prismjs-copy="Copy to clipboard">query { by_vessel: portEventsByVessel(vessel: {mmsi: } locations: {unlocode: [] locationType: [] area: {polygon:{type:"Polygon" coordinates:[[[]]]}}} timeRange: {startTime: "" endTime: ""} lastUpdate: {startTime: "" endTime: ""} ataTimeRange: {startTime: "" endTime: ""} atdTimeRange: {startTime: "" endTime: ""} state: after: "" first: 100) {nodes {id location {name}}} } </code></pre></div></div><p>&nbsp;</p><div class="codebox"><div class="title">All &#8216;portEventsByLocation&#8217; query arguments (reduced formatting)</div><div class="code"><pre><code data-prismjs-copy="Copy to clipboard">query { by_location: portEventsByLocation(location: {unlocode: "" locationType: []} vessels: {mmsi: [] shipType: []} timeRange: {startTime: "" endTime: ""} lastUpdate: {startTime: "" endTime: ""} ataTimeRange: {startTime: "" endTime: ""} atdTimeRange: {startTime: "" endTime: ""} state: after: "" first: 100) {nodes {id location {name}}} } </code></pre></div></div><p>&nbsp;</p><div class="codebox"><div class="title">All &#8216;portEventsByShipType&#8217; query arguments (reduced formatting)</div><div class="code"><pre><code data-prismjs-copy="Copy to clipboard">query { by_shipType: portEventsByShipType(vessels: {shipType: } locations: {unlocode: [] locationType: [] area: {polygon:{type:"Polygon" coordinates:[[[]]]}}} timeRange: {startTime: "" endTime: ""} lastUpdate: {startTime: "" endTime: ""} ataTimeRange: {startTime: "" endTime: ""} atdTimeRange: {startTime: "" endTime: ""} state: after: "" first: 100) {nodes {id location {name}}} } </code></pre></div></div><p>&nbsp;</p><div class="codebox"><div class="title">All response fields for any ‘portEvents&#8230;’ root query (reduced formatting)</div><div class="code"><pre><code data-prismjs-copy="Copy to clipboard">query { query_name: portEventsByLocation(location: {unlocode: "NLRTM"} first: 10) {pageInfo {hasNextPage endCursor} totalCount {value relation} nodes{id timestamp updateTimestamp location{id name type country unlocode centerPoint {longitude latitude}} vessel {id staticData{mmsi imo name callsign shipType}} state ata atd duration {iso seconds text} draughtChange draughtAta draughtAtd } } } </code></pre></div></div></div></div><div class="wrapper clearfix"><div class="col col7 feedback"> <span class="textlabel">Was this article useful?</span> <a class="givefeedback yes" href="#" data-section-id="1284" data-value="1">Yes</a> <a class="givefeedback no" href="#" data-section-id="1284" data-value="-1">No</a><div class="formcontainer" id="container-67b8a879519b4"></div></div></div></section><section data-id="1376" id="port-congestion" class="level2 " data-url="https://documentation.spire.com/maritime-2-0/port-congestion/"><div class="wrapper clearfix"><div class="col col7"><h2>Port Congestion<span class="beta_label">&nbsp;beta&nbsp;</span></h2><p>The Port Congestion GraphQL API is a comprehensive data solution that provides real-time and historical insights into port congestion for the commercial maritime industry. By offering granular and high-level metrics, it helps stakeholders identify bottlenecks, monitor port performance, and optimize maritime operations.</p></div></div><div class="wrapper clearfix"><div class="col col7 feedback"> <span class="textlabel">Was this article useful?</span> <a class="givefeedback yes" href="#" data-section-id="1376" data-value="1">Yes</a> <a class="givefeedback no" href="#" data-section-id="1376" data-value="-1">No</a><div class="formcontainer" id="container-67b8a87951b21"></div></div></div></section><section data-id="1378" id="port-congestion-query-arguments" class="level3 " data-url="https://documentation.spire.com/maritime-2-0/port-congestion/port-congestion-query-arguments/"><div class="wrapper clearfix"><div class="col col7"><h3>Query arguments</h3><p>Querying the Port Congestion API requires the use of specific parameters to customize data retrieval. A single mandatory argument (<code>port</code>) and two optional arguments (<code>vessels</code>, <code>dateRange</code>) can be specified to fine-tune your data request.</p><pre><code data-prismjs-copy="Copy to clipboard">portCongestion( port: PortCongestionPortInput! vessels: PortCongestionVesselsInput dateRange: DateRangeInput ): PortCongestionMetrics</code></pre></div></div><div class="wrapper clearfix"><div class="col col7 feedback"> <span class="textlabel">Was this article useful?</span> <a class="givefeedback yes" href="#" data-section-id="1378" data-value="1">Yes</a> <a class="givefeedback no" href="#" data-section-id="1378" data-value="-1">No</a><div class="formcontainer" id="container-67b8a87951cc9"></div></div></div></section><section data-id="1384" id="port" class="level4 " data-url="https://documentation.spire.com/maritime-2-0/port-congestion/port-congestion-query-arguments/port/"><div class="wrapper clearfix"><div class="col col7"><h4>port</h4><p>In the <code>port</code> query parameter, the desired port can be specified for which port congestion data is required. Ports are identified by the UNLOCODE which are used in line with the UNECE UN Location Codes.</p><p>&nbsp;</p><pre><code data-prismjs-copy="Copy to clipboard">portCongestion( port: {unlocode: "SGSIN"} ... )</code></pre><p>&nbsp;</p></div></div><div class="wrapper clearfix"><div class="col col7 feedback"> <span class="textlabel">Was this article useful?</span> <a class="givefeedback yes" href="#" data-section-id="1384" data-value="1">Yes</a> <a class="givefeedback no" href="#" data-section-id="1384" data-value="-1">No</a><div class="formcontainer" id="container-67b8a87951e70"></div></div></div></section><section data-id="1385" id="portcongestionvessels" class="level4 " data-url="https://documentation.spire.com/maritime-2-0/port-congestion/port-congestion-query-arguments/portcongestionvessels/"><div class="wrapper clearfix"><div class="col col7"><h4>vessels</h4><p>In the <code>vessel</code> query parameter, the relevant ship type or list of ship types can be specified for which port congestion data is required.</p><pre><code data-prismjs-copy="Copy to clipboard">portCongestion( port: {unlocode: "SGSIN"} vessels: { CONTAINER } ... )</code></pre><p>&nbsp;</p><p>Available ship types are all commercial ship types:</p><dl><dt>Supported ship types:</dt><dd>CAR_CARRIER, COMBINATION_CARRIER, GAS_CARRIER, LNG_CARRIER , LIVESTOCK, GENERAL_CARGO, CONTAINER, DRY_BULK, ROLL_ON_ROLL_OFF, REEFER, GENERAL_TANKER, TANKER_CHEMICALS, TANKER_CRUDE, TANKER_PRODUCT, VEHICLE_PASSENGER, PASSENGER</dd></dl><p>&nbsp;</p></div></div><div class="wrapper clearfix"><div class="col col7 feedback"> <span class="textlabel">Was this article useful?</span> <a class="givefeedback yes" href="#" data-section-id="1385" data-value="1">Yes</a> <a class="givefeedback no" href="#" data-section-id="1385" data-value="-1">No</a><div class="formcontainer" id="container-67b8a87952040"></div></div></div></section><section data-id="1386" id="daterange" class="level4 " data-url="https://documentation.spire.com/maritime-2-0/port-congestion/port-congestion-query-arguments/daterange/"><div class="wrapper clearfix"><div class="col col7"><h4>dateRange</h4><p>In the <code>dateRange</code> query parameter, the desired dateRange can be specified for which port congestion data is required. If no date range is provided, data for the last 24 hours will be returned.</p><p>&nbsp;</p><pre><code data-prismjs-copy="Copy to clipboard">portCongestion( port: {unlocode: "SGSIN"} dateRange: { startDate: "2023-10-08", endDate: "2023-10-10" } ... )</code></pre><p>&nbsp;</p></div></div><div class="wrapper clearfix"><div class="col col7 feedback"> <span class="textlabel">Was this article useful?</span> <a class="givefeedback yes" href="#" data-section-id="1386" data-value="1">Yes</a> <a class="givefeedback no" href="#" data-section-id="1386" data-value="-1">No</a><div class="formcontainer" id="container-67b8a879521eb"></div></div></div></section><section data-id="1393" id="data-structure" class="level3 " data-url="https://documentation.spire.com/maritime-2-0/port-congestion/data-structure/"><div class="wrapper clearfix"><div class="col col7"><h3>Data Structure</h3><p>The Port Congestion API is structured hierarchically, starting with the &#8216;portCongestion&#8217; root query. This root provides access to several metrics, such as &#8216;congestionIndex&#8217; and &#8216;vesselsInPort&#8217;. Within specific metrics, users can explore detailed data objects, for instance, &#8216;aggregate&#8217; and &#8216;byTimeInterval&#8217; associated with the &#8216;vesselsInPort&#8217; metric. These data objects further encompass a range of statistical attributes, ensuring a comprehensive analysis of each metric.</p><p><strong>Example:</strong><br /> In the below example, the average (mean) number of vessels in port for the requested time frame is returned. See the code example on the right?</p><p><img decoding="async" class="alignnone size-full wp-image-1412" src="https://documentation.spire.com/wp-content/uploads/2023/10/Port-Congestion-2.png" alt="" width="3408" height="3358" srcset="https://documentation.spire.com/wp-content/uploads/2023/10/Port-Congestion-2.png 3408w, https://documentation.spire.com/wp-content/uploads/2023/10/Port-Congestion-2-300x296.png 300w, https://documentation.spire.com/wp-content/uploads/2023/10/Port-Congestion-2-1024x1009.png 1024w, https://documentation.spire.com/wp-content/uploads/2023/10/Port-Congestion-2-768x757.png 768w, https://documentation.spire.com/wp-content/uploads/2023/10/Port-Congestion-2-1536x1513.png 1536w, https://documentation.spire.com/wp-content/uploads/2023/10/Port-Congestion-2-2048x2018.png 2048w" sizes="(max-width: 3408px) 100vw, 3408px" /></p></div><div class="col col1">&nbsp;</div><div class="col col4"><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p><p><strong>Example</strong><br /> Below is the code of the illustrated data structure example on the left:</p><div class="codebox"><div class="title">Query</div><div class="code"><pre><code data-prismjs-copy="Copy to clipboard">{ portCongestion( port: { unlocode: "USSAV" } vessels: { shipType: [CONTAINER] } ) { vesselsInPort { aggregate { mean } } } }</code></pre></div></div><p>This returns the data as follows:</p><div class="codebox"><div class="title">Response</div><div class="code"><pre><code data-prismjs-copy="Copy to clipboard">{ "data": { "portCongestion": { "vesselsInPort": { "aggregate": { "mean": 6.04166667 } } } }</code></pre></div></div></div></div><div class="wrapper clearfix"><div class="col col7 feedback"> <span class="textlabel">Was this article useful?</span> <a class="givefeedback yes" href="#" data-section-id="1393" data-value="1">Yes</a> <a class="givefeedback no" href="#" data-section-id="1393" data-value="-1">No</a><div class="formcontainer" id="container-67b8a8795283d"></div></div></div></section><section data-id="1404" id="metrics" class="level3 " data-url="https://documentation.spire.com/maritime-2-0/port-congestion/metrics/"><div class="wrapper clearfix"><div class="col col7"><h3>Metrics</h3><p>Metrics serve as the quantifiable measurements that provide insights into various aspects of port congestion. This section offers a comprehensive breakdown of all available metrics, enabling access and understanding of specific aspects of port operations and shipping behaviours.</p><dl><dt>congestionIndex</dt><dd>A composite metric providing a holistic view of port congestion</dd><dt>vesselsInPort</dt><dd>A count of commercial vessels currently located within a specified port&#8217;s boundary, available in both historical and real-time data.</dd><dt>vesselsInAnchorage</dt><dd>A tally of commercial vessels currently situated in a port&#8217;s anchorage areas, indicating the demand for berthing spaces.</dd><dt>WaitingTimeAtPort</dt><dd>The duration vessels spend at anchorage before entering the port, differentiated by ship type.</dd><dt>probabilityOfWaiting</dt><dd>A ratio indicating the likelihood of a vessel needing to wait in anchorage before docking, derived from comparing vessels having to wait before arrival with direct berthings.</dd><dt>portTurnaroundTimes</dt><dd>The time vessels spend within the port&#8217;s boundary, broken down by ship type, reflecting port operational efficiency.</dd></dl></div><div class="col col1">&nbsp;</div><div class="col col4"><pre><code data-prismjs-copy="Copy to clipboard"> { portCongestion( port: {unlocode: "NLRTM"} ) { congestionIndex { ... } vesselsInPort { ... } vesselsInAnchorage { ... } waitingTimeAtPort { ... vesselsActivity { probabilityOfWaiting { ... } } } portTurnaroundTimes { ... } } } </code></pre></div></div><div class="wrapper clearfix"><div class="col col7 feedback"> <span class="textlabel">Was this article useful?</span> <a class="givefeedback yes" href="#" data-section-id="1404" data-value="1">Yes</a> <a class="givefeedback no" href="#" data-section-id="1404" data-value="-1">No</a><div class="formcontainer" id="container-67b8a87952abf"></div></div></div></section><section data-id="1389" id="congestionindex" class="level4 " data-url="https://documentation.spire.com/maritime-2-0/port-congestion/metrics/congestionindex/"><div class="wrapper clearfix"><div class="col col7"><h4>congestionIndex</h4><p>The Port Congestion Index is a metric developed to provide a comprehensive view of port congestion levels, with the aim of supporting decision-making and improving operational efficiency. This index aggregates several essential port metrics: Vessels in Port, Vessels in Anchorage, Waiting Time at Port, Probability of Waiting, and Port Turnaround Time. To ensure a consistent representation, each of these metrics is normalized. After normalization, weights are assigned to each metric based on their significance. The weighted metrics are then combined to give a clear picture of port congestion. For ease of interpretation, the resultant data is categorized into a traffic-light style format, facilitating its integration into various systems and platforms.</p><p>&nbsp;</p><pre><code data-prismjs-copy="Copy to clipboard">type congestionIndex { latestValue: PortCongestionIndexValue byShipType: PortCongestionIndexMetricByShipType byTimeInterval: PortCongestionIndexMetricByTimeInterval }</code></pre></div><div class="col col1">&nbsp;</div><div class="col col4"><p><strong>Example</strong><br /> What is the congestion index for containerships in Rotterdam now?</p><div class="codebox"><div class="title">Query</div><div class="code"><pre><code data-prismjs-copy="Copy to clipboard">{ portCongestion( port: {unlocode: "NLRTM"}, vessels: { shipType: [CONTAINER] } ) { congestionIndex { latestValue { index level } } } } </code></pre></div></div><p>This returns the data as follows:</p><div class="codebox"><div class="title">Response</div><div class="code"><pre><code data-prismjs-copy="Copy to clipboard">{ "data": { "portCongestion": { "congestionIndex": { "latestValue": { "index": 0.20321934, "level": "LOW_CONGESTION" } } } } }</code></pre></div></div></div></div><div class="wrapper clearfix"><div class="col col7 feedback"> <span class="textlabel">Was this article useful?</span> <a class="givefeedback yes" href="#" data-section-id="1389" data-value="1">Yes</a> <a class="givefeedback no" href="#" data-section-id="1389" data-value="-1">No</a><div class="formcontainer" id="container-67b8a87952cfb"></div></div></div></section><section data-id="1377" id="vesselsinport" class="level4 " data-url="https://documentation.spire.com/maritime-2-0/port-congestion/metrics/vesselsinport/"><div class="wrapper clearfix"><div class="col col7"><h4>vesselsInPort</h4><p>The Vessels in Port metric provides a count of commercial vessels currently within a specified port polygon area. This data can be historical or real-time, depending on your query parameters. A high Vessels in Port count could signify maximum port capacity utilisation but could also be a precursor to bottlenecks. For example, a sudden uptick in Vessels in Port numbers may necessitate additional logistical planning to avert delays in offloading or reloading cargo.</p><p>&nbsp;</p><pre><code data-prismjs-copy="Copy to clipboard">type vesselsInPort { latestValue: Int aggregate: ValueMetricStatistics byShipType: PortCongestionCountMetricByShipType byTimeInterval: PortCongestionCountMetricByTimeInterval }</code></pre></div><div class="col col1">&nbsp;</div><div class="col col4"><p><strong>Example</strong><br /> How many containerships are in the port of Savannah right now?</p><div class="codebox"><div class="title">Query</div><div class="code"><pre><code data-prismjs-copy="Copy to clipboard">{ portCongestion( port: { unlocode: "USSAV" } vessels: { shipType: [CONTAINER] } ) { vesselsInPort { latestValue } } } </code></pre></div></div><p>This returns the data as follows:</p><div class="codebox"><div class="title">Response</div><div class="code"><pre><code data-prismjs-copy="Copy to clipboard">{ "data": { "portCongestion": { "vesselsInPort": { "latestValue": 6 } } } }</code></pre></div></div></div></div><div class="wrapper clearfix"><div class="col col7 feedback"> <span class="textlabel">Was this article useful?</span> <a class="givefeedback yes" href="#" data-section-id="1377" data-value="1">Yes</a> <a class="givefeedback no" href="#" data-section-id="1377" data-value="-1">No</a><div class="formcontainer" id="container-67b8a87952f31"></div></div></div></section><section data-id="1381" id="vesselsinanchorage" class="level4 " data-url="https://documentation.spire.com/maritime-2-0/port-congestion/metrics/vesselsinanchorage/"><div class="wrapper clearfix"><div class="col col7"><h4>vesselsInAnchorage</h4><p><span class="TextRun SCXW190503224 BCX0" data-contrast="auto"><span class="NormalTextRun SCXW190503224 BCX0">The Vessels in Anchorage (VIA) metric counts the number of commercial vessels currently in a port&#8217;s anchorage areas. This is vital for gauging the demand for berthing spaces and the potential backlog that may be forming. In a practical sense, a rise in VIA can flag the need for short-term measures, like prioritizing certain vessels based on cargo urgency or rerouting others to alternate anchorages.</span></span><span class="EOP SCXW190503224 BCX0" data-ccp-props="{&quot;335559685&quot;:720}"> </span></p><p>&nbsp;</p><pre><code data-prismjs-copy="Copy to clipboard">type vesselsInAnchorage { latestValue: Int aggregate: ValueMetricStatistics byShipType: PortCongestionCountMetricByShipType byTimeInterval: PortCongestionCountMetricByTimeInterval }</code></pre></div><div class="col col1">&nbsp;</div><div class="col col4"><p><strong>Example</strong><br /> How many containerships are waiting in the anchorage in Savannah?</p><div class="codebox"><div class="title">Query</div><div class="code"><pre><code data-prismjs-copy="Copy to clipboard">{ portCongestion( port: { unlocode: "USSAV" } vessels: { shipType: [CONTAINER] } ) { vesselsInAnchorage { latestValue } } } </code></pre></div></div><p>This returns the data as follows:</p><div class="codebox"><div class="title">Response</div><div class="code"><pre><code data-prismjs-copy="Copy to clipboard">{ "data": { "portCongestion": { "vesselsInAnchorage": { "latestValue": 10 } } } }</code></pre></div></div></div></div><div class="wrapper clearfix"><div class="col col7 feedback"> <span class="textlabel">Was this article useful?</span> <a class="givefeedback yes" href="#" data-section-id="1381" data-value="1">Yes</a> <a class="givefeedback no" href="#" data-section-id="1381" data-value="-1">No</a><div class="formcontainer" id="container-67b8a8795317b"></div></div></div></section><section data-id="1382" id="waitingtimeatport" class="level4 " data-url="https://documentation.spire.com/maritime-2-0/port-congestion/metrics/waitingtimeatport/"><div class="wrapper clearfix"><div class="col col7"><h4>waitingTimeAtPort</h4><p><span class="TextRun SCXW154313248 BCX0" data-contrast="auto"><span class="NormalTextRun SCXW154313248 BCX0">The Wait Time at Port (WTP) metric provides an aggregated measurement of how long vessels waited at anchorage before entering the port, and it&#8217;s often broken down by ship type. This metric uncovers inefficiencies in the transition from anchorage to port, offering insights for operational improvements. For instance, if WTP for container ships is substantially longer than for other vessel types, it may indicate </span><span class="NormalTextRun SCXW154313248 BCX0">issues at a terminal or general congestion</span><span class="NormalTextRun SCXW154313248 BCX0">.</span></span><span class="EOP SCXW154313248 BCX0" data-ccp-props="{&quot;335559685&quot;:720}"> </span></p><p>&nbsp;</p><pre><code data-prismjs-copy="Copy to clipboard">type waitingTimeAtPort { latestValue: Int aggregate: ValueMetricStatistics byShipType: PortCongestionCountMetricByShipType byTimeInterval: PortCongestionCountMetricByTimeInterval vesselsActivity: WaitAtPortVesselsActivity }</code></pre><p>&nbsp;</p><h4>probailityOfWaiting</h4><p><span data-contrast="auto">The Probability of Waiting is an essential extension of the Wait Time at Port (WTP) metric. Derived from vessel arrivals, this metric indicates the likelihood that a ship will have to wait in anchorage before being able to dock. It&#8217;s a dynamic figure obtained by dividing the number of vessels that had to wait in the anchorage before arrival by the total number of arrivals.</span></p><p><span data-contrast="auto">For example, consider a day at Port X focusing on container ships:</span><span data-ccp-props="{&quot;335559685&quot;:720}"> </span></p><p><span data-contrast="auto">Total number of vessels arrived: 57</span><span data-ccp-props="{&quot;335559685&quot;:720}"><br /> </span><span data-contrast="auto">Number of vessels arriving at port coming from the anchorage: 12</span><span data-ccp-props="{&quot;335559685&quot;:720}"><br /> </span><span data-contrast="auto">Number of vessels arriving directly at port without anchorage waiting: 45</span><span data-ccp-props="{&quot;335559685&quot;:720}"><br /> </span><span data-contrast="auto">The Probability of Waiting would be 12/57×100=21%</span><span data-ccp-props="{&quot;335559685&quot;:720}"> </span></p><p><span data-contrast="auto">This metric is invaluable for predicting operational flux and guiding short-term logistical decision-making. For instance, a high Probability of Waiting could inform a decision to reduce speed for an approaching vessel to reduce waiting time.</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559685&quot;:720,&quot;335559740&quot;:259}"> </span></p><p>&nbsp;</p><pre><code data-prismjs-copy="Copy to clipboard">type waitingTimeAtPort { vesselsActivity { probabilityOfWaiting: Float vesselsEnteredPort: Int vesslesWaitedAtAnchorage: Int }</code></pre><p>&nbsp;</p></div><div class="col col1">&nbsp;</div><div class="col col4"><p><strong>Example</strong><br /> How long are containerships waiting before berthing in Savannah? And how likely is it that they have to wait?</p><div class="codebox"><div class="title">Query</div><div class="code"><pre><code data-prismjs-copy="Copy to clipboard">{ portCongestion( port: {unlocode: "USSAV"}, vessels: {shipType: [CONTAINER]} ) { waitingTimeAtPort { aggregate { mean { text } min { text } max { text } } vesselsActivity { probabilityOfWaiting } } } } </code></pre></div></div><p>This returns the data as follows:</p><div class="codebox"><div class="title">Response</div><div class="code"><pre><code data-prismjs-copy="Copy to clipboard">{ "data": { "portCongestion": { "waitingTimeAtPort": { "aggregate": { "mean": { "text": "83h36m24s" }, "min": { "text": "41h55m18s" }, "max": { "text": "126h7m24s" } }, "vesselsActivity": { "probabilityOfWaiting": 0.66666667 } } } } }</code></pre></div></div></div></div><div class="wrapper clearfix"><div class="col col7 feedback"> <span class="textlabel">Was this article useful?</span> <a class="givefeedback yes" href="#" data-section-id="1382" data-value="1">Yes</a> <a class="givefeedback no" href="#" data-section-id="1382" data-value="-1">No</a><div class="formcontainer" id="container-67b8a879534f3"></div></div></div></section><section data-id="1383" id="portturnaroundtime" class="level4 " data-url="https://documentation.spire.com/maritime-2-0/port-congestion/metrics/portturnaroundtime/"><div class="wrapper clearfix"><div class="col col7"><h4>portTurnaroundTime</h4><p><span class="TextRun SCXW84565394 BCX0" data-contrast="auto"><span class="NormalTextRun SCXW84565394 BCX0">The Port Turnaround Time (PTT) measures the length of time a vessel spends inside the port polygon area, usually also disaggregated by ship type. It serves as a key performance indicator for the port; shorter PTT usually suggests more efficient operations. Consider a scenario where bulk carriers have a shorter PTT </span><span class="NormalTextRun SCXW84565394 BCX0">in one week and then a sudden uptick in the following week. This could indicate issues with loading gears or other operational impacts such as weather or pilot availabilities.</span></span><span class="EOP SCXW84565394 BCX0" data-ccp-props="{&quot;335559685&quot;:720}"> </span></p><p>&nbsp;</p><pre><code data-prismjs-copy="Copy to clipboard">type waitingTimeAtPort { latestValue: Int aggregate: ValueMetricStatistics byShipType: PortCongestionCountMetricByShipType byTimeInterval: PortCongestionCountMetricByTimeInterval }</code></pre></div><div class="col col1">&nbsp;</div><div class="col col4"><p><strong>Example</strong><br /> How long are containerships staying in port of Savannah on average?</p><div class="codebox"><div class="title">Query</div><div class="code"><pre><code data-prismjs-copy="Copy to clipboard">{ portCongestion( port: {unlocode: "USSAV"}, vessels: {shipType: [CONTAINER]} ) { portTurnaroundTime { aggregate { mean { text } } } } } </code></pre></div></div><p>This returns the data as follows:</p><div class="codebox"><div class="title">Response</div><div class="code"><pre><code data-prismjs-copy="Copy to clipboard">{ "data": { "portCongestion": { "portTurnaroundTime": { "aggregate": { "mean": { "text": "34h38m59s" } } } } } }</code></pre></div></div></div></div><div class="wrapper clearfix"><div class="col col7 feedback"> <span class="textlabel">Was this article useful?</span> <a class="givefeedback yes" href="#" data-section-id="1383" data-value="1">Yes</a> <a class="givefeedback no" href="#" data-section-id="1383" data-value="-1">No</a><div class="formcontainer" id="container-67b8a879537a9"></div></div></div></section><section data-id="1405" id="data-objects" class="level3 " data-url="https://documentation.spire.com/maritime-2-0/port-congestion/data-objects/"><div class="wrapper clearfix"><div class="col col7"><h3>Data Objects</h3><p>The data objects provide a variety of views on the data related to the selected metric. The data can be provided either as the &#8216;latestValue&#8217; available for a metric or the &#8216;aggregate&#8217; data available for the selected data range.</p><p>The data can also be returned broken down into either &#8216;byShipType&#8217; or &#8216;byTimeInterval&#8217;.</p></div></div><div class="wrapper clearfix"><div class="col col7 feedback"> <span class="textlabel">Was this article useful?</span> <a class="givefeedback yes" href="#" data-section-id="1405" data-value="1">Yes</a> <a class="givefeedback no" href="#" data-section-id="1405" data-value="-1">No</a><div class="formcontainer" id="container-67b8a8795393a"></div></div></div></section><section data-id="1406" id="latestvalue" class="level4 " data-url="https://documentation.spire.com/maritime-2-0/port-congestion/data-objects/latestvalue/"><div class="wrapper clearfix"><div class="col col7"><h4>latestValue</h4><p>Providing the latestValue for a given count metric.</p><dl><dt>latestValue</dt><dd>Returns the most recent value for a given metric as an integer</dd><dt>PortCongestionIndexValue</dt><dd>Returns the most recent or requested value of the congestion index</dd></dl></div><div class="col col1">&nbsp;</div><div class="col col4"><p><strong>Example</strong><br /> What is the congestion index for containerships in Rotterdam now?</p><div class="codebox"><div class="title">Query</div><div class="code"><pre><code data-prismjs-copy="Copy to clipboard">{ portCongestion( port: {unlocode: "NLRTM"}, vessels: { shipType: [CONTAINER] } ) { congestionIndex { latestValue { index level } } } } </code></pre></div></div><p>This returns the data as follows:</p><div class="codebox"><div class="title">Response</div><div class="code"><pre><code data-prismjs-copy="Copy to clipboard">{ "data": { "portCongestion": { "congestionIndex": { "latestValue": { "index": 0.20321934, "level": "LOW_CONGESTION" } } } } }</code></pre></div></div></div></div><div class="wrapper clearfix"><div class="col col7 feedback"> <span class="textlabel">Was this article useful?</span> <a class="givefeedback yes" href="#" data-section-id="1406" data-value="1">Yes</a> <a class="givefeedback no" href="#" data-section-id="1406" data-value="-1">No</a><div class="formcontainer" id="container-67b8a87953b7b"></div></div></div></section><section data-id="1409" id="aggregate" class="level4 " data-url="https://documentation.spire.com/maritime-2-0/port-congestion/data-objects/aggregate/"><div class="wrapper clearfix"><div class="col col7"><h4>aggregate</h4><p>Providing aggregated data for the requested date range.</p><ul><li>If no specific ship types are queried, statistics for all types are returned.</li><li>If specific ship types are selected, the aggregate values for those types are returned.</li></ul><dl><dt>DurationMetricStatistics</dt><dd>Returns aggregated duration statistics</dd><dt>ValueMetricStatistics</dt><dd>Returns aggregated count statistics</dd></dl></div><div class="col col1">&nbsp;</div><div class="col col4"><p><strong>Example</strong><br /> How many containerships are typically in Singapore?</p><div class="codebox"><div class="title">Query</div><div class="code"><pre><code data-prismjs-copy="Copy to clipboard">{ portCongestion( port: { unlocode: "SGSIN" } vessels: { shipType: [CONTAINER] } dateRange: { startDate: "2023-09-01" endDate: "2023-09-07" } ) { vesselsInPort { aggregate { mean median min max range } } } } </code></pre></div></div><p>This returns the data as follows:</p><div class="codebox"><div class="title">Response</div><div class="code"><pre><code data-prismjs-copy="Copy to clipboard">{ "data": { "portCongestion": { "vesselsInPort": { "aggregate": { "mean": 41.25, "median": 41.0, "min": 33.0, "max": 50.0, "range": 17.0 } } } } }</code></pre></div></div></div></div><div class="wrapper clearfix"><div class="col col7 feedback"> <span class="textlabel">Was this article useful?</span> <a class="givefeedback yes" href="#" data-section-id="1409" data-value="1">Yes</a> <a class="givefeedback no" href="#" data-section-id="1409" data-value="-1">No</a><div class="formcontainer" id="container-67b8a87953dff"></div></div></div></section><section data-id="1407" id="portcongestionindexmetricbyshiptype" class="level4 " data-url="https://documentation.spire.com/maritime-2-0/port-congestion/data-objects/portcongestionindexmetricbyshiptype/"><div class="wrapper clearfix"><div class="col col7"><h4>byShipType</h4><p>Providing results on a per ship type basis for either all ship types or the requested ones in the query.</p><dl><dt>PortCongestionCountMetricByShipType</dt><dd>Returns count metrics, specifically organized by ship type.</dd><dt>PortCongestionDurationMetricByShipType</dt><dd>Provides duration metrics, categorized by ship type.</dd><dt>PortCongestionIndexMetricByShipType</dt><dd>Delivers the congestion index, segmented by ship type.</dd></dl></div><div class="col col1">&nbsp;</div><div class="col col4"><p><strong>Example</strong><br /> What is the highest number of container and dry bulk vessels in Savannah?</p><div class="codebox"><div class="title">Query</div><div class="code"><pre><code data-prismjs-copy="Copy to clipboard">{ portCongestion( port: { unlocode: "USSAV" } vessels: { shipType: [CONTAINER, DRY_BULK] } dateRange: { startDate: "2023-09-01" endDate: "2023-09-30" } ) { vesselsInPort { byShipType { shipType aggregate { max } } } } } </code></pre></div></div><p>This returns the data as follows:</p><div class="codebox"><div class="title">Response</div><div class="code"><pre><code data-prismjs-copy="Copy to clipboard">{ "data": { "portCongestion": { "vesselsInPort": { "byShipType": [ { "shipType": "CONTAINER", "aggregate": { "max": 8.0 } }, { "shipType": "DRY_BULK", "aggregate": { "max": 5.0 } } ] } } } }</code></pre></div></div></div></div><div class="wrapper clearfix"><div class="col col7 feedback"> <span class="textlabel">Was this article useful?</span> <a class="givefeedback yes" href="#" data-section-id="1407" data-value="1">Yes</a> <a class="givefeedback no" href="#" data-section-id="1407" data-value="-1">No</a><div class="formcontainer" id="container-67b8a87954067"></div></div></div></section><section data-id="1408" id="bytimeinterval" class="level4 " data-url="https://documentation.spire.com/maritime-2-0/port-congestion/data-objects/bytimeinterval/"><div class="wrapper clearfix"><div class="col col7"><h4>byTimeInterval</h4><p>Providing results on a time interval basis meaning the data is returned as time series data for the queried date range giving a value for each day.</p><dl><dt>PortCongestionCountMetricByTimeInterval</dt><dd>Returns count metrics, grouped by a time interval. The default interval is 1 day.</dd><dt>PortCongestionDurationMetricByTimeInterval</dt><dd>Offers duration metrics, categorized by the same time interval. The default is 1 day.</dd><dt>PortCongestionIndexMetricByTimeInterval</dt><dd>Presents the congestion index, organized by the set time interval.</dd></dl></div><div class="col col1">&nbsp;</div><div class="col col4"><p><strong>Example</strong><br /> What is the congestion index for containerships in Rotterdam now?</p><div class="codebox"><div class="title">Query</div><div class="code"><pre><code data-prismjs-copy="Copy to clipboard">{ portCongestion( port: { unlocode: "NLRTM" } vessels: { shipType: [CONTAINER] } dateRange: { startDate: "2023-10-01", endDate: "2023-10-04" } ) { congestionIndex { byTimeInterval { timeInterval { endTime } value { index level } } } } } </code></pre></div></div><p>This returns the data as follows:</p><div class="codebox"><div class="title">Response</div><div class="code"><pre><code data-prismjs-copy="Copy to clipboard">{ "data": { "portCongestion": { "congestionIndex": { "byTimeInterval": [ { "timeInterval": { "endTime": "2023-10-01T23:59:59.000Z" }, "value": { "index": 0.40231769, "level": "MEDIUM_CONGESTION" } }, { "timeInterval": { "endTime": "2023-10-02T23:59:59.000Z" }, "value": { "index": 0.34812829, "level": "MEDIUM_CONGESTION" } }, { "timeInterval": { "endTime": "2023-10-03T23:59:59.000Z" }, "value": { "index": 0.38143839, "level": "MEDIUM_CONGESTION" } }, { "timeInterval": { "endTime": "2023-10-04T23:59:59.000Z" }, "value": { "index": 0.53605895, "level": "MEDIUM_CONGESTION" } } ] } } } }</code></pre></div></div></div></div><div class="wrapper clearfix"><div class="col col7 feedback"> <span class="textlabel">Was this article useful?</span> <a class="givefeedback yes" href="#" data-section-id="1408" data-value="1">Yes</a> <a class="givefeedback no" href="#" data-section-id="1408" data-value="-1">No</a><div class="formcontainer" id="container-67b8a879542e0"></div></div></div></section><section data-id="1392" id="statistics" class="level3 " data-url="https://documentation.spire.com/maritime-2-0/port-congestion/statistics/"><div class="wrapper clearfix"><div class="col col7"><h3>Statistics</h3><p><span class="TextRun SCXW73246342 BCX0" data-contrast="auto"><span class="NormalTextRun SCXW73246342 BCX0">S</span><span class="NormalTextRun SCXW73246342 BCX0">tatistical analysis of the collected data</span> <span class="NormalTextRun SCXW73246342 BCX0">allow</span><span class="NormalTextRun SCXW73246342 BCX0">s </span><span class="NormalTextRun SCXW73246342 BCX0">for a deeper understanding of the port congestion metrics. </span></span><span class="EOP SCXW73246342 BCX0" data-ccp-props="{}"> </span></p><dl><dt>mean</dt><dd>The mean, or average, is a measure of central tendency in the data set. It&#8217;s beneficial for setting baseline expectations. For example, if the mean waiting time at a port is 12 hours, this can be factored into port operational plans and shipping schedules.</dd><dt>median</dt><dd>The median is the middle value of the data set and is less sensitive to outliers than the mean. It&#8217;s a solid indicator of a &#8216;typical&#8217; value. If the median waiting time is 9 hours and the mean is 12 hours, it indicates that a few extended waits skew the mean, whereas the median represents a more common wait time.</dd><dt>deviation</dt><dd>Deviation quantifies the variability or spread in the data. A low standard deviation in port turnaround times might suggest consistent port operations, essential information for shippers aiming for punctuality.</dd><dt>iqr</dt><dd>The interquartile range (IQR) focuses on the middle 50% of the data, pinpointing where most values are concentrated. If the IQR for waiting times is 4 to 7 hours, it implies that the bulk of ships experience wait times within this window.</dd><dt>min &amp; max</dt><dd>These metrics display the extremes in the data set. If the minimum and maximum waiting times are 2 and 22 hours, respectively, it hints at the possible range of wait times ships might encounter.</dd><dt>range</dt><dd>The range represents the spread of the data by showing the gap between the maximum and minimum values. A range of 20 hours in waiting times underscores the variation in wait times that vessels might face.</dd><dt>quantiles</dt><dd>Quantiles divide the data into equal parts, invaluable for risk evaluations or determining operational thresholds. If the first quantile (Q1) for waiting time is 5 hours, it implies that a quarter of vessels wait no longer than this time.</dd><dt>percentiles</dt><dd>Percentiles allow for a detailed breakdown of data distribution. For instance, if a vessel&#8217;s waiting time exceeds the 85th percentile, it could indicate the need for further analysis or operational adjustments.</dd><dt>sampleSize</dt><dd>Sample size conveys the number of data points used in the analysis. A substantial sample size enhances the trustworthiness of the statistics, reinforcing the basis for data-informed decisions.</dd></dl><p>The deviation, iqr, quantiles, and some percentiles might not be available for small sample sizes.</p></div><div class="col col1">&nbsp;</div><div class="col col4"><p><strong>Example</strong><br /> How many containerships are typically in Singapore?</p><div class="codebox"><div class="title">Query</div><div class="code"><pre><code data-prismjs-copy="Copy to clipboard">{ portCongestion( port: { unlocode: "SGSIN" } vessels: { shipType: [CONTAINER] } dateRange: { startDate: "2023-09-01" endDate: "2023-09-07" } ) { vesselsInPort { aggregate { mean median min max range deviation iqr quantiles percentiles { percentile value } sampleSize } } } } </code></pre></div></div><p>This returns the data as follows:</p><div class="codebox"><div class="title">Response</div><div class="code"><pre><code data-prismjs-copy="Copy to clipboard">{ "data": { "portCongestion": { "vesselsInPort": { "aggregate": { "mean": 41.25, "median": 41.0, "min": 33.0, "max": 50.0, "range": 17.0, "deviation": 3.30803775, "iqr": 4.0, "quantiles": [ 39.0, 41.0, 43.0 ], "percentiles": [ { "percentile": "P_05", "value": 36.0 }, { "percentile": "P_10", "value": 36.5 }, { "percentile": "P_25", "value": 39.0 }, { "percentile": "P_50", "value": 41.0 }, { "percentile": "P_75", "value": 43.0 }, { "percentile": "P_90", "value": 45.0 }, { "percentile": "P_95", "value": 46.5 } ], "sampleSize": 168 } } } } }</code></pre></div></div></div></div><div class="wrapper clearfix"><div class="col col7 feedback"> <span class="textlabel">Was this article useful?</span> <a class="givefeedback yes" href="#" data-section-id="1392" data-value="1">Yes</a> <a class="givefeedback no" href="#" data-section-id="1392" data-value="-1">No</a><div class="formcontainer" id="container-67b8a87954610"></div></div></div></section><section data-id="304" id="matchedport" class="level2 " data-url="https://documentation.spire.com/maritime-2-0/matchedport/"><div class="wrapper clearfix"><div class="col col7"><h2>The <code>matchedPort</code> root query</h2><p>AIS reported destinations are often non-standard, which leads to difficulty in standardizing and obtaining formatted destination UNLOCODES 0r more granular port information.</p><p>You can use the <code>matchedPort</code> root query to try and obtain a normalized port from a non-standard destination text string.</p></div><div class="col col1">&nbsp;</div><div class="col col4"><div class="codebox"><div class="title">Example query for getting Matched Port</div><div class="code"><pre><code data-prismjs-copy="Copy to clipboard">query getMatchedPort{ matchedPort(text: "Sydney"){ matchScore port{ name unlocode } } }</code></pre></div></div></div></div><div class="wrapper clearfix"><div class="col col7 feedback"> <span class="textlabel">Was this article useful?</span> <a class="givefeedback yes" href="#" data-section-id="304" data-value="1">Yes</a> <a class="givefeedback no" href="#" data-section-id="304" data-value="-1">No</a><div class="formcontainer" id="container-67b8a8795484c"></div></div></div></section><section data-id="305" id="matchedport-query-arguments" class="level3 " data-url="https://documentation.spire.com/maritime-2-0/matchedport/matchedport-query-arguments/"><div class="wrapper clearfix"><div class="col col7"><h3>Query arguments</h3><p>Obtain port information by supplying search text.</p><pre><code data-prismjs-copy="Copy to clipboard">type Query { matchedPort(text: String!): MatchedPort }</code></pre></div></div><div class="wrapper clearfix"><div class="col col7 feedback"> <span class="textlabel">Was this article useful?</span> <a class="givefeedback yes" href="#" data-section-id="305" data-value="1">Yes</a> <a class="givefeedback no" href="#" data-section-id="305" data-value="-1">No</a><div class="formcontainer" id="container-67b8a87954a0d"></div></div></div></section><section data-id="306" id="matchedport-output" class="level3 " data-url="https://documentation.spire.com/maritime-2-0/matchedport/matchedport-output/"><div class="wrapper clearfix"><div class="col col7"><h3>Output</h3><ul><li><code>port</code> is described here</li><li><code>matchScore</code> is the confidence value of the match</li></ul><p>The match with the highest <code>matchScore</code> is returned</p><pre><code data-prismjs-copy="Copy to clipboard">type MatchedPort { matchScore: Float! port: Port }</code></pre></div></div><div class="wrapper clearfix"><div class="col col7 feedback"> <span class="textlabel">Was this article useful?</span> <a class="givefeedback yes" href="#" data-section-id="306" data-value="1">Yes</a> <a class="givefeedback no" href="#" data-section-id="306" data-value="-1">No</a><div class="formcontainer" id="container-67b8a87954c68"></div></div></div></section><section data-id="308" id="port" class="level2 " data-url="https://documentation.spire.com/maritime-2-0/port/"><div class="wrapper clearfix"><div class="col col7"><h2>The <code>port</code> root query</h2><p>You can use the <code>port</code> root query to obtain more information about a specific port, through a provided specific UNLOCODE.</p></div><div class="col col1">&nbsp;</div><div class="col col4"><div class="title">Example query for getting Matched Port</div><div class="code"><pre><code data-prismjs-copy="Copy to clipboard">query getPort{ port(unlocode: "USNYC"){ name unlocode centerPoint{ latitude longitude } } }</code></pre></div></div></div><div class="wrapper clearfix"><div class="col col7 feedback"> <span class="textlabel">Was this article useful?</span> <a class="givefeedback yes" href="#" data-section-id="308" data-value="1">Yes</a> <a class="givefeedback no" href="#" data-section-id="308" data-value="-1">No</a><div class="formcontainer" id="container-67b8a87954ee3"></div></div></div></section><section data-id="309" id="port-query-arguments" class="level3 " data-url="https://documentation.spire.com/maritime-2-0/port/port-query-arguments/"><div class="wrapper clearfix"><div class="col col7"><h3>Query arguments</h3><p>Obtain port information given a UNLOCODE.</p><p>The value for <code>unlocode</code> must be a valid value or an error will be returned.</p><pre><code data-prismjs-copy="Copy to clipboard">type Query { port(unlocode: UNLOCODE!): Port }</code></pre></div></div><div class="wrapper clearfix"><div class="col col7 feedback"> <span class="textlabel">Was this article useful?</span> <a class="givefeedback yes" href="#" data-section-id="309" data-value="1">Yes</a> <a class="givefeedback no" href="#" data-section-id="309" data-value="-1">No</a><div class="formcontainer" id="container-67b8a8795507d"></div></div></div></section><section data-id="310" id="port-output" class="level3 " data-url="https://documentation.spire.com/maritime-2-0/port/port-output/"><div class="wrapper clearfix"><div class="col col7"><h3>Output</h3><pre><code data-prismjs-copy="Copy to clipboard">type Port { centerPoint: GeoPoint name: String! unlocode: UNLOCODE! }</code></pre></div></div><div class="wrapper clearfix"><div class="col col7 feedback"> <span class="textlabel">Was this article useful?</span> <a class="givefeedback yes" href="#" data-section-id="310" data-value="1">Yes</a> <a class="givefeedback no" href="#" data-section-id="310" data-value="-1">No</a><div class="formcontainer" id="container-67b8a87955213"></div></div></div></section></div></main><footer class="simple"><nav class="wrapper clearfix" id="postfooterlegal"><div class="col col12"> <a target="_blank" href="https://spire.com" id="copyright">© Spire Global</a><ul id="socialicons"><li><a href="https://www.facebook.com/spireglobal/" target="_blank" rel="noopener nofollow" title="Spire on Facebok"><i class="icon-facebook"></i></a></li><li><a href="https://twitter.com/SpireGlobal" rel="noopener nofollow" target="_blank" title="Spire on Twitter"><i class="icon-twitter"></i></a></li><li><a href="https://www.linkedin.com/company/spireglobal/" rel="noopener nofollow" target="_blank" title="Spire on LinkedIn"><i class="icon-linkedin"></i></a></li></ul><ul id="legalmenu"><li id="menu-item-995" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-995"><a target="_blank" href="https://spire.com/legal-disclaimer/">Legal Disclaimer</a></li><li id="menu-item-994" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-privacy-policy menu-item-994"><a target="_blank" href="https://spire.com/privacy-policy/">Privacy Policy</a></li><li id="menu-item-1604" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-1604"><a target="_blank" href="https://spire.com/cookie-policy/">Cookie Policy</a></li><li id="menu-item-5108" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-5108"><a target="_blank" href="https://spire.com/accessibility/">Accessibility</a></li><li id="menu-item-3372" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-3372"><a target="_blank" href="https://spire.com/our-data/terms-of-use/">Spire Online Data Terms &amp; Conditions</a></li><li id="menu-item-9107" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-9107"><a target="_blank" href="https://spire.com/uk-modern-slavery-act-statement/">UK Modern Slavery Act Statement</a></li></ul></div></nav></footer><div id="searchpane"><div><div class="clearfix boxed"><form role="search" method="get" class="search-form" action="/" style="position: relative;"> <label> <span class="screen-reader-text sr-only">Search for:</span> <input type="search" class="search-field" placeholder="What are you looking for? Start typing to get suggestions..." name="s" data-rlvlive="true" data-rlvparentel="#rlvlive" data-rlvconfig="default"> </label><div id="rlvlive"></div></form></div></div></div> <script defer type="text/javascript" src="https://spire.com/wp-content/themes/spire2021/js/a.min.js?ver=6.7.1" id="a-js"></script> <script defer type="text/javascript" src="https://cdn.jsdelivr.net/npm/gsap@3.6.0/dist/gsap.min.js?ver=6.7.1" id="gsap-js"></script> <script defer type="text/javascript" src="https://cdn.jsdelivr.net/npm/gsap@3.6.0/dist/ScrollToPlugin.min.js?ver=6.7.1" id="gsap-scrollto-js"></script> <script defer type="text/javascript" src="https://cdn.jsdelivr.net/npm/magnific-popup@1.1.0/dist/jquery.magnific-popup.min.js?ver=6.7.1" id="magnific-js"></script> <script defer type="text/javascript" src="https://documentation.spire.com/wp-content/cache/autoptimize/js/autoptimize_single_732d7fed67b698060223c7dc92318ea6.js?ver=1688136661" id="hubspot_lazy-js"></script> <script defer type="text/javascript" src="https://documentation.spire.com/wp-content/cache/autoptimize/js/autoptimize_single_8edcd5e59604e4fac5cf09494e6e2e15.js?ver=1679901433" id="imagepopup-js"></script> <script defer type="text/javascript" src="https://documentation.spire.com/wp-content/cache/autoptimize/js/autoptimize_single_c1c14bd64724eeeb816c72a664df7c24.js?ver=1679901433" id="popups-js"></script> <script defer type="text/javascript" src="https://documentation.spire.com/wp-content/cache/autoptimize/js/autoptimize_single_22d0c5f859ca466f5a015027d8fb3c17.js?ver=1679901433" id="feedback-js"></script> <script defer type="text/javascript" src="https://documentation.spire.com/wp-content/cache/autoptimize/js/autoptimize_single_3437dec8868ec14c38ea419b6e579a1d.js?ver=1679901433" id="most-visible-js"></script> <script defer type="text/javascript" src="https://documentation.spire.com/wp-content/cache/autoptimize/js/autoptimize_single_1135a95fb193562bd845ac465b56ee1d.js?ver=1698917261" id="documentation-js"></script> <script defer type="text/javascript" src="https://documentation.spire.com/wp-content/cache/autoptimize/js/autoptimize_single_a1a75439e41e75d4bc2ebcab10ddf91e.js?ver=1688995362" id="videochapters-js"></script> <script defer type="text/javascript" src="https://documentation.spire.com/wp-content/cache/autoptimize/js/autoptimize_single_431c5c8a3066177634667f012c12ab7c.js?ver=1679901433" id="search-js"></script> <script defer type="text/javascript" src="https://documentation.spire.com/wp-content/cache/autoptimize/js/autoptimize_single_17c54228666c5eb9b444388eb2e34b85.js?ver=1679901433" id="darkmode-js"></script> <script defer type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.0.0/highlight.min.js?ver=6.7.1" id="highlightjs-js"></script> <script defer type="text/javascript" src="https://documentation.spire.com/wp-content/cache/autoptimize/js/autoptimize_single_b1ac170c5c279a0f8f903636fa53b6d2.js?ver=1679901433" id="syntaxhighlighting-js"></script> <script defer type="text/javascript" src="https://documentation.spire.com/wp-content/cache/autoptimize/js/autoptimize_single_e59cb0bed635764fe5fa0122cbb2e39e.js?ver=6.7.1" id="prism-js"></script> <script defer type="text/javascript" src="https://documentation.spire.com/wp-content/cache/autoptimize/js/autoptimize_single_35f9d357c473ec32bafdd2909788f94a.js?ver=1679901433" id="menu-js"></script> <script defer id="relevanssi-live-search-client-js-extra" src="data:text/javascript;base64,dmFyIHJlbGV2YW5zc2lfbGl2ZV9zZWFyY2hfcGFyYW1zPVtdO3JlbGV2YW5zc2lfbGl2ZV9zZWFyY2hfcGFyYW1zPXsiYWpheHVybCI6Imh0dHBzOlwvXC9kb2N1bWVudGF0aW9uLnNwaXJlLmNvbVwvd3AtYWRtaW5cL2FkbWluLWFqYXgucGhwIiwiY29uZmlnIjp7ImRlZmF1bHQiOnsiaW5wdXQiOnsiZGVsYXkiOjMwMCwibWluX2NoYXJzIjozfSwicmVzdWx0cyI6eyJwb3NpdGlvbiI6ImJvdHRvbSIsIndpZHRoIjoiYXV0byIsIm9mZnNldCI6eyJ4IjowLCJ5Ijo1fSwic3RhdGljX29mZnNldCI6dHJ1ZX19fSwibXNnX25vX2NvbmZpZ19mb3VuZCI6Ik5vIHZhbGlkIFJlbGV2YW5zc2kgTGl2ZSBTZWFyY2ggY29uZmlndXJhdGlvbiBmb3VuZCEiLCJtc2dfbG9hZGluZ19yZXN1bHRzIjoiTG9hZGluZyBzZWFyY2ggcmVzdWx0cy4iLCJtZXNzYWdlc190ZW1wbGF0ZSI6IjxkaXYgY2xhc3M9XCJsaXZlLWFqYXgtbWVzc2FnZXNcIj5cblx0PGRpdiBpZD1cInJlbGV2YW5zc2ktbGl2ZS1hamF4LXNlYXJjaC1zcGlubmVyXCI+PFwvZGl2PlxuPFwvZGl2PlxuIn07Ow=="></script> <script defer type="text/javascript" src="https://documentation.spire.com/wp-content/plugins/relevanssi-live-ajax-search/assets/javascript/dist/script.min.js?ver=2.4" id="relevanssi-live-search-client-js"></script> <script defer id="mediaelement-core-js-before" src="data:text/javascript;base64,Ci8qIDwhW0NEQVRBWyAqLwp2YXIgbWVqc0wxMG4gPSB7Imxhbmd1YWdlIjoiZW4iLCJzdHJpbmdzIjp7Im1lanMuZG93bmxvYWQtZmlsZSI6IkRvd25sb2FkIEZpbGUiLCJtZWpzLmluc3RhbGwtZmxhc2giOiJZb3UgYXJlIHVzaW5nIGEgYnJvd3NlciB0aGF0IGRvZXMgbm90IGhhdmUgRmxhc2ggcGxheWVyIGVuYWJsZWQgb3IgaW5zdGFsbGVkLiBQbGVhc2UgdHVybiBvbiB5b3VyIEZsYXNoIHBsYXllciBwbHVnaW4gb3IgZG93bmxvYWQgdGhlIGxhdGVzdCB2ZXJzaW9uIGZyb20gaHR0cHM6XC9cL2dldC5hZG9iZS5jb21cL2ZsYXNocGxheWVyXC8iLCJtZWpzLmZ1bGxzY3JlZW4iOiJGdWxsc2NyZWVuIiwibWVqcy5wbGF5IjoiUGxheSIsIm1lanMucGF1c2UiOiJQYXVzZSIsIm1lanMudGltZS1zbGlkZXIiOiJUaW1lIFNsaWRlciIsIm1lanMudGltZS1oZWxwLXRleHQiOiJVc2UgTGVmdFwvUmlnaHQgQXJyb3cga2V5cyB0byBhZHZhbmNlIG9uZSBzZWNvbmQsIFVwXC9Eb3duIGFycm93cyB0byBhZHZhbmNlIHRlbiBzZWNvbmRzLiIsIm1lanMubGl2ZS1icm9hZGNhc3QiOiJMaXZlIEJyb2FkY2FzdCIsIm1lanMudm9sdW1lLWhlbHAtdGV4dCI6IlVzZSBVcFwvRG93biBBcnJvdyBrZXlzIHRvIGluY3JlYXNlIG9yIGRlY3JlYXNlIHZvbHVtZS4iLCJtZWpzLnVubXV0ZSI6IlVubXV0ZSIsIm1lanMubXV0ZSI6Ik11dGUiLCJtZWpzLnZvbHVtZS1zbGlkZXIiOiJWb2x1bWUgU2xpZGVyIiwibWVqcy52aWRlby1wbGF5ZXIiOiJWaWRlbyBQbGF5ZXIiLCJtZWpzLmF1ZGlvLXBsYXllciI6IkF1ZGlvIFBsYXllciIsIm1lanMuY2FwdGlvbnMtc3VidGl0bGVzIjoiQ2FwdGlvbnNcL1N1YnRpdGxlcyIsIm1lanMuY2FwdGlvbnMtY2hhcHRlcnMiOiJDaGFwdGVycyIsIm1lanMubm9uZSI6Ik5vbmUiLCJtZWpzLmFmcmlrYWFucyI6IkFmcmlrYWFucyIsIm1lanMuYWxiYW5pYW4iOiJBbGJhbmlhbiIsIm1lanMuYXJhYmljIjoiQXJhYmljIiwibWVqcy5iZWxhcnVzaWFuIjoiQmVsYXJ1c2lhbiIsIm1lanMuYnVsZ2FyaWFuIjoiQnVsZ2FyaWFuIiwibWVqcy5jYXRhbGFuIjoiQ2F0YWxhbiIsIm1lanMuY2hpbmVzZSI6IkNoaW5lc2UiLCJtZWpzLmNoaW5lc2Utc2ltcGxpZmllZCI6IkNoaW5lc2UgKFNpbXBsaWZpZWQpIiwibWVqcy5jaGluZXNlLXRyYWRpdGlvbmFsIjoiQ2hpbmVzZSAoVHJhZGl0aW9uYWwpIiwibWVqcy5jcm9hdGlhbiI6IkNyb2F0aWFuIiwibWVqcy5jemVjaCI6IkN6ZWNoIiwibWVqcy5kYW5pc2giOiJEYW5pc2giLCJtZWpzLmR1dGNoIjoiRHV0Y2giLCJtZWpzLmVuZ2xpc2giOiJFbmdsaXNoIiwibWVqcy5lc3RvbmlhbiI6IkVzdG9uaWFuIiwibWVqcy5maWxpcGlubyI6IkZpbGlwaW5vIiwibWVqcy5maW5uaXNoIjoiRmlubmlzaCIsIm1lanMuZnJlbmNoIjoiRnJlbmNoIiwibWVqcy5nYWxpY2lhbiI6IkdhbGljaWFuIiwibWVqcy5nZXJtYW4iOiJHZXJtYW4iLCJtZWpzLmdyZWVrIjoiR3JlZWsiLCJtZWpzLmhhaXRpYW4tY3Jlb2xlIjoiSGFpdGlhbiBDcmVvbGUiLCJtZWpzLmhlYnJldyI6IkhlYnJldyIsIm1lanMuaGluZGkiOiJIaW5kaSIsIm1lanMuaHVuZ2FyaWFuIjoiSHVuZ2FyaWFuIiwibWVqcy5pY2VsYW5kaWMiOiJJY2VsYW5kaWMiLCJtZWpzLmluZG9uZXNpYW4iOiJJbmRvbmVzaWFuIiwibWVqcy5pcmlzaCI6IklyaXNoIiwibWVqcy5pdGFsaWFuIjoiSXRhbGlhbiIsIm1lanMuamFwYW5lc2UiOiJKYXBhbmVzZSIsIm1lanMua29yZWFuIjoiS29yZWFuIiwibWVqcy5sYXR2aWFuIjoiTGF0dmlhbiIsIm1lanMubGl0aHVhbmlhbiI6IkxpdGh1YW5pYW4iLCJtZWpzLm1hY2Vkb25pYW4iOiJNYWNlZG9uaWFuIiwibWVqcy5tYWxheSI6Ik1hbGF5IiwibWVqcy5tYWx0ZXNlIjoiTWFsdGVzZSIsIm1lanMubm9yd2VnaWFuIjoiTm9yd2VnaWFuIiwibWVqcy5wZXJzaWFuIjoiUGVyc2lhbiIsIm1lanMucG9saXNoIjoiUG9saXNoIiwibWVqcy5wb3J0dWd1ZXNlIjoiUG9ydHVndWVzZSIsIm1lanMucm9tYW5pYW4iOiJSb21hbmlhbiIsIm1lanMucnVzc2lhbiI6IlJ1c3NpYW4iLCJtZWpzLnNlcmJpYW4iOiJTZXJiaWFuIiwibWVqcy5zbG92YWsiOiJTbG92YWsiLCJtZWpzLnNsb3ZlbmlhbiI6IlNsb3ZlbmlhbiIsIm1lanMuc3BhbmlzaCI6IlNwYW5pc2giLCJtZWpzLnN3YWhpbGkiOiJTd2FoaWxpIiwibWVqcy5zd2VkaXNoIjoiU3dlZGlzaCIsIm1lanMudGFnYWxvZyI6IlRhZ2Fsb2ciLCJtZWpzLnRoYWkiOiJUaGFpIiwibWVqcy50dXJraXNoIjoiVHVya2lzaCIsIm1lanMudWtyYWluaWFuIjoiVWtyYWluaWFuIiwibWVqcy52aWV0bmFtZXNlIjoiVmlldG5hbWVzZSIsIm1lanMud2Vsc2giOiJXZWxzaCIsIm1lanMueWlkZGlzaCI6IllpZGRpc2gifX07Ci8qIF1dPiAqLwo="></script> <script defer type="text/javascript" src="https://documentation.spire.com/wp-includes/js/mediaelement/mediaelement-and-player.min.js?ver=4.2.17" id="mediaelement-core-js"></script> <script defer type="text/javascript" src="https://documentation.spire.com/wp-includes/js/mediaelement/mediaelement-migrate.min.js?ver=6.7.1" id="mediaelement-migrate-js"></script> <script defer id="mediaelement-js-extra" src="data:text/javascript;base64,Ci8qIDwhW0NEQVRBWyAqLwp2YXIgX3dwbWVqc1NldHRpbmdzID0geyJwbHVnaW5QYXRoIjoiXC93cC1pbmNsdWRlc1wvanNcL21lZGlhZWxlbWVudFwvIiwiY2xhc3NQcmVmaXgiOiJtZWpzLSIsInN0cmV0Y2hpbmciOiJyZXNwb25zaXZlIiwiYXVkaW9TaG9ydGNvZGVMaWJyYXJ5IjoibWVkaWFlbGVtZW50IiwidmlkZW9TaG9ydGNvZGVMaWJyYXJ5IjoibWVkaWFlbGVtZW50In07Ci8qIF1dPiAqLwo="></script> <script defer type="text/javascript" src="https://documentation.spire.com/wp-includes/js/mediaelement/renderers/vimeo.min.js?ver=4.2.17" id="mediaelement-vimeo-js"></script> </body></html>

Pages: 1 2 3 4 5 6 7 8 9 10