I have removed API access via archives. Usage was unsustainable. Access to a limited number of examples remains. I am leaving these instructions for now, but I expect they will be removed shortly.


Python Reflectometry Software Package

githubhttps://github.com/kristinemlarson/gnssrefl
pypi https://pypi.org/project/gnssrefl
Cryosphere, Water, SnowUse Cases

Description of the API -using data archives

Parameter Description Default
station4 character lowercase station nameuser must supply
year4 character yearuser must supply
doyday of yearuser must supply
freqGPS frequency L1, L2, L2C,L5, or L1L2L1
pk2noiseminimum ratio of spectral peak to noise3
ampmininum amplitude of spectral peak 8 v/v
h1,h2minimum and maximum reflector heights 0.5,8 meters
e1, e2minimum and maximum elevation angles 5,25 degrees
azim1, azim2minimum and maximum azimuth angles 0,360 degrees
rinexRINEX version 2.11 or 32.11
archiveunavco, sopac, cddis, sonel,or allall
ftypeoutput filetype (txt or csv)txt
jsononlyTrue returns solution via jsonFalse

Example: for the station p038, the year 2020, day of year 135:

https://gnss-reflections.org/api?station=p038&year=2020&doy=135&archive=unavco

The API starts a task queue and opens a web page with which will ultimately be populated with a png summary of spectral characteristics, links to the reflection solution, station location summary, a google map, and station photograph (if available). Here we specified the unavco archive because we know it is the primary archive for this site.

Regardless of the method you use to query the API, you will need to wait ~10 seconds for the solution to be posted.

If you only want solution information returned in a json using your browser:

https://gnss-reflections.org/api?station=p038&year=2020&doy=135&archive=unavco&jsononly=True

returns:

{
  "amp": 8,
  "archive": "unavco",
  "azim1": 0,
  "azim2": 360,
  "createdAt": "2021-04-24 11:41:11Z",
  "e1": 5.0,
  "e2": 25.0,
  "fileAddress": "https://gnss-reflections.org/results2/2ea83252-0377-45c1-8ad9-ee1f43b80b9e",
  "fileType": "rh",
  "h1": 0.4,
  "h2": 8.0,
  "pk2noise": 3.0,
  "siteId": "p038",
  "softwareVersion": 2.0,
  "startDate": "2020-05-05 00:00:00Z"
}

The reflector height solution is found in the fileAddress field.

The API can be accessed via curl:

curl "https://gnss-reflections.org/api?station=p038&year=2020&doy=135&jsononly=True&archive=unavco"

or using the http utility:

http https://gnss-reflections.org/api station==p038 year==2020 doy==135 jsononly==True archive==unavco

Example: for the station p041, the year 2020, day of year 198, and L1 data:

From the command line within a browser:

curl "https://gnss-reflections.org/api?station=p041&year=2020&doy=198&freq=L1"

From the command line, wth json returned, using curl:

curl "https://gnss-reflections.org/api?station=p041&year=2020&doy=198&freq=L1&jsononly=True"

Using the http utility:

http https://gnss-reflections.org/api station==p041 year==2020 doy==198 freq==L1 jsononly==True

returns:

{
    "amp": 8,
    "archive": "all",
    "azim1": 0,
    "azim2": 360,
    "createdAt": "2021-04-23 16:58:38Z",
    "e1": 5.0,
    "e2": 25.0,
    "fileAddress": "https://gnss-reflections.org/results2/1f943d0e-f704-4a50-a0bc-bf8213182468",
    "fileType": "rh",
    "h1": 0.4,
    "h2": 8.0,
    "pk2noise": 3.0,
    "siteId": "p041",
    "softwareVersion": 2.0,
    "startDate": "2020-07-07 00:00:00Z"
}
Errors: Non-existent station

http http://gnss-reflections.org/api station==xxxx year==2020 doy==201 jsononly==True returns:

{
    "amp": 8,
    "archive": "all",
    "azim1": 0,
    "azim2": 360,
    "createdAt": "2021-04-25 00:54:50Z",
    "e1": 5.0,
    "e2": 25.0,
    "fileAddress": "http://gnss-reflections.org/results2/8f4fe6c7-7d4c-4cbb-8ec6-598c4e75531e",
    "fileType": "rh",
    "h1": 0.4,
    "h2": 8.0,
    "pk2noise": 3.0,
    "siteId": "xxxx",
    "softwareVersion": 2.0,
    "startDate": "2020-07-07 00:00:00Z"
}
The fileAddress returns the error message:

No Results Could be Retrieved

Illegal Date

http http://gnss-reflections.org/api station==p038 year==2021 doy==115 jsononly==True archive==unavco

Returns:

HTTP/1.1 200 OK
Connection: keep-alive
Content-Length: 102
Content-Type: application/json
Date: Sun, 25 Apr 2021 01:00:33 GMT
Server: gunicorn/20.0.4
Via: 1.1 vegur

{
    "errormessage": "You have chosen a day that has not happened yet (or orbits are not yet available)."
}


Description of the API - using data upload option

Parameter Description Default
file**Version 2.11 RINEX file, lowercase, gz or Z alloweduser must supply
freqGPS frequency L1, L2, L2C, or L5 L1
pk2noiseminimum ratio of spectral peak to noise3
ampminimum amplitude of spectral peak 8 v/v
h1,h2minimum and maximum reflector heights 0.5,8 meters
e1,e2minimum and maximum elevation angles 5,25 degrees
azim1, azim2minimum and maximum azimuth angles 0,360 degrees
ftypeoutput filetype (csv or txt)txt

Example: you have a RINEX 2.11 file that has been gzipped, p0301000.20o.gz. The command to analyze the L1 data for this site is:

curl -F "file=@p0301000.20o.gz" -F "freq=L1" -F "jsononly=True" "http://gnss-reflections.org/api"

returns:

{
  "amp": 8,
  "archive": "local",
  "azim1": 0,
  "azim2": 360,
  "createdAt": "2021-04-23 18:21:47Z",
  "e1": 5,
  "e2": 25,
  "fileAddress": "http://gnss-reflections.org/static/files/319386247.txt",
  "fileType": "rh",
  "h1": 0.4,
  "h2": 8,
  "pk2noise": 3,
  "siteId": "p030",
  "softwareVersion": 2.0,
  "startDate": "2020-04-04 00:00:00Z"
}

Using the http utility:

http --form POST http://gnss-reflections.org/api file@p0301000.20o.gz freq=L1 jsononly=True

returns:

HTTP/1.0 200 OK
Content-Length: 358
Content-Type: application/json
Date: Sat, 24 Apr 2021 00:23:59 GMT
Server: Werkzeug/1.0.1 Python/3.8.7
{
    "amp": 8,
    "archive": "local",
    "azim1": 0,
    "azim2": 360,
    "createdAt": "2021-04-23 18:23:59Z",
    "e1": 5,
    "e2": 25,
    "fileAddress": "http://gnss-reflections.org/static/files/185639884.txt",
    "fileType": "rh",
    "h1": 0.4,
    "h2": 8,
    "pk2noise": 3,
    "siteId": "p030",
    "softwareVersion": 2.0,
    "startDate": "2020-04-04 00:00:00Z"
}

Errors:

http --form POST http://gnss-reflections.org/api file@p0301000.2020o.gz freq=L1 jsononly=True

returns:

{
    "errormessage": "Illegal Filename"
}
** You must use the geodetic naming convention for RINEX 2.11 files. Lowercase. Four character station name, three character day of year followed by a 0, a period, two character year, and o. gz and Z compression is also allowed.

Privacy policy: I do not track who uses this API or where they are from. However, I do track the number of calls for the various sections (i.e. rzones, geoid, api-rinex3, and api) and where the GNSS sites are located.