Documentation Index Fetch the complete documentation index at: https://mintlify.com/ManiFed/TTN/llms.txt
Use this file to discover all available pages before exploring further.
Member endpoints power the dashboard and mobile app experience. They cover the full lifecycle of a member’s relationship with The Telescope Net: creating an account, linking telescope nodes, generating activation codes for first-boot registration, browsing observation history and cumulative statistics, managing node schedules and vacation modes, and controlling notification preferences. All endpoints except registration and login require an Authorization: Bearer <token> header obtained at login.
POST /api/v1/auth/register
Create a new member account. Returns a bearer token immediately so the client does not need a separate login step.
Auth: NoneValid email address. Must contain @ and a dot in the domain. Stored in lowercase. Returns 400 if the address is already registered.
Minimum 8 characters. Hashed server-side with PBKDF2-HMAC-SHA256 at 260,000 iterations with a per-user random salt.
Optional display name shown in the member dashboard. Defaults to the email prefix if omitted.
200 OK Unique member identifier, e.g. "u_4a8b1c2d".
Bearer token. Pass in Authorization: Bearer <token> on all subsequent member requests.
curl -X POST https://api.thetelescope.net/api/v1/auth/register \
-H "Content-Type: application/json" \
-d '{"email": "you@example.com", "password": "SecurePass123!", "display_name": "Jane"}'
{
"user_id" : "u_4a8b1c2d" ,
"token" : "aBcDeFgHiJkLmNoPqRsTuVwXyZ012345_abc"
}
POST /api/v1/auth/login
Authenticate with email and password. Issues a new bearer token, invalidating any previously issued token for this account.
Auth: NoneRegistered email address.
200 OK 401 is returned with a deliberately vague "invalid email or password" error for both unknown emails and wrong passwords, to prevent account enumeration.curl -X POST https://api.thetelescope.net/api/v1/auth/login \
-H "Content-Type: application/json" \
-d '{"email": "you@example.com", "password": "SecurePass123!"}'
{
"user_id" : "u_4a8b1c2d" ,
"token" : "new_token_here"
}
GET /api/v1/me
Retrieve the authenticated member’s profile.
Auth: Authorization: Bearer <token>No request body or query parameters.
200 OK Registered email address.
Account role, typically "member".
Display name set at registration or updated since.
Country stored on the member profile.
ISO 8601 UTC timestamp of account creation.
ISO 8601 UTC timestamp of most recent login.
curl -H "Authorization: Bearer <token>" \
https://api.thetelescope.net/api/v1/me
{
"user_id" : "u_4a8b1c2d" ,
"email" : "you@example.com" ,
"role" : "member" ,
"display_name" : "Jane" ,
"country" : "US" ,
"created_at" : "2026-01-10T18:30:00.000000+00:00" ,
"last_login" : "2026-06-15T01:12:00.000000+00:00"
}
DELETE /api/v1/me
Permanently delete the member account and all associated data including notifications, activation codes, node memberships, and help chat history. This action is irreversible.
Auth: Authorization: Bearer <token>Must be true. The server returns 400 if this field is absent or false, preventing accidental deletion.
200 OK — {"ok": true}
curl -X DELETE \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{"confirm": true}' \
https://api.thetelescope.net/api/v1/me
GET /api/v1/me/nodes
List all telescope nodes claimed by the authenticated member.
Auth: Authorization: Bearer <token>No request body or query parameters.
200 OK Array of node records. Each entry omits api_key and owner_email. Model name, e.g. "ZWO Seestar S50".
Member-set display name for this node.
active, sleeping, vacation, or disabled.
Derived: true when heartbeat is recent and status is active.
true for telescopes that move between sites.
ISO date string if node is on vacation, otherwise empty.
Most recently uploaded observing conditions.
Tonight’s session location (portable nodes only).
Up to 10 recent session locations for portable nodes.
ISO 8601 UTC timestamp of when this member claimed the node.
curl -H "Authorization: Bearer <token>" \
https://api.thetelescope.net/api/v1/me/nodes
{
"nodes" : [
{
"node_id" : "node_a3f9b2c1" ,
"telescope_model" : "ZWO Seestar S50" ,
"display_name" : "Backyard Seestar" ,
"city" : "Austin" ,
"country" : "US" ,
"status" : "active" ,
"online" : true ,
"portable" : false ,
"claimed_at" : "2026-01-15T20:00:00.000000+00:00"
}
]
}
POST /api/v1/me/nodes/
Claim an existing node by presenting its api_key. Use this to link a node that was registered before the member account existed, or to add a second account as a co-owner.
Auth: Authorization: Bearer <token>The node identifier to claim.
The node’s secret API key (from data/cloud_state.json on the node).
200 OK true when the claim is recorded.
401 is returned when the api_key does not match the node.curl -X POST https://api.thetelescope.net/api/v1/me/nodes/node_a3f9b2c1 \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{"api_key": "<the_node_api_key>"}'
{ "ok" : true , "node_id" : "node_a3f9b2c1" }
PUT /api/v1/me/nodes/
Update member-specific settings for a claimed node, such as its display name.
Auth: Authorization: Bearer <token>Node identifier. The node must be claimed by this member.
Human-readable label for this node in the dashboard. Maximum 80 characters.
200 OK 404 is returned when the node is not claimed by this member.curl -X PUT https://api.thetelescope.net/api/v1/me/nodes/node_a3f9b2c1 \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{"display_name": "Backyard Seestar"}'
{ "ok" : true , "node_id" : "node_a3f9b2c1" }
DELETE /api/v1/me/nodes/
Remove this member’s claim on a node, disconnecting it from their account. The node itself is not deleted — only the membership link is removed.
Auth: Authorization: Bearer <token>Node identifier. The node must be claimed by this member.
200 OK — {"ok": true}404 is returned when the node is not claimed by this member.
curl -X DELETE \
-H "Authorization: Bearer <token>" \
https://api.thetelescope.net/api/v1/me/nodes/node_a3f9b2c1
POST /api/v1/me/nodes//session
Start a portable node’s observing session for tonight. Updates the session location, fetches sky quality for that location, and sets the node status to active. Only valid for nodes registered as portable.
Auth: Authorization: Bearer <token>Node identifier. Must be a portable node claimed by this member.
Tonight’s observing latitude in decimal degrees.
Tonight’s observing longitude in decimal degrees.
Human-readable city or locality name for this session location.
Optional site name, e.g. "Cherry Springs State Park".
200 OK true when the session is started.
Sky brightness at tonight’s location in magnitudes per square arcsecond.
Bortle scale classification for the session site (1–9).
400 is returned when lat or lon are missing, or for non-portable nodes.404 is returned when the node is not claimed by this member.curl -X POST https://api.thetelescope.net/api/v1/me/nodes/node_a3f9b2c1/session \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{"lat": 41.6611, "lon": -77.8202, "city": "Coudersport", "site_name": "Cherry Springs SP"}'
{ "ok" : true , "mpsas" : 21.8 , "bortle" : 2 }
DELETE /api/v1/me/nodes//session
Manually end a portable node’s observing session, returning it to sleeping status.
Auth: Authorization: Bearer <token>Node identifier. Must be a portable node claimed by this member.
200 OK — {"ok": true}404 is returned when the node is not claimed by this member.
curl -X DELETE \
-H "Authorization: Bearer <token>" \
https://api.thetelescope.net/api/v1/me/nodes/node_a3f9b2c1/session
PUT /api/v1/me/nodes//vacation
Pause a node’s observation schedule until a specified date. Nights during the vacation window are excluded from the reliability score calculation. The scheduler will not generate plans for a node on vacation.
Auth: Authorization: Bearer <token>Node identifier. The node must be claimed by this member.
ISO date string in YYYY-MM-DD format specifying the last day of vacation.
200 OK true when vacation is set.
400 is returned when until_date is missing or not in YYYY-MM-DD format.404 is returned when the node is not claimed by this member.curl -X PUT \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{"until_date": "2026-07-01"}' \
https://api.thetelescope.net/api/v1/me/nodes/node_a3f9b2c1/vacation
{ "ok" : true , "vacation_until" : "2026-07-01" }
DELETE /api/v1/me/nodes//vacation
Cancel an active vacation early, returning the node to its normal operating status.
Auth: Authorization: Bearer <token>Node identifier. The node must be claimed by this member.
200 OK — {"ok": true}404 is returned when the node is not claimed by this member.
curl -X DELETE \
-H "Authorization: Bearer <token>" \
https://api.thetelescope.net/api/v1/me/nodes/node_a3f9b2c1/vacation
POST /api/v1/me/activation-code
Generate a personal activation code for linking a new node to this account. The code is embedded in the installer flow and is consumed during POST /api/v1/nodes/register. Codes expire after 30 days .
Auth: Authorization: Bearer <token>Place name for the observatory, e.g. "Rockwood TX". Geocoded via Nominatim and stored with the code so the node automatically receives coordinates at registration.
Observatory latitude. Takes precedence over location_name geocoding when provided together with longitude.
Telescope model chosen in the app, e.g. "ZWO Seestar S50". Used to seed hardware spec defaults at registration.
Human-readable name for this specific telescope, max 80 characters.
true if this will be a portable node.
200 OK Activation code in BS-YYYY-XXXXXXXX format.
ISO 8601 UTC expiry timestamp (30 days from generation).
curl -X POST https://api.thetelescope.net/api/v1/me/activation-code \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"location_name": "Rockwood TX",
"telescope_model": "ZWO Seestar S50",
"telescope_display_name": "Back Porch Seestar"
}'
{
"code" : "BS-2026-ABCD1234" ,
"expires_at" : "2026-07-15T14:22:00.000000+00:00"
}
GET /api/v1/me/observations
Retrieve photometry measurements uploaded by all nodes owned by this member, most recent first.
Auth: Authorization: Bearer <token>Look-back window in days. Default 90, maximum 365.
Maximum number of rows to return. Default 200, maximum 100,000.
200 OK Array of measurement records sorted by BJD descending. Node that made the measurement.
1-σ photometric uncertainty.
"good", "acceptable", or "poor".
1 when submitted to AAVSO, 0 otherwise.
ISO 8601 UTC timestamp of cloud receipt.
Number of observations returned.
curl -H "Authorization: Bearer <token>" \
"https://api.thetelescope.net/api/v1/me/observations?days=30&limit=50"
{
"observations" : [
{
"node_id" : "node_a3f9b2c1" ,
"target_name" : "SS_Cyg" ,
"bjd" : 2460476.5123 ,
"magnitude" : 11.42 ,
"uncertainty" : 0.018 ,
"filter" : "CV" ,
"quality_flag" : "good" ,
"aavso_submitted" : 1 ,
"received_at" : "2026-06-15T03:10:00.000000+00:00"
}
],
"total" : 1
}
GET /api/v1/me/stats
Retrieve cumulative photometry statistics across all nodes owned by this member.
Auth: Authorization: Bearer <token>No request body or query parameters.
200 OK Total measurements uploaded across all owned nodes.
Measurements submitted to AAVSO WebObs.
Distinct target names observed.
Distinct nights where at least one observation was recorded.
Number of nodes this member owns.
curl -H "Authorization: Bearer <token>" \
https://api.thetelescope.net/api/v1/me/stats
{
"total_observations" : 1423 ,
"aavso_submitted" : 1287 ,
"targets_observed" : 34 ,
"clear_nights" : 89 ,
"node_count" : 2
}
GET /api/v1/me/timeline
Retrieve tonight’s planned observing timeline across all nodes owned by this member. Each item in the response includes a derived state field (planned, observing, or complete) based on the node’s local wall clock time.
Auth: Authorization: Bearer <token>No request body or query parameters.
200 OK Planned observation slots across all owned nodes, sorted by start time then node ID. Scheduled start in node-local HH:MM format.
Sub-frame exposure duration in seconds.
Estimated total time on target in minutes.
"planned", "observing", or "complete" based on current local time.
Position in this node’s plan (1-based).
Node metadata: node_id, telescope_model, city, country, status, online.
Plan-level metadata for each node, including node, night, generated_at, and n_items.
ISO 8601 UTC timestamp of this response.
curl -H "Authorization: Bearer <token>" \
https://api.thetelescope.net/api/v1/me/timeline
{
"items" : [
{
"target" : "SS_Cyg" ,
"startTime" : "22:15" ,
"expDur" : 30.0 ,
"expCount" : 40 ,
"estimated_minutes" : 20.0 ,
"state" : "planned" ,
"sequence" : 1 ,
"node" : {
"node_id" : "node_a3f9b2c1" ,
"telescope_model" : "ZWO Seestar S50" ,
"city" : "Austin" ,
"online" : true
}
}
],
"plans" : [
{
"node" : { "node_id" : "node_a3f9b2c1" , "city" : "Austin" },
"night" : "2026-06-15" ,
"generated_at" : "2026-06-15T01:00:00.000000+00:00" ,
"n_items" : 4
}
],
"server_time" : "2026-06-15T21:30:00.000000+00:00"
}
GET /api/v1/me/nights
Retrieve night-by-night observation summaries for all nodes owned by this member, most recent first.
Auth: Authorization: Bearer <token>Maximum number of nights to return. Default 30, maximum 90.
200 OK Array of nightly summary records. Show Night summary fields
Node that observed on this night.
Local evening date in YYYY-MM-DD format.
Number of distinct targets observed.
Total measurements taken.
Measurements submitted to AAVSO.
Per-target breakdown from the night summary JSON.
AAVSO submission receipt if available.
ISO 8601 UTC timestamp when the summary was compiled.
curl -H "Authorization: Bearer <token>" \
"https://api.thetelescope.net/api/v1/me/nights?limit=7"
{
"nights" : [
{
"node_id" : "node_a3f9b2c1" ,
"night" : "2026-06-15" ,
"n_targets" : 4 ,
"n_observations" : 18 ,
"n_submitted" : 16 ,
"targets" : { "SS_Cyg" : 6 , "T_CrB" : 5 , "RR_Lyr" : 4 , "V_Cyg" : 3 },
"generated_at" : "2026-06-15T11:00:00.000000+00:00"
}
]
}
GET /api/v1/me/highlights
Retrieve notable observation highlights for the authenticated member — events such as a first detection or a rare outburst, surfaced automatically by the cloud pipeline.
Auth: Authorization: Bearer <token>Maximum number of highlights to return. Default 50, maximum 200.
200 OK Array of highlight records. Highlight ID. Use with POST /api/v1/me/highlights/{id}/read.
Node that made the observation.
Barycentric Julian Date of the observation.
Short human-readable description of the highlight.
Extended description if available.
ISO 8601 UTC timestamp when the highlight was created.
ISO 8601 UTC timestamp when marked read, or null.
Count of unread highlights in the returned set.
curl -H "Authorization: Bearer <token>" \
https://api.thetelescope.net/api/v1/me/highlights
{
"highlights" : [
{
"id" : 55 ,
"node_id" : "node_a3f9b2c1" ,
"target_name" : "T_CrB" ,
"target_type" : "NOVA" ,
"bjd" : 2460476.5 ,
"magnitude" : 2.1 ,
"headline" : "T CrB detected at mag 2.1 — possible recurrent nova eruption!" ,
"created_at" : "2026-06-15T04:00:00.000000+00:00" ,
"read_at" : null
}
],
"unread" : 1
}
POST /api/v1/me/highlights//read
Mark a highlight as read.
Auth: Authorization: Bearer <token>Highlight ID from the highlights list.
200 OK true when the read timestamp is recorded.
curl -X POST \
-H "Authorization: Bearer <token>" \
https://api.thetelescope.net/api/v1/me/highlights/55/read
GET /api/v1/me/incidents
Retrieve recent reliability incidents for all nodes owned by this member.
Auth: Authorization: Bearer <token>Maximum number of incidents to return. Default 50, maximum 200.
200 OK Array of incident records from the reliability_incidents table, most recent first. Node that reported the incident.
Machine-readable event type, e.g. "slew_failure".
"info", "warning", "error", or "critical".
Target being observed at the time, if applicable.
true when resolved_at is set.
curl -H "Authorization: Bearer <token>" \
https://api.thetelescope.net/api/v1/me/incidents
{
"incidents" : [
{
"id" : 201 ,
"node_id" : "node_a3f9b2c1" ,
"incident_type" : "slew_failure" ,
"severity" : "error" ,
"target_name" : "SS_Cyg" ,
"detail" : { "error_code" : "MOUNT_STALL" },
"occurred_at" : "2026-06-15T02:05:00.000000+00:00" ,
"resolved" : false
}
]
}
GET /api/v1/me/notifications
Retrieve the notification inbox for the authenticated member, most recent first.
Auth: Authorization: Bearer <token>Maximum number of notifications to return. Default 50, maximum 200.
200 OK Array of notification records. Notification ID. Use with POST /api/v1/me/notifications/{id}/read.
Notification category, e.g. "night_summary", "aavso_accepted", "alert".
Structured notification data (varies by type).
ISO 8601 UTC timestamp when marked read, or null if unread.
Count of unread notifications in the returned set.
curl -H "Authorization: Bearer <token>" \
https://api.thetelescope.net/api/v1/me/notifications
{
"notifications" : [
{
"id" : 1021 ,
"type" : "night_summary" ,
"payload" : { "night" : "2026-06-15" , "n_submitted" : 16 },
"sent_at" : "2026-06-15T11:01:00.000000+00:00" ,
"read_at" : null
}
],
"unread" : 1
}
POST /api/v1/me/notifications//read
Mark a notification as read.
Auth: Authorization: Bearer <token>Notification ID from the notifications list.
200 OK true when the read timestamp is recorded.
curl -X POST \
-H "Authorization: Bearer <token>" \
https://api.thetelescope.net/api/v1/me/notifications/1021/read
PUT /api/v1/me/notifications/prefs
Update notification delivery preferences.
Auth: Authorization: Bearer <token>Enable or disable email notifications.
Enable or disable push notifications to the registered mobile app.
Mobile push token (up to 500 characters) to register or update.
200 OK true when preferences are updated.
400 is returned when the request body contains no recognised updatable fields.curl -X PUT \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{"notification_email": true, "notification_push": false}' \
https://api.thetelescope.net/api/v1/me/notifications/prefs
POST /api/v1/me/science-program-suggestions
Submit a science program idea to the The Telescope Net team. Suggestions are reviewed by administrators and may influence future target ingestion and scheduling priorities.
Auth: Authorization: Bearer <token>Short title for the suggested science program (max 200 characters).
Full description of the scientific rationale (max 5,000 characters).
Example target names or categories (max 2,000 characters).
Additional notes or references (max 2,000 characters).
200 OK true when the suggestion is stored.
Database ID of the suggestion.
ISO 8601 UTC timestamp of submission.
400 is returned when title or description is missing.curl -X POST https://api.thetelescope.net/api/v1/me/science-program-suggestions \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"title": "Symbiotic Star Monitoring Campaign",
"description": "Long-term photometric monitoring of southern symbiotic systems...",
"target_examples": "R Aqr, CH Cyg, Z And"
}'
{
"ok" : true ,
"id" : 12 ,
"created_at" : "2026-06-15T14:00:00.000000+00:00"
}
GET /api/v1/me/help
Retrieve the help session for the authenticated member, including contact information, the weekly chat quota, and recent chat history.
Auth: Authorization: Bearer <token>No request body or query parameters.
200 OK — Returns the help session object from the help chat module, including quota usage and message history.
curl -H "Authorization: Bearer <token>" \
https://api.thetelescope.net/api/v1/me/help
POST /api/v1/me/help/chat
Send a message to the OpenRouter-powered help assistant. Members are limited to 5 user messages per week. The assistant has access to the member’s node configuration context and can generate configuration patches that the node agent applies automatically.
Auth: Authorization: Bearer <token>The help message text to send to the assistant.
Optional node ID to scope the assistant’s context to a specific node’s configuration.
200 OK — Returns the assistant’s reply and any generated config patches.400 is returned when the message is empty.429 is returned when the weekly quota is exhausted.503 is returned when the upstream AI provider is unavailable.
curl -X POST https://api.thetelescope.net/api/v1/me/help/chat \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{"message": "My node keeps failing to slew past azimuth 180. How do I set a horizon mask?", "node_id": "node_a3f9b2c1"}'