openapi: 3.2.0 info: title: OpenWiFi User Portal description: API describing User Self Care interaction with OpenWifi. version: 1.0.0 license: name: BSD3 url: https://github.com/Telecominfraproject/wlan-cloud-ucentralgw/blob/master/LICENSE servers: - url: 'https://localhost:16006/api/v1' security: - bearerAuth: [] - ApiKeyAuth: [] components: securitySchemes: ApiKeyAuth: type: apiKey in: header name: X-API-KEY bearerAuth: type: http scheme: bearer bearerFormat: JWT responses: NotFound: $ref: https://raw.githubusercontent.com/routerarchitects/ra-wlan-cloud-ucentralsec/main/openapi/owsec.yaml#/components/responses/NotFound Unauthorized: $ref: https://raw.githubusercontent.com/routerarchitects/ra-wlan-cloud-ucentralsec/main/openapi/owsec.yaml#/components/responses/Unauthorized Success: $ref: https://raw.githubusercontent.com/routerarchitects/ra-wlan-cloud-ucentralsec/main/openapi/owsec.yaml#/components/responses/Success EmptySuccess: description: The operation was completed successfully (returns an empty response body). BadRequest: $ref: https://raw.githubusercontent.com/routerarchitects/ra-wlan-cloud-ucentralsec/main/openapi/owsec.yaml#/components/responses/BadRequest InternalError: description: The request failed because UserPortal encountered an internal error. content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' Conflict: description: The request failed because the requested parental-control state conflicts with existing subscriber state. content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' schemas: ErrorResponse: type: object description: Standard error payload returned by UserPortal handlers or forwarded from downstream services. additionalProperties: true required: - ErrorCode - ErrorDetails - ErrorDescription properties: ErrorCode: type: integer description: HTTP status code or service error code. ErrorDetails: type: string description: HTTP method or operation detail associated with the error. ErrorDescription: type: string description: Formatted service error description. SignupResponse: type: object properties: id: type: string format: uuid name: type: string description: type: string created: type: integer format: int64 modified: type: integer format: int64 notes: type: array items: type: object properties: created: type: integer format: int64 createdBy: type: string note: type: string additionalProperties: true tags: type: array items: type: integer format: int64 email: type: string format: email userId: type: string macAddress: type: string serialNumber: type: string submitted: type: integer format: int64 completed: type: integer format: int64 status: type: string error: type: integer format: int64 statusCode: type: integer deviceID: type: string registrationId: type: string operatorId: type: string additionalProperties: false ActionRequestBody: type: object properties: mac: type: string pattern: '^(?:[0-9A-Fa-f]{12}|(?:[0-9A-Fa-f]{2}[:-]){5}[0-9A-Fa-f]{2})$' when: type: integer format: int64 default: 0 duration: type: integer format: int64 default: 30 pattern: type: string default: blink uri: type: string keepRedirector: type: boolean default: true ssid: $ref: '#/components/schemas/SsidOverride' client: type: array items: $ref: '#/components/schemas/ClientAccessChange' additionalProperties: true SsidOverride: type: object required: - name - password properties: name: type: string minLength: 1 maxLength: 32 pattern: '^[A-Za-z0-9._ \-]{1,32}$' password: type: string minLength: 8 maxLength: 32 pattern: '^\S{8,32}$' additionalProperties: false ClientAccessChange: type: object required: - mac - access properties: mac: type: string pattern: '^(?:[0-9A-Fa-f]{12}|(?:[0-9A-Fa-f]{2}[:-]){5}[0-9A-Fa-f]{2})$' access: type: string enum: - allow - deny duration: type: integer format: int64 minimum: 1 description: 'Optional block duration in minutes. Valid only when access is "deny". Duration-based client blocking is limited to the current block day (the computed block end time must not cross midnight). When omitted, the client is blocked permanently until an "allow" request explicitly removes the block. The property must be omitted for a permanent block; null and values below 1 are invalid.' additionalProperties: false ActionSuccessResponse: type: object properties: Operation: type: string Details: type: string Code: type: integer additionalProperties: true ActionGatewayResponse: type: object additionalProperties: true ActionResponse: oneOf: - $ref: '#/components/schemas/ActionSuccessResponse' - $ref: '#/components/schemas/ActionGatewayResponse' TopologyResponse: type: object minProperties: 1 required: - timezone properties: boardId: type: string edges: $ref: '#/components/schemas/TopologyEdges' historicalClients: type: array items: $ref: '#/components/schemas/TopologyHistoricalClient' nodes: type: array items: $ref: '#/components/schemas/TopologyNode' timestamp: type: string format: date-time timezone: type: string description: "IANA timezone resolved from the location linked to the subscriber's venue." example: "Asia/Kolkata" additionalProperties: true SubscriberLocationCreateRequest: type: object required: - timezone properties: name: type: string description: Optional name for the subscriber location. example: "Home" description: type: string type: type: string enum: - SERVICE - EQUIPMENT - AUTO - MANUAL - SPECIAL - UNKNOWN - CORPORATE buildingName: type: string addressLines: type: array items: type: string city: type: string state: type: string postal: type: string country: type: string phones: type: array items: type: string mobiles: type: array items: type: string geoCode: type: string timezone: type: string minLength: 1 description: "Required IANA timezone identifier to configure on the location linked to the subscriber's venue." example: "Asia/Kolkata" additionalProperties: false SubscriberLocationResponse: type: object description: Location object currently linked to the authenticated subscriber's venue. The object is returned from OWProv without response-field normalization by UserPortal. properties: id: type: string format: uuid description: Location UUID. name: type: string description: Location name. description: type: string description: Location description. created: type: integer format: int64 description: Location creation timestamp supplied by OWProv. modified: type: integer format: int64 description: Location modification timestamp supplied by OWProv. notes: type: array items: {} tags: type: array items: type: integer format: int64 type: type: string enum: - SERVICE - EQUIPMENT - AUTO - MANUAL - SPECIAL - UNKNOWN - CORPORATE buildingName: type: string addressLines: type: array items: type: string city: type: string state: type: string postal: type: string country: type: string phones: type: array items: type: string mobiles: type: array items: type: string geoCode: type: string inUse: type: array items: type: string entity: type: string managementPolicy: type: string timezone: type: string description: IANA timezone configured on the location. example: "Asia/Kolkata" additionalProperties: true SubscriberLocationUpdateRequest: type: object minProperties: 1 description: > Partial update for the OWProv Location currently linked to the authenticated subscriber's venue. Only supplied properties are updated. Internal Location relationship fields such as entity, inUse, and managementPolicy cannot be changed through UserPortal. properties: name: type: string description: Updated name for the subscriber location. example: "My Home Location" description: type: string type: type: string enum: - SERVICE - EQUIPMENT - AUTO - MANUAL - SPECIAL - UNKNOWN - CORPORATE buildingName: type: string addressLines: type: array items: type: string city: type: string state: type: string postal: type: string country: type: string phones: type: array items: type: string mobiles: type: array items: type: string geoCode: type: string timezone: type: string minLength: 1 description: Optional IANA timezone identifier to update on the location linked to the subscriber's venue. example: "Asia/Kolkata" additionalProperties: false TopologyEmptyResponse: type: object maxProperties: 0 additionalProperties: false TopologyEdges: type: object properties: mesh: type: array items: $ref: '#/components/schemas/TopologyEdge' wired: type: array items: $ref: '#/components/schemas/TopologyEdge' additionalProperties: true TopologyEdge: type: object properties: from: type: string to: type: string ssid: type: string band: type: string channel: type: integer additionalProperties: true TopologyHistoricalClient: type: object required: - station - blocked properties: blocked: type: string enum: - "0" - "1" description: 'Indicates whether topology currently reports the client as blocked ("1") or not blocked ("0"). A client is reported as blocked when it matches an active permanent or timed client-access rule, or an active recurring parental-control schedule rule.' blocked_until: type: string description: 'Expiration timestamp of the longest currently active blocking rule in YYYY-MM-DD HH:MM:SS format in the subscriber venue local timezone (e.g. "2026-08-06 17:29:48"), "indefinite" when any active permanent block applies, or omitted when not blocked.' example: "2026-08-06 17:29:48" station: type: string additionalProperties: true TopologyNode: type: object properties: aps: type: array items: $ref: '#/components/schemas/TopologyRadio' connected: type: boolean mesh: type: array items: $ref: '#/components/schemas/TopologyRadio' serial: type: string uptime: type: integer additionalProperties: true TopologyRadio: type: object properties: band: type: string bssid: type: string channel: type: integer clients: type: - array - 'null' items: $ref: '#/components/schemas/TopologyClient' mode: type: string ssid: type: string timestamp: type: string format: date-time additionalProperties: true TopologyClient: type: object properties: blocked: type: string enum: - "0" - "1" description: 'Indicates whether topology currently reports the client as blocked ("1") or not blocked ("0"). A client is reported as blocked when it matches an active permanent or timed client-access rule, or an active recurring parental-control schedule rule.' blocked_until: type: string description: 'Expiration timestamp of the longest currently active blocking rule in YYYY-MM-DD HH:MM:SS format in the subscriber venue local timezone (e.g. "2026-08-06 17:29:48"), "indefinite" when any active permanent block applies, or omitted when not blocked.' example: "2026-08-06 17:29:48" connected: type: integer fingerprint: type: string inactive: type: integer rssi: type: integer rx_rate_bitrate: type: integer rx_rate_chwidth: type: integer rx_speed: type: integer station: type: string tx_rate_bitrate: type: integer tx_speed: type: integer additionalProperties: true SystemConfigurationEntry: type: object required: - parameterName - parameterValue properties: parameterName: type: string parameterValue: type: string additionalProperties: false SystemConfigurationResponse: type: array items: $ref: '#/components/schemas/SystemConfigurationEntry' ######################################################################################### ## ## These are endpoints that all services in the OPenWiFI stack must provide ## ######################################################################################### CertificateInfo: type: object required: - filename - expiresOn properties: filename: type: string expiresOn: type: integer format: int64 additionalProperties: true SystemCommandGetResponse: oneOf: - $ref: '#/components/schemas/SystemCommandInfoResponse' - $ref: '#/components/schemas/SystemCommandExtraConfigurationResponse' - $ref: '#/components/schemas/SystemCommandResourcesResponse' SystemCommandInfoResponse: type: object required: - version - uptime - start - os - processors - hostname - UI - certificates properties: version: type: string uptime: type: integer format: int64 start: type: integer format: int64 os: type: string processors: type: integer hostname: type: string UI: type: string certificates: type: array items: $ref: '#/components/schemas/CertificateInfo' additionalProperties: true SystemCommandExtraConfigurationResponse: type: object required: - additionalConfiguration properties: additionalConfiguration: type: boolean additionalProperties: true SystemCommandResourcesResponse: type: object required: - numberOfFileDescriptors - currRealMem - peakRealMem - currVirtMem - peakVirtMem properties: numberOfFileDescriptors: type: integer currRealMem: type: integer format: int64 peakRealMem: type: integer format: int64 currVirtMem: type: integer format: int64 peakVirtMem: type: integer format: int64 additionalProperties: true SystemCommandPostResponse: anyOf: - type: object required: - Code - Operation - Details properties: Code: type: integer Operation: type: string Details: type: string additionalProperties: true - $ref: '#/components/schemas/SystemTagListResponse' - $ref: '#/components/schemas/SystemListResponse' SystemCommandLogLevelRequestEntry: type: object properties: tag: type: string value: type: string additionalProperties: true SystemCommandSetLogLevelRequest: type: object required: - command - subsystems properties: command: type: string pattern: '^[sS][eE][tT][lL][oO][gG][lL][eE][vV][eE][lL]$' example: setloglevel subsystems: type: array items: $ref: '#/components/schemas/SystemCommandLogLevelRequestEntry' additionalProperties: true SystemCommandReloadRequest: type: object required: - command properties: command: type: string pattern: '^[rR][eE][lL][oO][aA][dD]$' example: reload subsystems: type: array items: type: string additionalProperties: true SystemCommandGetLogLevelsRequest: type: object required: - command properties: command: type: string pattern: '^[gG][eE][tT][lL][oO][gG][lL][eE][vV][eE][lL][sS]$' example: getloglevels additionalProperties: true SystemCommandGetLogLevelNamesRequest: type: object required: - command properties: command: type: string pattern: '^[gG][eE][tT][lL][oO][gG][lL][eE][vV][eE][lL][nN][aA][mM][eE][sS]$' example: getloglevelnames additionalProperties: true SystemCommandGetSubsystemNamesRequest: type: object required: - command properties: command: type: string pattern: '^[gG][eE][tT][sS][uU][bB][sS][yY][sS][tT][eE][mM][nN][aA][mM][eE][sS]$' example: getsubsystemnames additionalProperties: true SystemCommandRequest: oneOf: - $ref: '#/components/schemas/SystemCommandSetLogLevelRequest' - $ref: '#/components/schemas/SystemCommandReloadRequest' - $ref: '#/components/schemas/SystemCommandGetLogLevelsRequest' - $ref: '#/components/schemas/SystemCommandGetLogLevelNamesRequest' - $ref: '#/components/schemas/SystemCommandGetSubsystemNamesRequest' SystemTagValue: type: object properties: tag: type: string value: type: string additionalProperties: true SystemTagListResponse: type: object required: - tagList properties: tagList: type: array items: $ref: '#/components/schemas/SystemTagValue' additionalProperties: true SystemListResponse: type: object required: - list properties: list: type: array items: type: string additionalProperties: true Group: type: object description: Subscriber-scoped parental-control group proxied by UserPortal from the Mango Parental Control Service. required: - id - subscriber_id - group_config_index - name - created_at - updated_at properties: id: type: string format: uuid subscriber_id: type: string format: uuid group_config_index: type: integer name: type: string description: oneOf: - type: string - type: 'null' created_at: type: string format: date-time updated_at: type: string format: date-time config-raw: oneOf: - type: array description: Raw UCI configuration commands generated for the group. items: type: array items: type: string - type: 'null' additionalProperties: false GroupCreateRequest: type: object description: Create request for one subscriber-scoped parental-control group. required: - name properties: name: type: string minLength: 1 description: oneOf: - type: string - type: 'null' additionalProperties: false GroupPutRequest: type: object description: Full replacement request for mutable group fields. PUT requests must send the complete mutable group representation. required: - name - description properties: name: type: string minLength: 1 description: oneOf: - type: string - type: 'null' additionalProperties: false GroupDevice: type: object description: Subscriber-scoped client-MAC assignment to a parental-control group. Stored and returned client_mac uses colon-separated MAC representation. required: - subscriber_id - group_id - client_mac - created_at - updated_at properties: subscriber_id: type: string format: uuid group_id: type: string format: uuid client_mac: type: string pattern: '^([0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{2}$' description: Stored and returned MAC representation uses colon-separated form. UserPortal forwards canonical lowercase colon-separated MAC downstream. Rendered gateway config uses uppercase colon-separated MAC before ordering and rendering. created_at: type: string format: date-time updated_at: type: string format: date-time additionalProperties: false GroupDeviceCreateRequest: type: object description: Create request for assigning one client MAC to one subscriber-scoped parental-control group. required: - client_mac properties: client_mac: type: string pattern: '^(?:[0-9A-Fa-f]{12}|(?:[0-9A-Fa-f]{2}[:-]){5}[0-9A-Fa-f]{2})$' description: Accepted public input formats are 12 hex digits without separators, hyphen-separated MAC, or colon-separated MAC. UserPortal normalizes accepted input to canonical lowercase colon-separated MAC before downstream forwarding. additionalProperties: false ScheduleInternet: type: object description: Subscriber-scoped INTERNET schedule returned by UserPortal. target_value is always null. required: - id - subscriber_id - schedule_config_index - name - enabled - action_type - target_kind - target_value - start_time - stop_time - weekdays - created_at - updated_at properties: id: type: string format: uuid subscriber_id: type: string format: uuid schedule_config_index: type: integer name: type: string description: oneOf: - type: string - type: 'null' enabled: type: boolean action_type: type: string enum: - BLOCK target_kind: type: string enum: - INTERNET target_value: type: 'null' description: Must be null when target_kind = INTERNET. start_time: type: string pattern: '^([01][0-9]|2[0-3]):[0-5][0-9]$' description: "Schedule start time returned in subscriber-local time using HH:MM format. UserPortal converts the internal UTC start_minute value using the timezone configured on the location linked to the subscriber's venue." stop_time: type: string pattern: '^([01][0-9]|2[0-3]):[0-5][0-9]$' description: "Schedule stop time returned in subscriber-local time using HH:MM format. A stop time earlier than the start time represents an overnight schedule. UserPortal converts the internal UTC stop_minute value using the timezone configured on the location linked to the subscriber's venue." weekdays: type: array description: "Subscriber-local weekdays on which the schedule starts, where 0 is Sunday and 6 is Saturday. UserPortal shifts the internal UTC weekdays when timezone conversion changes the schedule's calendar day, using the timezone configured on the location linked to the subscriber's venue." minItems: 1 uniqueItems: true items: type: integer minimum: 0 maximum: 6 created_at: type: string format: date-time updated_at: type: string format: date-time additionalProperties: false ScheduleApp: type: object description: Subscriber-scoped APP schedule returned by UserPortal. target_value is always a non-empty application identifier. required: - id - subscriber_id - schedule_config_index - name - enabled - action_type - target_kind - target_value - start_time - stop_time - weekdays - created_at - updated_at properties: id: type: string format: uuid subscriber_id: type: string format: uuid schedule_config_index: type: integer name: type: string description: oneOf: - type: string - type: 'null' enabled: type: boolean action_type: type: string enum: - BLOCK target_kind: type: string enum: - APP target_value: type: string minLength: 1 description: Required non-empty application identifier when target_kind = APP. start_time: type: string pattern: '^([01][0-9]|2[0-3]):[0-5][0-9]$' description: "Schedule start time returned in subscriber-local time using HH:MM format. UserPortal converts the internal UTC start_minute value using the timezone configured on the location linked to the subscriber's venue." stop_time: type: string pattern: '^([01][0-9]|2[0-3]):[0-5][0-9]$' description: "Schedule stop time returned in subscriber-local time using HH:MM format. A stop time earlier than the start time represents an overnight schedule. UserPortal converts the internal UTC stop_minute value using the timezone configured on the location linked to the subscriber's venue." weekdays: type: array description: "Subscriber-local weekdays on which the schedule starts, where 0 is Sunday and 6 is Saturday. UserPortal shifts the internal UTC weekdays when timezone conversion changes the schedule's calendar day, using the timezone configured on the location linked to the subscriber's venue." minItems: 1 uniqueItems: true items: type: integer minimum: 0 maximum: 6 created_at: type: string format: date-time updated_at: type: string format: date-time additionalProperties: false Schedule: description: Subscriber-scoped schedule returned by UserPortal. INTERNET schedules always return target_value = null. APP schedules always return a non-empty target_value. oneOf: - $ref: '#/components/schemas/ScheduleInternet' - $ref: '#/components/schemas/ScheduleApp' discriminator: propertyName: target_kind mapping: INTERNET: '#/components/schemas/ScheduleInternet' APP: '#/components/schemas/ScheduleApp' ScheduleCreateInternetRequest: type: object description: Create request for one subscriber-scoped INTERNET parental-control schedule. required: - name - action_type - target_kind - target_value - start_time - stop_time - weekdays properties: name: type: string minLength: 1 description: oneOf: - type: string - type: 'null' enabled: type: boolean default: true action_type: type: string enum: - BLOCK target_kind: type: string enum: - INTERNET target_value: type: 'null' description: Must be null when target_kind = INTERNET. start_time: type: string pattern: '^([01][0-9]|2[0-3]):[0-5][0-9]$' description: "Schedule start time in subscriber-local time using HH:MM format. UserPortal converts this value to UTC using the timezone configured on the location linked to the subscriber's venue before forwarding it to parental-control." stop_time: type: string pattern: '^([01][0-9]|2[0-3]):[0-5][0-9]$' description: "Schedule stop time in subscriber-local time using HH:MM format. A stop time earlier than the start time represents an overnight schedule. The stop time must not equal the start time. UserPortal converts this value to UTC using the timezone configured on the location linked to the subscriber's venue." weekdays: type: array description: "Subscriber-local weekdays on which the schedule starts, where 0 is Sunday and 6 is Saturday. UserPortal shifts weekdays when conversion to UTC changes the schedule's calendar day, using the timezone configured on the location linked to the subscriber's venue." minItems: 1 uniqueItems: true items: type: integer minimum: 0 maximum: 6 additionalProperties: false ScheduleCreateAppRequest: type: object description: Create request for one subscriber-scoped APP parental-control schedule. required: - name - action_type - target_kind - target_value - start_time - stop_time - weekdays properties: name: type: string minLength: 1 description: oneOf: - type: string - type: 'null' enabled: type: boolean default: true action_type: type: string enum: - BLOCK target_kind: type: string enum: - APP target_value: type: string minLength: 1 description: Required non-empty application identifier when target_kind = APP. start_time: type: string pattern: '^([01][0-9]|2[0-3]):[0-5][0-9]$' description: "Schedule start time in subscriber-local time using HH:MM format. UserPortal converts this value to UTC using the timezone configured on the location linked to the subscriber's venue before forwarding it to parental-control." stop_time: type: string pattern: '^([01][0-9]|2[0-3]):[0-5][0-9]$' description: "Schedule stop time in subscriber-local time using HH:MM format. A stop time earlier than the start time represents an overnight schedule. The stop time must not equal the start time. UserPortal converts this value to UTC using the timezone configured on the location linked to the subscriber's venue." weekdays: type: array description: "Subscriber-local weekdays on which the schedule starts, where 0 is Sunday and 6 is Saturday. UserPortal shifts weekdays when conversion to UTC changes the schedule's calendar day, using the timezone configured on the location linked to the subscriber's venue." minItems: 1 uniqueItems: true items: type: integer minimum: 0 maximum: 6 additionalProperties: false ScheduleCreateRequest: description: "Create request. INTERNET schedules must send target_value = null. APP schedules must send a non-empty target_value. start_time and stop_time use HH:MM 24-hour subscriber-local time. start_time < stop_time represents a same-day schedule. start_time > stop_time represents an overnight schedule. start_time = stop_time is invalid and returns HTTP 400. weekdays values must be distinct and use 0 = Sunday through 6 = Saturday. UserPortal converts local times to UTC and shifts weekdays accordingly using the timezone configured on the location linked to the subscriber's venue." oneOf: - $ref: '#/components/schemas/ScheduleCreateInternetRequest' - $ref: '#/components/schemas/ScheduleCreateAppRequest' discriminator: propertyName: target_kind mapping: INTERNET: '#/components/schemas/ScheduleCreateInternetRequest' APP: '#/components/schemas/ScheduleCreateAppRequest' SchedulePutInternetRequest: type: object description: Full replacement request for mutable INTERNET schedule fields. PUT requests must send the complete mutable schedule representation. required: - name - description - enabled - action_type - target_kind - target_value - start_time - stop_time - weekdays properties: name: type: string minLength: 1 description: oneOf: - type: string - type: 'null' enabled: type: boolean action_type: type: string enum: - BLOCK target_kind: type: string enum: - INTERNET target_value: type: 'null' description: Must be null when target_kind = INTERNET. start_time: type: string pattern: '^([01][0-9]|2[0-3]):[0-5][0-9]$' description: "Schedule start time in subscriber-local time using HH:MM format. UserPortal converts this value to UTC using the timezone configured on the location linked to the subscriber's venue before forwarding it to parental-control." stop_time: type: string pattern: '^([01][0-9]|2[0-3]):[0-5][0-9]$' description: "Schedule stop time in subscriber-local time using HH:MM format. A stop time earlier than the start time represents an overnight schedule. The stop time must not equal the start time. UserPortal converts this value to UTC using the timezone configured on the location linked to the subscriber's venue." weekdays: type: array description: "Subscriber-local weekdays on which the schedule starts, where 0 is Sunday and 6 is Saturday. UserPortal shifts weekdays when conversion to UTC changes the schedule's calendar day, using the timezone configured on the location linked to the subscriber's venue." minItems: 1 uniqueItems: true items: type: integer minimum: 0 maximum: 6 additionalProperties: false SchedulePutAppRequest: type: object description: Full replacement request for mutable APP schedule fields. PUT requests must send the complete mutable schedule representation. required: - name - description - enabled - action_type - target_kind - target_value - start_time - stop_time - weekdays properties: name: type: string minLength: 1 description: oneOf: - type: string - type: 'null' enabled: type: boolean action_type: type: string enum: - BLOCK target_kind: type: string enum: - APP target_value: type: string minLength: 1 description: Required non-empty application identifier when target_kind = APP. start_time: type: string pattern: '^([01][0-9]|2[0-3]):[0-5][0-9]$' description: "Schedule start time in subscriber-local time using HH:MM format. UserPortal converts this value to UTC using the timezone configured on the location linked to the subscriber's venue before forwarding it to parental-control." stop_time: type: string pattern: '^([01][0-9]|2[0-3]):[0-5][0-9]$' description: "Schedule stop time in subscriber-local time using HH:MM format. A stop time earlier than the start time represents an overnight schedule. The stop time must not equal the start time. UserPortal converts this value to UTC using the timezone configured on the location linked to the subscriber's venue." weekdays: type: array description: "Subscriber-local weekdays on which the schedule starts, where 0 is Sunday and 6 is Saturday. UserPortal shifts weekdays when conversion to UTC changes the schedule's calendar day, using the timezone configured on the location linked to the subscriber's venue." minItems: 1 uniqueItems: true items: type: integer minimum: 0 maximum: 6 additionalProperties: false SchedulePutRequest: description: "Full replacement request. PUT requests must send the complete mutable schedule representation. start_time and stop_time use HH:MM 24-hour subscriber-local time. start_time < stop_time represents a same-day schedule. start_time > stop_time represents an overnight schedule. start_time = stop_time is invalid and returns HTTP 400. weekdays values must be distinct and use 0 = Sunday through 6 = Saturday. UserPortal converts local times to UTC and shifts weekdays accordingly using the timezone configured on the location linked to the subscriber's venue." oneOf: - $ref: '#/components/schemas/SchedulePutInternetRequest' - $ref: '#/components/schemas/SchedulePutAppRequest' discriminator: propertyName: target_kind mapping: INTERNET: '#/components/schemas/SchedulePutInternetRequest' APP: '#/components/schemas/SchedulePutAppRequest' GroupScheduleLink: type: object description: Subscriber-scoped link between one parental-control group and one schedule. required: - subscriber_id - group_id - schedule_id - created_at properties: subscriber_id: type: string format: uuid group_id: type: string format: uuid schedule_id: type: string format: uuid created_at: type: string format: date-time additionalProperties: false GroupScheduleLinkRequest: type: object description: Create request for linking one subscriber-scoped schedule to one subscriber-scoped parental-control group. required: - schedule_id properties: schedule_id: type: string format: uuid additionalProperties: false GroupScheduleReplaceRequest: type: object description: Full replacement request for the set of schedules linked to one subscriber-scoped parental-control group. required: - schedule_ids properties: schedule_ids: type: array uniqueItems: true items: type: string format: uuid additionalProperties: false GroupScheduleReplaceResponse: type: object description: Response containing the current subscriber-scoped group-schedule links after a full replacement operation. required: - links properties: links: type: array items: $ref: '#/components/schemas/GroupScheduleLink' additionalProperties: false paths: /subscriber: post: tags: - Subscriber Information summary: Register a subscriber operationId: createSubscriber security: [] parameters: - in: query name: email schema: type: string format: email required: true - in: query name: registrationId schema: type: string minLength: 1 required: true - in: query name: resend schema: type: boolean default: false required: false responses: '200': description: Signup request accepted or existing pending signup returned. content: application/json: schema: $ref: '#/components/schemas/SignupResponse' '400': $ref: '#/components/responses/BadRequest' delete: tags: - Subscriber Information summary: Remove the subscriber from the DB operationId: deleteSubscriberInfo security: - bearerAuth: [] responses: '200': $ref: '#/components/responses/EmptySuccess' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /subscriber/devices/{mac}: post: tags: - Subscriber Devices summary: Add a device to the subscriber account operationId: addSubscriberDevice security: - bearerAuth: [] parameters: - in: path name: mac schema: type: string pattern: '^(?:[0-9A-Fa-f]{12}|(?:[0-9A-Fa-f]{2}[:-]){5}[0-9A-Fa-f]{2})$' required: true example: aa:bb:cc:dd:ee:ff responses: '200': $ref: '#/components/responses/Success' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' '500': $ref: '#/components/responses/InternalError' delete: tags: - Subscriber Devices summary: Remove a device from the subscriber account operationId: deleteSubscriberDevice security: - bearerAuth: [] parameters: - in: path name: mac schema: type: string pattern: '^(?:[0-9A-Fa-f]{12}|(?:[0-9A-Fa-f]{2}[:-]){5}[0-9A-Fa-f]{2})$' required: true example: aa:bb:cc:dd:ee:ff responses: '200': $ref: '#/components/responses/EmptySuccess' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' '500': $ref: '#/components/responses/InternalError' /subscriber/location: get: tags: - Subscriber Location summary: Retrieve location currently linked to the subscriber's venue description: Retrieves the OWProv Location object currently linked to the authenticated subscriber's venue. UserPortal resolves the subscriber venue and its linked Location, then returns the Location response from OWProv. Returns HTTP 404 when no subscriber venue exists or when the venue has no linked Location. operationId: getSubscriberLocation security: - bearerAuth: [] responses: '200': description: Subscriber Location retrieved successfully. content: application/json: schema: $ref: '#/components/schemas/SubscriberLocationResponse' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' '500': $ref: '#/components/responses/InternalError' post: tags: - Subscriber Location summary: Create and link a location to the subscriber's venue description: Creates an OWProv Location object containing the supplied location parameters, requires an IANA timezone, and links the new Location to the authenticated subscriber's venue. Returns HTTP 400 (SubscriberLocationAlreadyConfigured) if a Location is already linked to the venue. operationId: createSubscriberLocation security: - bearerAuth: [] requestBody: required: true description: Location object containing location details. content: application/json: schema: $ref: '#/components/schemas/SubscriberLocationCreateRequest' example: name: "Home Location" timezone: "Asia/Kolkata" responses: '200': $ref: '#/components/responses/Success' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' '500': $ref: '#/components/responses/InternalError' put: tags: - Subscriber Location summary: Update location currently linked to the subscriber's venue description: Updates the OWProv Location object currently linked to the authenticated subscriber's venue. UserPortal resolves the subscriber venue and updates its linked Location. Returns HTTP 404 when no subscriber venue exists or when the venue has no linked Location. operationId: updateSubscriberLocation security: - bearerAuth: [] requestBody: required: true description: Location update parameters. content: application/json: schema: $ref: '#/components/schemas/SubscriberLocationUpdateRequest' example: name: "My Home Location" timezone: "Asia/Kolkata" responses: '200': description: Subscriber Location updated successfully. content: application/json: schema: $ref: '#/components/schemas/SubscriberLocationResponse' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' '500': $ref: '#/components/responses/InternalError' delete: tags: - Subscriber Location summary: Delete location currently linked to the subscriber's venue description: Unlinks and deletes the location object currently associated with the authenticated subscriber's venue. Returns HTTP 404 if no location is currently linked. operationId: deleteSubscriberLocation security: - bearerAuth: [] responses: '200': $ref: '#/components/responses/EmptySuccess' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' '500': $ref: '#/components/responses/InternalError' /action: post: tags: - Device Commands summary: Sending different commands to a device description: "Executes device control commands (configure, reboot, blink, upgrade, factory). For action=configure, applies network configuration changes including SSID overrides and client-access parental control rules to the gateway. For client-access rules: access='deny' with a duration creates a timed block limited to the current block day (end time cannot cross midnight); access='deny' without duration creates a permanent block (duration property must be omitted; null and values below 1 are invalid); access='allow' removes an existing block (duration property is not allowed with allow). One client-access rule may exist per subscriber and MAC; sending a new deny request for an already blocked client replaces the existing block state without requiring an intermediate allow request. A timed block may be replaced with a new duration, a permanent block may be replaced by a timed block, and a timed block may be replaced by a permanent block." operationId: performAnAction security: - bearerAuth: [] parameters: - in: query name: action required: true schema: type: string enum: - configure - reboot - blink - upgrade - factory default: configure requestBody: required: false content: application/json: examples: configure: value: ssid: name: Example-SSID password: ExamplePassword1 client: - mac: f0:09:0d:2d:b4:9c access: allow - mac: aa:bb:cc:dd:ee:ff access: deny - mac: 11:22:33:44:55:66 access: deny duration: 30 blink: value: mac: f0:09:0d:2d:b4:9c when: 0 pattern: blink schema: $ref: '#/components/schemas/ActionRequestBody' responses: '200': description: Action completed successfully. content: application/json: schema: $ref: '#/components/schemas/ActionResponse' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '403': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '500': $ref: '#/components/responses/InternalError' /topology: get: tags: - Device Topology summary: Retrieve the network topology for the subscriber description: 'Retrieves the network topology for the subscriber. UserPortal resolves the timezone configured on the location linked to the subscriber''s venue and returns HTTP 400 when no timezone is configured. It evaluates active permanent and timed client-access rules and active recurring parental-control schedule rules in real time to set the blocked status ("0" or "1") on historical and connected clients.' operationId: getTopology security: - bearerAuth: [] responses: '200': description: Topology graph content: application/json: schema: oneOf: - $ref: '#/components/schemas/TopologyResponse' - $ref: '#/components/schemas/TopologyEmptyResponse' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' '500': $ref: '#/components/responses/InternalError' /system: post: tags: - System Commands summary: Perform some system wide commands. operationId: systemCommand requestBody: required: true description: Command details content: application/json: schema: $ref: '#/components/schemas/SystemCommandRequest' responses: '200': description: Successful command execution content: application/json: schema: $ref: '#/components/schemas/SystemCommandPostResponse' '400': $ref: '#/components/responses/BadRequest' '403': $ref: '#/components/responses/Unauthorized' get: tags: - System Commands summary: Retrieve different values from the running service. operationId: getSystemCommand parameters: - in: query description: Get a value name: command schema: type: string enum: - info - extraConfiguration - resources required: true responses: '200': description: successful operation content: application/json: schema: $ref: '#/components/schemas/SystemCommandGetResponse' '400': $ref: '#/components/responses/BadRequest' '403': $ref: '#/components/responses/Unauthorized' /systemConfiguration: get: tags: - SystemConfiguration summary: Retrieve system configuration items operationId: getSystemConfiguration parameters: - in: query description: Which parameters you want to retrieve name: entries schema: type: string minLength: 1 example: element1,element2,element3 required: true responses: '200': description: List of configuration elements content: application/json: schema: $ref: '#/components/schemas/SystemConfigurationResponse' '400': $ref: '#/components/responses/BadRequest' '403': $ref: '#/components/responses/Unauthorized' put: tags: - SystemConfiguration summary: Set some or all system configuration operationId: updateSystemConfiguration responses: '400': $ref: '#/components/responses/BadRequest' '403': $ref: '#/components/responses/Unauthorized' delete: tags: - SystemConfiguration summary: Delete all additional system configuration operationId: deleteSystemConfiguration responses: '400': $ref: '#/components/responses/BadRequest' '403': $ref: '#/components/responses/Unauthorized' /groups: get: tags: - Groups summary: List subscriber parental-control groups description: Returns all parental-control groups for the authenticated subscriber. operationId: listGroups security: - bearerAuth: [] responses: '200': description: Subscriber parental-control groups returned successfully. content: application/json: schema: type: array items: $ref: '#/components/schemas/Group' '401': $ref: '#/components/responses/Unauthorized' '500': $ref: '#/components/responses/InternalError' post: tags: - Groups summary: Create subscriber parental-control group description: Creates one parental-control group for the authenticated subscriber. operationId: createGroup security: - bearerAuth: [] requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/GroupCreateRequest' responses: '200': description: Parental-control group created successfully. content: application/json: schema: $ref: '#/components/schemas/Group' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '409': $ref: '#/components/responses/Conflict' '500': $ref: '#/components/responses/InternalError' /groups/{group_id}: get: tags: - Groups summary: Get one subscriber parental-control group description: Returns one parental-control group for the authenticated subscriber. operationId: getGroup security: - bearerAuth: [] parameters: - in: path name: group_id required: true description: Parental-control group identifier. schema: type: string format: uuid responses: '200': description: Parental-control group returned successfully. content: application/json: schema: $ref: '#/components/schemas/Group' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' '500': $ref: '#/components/responses/InternalError' put: tags: - Groups summary: Update one subscriber parental-control group description: Replaces the mutable fields of one parental-control group for the authenticated subscriber. operationId: updateGroup security: - bearerAuth: [] parameters: - in: path name: group_id required: true description: Parental-control group identifier. schema: type: string format: uuid requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/GroupPutRequest' responses: '200': description: Parental-control group updated successfully. content: application/json: schema: $ref: '#/components/schemas/Group' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '500': $ref: '#/components/responses/InternalError' delete: tags: - Groups summary: Delete one subscriber parental-control group description: Deletes one parental-control group for the authenticated subscriber. operationId: deleteGroup security: - bearerAuth: [] parameters: - in: path name: group_id required: true description: Parental-control group identifier. schema: type: string format: uuid responses: '200': $ref: '#/components/responses/EmptySuccess' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' '500': $ref: '#/components/responses/InternalError' /groups/{group_id}/devices: get: tags: - Group Devices summary: List client-MAC assignments for a group description: Returns all stored client-MAC assignments for one parental-control group under the authenticated subscriber. operationId: listGroupDevices security: - bearerAuth: [] parameters: - in: path name: group_id required: true description: Parental-control group identifier. schema: type: string format: uuid responses: '200': description: Group device assignments returned successfully. content: application/json: schema: type: array items: $ref: '#/components/schemas/GroupDevice' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' '500': $ref: '#/components/responses/InternalError' post: tags: - Group Devices summary: Add a client MAC to a group description: "Adds a syntactically valid client MAC address to the group. The MAC does not need to be currently connected or present in live or historical topology." operationId: createGroupDevice security: - bearerAuth: [] parameters: - in: path name: group_id required: true description: Parental-control group identifier. schema: type: string format: uuid requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/GroupDeviceCreateRequest' examples: add: value: client_mac: aa:bb:cc:dd:ee:ff responses: '200': description: Client MAC assigned to group successfully. content: application/json: schema: $ref: '#/components/schemas/GroupDevice' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '500': $ref: '#/components/responses/InternalError' /groups/{group_id}/devices/{client_mac}: get: tags: - Group Devices summary: Get one stored client-MAC group assignment description: Returns one stored group-device assignment for the authenticated subscriber. operationId: getGroupDevice security: - bearerAuth: [] parameters: - in: path name: group_id required: true description: Parental-control group identifier. schema: type: string format: uuid - in: path name: client_mac required: true description: Client MAC address. Accepted public input formats are 12 hex digits without separators, hyphen-separated MAC, or colon-separated MAC. schema: type: string pattern: '^(?:[0-9A-Fa-f]{12}|(?:[0-9A-Fa-f]{2}[:-]){5}[0-9A-Fa-f]{2})$' responses: '200': description: Group-device assignment returned successfully. content: application/json: schema: $ref: '#/components/schemas/GroupDevice' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' '500': $ref: '#/components/responses/InternalError' delete: tags: - Group Devices summary: Remove one client MAC from a group description: Removes one stored client-MAC assignment from one parental-control group for the authenticated subscriber. operationId: deleteGroupDevice security: - bearerAuth: [] parameters: - in: path name: group_id required: true description: Parental-control group identifier. schema: type: string format: uuid - in: path name: client_mac required: true description: Client MAC address. Accepted public input formats are 12 hex digits without separators, hyphen-separated MAC, or colon-separated MAC. schema: type: string pattern: '^(?:[0-9A-Fa-f]{12}|(?:[0-9A-Fa-f]{2}[:-]){5}[0-9A-Fa-f]{2})$' responses: '200': $ref: '#/components/responses/EmptySuccess' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' '500': $ref: '#/components/responses/InternalError' /schedules: get: tags: - Schedules summary: List subscriber parental-control schedules description: "Returns all stored parental-control schedules for the authenticated subscriber. UserPortal converts stored UTC schedule times and weekdays to subscriber-local values using the timezone configured on the location linked to the subscriber's venue. Returns HTTP 400 when no timezone is configured." operationId: listSchedules security: - bearerAuth: [] responses: '200': description: Subscriber schedules returned successfully. content: application/json: schema: type: array items: $ref: '#/components/schemas/Schedule' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '500': $ref: '#/components/responses/InternalError' post: tags: - Schedules summary: Create subscriber parental-control schedule description: "Creates one parental-control schedule for the authenticated subscriber. UserPortal converts subscriber-local schedule times and weekdays to UTC using the timezone configured on the location linked to the subscriber's venue before forwarding the request downstream. Returns HTTP 400 when no timezone is configured." operationId: createSchedule security: - bearerAuth: [] requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ScheduleCreateRequest' examples: internet: value: name: Weekday Night description: Block internet on school nights enabled: true action_type: BLOCK target_kind: INTERNET target_value: null start_time: "21:00" stop_time: "07:00" weekdays: [1, 2, 3, 4, 5] app: value: name: Block YouTube description: Evening YouTube block enabled: true action_type: BLOCK target_kind: APP target_value: YOUTUBE start_time: "18:00" stop_time: "21:00" weekdays: [0, 1, 2, 3, 4, 5, 6] responses: '200': description: Parental-control schedule created successfully. content: application/json: schema: $ref: '#/components/schemas/Schedule' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '409': $ref: '#/components/responses/Conflict' '500': $ref: '#/components/responses/InternalError' /schedules/{schedule_id}: get: tags: - Schedules summary: Get one subscriber parental-control schedule description: "Returns one stored parental-control schedule for the authenticated subscriber. UserPortal converts stored UTC schedule times and weekdays to subscriber-local values using the timezone configured on the location linked to the subscriber's venue. Returns HTTP 400 when no timezone is configured." operationId: getSchedule security: - bearerAuth: [] parameters: - in: path name: schedule_id required: true description: Parental-control schedule identifier. schema: type: string format: uuid responses: '200': description: Parental-control schedule returned successfully. content: application/json: schema: $ref: '#/components/schemas/Schedule' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' '500': $ref: '#/components/responses/InternalError' put: tags: - Schedules summary: Update one subscriber parental-control schedule description: "Replaces the mutable fields of one parental-control schedule for the authenticated subscriber. UserPortal converts subscriber-local schedule times and weekdays to UTC using the timezone configured on the location linked to the subscriber's venue before forwarding the request downstream. Returns HTTP 400 when no timezone is configured." operationId: updateSchedule security: - bearerAuth: [] parameters: - in: path name: schedule_id required: true description: Parental-control schedule identifier. schema: type: string format: uuid requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/SchedulePutRequest' examples: internet: value: name: Weekday Night description: Block internet on school nights enabled: true action_type: BLOCK target_kind: INTERNET target_value: null start_time: "21:00" stop_time: "07:00" weekdays: [1, 2, 3, 4, 5] app: value: name: Block YouTube description: Evening YouTube block enabled: true action_type: BLOCK target_kind: APP target_value: YOUTUBE start_time: "18:00" stop_time: "21:00" weekdays: [0, 1, 2, 3, 4, 5, 6] responses: '200': description: Parental-control schedule updated successfully. content: application/json: schema: $ref: '#/components/schemas/Schedule' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' '409': $ref: '#/components/responses/Conflict' '500': $ref: '#/components/responses/InternalError' delete: tags: - Schedules summary: Delete one subscriber parental-control schedule description: Deletes one parental-control schedule for the authenticated subscriber. operationId: deleteSchedule security: - bearerAuth: [] parameters: - in: path name: schedule_id required: true description: Parental-control schedule identifier. schema: type: string format: uuid responses: '200': $ref: '#/components/responses/EmptySuccess' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' '500': $ref: '#/components/responses/InternalError' /groups/{group_id}/schedules: get: tags: - Group Schedules summary: List schedules linked to a group description: Returns all parental-control schedules linked to the group as subscriber-local schedule objects. UserPortal converts stored UTC schedule times and weekdays using the timezone configured on the location linked to the subscriber's venue. Returns HTTP 400 when no timezone is configured. operationId: listGroupSchedules security: - bearerAuth: [] parameters: - in: path name: group_id required: true description: Parental-control group identifier. schema: type: string format: uuid responses: '200': description: Group schedules returned successfully. content: application/json: schema: type: array items: $ref: '#/components/schemas/Schedule' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' '500': $ref: '#/components/responses/InternalError' post: tags: - Group Schedules summary: Link one schedule to one group description: Creates one group-schedule link for the authenticated subscriber. operationId: createGroupSchedule security: - bearerAuth: [] parameters: - in: path name: group_id required: true description: Parental-control group identifier. schema: type: string format: uuid requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/GroupScheduleLinkRequest' responses: '200': description: Group-schedule link created successfully. content: application/json: schema: $ref: '#/components/schemas/GroupScheduleLink' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' '500': $ref: '#/components/responses/InternalError' put: tags: - Group Schedules summary: Replace schedules linked to one group description: Replaces the full schedule-id set linked to one parental-control group for the authenticated subscriber. operationId: replaceGroupSchedules security: - bearerAuth: [] parameters: - in: path name: group_id required: true description: Parental-control group identifier. schema: type: string format: uuid requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/GroupScheduleReplaceRequest' responses: '200': description: Group-schedule links replaced successfully. content: application/json: schema: type: array items: $ref: '#/components/schemas/GroupScheduleReplaceResponse' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' '500': $ref: '#/components/responses/InternalError' /groups/{group_id}/schedules/{schedule_id}: get: tags: - Group Schedules summary: Get one group-schedule link description: Returns one stored group-schedule link for the authenticated subscriber. operationId: getGroupSchedule security: - bearerAuth: [] parameters: - in: path name: group_id required: true description: Parental-control group identifier. schema: type: string format: uuid - in: path name: schedule_id required: true description: Parental-control schedule identifier. schema: type: string format: uuid responses: '200': description: Group-schedule link returned successfully. content: application/json: schema: $ref: '#/components/schemas/GroupScheduleLink' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' '500': $ref: '#/components/responses/InternalError' delete: tags: - Group Schedules summary: Remove one schedule from one group description: Deletes one group-schedule link for the authenticated subscriber. operationId: deleteGroupSchedule security: - bearerAuth: [] parameters: - in: path name: group_id required: true description: Parental-control group identifier. schema: type: string format: uuid - in: path name: schedule_id required: true description: Parental-control schedule identifier. schema: type: string format: uuid responses: '200': $ref: '#/components/responses/EmptySuccess' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' '500': $ref: '#/components/responses/InternalError'