Starlink Public API V2

The Starlink Public API V2 manages accounts, addresses, contacts, service lines, user terminals, WiFi routers, data pools, and billing for business and enterprise Starlink accounts. The public OpenAPI 3.0.4 description carries 49 paths across 12 tags and is downloadable anonymously. Authentication is OIDC client credentials against https://starlink.com/api/auth/connect/token, with role-based permissions declared per endpoint.

OpenAPI Specification

starlink-public-api-v2-openapi.json Raw ↑
{
  "openapi": "3.0.4",
  "info": {
    "title": "Starlink Public API",
    "description": "<h3>Description</h3>API to manage Starlink accounts and devices. For interactive endpoints list see: <a href='https://starlink.readme.io/'>https://starlink.readme.io/</a><h3>Authentication - OIDC</h3><p>To authenticate with this API using OIDC, <a target='_blank' href='/api/auth/.well-known/openid-configuration'>Well Known URL</a> and attach the result to your requests with the <strong>Authorize</strong> button below.</p>",
    "version": "2"
  },
  "servers": [
    {
      "url": "/api"
    }
  ],
  "paths": {
    "/public/v2/account": {
      "get": {
        "tags": [
          "Account"
        ],
        "summary": "Get account information",
        "description": "Required permission: Account information, View.",
        "responses": {
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Missing required permission for this endpoint or resource"
          },
          "200": {
            "description": "Account retrieved",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AccountResponseV2ServiceResponse"
                }
              }
            }
          },
          "422": {
            "description": "Failed to retrieve account",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServiceResponse"
                }
              }
            }
          }
        }
      }
    },
    "/public/v2/data-usage/query": {
      "post": {
        "tags": [
          "Account"
        ],
        "summary": "Query data usage",
        "description": "Required permission: Service plan, View.<br/>Retrieve the real-time data tracking info for this account's data usage. For detailed instructions, please refer to the API documentation: https://starlink.readme.io/docs/data-usage-api",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Index of page to get.",
            "schema": {
              "type": "integer",
              "format": "int32",
              "default": 0
            }
          },
          {
            "name": "limit",
            "in": "query",
            "description": "Amount of service lines to retrieve per page. Defaults to 50, can request up to 250.",
            "schema": {
              "type": "integer",
              "format": "int32",
              "default": 50
            }
          }
        ],
        "requestBody": {
          "description": "Data usage query filters",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/QueryDataUsageRequest"
              }
            }
          }
        },
        "responses": {
          "400": {
            "description": "Bad Request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Missing required permission for this endpoint or resource"
          },
          "200": {
            "description": "Successfully retrieved data usage",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServiceLineDataUsageForBillingCyclesPaginatedServiceResponse"
                }
              }
            }
          },
          "422": {
            "description": "Failed to query data usage",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServiceResponse"
                }
              }
            }
          }
        }
      }
    },
    "/public/v2/products": {
      "get": {
        "tags": [
          "Account"
        ],
        "summary": "Get products",
        "description": "Required permission: Service plan, View.<br/>Gets all products available to this account that could be assigned to service lines. Each product includes data block product info if compatible.",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Index of page to get. Page size is 100",
            "schema": {
              "type": "integer",
              "format": "int32",
              "default": 0
            },
            "example": 0
          }
        ],
        "responses": {
          "400": {
            "description": "Bad Request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Missing required permission for this endpoint"
          },
          "200": {
            "description": "Subscription products retrieved",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SubscriptionProductResponsePaginatedServiceResponse"
                }
              }
            }
          },
          "422": {
            "description": "Failed to retrieve subscriptions",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServiceResponse"
                }
              }
            }
          }
        }
      }
    },
    "/public/v2/addresses": {
      "get": {
        "tags": [
          "Addresses"
        ],
        "summary": "Get all addresses",
        "description": "Required permission: Account information, View.<br/>Returns all addresses on the account in paginated form.",
        "parameters": [
          {
            "name": "addressIds",
            "in": "query",
            "description": "Filter by a specific set of Address Reference IDs",
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "format": "uuid"
              }
            }
          },
          {
            "name": "metadata",
            "in": "query",
            "description": "Filter by metadata",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "page",
            "in": "query",
            "description": "Index of page to get. Page size is 100",
            "schema": {
              "type": "integer",
              "format": "int32",
              "default": 0
            },
            "example": 0
          }
        ],
        "responses": {
          "400": {
            "description": "Bad Request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Missing required permission for this endpoint or resource"
          },
          "200": {
            "description": "Addresses retrieved",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AddressResponsePaginatedServiceResponse"
                }
              }
            }
          },
          "422": {
            "description": "Failed to retrieve addresses",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServiceResponse"
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "Addresses"
        ],
        "summary": "Create address",
        "description": "Required permission: Account information, Edit.",
        "requestBody": {
          "description": "AddressCreateRequest",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AddressCreateRequest"
              }
            }
          }
        },
        "responses": {
          "400": {
            "description": "Bad Request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Missing required permission for this endpoint or resource"
          },
          "201": {
            "description": "Address created",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AddressResponseServiceResponse"
                }
              }
            }
          },
          "422": {
            "description": "Failed to create address",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AddressResponseServiceResponse"
                }
              }
            }
          }
        }
      }
    },
    "/public/v2/addresses/{addressReferenceId}": {
      "get": {
        "tags": [
          "Addresses"
        ],
        "summary": "Get address",
        "description": "Required permission: Account information, View.",
        "parameters": [
          {
            "name": "addressReferenceId",
            "in": "path",
            "description": "Address reference ID",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "example": "55ec6574-10d8-bd9c-1951-d4184f4ae467"
          }
        ],
        "responses": {
          "400": {
            "description": "Bad Request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Missing required permission for this endpoint or resource"
          },
          "200": {
            "description": "Address retrieved",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AddressResponseServiceResponse"
                }
              }
            }
          },
          "422": {
            "description": "Failed to retrieve address",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServiceResponse"
                }
              }
            }
          }
        }
      },
      "put": {
        "tags": [
          "Addresses"
        ],
        "summary": "Update address",
        "description": "Required permission: Account information, Edit.",
        "parameters": [
          {
            "name": "addressReferenceId",
            "in": "path",
            "description": "Reference Id of address to update",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "example": "55ec6574-10d8-bd9c-1951-d4184f4ae467"
          }
        ],
        "requestBody": {
          "description": "AddressUpdateRequest",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AddressUpdateRequestV2"
              }
            }
          }
        },
        "responses": {
          "400": {
            "description": "Bad Request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Missing required permission for this endpoint or resource"
          },
          "200": {
            "description": "Address updated",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AddressResponseServiceResponse"
                }
              }
            }
          },
          "422": {
            "description": "Failed to update the address",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServiceResponse"
                }
              }
            }
          }
        }
      }
    },
    "/public/v2/billing/invoices": {
      "get": {
        "tags": [
          "Billing"
        ],
        "summary": "Get invoice summaries",
        "description": "Required permission: Financial, View.",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "The index of the page, starting at 0. Page size is 100",
            "schema": {
              "type": "integer",
              "format": "int32",
              "default": 0
            }
          }
        ],
        "responses": {
          "400": {
            "description": "Bad request. Invalid or missing parameter"
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Missing required permission for this endpoint or resource"
          },
          "200": {
            "description": "Invoices retrieved",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InvoiceSummaryResponsePaginatedServiceResponse"
                }
              }
            }
          },
          "422": {
            "description": "Failed to retrieve invoices",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServiceResponse"
                }
              }
            }
          }
        }
      }
    },
    "/public/v2/billing/invoices/{invoiceId}": {
      "get": {
        "tags": [
          "Billing"
        ],
        "summary": "Get invoice details",
        "description": "Required permission: Financial, View.",
        "parameters": [
          {
            "name": "invoiceId",
            "in": "path",
            "description": "The invoice identifier",
            "required": true,
            "schema": {
              "type": "string"
            },
            "example": "INV-DF-US-1234ABCD"
          }
        ],
        "responses": {
          "400": {
            "description": "Bad request. Invalid or missing parameter"
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Missing required permission for this endpoint or resource"
          },
          "200": {
            "description": "Invoice retrieved",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InvoiceDetailResponseServiceResponse"
                }
              }
            }
          },
          "422": {
            "description": "Failed to retrieve the invoice",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServiceResponse"
                }
              }
            }
          }
        }
      }
    },
    "/public/v2/billing/balance": {
      "get": {
        "tags": [
          "Billing"
        ],
        "summary": "Get account balance",
        "description": "Required permission: Financial, View.<br/>Response contains one balance for each currency. If all balances are 0 then response will contain a single entry with 0 balance and currency matching the default for this account.",
        "responses": {
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Missing required permission for this endpoint or resource"
          },
          "200": {
            "description": "Balance retrieved",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AccountBalanceResponseServiceResponse"
                }
              }
            }
          },
          "422": {
            "description": "Failed to retrieve the balance",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServiceResponse"
                }
              }
            }
          }
        }
      }
    },
    "/public/v2/contacts": {
      "get": {
        "tags": [
          "Contacts"
        ],
        "summary": "Get contacts",
        "description": "Required permission: User management, Edit.<br/>Get list of contacts on the authenticated user's account.",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Page of contacts to query.",
            "schema": {
              "type": "integer",
              "format": "int32",
              "default": 0
            }
          }
        ],
        "responses": {
          "400": {
            "description": "Bad request. Invalid or missing parameter"
          },
          "401": {
            "description": "Unauthorized"
          },
          "200": {
            "description": "Contacts retrieved.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UserResponsePaginatedServiceResponse"
                }
              }
            }
          },
          "422": {
            "description": "Failed to retrieve contacts.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServiceResponse"
                }
              }
            }
          },
          "default": {
            "description": "Error"
          },
          "403": {
            "description": "user_lacks_required_permission",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UserLacksRequiredPermissionServiceResponse"
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "Contacts"
        ],
        "summary": "Create contact",
        "description": "Required permission: Admin Only - API User Management, Edit.<br/>Creates the contact if it is new, and adds the contact to the authenticated account.",
        "requestBody": {
          "description": "Contact information to be added to account.",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateContactOnAccountRequest"
              }
            }
          }
        },
        "responses": {
          "401": {
            "description": "Unauthorized"
          },
          "400": {
            "description": "Bad request. Invalid or missing parameter"
          },
          "200": {
            "description": "Contact has been created and added to the account with the requested roles.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UserResponseServiceResponse"
                }
              }
            }
          },
          "422": {
            "description": "Failed to create the contact and add it to the account with the correct roles.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServiceResponse"
                }
              }
            }
          },
          "403": {
            "description": "user_lacks_required_permission",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UserLacksRequiredPermissionServiceResponse"
                }
              }
            }
          }
        }
      }
    },
    "/public/v2/contacts/{subjectId}": {
      "delete": {
        "tags": [
          "Contacts"
        ],
        "summary": "Delete contact",
        "description": "Required permission: Admin Only - API User Management, Edit.<br/>Deletes contact based on specified subject Id on the authenticated account.",
        "parameters": [
          {
            "name": "subjectId",
            "in": "path",
            "description": "Subject ID of contact to be deleted.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "400": {
            "description": "Bad request. Invalid or missing parameter"
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Forbidden"
          },
          "200": {
            "description": "Contact successfully deleted from account.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServiceResponse"
                }
              }
            }
          },
          "422": {
            "description": "Failed to delete contact.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServiceResponse"
                }
              }
            }
          },
          "default": {
            "description": "Error"
          }
        }
      },
      "put": {
        "tags": [
          "Contacts"
        ],
        "summary": "Update contact",
        "description": "Required permission: Admin Only - API User Management, Edit.<br/>Update contact on the authenticated account.",
        "parameters": [
          {
            "name": "subjectId",
            "in": "path",
            "description": "Subject Id of the contact to be updated.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "description": "Updates for contact.",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateContactOnAccountRequest"
              }
            }
          }
        },
        "responses": {
          "400": {
            "description": "Bad request. Invalid or missing parameter"
          },
          "401": {
            "description": "Unauthorized"
          },
          "200": {
            "description": "Updated contact.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UserResponseServiceResponse"
                }
              }
            }
          },
          "422": {
            "description": "Failed to update contact.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServiceResponse"
                }
              }
            }
          },
          "default": {
            "description": "Error"
          },
          "403": {
            "description": "user_lacks_required_permission",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UserLacksRequiredPermissionServiceResponse"
                }
              }
            }
          }
        }
      }
    },
    "/public/v2/data-pools": {
      "get": {
        "tags": [
          "Data Pools"
        ],
        "summary": "Pre-Release: Get all multi-service line enabled data pools.",
        "description": "Required permission: Service plan, View.<br/>This endpoint is available for select audiences only.",
        "parameters": [
          {
            "name": "productReferenceId",
            "in": "query",
            "description": "Filter by Product ID of the pool",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dataPoolIds",
            "in": "query",
            "description": "Data pool IDs to filter by. Queries for all data pools on account if omitted",
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          },
          {
            "name": "page",
            "in": "query",
            "description": "The index of the page, starting at 0. Page size is 100",
            "schema": {
              "type": "integer",
              "format": "int32",
              "default": 0
            }
          }
        ],
        "responses": {
          "400": {
            "description": "Bad Request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Forbidden"
          },
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DataPoolResponseV2PaginatedServiceResponse"
                }
              }
            }
          },
          "422": {
            "description": "Unprocessable Content",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServiceResponse"
                }
              }
            }
          }
        }
      }
    },
    "/public/v2/data-pools/usage": {
      "get": {
        "tags": [
          "Data Pools"
        ],
        "summary": "Pre-Release: Query data pool usage with service line and monthly breakdowns.",
        "description": "Required permission: Service plan, View.<br/>This endpoint is available for select audiences only.",
        "parameters": [
          {
            "name": "dataPoolIds",
            "in": "query",
            "description": "Data pool Ids to filter by. Queries for usage of all data pools on account if omitted",
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          },
          {
            "name": "asOfTimestamp",
            "in": "query",
            "description": "Optional timestamp for snapshotting data pool usage *as of* this time. Only includes data blocks\n            that are active at this instant (i.e., `StartDate <= asOfTimestamp < EndDate`).\n            Defaults to `DateTimeOffset.UtcNow` to return currently active blocks.",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "page",
            "in": "query",
            "description": "The index of the page, starting at 0.",
            "schema": {
              "type": "integer",
              "format": "int32",
              "default": 0
            }
          },
          {
            "name": "limit",
            "in": "query",
            "description": "Amount of data pool usage summaries to retrieve per page. Defaults to 50, can request up to 100.",
            "schema": {
              "type": "integer",
              "format": "int32",
              "default": 50
            }
          }
        ],
        "responses": {
          "400": {
            "description": "Bad Request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Forbidden"
          },
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DataPoolUsageResponseV2PaginatedServiceResponse"
                }
              }
            }
          },
          "422": {
            "description": "Unprocessable Content",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServiceResponse"
                }
              }
            }
          }
        }
      }
    },
    "/public/v2/data-pools/{dataPoolId}/set-automatic-top-up": {
      "post": {
        "tags": [
          "Data Pools"
        ],
        "summary": "Pre-Release: Enable or disable automatic top-up for a data pool.",
        "description": "Required permission: Service plan, Edit.<br/>This endpoint is available for select audiences only.",
        "parameters": [
          {
            "name": "dataPoolId",
            "in": "path",
            "description": "The data pool ID",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "enabled",
            "in": "query",
            "description": "Whether automatic top-up should be enabled (defaults to true)",
            "schema": {
              "type": "boolean",
              "default": true
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServiceResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Forbidden"
          },
          "422": {
            "description": "Unprocessable Content",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServiceResponse"
                }
              }
            }
          }
        }
      }
    },
    "/public/v2/flights/status": {
      "post": {
        "tags": [
          "Flights"
        ],
        "summary": "Post a flight event",
        "description": "Required permission: Aviation flight status management, Edit.<br/>Post a real-time flight event on a Starlink-enabled plane. This endpoint is only accessible from an aviation account.",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/StarlinkFlightRequest"
              }
            }
          }
        },
        "responses": {
          "400": {
            "description": "Bad Request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Forbidden"
          },
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServiceResponse"
                }
              }
            }
          }
        }
      }
    },
    "/public/v2/managed/customers": {
      "post": {
        "tags": [
          "Managed"
        ],
        "summary": "Create a managed customer account",
        "description": "This endpoint is only callable with an authorized provider account.",
        "requestBody": {
          "description": "CreateManagedCustomerRequest",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateManagedCustomerRequest"
              }
            }
          }
        },
        "responses": {
          "400": {
            "description": "Bad Request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Forbidden from creating customer accounts"
          },
          "200": {
            "description": "Successfully created customer account",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CreateManagedCustomerResponseServiceResponse"
                }
              }
            }
          },
          "422": {
            "description": "Failed to create customer account",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServiceResponse"
                }
              }
            }
          }
        }
      }
    },
    "/public/v2/managed/accounts/tree": {
      "get": {
        "tags": [
          "Managed Accounts"
        ],
        "summary": "Pre-Release: Get managed account tree",
        "description": "Required perm

# --- truncated at 32 KB (244 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/starlink/refs/heads/main/openapi/starlink-public-api-v2-openapi.json