Usage Guide
This guide provides detailed examples of how to use HAPIClient.jl to access heliophysics data from HAPI servers.
Basic Usage
Listing Available Servers
Start by exploring what HAPI servers are available:
using HAPIClient
# List all available HAPI servers
servers = hapi()19-element Vector{SubString{String}}:
"https://cdaweb.gsfc.nasa.gov/hapi"
"http://hapi-server.org/servers/SSCWeb/hapi"
"https://amda.irap.omp.eu/service/hapi"
"https://csatools.esac.esa.int/HapiServer/hapi"
"https://iswa.gsfc.nasa.gov/IswaSystemWebApp/hapi"
"https://vires.services/hapi"
"https://imag-data.bgs.ac.uk/GIN_V1/hapi"
"https://supermag.jhuapl.edu/hapi"
"https://wdcapi.bgs.ac.uk/hapi"
"http://lasp.colorado.edu/lisird/hapi"
"https://hapi.spaceweather.knmi.nl/hapi"
"https://api.helioviewer.org/hapi/Helioviewer/hapi"
"https://planet.physics.uiowa.edu/das/das2Server/hapi"
"http://hapi-server.org/servers/TestData2.0/hapi"
"http://hapi-server.org/servers/TestData2.1/hapi"
"http://hapi-server.org/servers/TestData3.0/hapi"
"http://hapi-server.org/servers/TestData3.1/hapi"
"http://hapi-server.org/servers/TestData3.2/hapi"
"http://hapi-server.org/servers/TestData3.3/hapi"Getting Dataset Catalogs
Once you know which servers are available, you can browse their catalogs:
# Get catalog of available datasets from CDAWeb
catalog = hapi(CDAWeb)3344-element Vector{Any}:
JSON.Object{String, Any}("id" => "A1_K0_MPA")
JSON.Object{String, Any}("id" => "A2_K0_MPA")
JSON.Object{String, Any}("id" => "AC_AT_DEF")
JSON.Object{String, Any}("id" => "AC_H0_MFI")
JSON.Object{String, Any}("id" => "AC_H0_SWE")
JSON.Object{String, Any}("id" => "AC_H1_EPM")
JSON.Object{String, Any}("id" => "AC_H1_MFI")
JSON.Object{String, Any}("id" => "AC_H1_SIS")
JSON.Object{String, Any}("id" => "AC_H2_CRIS")
JSON.Object{String, Any}("id" => "AC_H2_EPM")
⋮
JSON.Object{String, Any}("id" => "WI_PLSP_3DP")
JSON.Object{String, Any}("id" => "WI_PM_3DP")
JSON.Object{String, Any}("id" => "WI_SFPD_3DP")
JSON.Object{String, Any}("id" => "WI_SFSP_3DP")
JSON.Object{String, Any}("id" => "WI_SOPD_3DP")
JSON.Object{String, Any}("id" => "WI_SOSP_3DP")
JSON.Object{String, Any}("id" => "WI_STRAHL0_SWE")
JSON.Object{String, Any}("id" => "WI_SW-ION-DIST_SWE-FARADAY")
JSON.Object{String, Any}("id" => "WI_WA_RAD1_L3_DF")Dataset Information
Get detailed information about parameters in a specific dataset:
dataset = "AC_H0_MFI"
params = hapi(CDAWeb, dataset)JSON.Object{String, Any} with 7 entries:
"HAPI" => "2.0"
"resourceURL" => "https://cdaweb.gsfc.nasa.gov/misc/NotesA.html#AC_H0_MFI"
"contact" => "N. Ness @ Bartol Research Institute"
"parameters" => Any[Object{String, Any}("name"=>"Time", "length"=>24, "units…
"startDate" => "1997-09-02T00:00:12Z"
"stopDate" => "2025-11-07T23:59:44Z"
"status" => Object{String, Any}("code"=>1200, "message"=>"OK")Data Retrieval and Access
Basic Data Download
Retrieve data for specific parameters within a time range:
using Dates
dataset = "AC_H0_MFI"
parameters = "Magnitude,BGSEc"
tmin = DateTime(2001, 1, 1, 5, 0, 0)
tmax = DateTime(2001, 1, 1, 6, 0, 0)
# Retrieve the data
data = hapi(CDAWeb, dataset, parameters, tmin, tmax)HAPIVariables: CDAWeb/AC_H0_MFI (https://cdaweb.gsfc.nasa.gov/hapi/data?time.min=2001-01-01T05%3A00%3A00.000Z¶meters=Magnitude%2CBGSEc&format=csv&id=AC_H0_MFI&time.max=2001-01-01T06%3A00%3A00.000Z)
Magnitude [Time Range: 2001-01-01T05:00:14 to 2001-01-01T05:59:58, Units: nT, Size: (225,)]
BGSEc [Time Range: 2001-01-01T05:00:14 to 2001-01-01T05:59:58, Units: nT, Size: (225, 3)]
Metadata - JSON.Object{String, Any} with 7 entries:
"HAPI" => "2.0"
"resourceURL" => "https://cdaweb.gsfc.nasa.gov/misc/NotesA.html#AC_H0_MFI"
"contact" => "N. Ness @ Bartol Research Institute"
"parameters" => Any[Object{String, Any}("name"=>"Time", "length"=>24, "units…
"startDate" => "1997-09-02T00:00:12Z"
"stopDate" => "2025-11-07T23:59:44Z"
"status" => Object{String, Any}("code"=>1200, "message"=>"OK")Alternative Path Format
You can also use a path-like format for data retrieval. The path format is "server/dataset/parameter", where datasets may contain slashes:
data = get_data("CDAWeb/AC_H0_MFI/Magnitude,BGSEc", tmin, tmax)This path format cannot handle cases where both the dataset and parameter contain slashes (e.g., dataset=abc/123 and parameter=p1/v1). In such cases, use the hapi() function directly.
Accessing Retrieved Data
Once you have retrieved data, you can access individual variables:
Magnitude = data.Magnitude # or data[1] if you know the order (same as `parameters` order)
BGSEc = data.BGSEc # or data[2]
var = data[2]HAPIVariable{Float64, 2, Matrix{Float64}, Vector{Dates.DateTime}, JSON.Object{String, Any}}: BGSEc
Time Range: 2001-01-01T05:00:14 to 2001-01-01T05:59:58
Units: nT
Size: (225, 3)
Memory Usage: 7.710 KiB
Metadata:
size: Any[3]
name: BGSEc
description: Magnetic Field Vector in GSE Cartesian coordinates (16 sec)
units: nT
type: double
fill: -1.0E31Retrieve the values
values = parent(var)225×3 Matrix{Float64}:
-3.588 0.2 -2.425
-3.534 0.149 -2.42
-3.543 0.14 -2.427
-3.581 0.067 -2.47
-3.536 0.062 -2.463
-3.557 0.063 -2.452
-3.557 0.02 -2.429
-3.593 0.04 -2.409
-3.655 -0.017 -2.396
-3.596 0.073 -2.406
⋮
-3.895 0.251 -2.019
-3.877 0.229 -2.036
-3.934 0.285 -2.028
-3.781 0.283 -2.074
-3.792 0.328 -2.15
-3.831 0.333 -2.123
-3.528 0.03 -2.519
-3.398 0.072 -2.647
-3.454 0.044 -2.663Retrieve the timestamps
timestamps = times(var)225-element Vector{Dates.DateTime}:
2001-01-01T05:00:14
2001-01-01T05:00:30
2001-01-01T05:00:46
2001-01-01T05:01:02
2001-01-01T05:01:18
2001-01-01T05:01:34
2001-01-01T05:01:50
2001-01-01T05:02:06
2001-01-01T05:02:22
2001-01-01T05:02:38
⋮
2001-01-01T05:57:50
2001-01-01T05:58:06
2001-01-01T05:58:22
2001-01-01T05:58:38
2001-01-01T05:58:54
2001-01-01T05:59:10
2001-01-01T05:59:26
2001-01-01T05:59:42
2001-01-01T05:59:58Retrieve the metadata
metadata = meta(var)JSON.Object{String, Any} with 6 entries:
"size" => Any[3]
"name" => "BGSEc"
"description" => "Magnetic Field Vector in GSE Cartesian coordinates (16 sec)"
"units" => "nT"
"type" => "double"
"fill" => "-1.0E31"Working with Different Servers
CSA Example
# Example with CSA (Cluster Science Archive) server
dataset = "C4_CP_FGM_FULL"
parameters = "B_vec_xyz_gse,B_mag"
tmin = DateTime(2001, 6, 11, 0, 0, 0)
tmax = DateTime(2001, 6, 11, 0, 1, 0)
data = hapi(CSA, dataset, parameters, tmin, tmax)INTERMAGNET Example
# Example with INTERMAGNET server (datasets with slashes in names)
dataset = "aae/definitive/PT1M/xyzf"
parameters = "Field_Vector"
tmin = DateTime(2001, 6, 11, 0, 0, 0)
tmax = DateTime(2001, 6, 11, 0, 1, 0)
data = hapi(INTERMAGNET, dataset, parameters, tmin, tmax)
data = get_data("INTERMAGNET/aae/definitive/PT1M/xyzf/Field_Vector", tmin, tmax)Data Analysis
The retrieved data integrates well with Julia's ecosystem:
using CairoMakie
f = Figure()
for (i, var) in enumerate(data)
m = meta(var)
ax = Axis(f[i,1]; ylabel=m["name"], title=m["description"])
t = times(var)
for c in eachcol(var)
lines!(t, c)
end
i != length(data) && hidexdecorations!(; grid=false)
end
f
For advanced visualization capabilities, HAPIClient.jl works well with the SPEDAS.jl ecosystem. See the SPEDAS.jl quickstart guide for detailed visualization examples.