> ## Documentation Index > Fetch the complete documentation index at: https://support.tulip.co/llms.txt > Use this file to discover all available pages before exploring further. # /api/stations/v1/stations/{stationId}/app-assignments > Gets a paginated list of station app assignments. ## OpenAPI ````json GET /api/stations/v1/stations/{stationId}/app-assignments { "openapi": "3.0.3", "info": { "title": "Tulip API", "version": "v1" }, "tags": [ { "name": "machines", "description": "An API for managing machines and their types" }, { "name": "stations", "description": "An API for managing and updating stations." }, { "name": "users", "description": "An API for managing users and their roles/permissions." } ], "paths": { "/api/stations/v1/stations/{stationId}/app-assignments": { "get": { "operationId": "listStationAppAssignments", "description": "Gets a paginated list of station app assignments.\n", "tags": [ "stations" ], "x-tulip-visibility": "public", "parameters": [ { "name": "stationId", "description": "The id of the station to update.", "in": "path", "required": "true", "schema": { "$ref": "#/components/schemas/StationId" } }, { "name": "limit", "description": "Limits the number of documents listed.\n", "in": "query", "required": "false", "schema": { "$ref": "#/components/schemas/PaginationParamLimit" } }, { "name": "offset", "description": "Returns documents after a certain offset. Use with limit to paginate the response.\n", "in": "query", "required": "false", "schema": { "$ref": "#/components/schemas/PaginationParamOffset" } } ], "responses": { "200": { "description": "A paginated list of app assignments.\n", "content": { "application/json": { "schema": { "allOf": [ { "type": "object", "properties": { "items": { "type": "array", "items": { "$ref": "#/components/schemas/AppAssignment" } } } }, { "$ref": "#/components/schemas/PaginatedResponse" } ] } } } }, "400": { "description": "An error occurred. The Tulip error codes `generic.customerIdRequired`, `generic.workspaceIdRequired`, `generic.invalidParams`, `http.invalidBodyJson`, `http.invalidHeaders`, `http.multiValueHeader`, `generic.limitParamNonNegativeInt`, `generic.limitParamBounds`, and `generic.offsetParamNonNegativeInt` all use the 400 HTTP status code. See the documentation of the response content schema for details on these specific Tulip errors that could result in this status code.", "content": { "application/json": { "schema": { "oneOf": [ { "allOf": [ { "$ref": "#/components/schemas/ApiError" }, { "type": "object", "description": "The request was missing information about the Tulip customer context.\n\nThis error is not automatically retryable.", "properties": { "errorCode": { "enum": [ "generic.customerIdRequired" ] }, "retryable": { "enum": [ "false" ] } }, "required": [ "errorCode", "retryable" ] } ] }, { "allOf": [ { "$ref": "#/components/schemas/ApiError" }, { "type": "object", "description": "The request was missing information about the Tulip workspace context.\n\nThis error is not automatically retryable.", "properties": { "errorCode": { "enum": [ "generic.workspaceIdRequired" ] }, "retryable": { "enum": [ "false" ] } }, "required": [ "errorCode", "retryable" ] } ] }, { "allOf": [ { "$ref": "#/components/schemas/ApiError" }, { "type": "object", "description": "The request parameters were invalid.\n\nThis error is not automatically retryable.", "properties": { "errorCode": { "enum": [ "generic.invalidParams" ] }, "retryable": { "enum": [ "false" ] } }, "required": [ "errorCode", "retryable" ] } ] }, { "allOf": [ { "$ref": "#/components/schemas/ApiError" }, { "type": "object", "description": "The HTTP request body could not be decoded as JSON.\n\nThis error is not automatically retryable.", "properties": { "errorCode": { "enum": [ "http.invalidBodyJson" ] }, "retryable": { "enum": [ "false" ] } }, "required": [ "errorCode", "retryable" ] } ] }, { "allOf": [ { "$ref": "#/components/schemas/ApiError" }, { "type": "object", "description": "The HTTP request headers were invalid.\n\nThis error is not automatically retryable.", "properties": { "errorCode": { "enum": [ "http.invalidHeaders" ] }, "retryable": { "enum": [ "false" ] } }, "required": [ "errorCode", "retryable" ] } ] }, { "allOf": [ { "$ref": "#/components/schemas/ApiError" }, { "type": "object", "description": "An HTTP request header contained multiple values.\n\nThis error is not automatically retryable.", "properties": { "errorCode": { "enum": [ "http.multiValueHeader" ] }, "details": { "type": "object", "properties": { "headerName": { "description": "The name of the given HTTP header which had multiple values.\n", "type": "string" } }, "required": [ "headerName" ] }, "retryable": { "enum": [ "false" ] } }, "required": [ "errorCode", "retryable", "details" ] } ] }, { "allOf": [ { "$ref": "#/components/schemas/ApiError" }, { "type": "object", "description": "The limit parameter for this endpoint was not a non-negative integer.\n\nThis error is not automatically retryable.", "properties": { "errorCode": { "enum": [ "generic.limitParamNonNegativeInt" ] }, "retryable": { "enum": [ "false" ] } }, "required": [ "errorCode", "retryable" ] } ] }, { "allOf": [ { "$ref": "#/components/schemas/ApiError" }, { "type": "object", "description": "The limit parameter for this endpoint was out of bounds.\n\nThis error is not automatically retryable.", "properties": { "errorCode": { "enum": [ "generic.limitParamBounds" ] }, "details": { "type": "object", "properties": { "upperBound": { "description": "The maximum allowed value for the limit parameter.\n", "type": "integer" } }, "required": [ "upperBound" ] }, "retryable": { "enum": [ "false" ] } }, "required": [ "errorCode", "retryable", "details" ] } ] }, { "allOf": [ { "$ref": "#/components/schemas/ApiError" }, { "type": "object", "description": "The offset parameter for this endpoint was not a non-negative integer.\n\nThis error is not automatically retryable.", "properties": { "errorCode": { "enum": [ "generic.offsetParamNonNegativeInt" ] }, "retryable": { "enum": [ "false" ] } }, "required": [ "errorCode", "retryable" ] } ] } ] } } } }, "401": { "description": "The request was missing required authentication information.\n\nThis error is not automatically retryable.", "content": { "application/json": { "schema": { "allOf": [ { "$ref": "#/components/schemas/ApiError" }, { "type": "object", "description": "The request was missing required authentication information.\n\nThis error is not automatically retryable.", "properties": { "errorCode": { "enum": [ "generic.authRequired" ] }, "retryable": { "enum": [ "false" ] } }, "required": [ "errorCode", "retryable" ] } ] } } } }, "404": { "description": "The requested resource was not found.\n\nThis error is not automatically retryable.", "content": { "application/json": { "schema": { "allOf": [ { "$ref": "#/components/schemas/ApiError" }, { "type": "object", "description": "The requested resource was not found.\n\nThis error is not automatically retryable.", "properties": { "errorCode": { "enum": [ "generic.notFound" ] }, "retryable": { "enum": [ "false" ] } }, "required": [ "errorCode", "retryable" ] } ] } } } }, "429": { "description": "Too many requests have been made to this endpoint in a short time period.\n\nThis error is not automatically retryable.", "content": { "application/json": { "schema": { "allOf": [ { "$ref": "#/components/schemas/ApiError" }, { "type": "object", "description": "Too many requests have been made to this endpoint in a short time period.\n\nThis error is not automatically retryable.", "properties": { "errorCode": { "enum": [ "http.endpointRateLimitExceeded" ] }, "details": { "type": "object", "properties": { "details": { "description": "Additional details about this endpoint's rate limits.\n", "type": "string" } } }, "retryable": { "enum": [ "false" ] } }, "required": [ "errorCode", "retryable", "details" ] } ] } } } }, "500": { "description": "An error occurred. The Tulip error codes `generic.internal` and `stations.internalTypeValidationError` both use the 500 HTTP status code. See the documentation of the response content schema for details on these specific Tulip errors that could result in this status code.", "content": { "application/json": { "schema": { "oneOf": [ { "allOf": [ { "$ref": "#/components/schemas/ApiError" }, { "type": "object", "description": "An internal server error occurred. Please contact [support@tulip.co](mailto:support@tulip.co)\nif the error persists.\n\nThis error is not automatically retryable.", "properties": { "errorCode": { "enum": [ "generic.internal" ] }, "retryable": { "enum": [ "false" ] } }, "required": [ "errorCode", "retryable" ] } ] }, { "allOf": [ { "$ref": "#/components/schemas/ApiError" }, { "type": "object", "description": "A resource failed internal type validation.\n\nThis error is not automatically retryable.", "properties": { "errorCode": { "enum": [ "stations.internalTypeValidationError" ] }, "details": { "type": "object", "properties": { "resourceName": { "description": "The name of the resource that failed validation.\n", "type": "string" }, "resourceId": { "description": "The id of the resource that failed validation.\n", "type": "string" } }, "required": [ "resourceName" ] }, "retryable": { "enum": [ "false" ] } }, "required": [ "errorCode", "retryable", "details" ] } ] } ] } } } } } } } }, "components": { "schemas": { "StationId": { "allOf": [ { "$ref": "#/components/schemas/RandomId" }, { "description": "The id of a station.\n" } ] }, "PaginationParamLimit": { "description": "The maximum number of items to return in the response. If this is set to 0, the endpoint will\nreturn a default number of items specific to the endpoint.\n", "type": "integer", "minimum": "0", "example": "1" }, "PaginationParamOffset": { "description": "The number of items to skip before collecting items for the response.\n", "type": "integer", "minimum": "0", "example": "0" }, "AppAssignment": { "allOf": [ { "$ref": "#/components/schemas/GenericAppAssignment" }, { "type": "object", "description": "App assignments are added to stations and station groups to restrict what\napps are allowed to run at respective stations.\n", "properties": { "id": { "$ref": "#/components/schemas/AppAssignmentId" } }, "required": [ "id" ], "example": { "id": "12M2aGebq5MjhKafN", "type": "app", "tag": "development", "appId": "swM2aGebq5MjhKafN" } } ] }, "PaginatedResponse": { "type": "object", "properties": { "count": { "description": "The total number of items that matched the list parameters.\n", "type": "number", "example": "10" }, "nextPage": { "description": "A URL at which the next page of results can be fetched.\n", "type": "string", "format": "url" }, "prevPage": { "description": "A URL at which the previous page of results can be fetched.\n", "type": "string", "format": "url" }, "items": { "type": "array", "items": {} }, "errors": { "type": "array", "description": "A list of errors per item that is omitted from the paginated response, if any.\n", "items": { "$ref": "#/components/schemas/PaginatedItemError" } } }, "required": [ "items" ] }, "ApiError": { "description": "An error response returned by a Tulip API.\n", "type": "object", "properties": { "errorCode": { "description": "A machine-readable code identifying the type of error.\n", "type": "string", "pattern": "^[a-zA-Z0-9.]$" }, "message": { "description": "A human-readable description of the error intended for debugging purposes only.\n\nThe exact content of this message is not stable.\n", "type": "string" }, "retryable": { "description": "Whether the request can be automatically retried by the client.\n", "type": "boolean" } }, "required": [ "errorCode", "retryable" ] }, "RandomId": { "description": "A randomly generated unique identifier.\n\nTypically has ~98 bits of entropy.\n", "example": "g56RCoZCtzv7borvp", "type": "string", "pattern": "^[a-zA-Z0-9_]+$" }, "GenericAppAssignment": { "type": "object", "description": "Represents the contents of a single app assignment.\n", "oneOf": [ { "$ref": "#/components/schemas/AllAppAssignment" }, { "$ref": "#/components/schemas/FolderAppAssignment" }, { "$ref": "#/components/schemas/SpecificAppAssignment" }, { "$ref": "#/components/schemas/VersionAppAssignment" } ], "discriminator": { "propertyName": "type", "mapping": { "all": "#/components/schemas/AllAppAssignment", "app-folder": "#/components/schemas/FolderAppAssignment", "app": "#/components/schemas/SpecificAppAssignment", "app-version": "#/components/schemas/VersionAppAssignment" } }, "example": { "type": "app", "tag": "development", "appId": "swM2aGebq5MjhKafN" } }, "AppAssignmentId": { "allOf": [ { "$ref": "#/components/schemas/RandomId" }, { "description": "The id of an app assignment.\n" } ] }, "PaginatedItemError": { "allOf": [ { "$ref": "#/components/schemas/ApiError" }, { "description": "An error for a single paginated list item that is omitted from the paginated list response.\n" }, { "type": "object", "properties": { "retryable": { "enum": [ "false" ] }, "details": { "type": "object", "properties": { "id": { "description": "The ID of the omitted record.", "type": "string" } } } }, "required": [ "details" ] } ], "example": { "errorCode": "generic.internal", "message": "Something went wrong.", "retryable": "false", "details": { "id": "invalidRecordId" } } }, "AllAppAssignment": { "type": "object", "description": "Allows all apps to be assigned to a station or station group.\n", "properties": { "type": { "type": "string", "default": "all", "enum": [ "all" ] }, "tag": { "$ref": "#/components/schemas/AppAssignmentTag" } }, "required": [ "type", "tag" ], "example": { "type": "all", "tag": "development" } }, "FolderAppAssignment": { "type": "object", "description": "Describes a folder of apps that are assigned to a station or station group.\n", "properties": { "type": { "type": "string", "default": "app-folder", "enum": [ "app-folder" ] }, "tag": { "$ref": "#/components/schemas/AppAssignmentTag" }, "appFolderId": { "$ref": "#/components/schemas/AppFolderId" } }, "required": [ "type", "tag", "appFolderId" ], "example": { "type": "app-folder", "tag": "development", "appFolderId": "swM2aGebq5MjhKafN" } }, "SpecificAppAssignment": { "type": "object", "description": "Describes a specific app that is assigned to a station or station group.\n", "properties": { "type": { "type": "string", "default": "app", "enum": [ "app" ] }, "tag": { "$ref": "#/components/schemas/AppAssignmentTag" }, "appId": { "$ref": "#/components/schemas/AppId" } }, "required": [ "type", "tag", "appId" ], "example": { "type": "app", "tag": "development", "appId": "swM2aGebq5MjhKafN" } }, "VersionAppAssignment": { "type": "object", "description": "Describes a specific app version that is assigned to a station or station group. Only published\napp versions can be used in app assignments.\n", "properties": { "type": { "type": "string", "default": "app-version", "enum": [ "app-version" ] }, "appVersionId": { "$ref": "#/components/schemas/AppVersionId" }, "appId": { "$ref": "#/components/schemas/AppId" } }, "required": [ "type", "appVersionId", "appId" ], "example": { "type": "app-version", "appVersionId": "swM2aGebq5MjhKafN", "appId": "12M2aGebq5MjhKafN" } }, "AppAssignmentTag": { "description": "The tag of an app assignment. Determines if the app assignment refers\nto the development version of an app or the latest production version.\n", "type": "string", "enum": [ "development", "latest-published" ] }, "AppFolderId": { "allOf": [ { "$ref": "#/components/schemas/RandomId" }, { "description": "A random string which uniquely identifies an app folder.\n" }, { "$ref": "#/components/schemas/RandomId" }, { "description": "The id of an app folder.\n" } ] }, "AppId": { "allOf": [ { "$ref": "#/components/schemas/RandomId" }, { "description": "The unique identifier for an app.\n" }, { "$ref": "#/components/schemas/RandomId" }, { "description": "The id of an app.\n" } ] }, "AppVersionId": { "allOf": [ { "$ref": "#/components/schemas/RandomId" }, { "description": "The unique identifier for an app version.\n" }, { "$ref": "#/components/schemas/RandomId" }, { "description": "The id of an app version.\n" } ] } } } } ````