You don’t need credentials to read most data. Raindrop’s station, observation and alert endpoints are open to anyone, as are Cyclone’s model catalog and a few of its data sources. Credentials raise the limits and unlock the rest.
Plans
Access is tiered by plan. Plans are attached to a CSSL account, and higher plans include everything below them.
| No account | Free | Pro | Commercial | |
|---|---|---|---|---|
| Raindrop observation window | 7 days | 7 days | 30 days | Unlimited |
| Raindrop bulk CSV export | – | – | – | ✓ |
| Cyclone RDPS, GOES-19, MRMS | ✓ | ✓ | ✓ | ✓ |
| Other Cyclone models | – | ✓ | ✓ | ✓ |
| Cyclone radar volumes | – | – | ✓ | ✓ |
RDPS composite indices (SCP, STP, SHIP, lapse rates and mixing ratio) need a signed-in account for tiles and time series. Some Cyclone sources are also limited to members of particular organizations. The table shows the default policy. To see exactly what a credential can reach, ask the API (see Checking access below).
Credentials
Both APIs read credentials from the Authorization header:
Authorization: Bearer <credential>
Credentials in query strings or request bodies are ignored.
CSSL account tokens
Signing in to Weather Intelligence gets you an access token from auth.cssl.ca. It’s a signed JWT that carries your plan. Raindrop and Cyclone both accept it.
- Browsers on a
*.cssl.casite send it automatically in thecssl_atcookie. - Other clients send it as a Bearer token.
Tokens expire. The portal refreshes them for you, but there’s currently no self-serve way to create a long-lived token for scripts. For automated access to gated Raindrop data, use an API key.
Raindrop API keys
A Raindrop API key is an opaque string issued by a CSSL administrator. Keys can’t be created self-serve; to request one, email nmp@uwo.ca.
- Raindrop treats every API key as the Commercial plan.
- Keys are issued either without an expiry or valid for one year.
- Keys work only on Raindrop. Cyclone treats anything that isn’t a JWT as anonymous.
curl -H "Authorization: Bearer $RAINDROP_API_KEY" \
"https://raindrop.cssl.ca/api/v1/capabilities"
Checking access
Each API has a /capabilities endpoint. It reports what the credential you send can do, and works with no credential too.
curl https://raindrop.cssl.ca/api/v1/capabilities
curl https://cyclone.cssl.ca/capabilities
The response lists products by ID. Each has an allowed flag and the plan it requires:
{
"products": {
"historical.bulk": { "allowed": false, "requires": "commercial", "requiresStanding": "none" }
},
"limits": {
"maxWindowMs": 604800000,
"maxReachMs": 604800000
}
}
- Compare plans by rank, not by name. A
commercialplan satisfies aprorequirement. - A missing product ID means the deployment doesn’t offer that product. A product that’s present with
"allowed": falseis gated. requiresStanding: "cssl"means the product is limited to CSSL staff. No plan can buy it.- In
limits,nullmeans unlimited. Ignore keys you don’t recognize.
When a request is refused
| Status | Body | Meaning |
|---|---|---|
401 |
{"reason": "…"} |
The token you sent was rejected. reason is one of malformed, unknown_kid, bad_signature, expired or bad_claims. Only expired is worth refreshing. |
401 |
empty | The endpoint needs a credential and you didn’t send one. |
403 |
empty | Your credential is valid, but your plan or organization doesn’t include this. Refreshing won’t help. |
A bad token is worse than no token
Raindrop treats an unrecognized API key as anonymous. An invalid or expired JWT is different: both APIs reject it with 401, even on endpoints that don’t require authentication. If your token expires mid-session, refresh it or stop sending it.