{"basePath":"","definitions":{"AdminDevice":{"properties":{"created_at":{"format":"date-time","type":"string"},"external_id":{"type":"string"},"id":{"type":"string"},"last_seen":{"format":"date-time","type":"string"},"name":{"maxLength":32,"minLength":2,"type":"string"},"serial_number":{"type":"string"},"space_id":{"type":"string"},"space_name":{"type":"string"}},"type":"object"},"AdminRetentionArchive":{"properties":{"encrypted":{"type":"boolean"},"encryption":{"enum":["public-key","passphrase"],"type":"string"},"mode":{"enum":["file","stdin"],"type":"string"},"name":{"type":"string"},"parts":{"type":"integer"},"rows":{"type":"integer"},"size_bytes":{"type":"integer"}},"type":"object"},"AdminRetentionPartition":{"properties":{"age_months":{"type":"integer"},"approx_rows":{"type":"integer"},"archive":{"allOf":[{"$ref":"#/definitions/AdminRetentionArchive"}],"description":"Archive summarises the archive written before the drop (dropped\npartitions only); the audit row lists the individual parts."},"bound":{"type":"string"},"dropped_at":{"format":"date-time","type":"string"},"month":{"type":"string"},"partition":{"type":"string"},"reason":{"enum":["age","size","resume"],"type":"string"},"size_bytes":{"type":"integer"},"state":{"enum":["protected","retained","due","detach_pending","detached","unknown","dropped"],"type":"string"},"table":{"type":"string"}},"type":"object"},"AdminRetentionSummary":{"properties":{"archive_enabled":{"type":"boolean"},"db_size_bytes":{"type":"integer"},"dry_run":{"type":"boolean"},"last_run":{"$ref":"#/definitions/retention.RunDetail"},"max_db_size_bytes":{"type":"integer"},"min_months":{"type":"integer"},"months":{"type":"integer"},"over_size_limit":{"type":"boolean"},"table_months":{"additionalProperties":{"type":"integer"},"type":"object"}},"type":"object"},"AdminUpdateUser":{"properties":{"company":{"maxLength":100,"type":"string"},"email":{"description":"user email","format":"email","maxLength":255,"type":"string"},"firstname":{"description":"user firstname","maxLength":100,"type":"string"},"lastname":{"maxLength":100,"type":"string"},"middlename":{"maxLength":100,"type":"string"},"picture":{"maxLength":500,"type":"string"},"system_role":{"description":"user role in the system","enum":["user","admin"],"type":"string"},"timezone":{"maxLength":100,"type":"string"}},"type":"object"},"AdminUser":{"properties":{"company":{"type":"string"},"created_at":{"type":"string"},"email":{"format":"email","maxLength":255,"type":"string"},"firstname":{"type":"string"},"id":{"type":"string"},"is_verified":{"format":"bool","type":"boolean"},"lastname":{"type":"string"},"middlename":{"type":"string"},"picture":{"type":"string"},"spaces":{"items":{"$ref":"#/definitions/user.Space"},"type":"array"},"system_role":{"type":"string"},"timezone":{"type":"string"}},"type":"object"},"CreateDeviceBatch":{"properties":{"all_devices":{"type":"boolean"},"comment":{"type":"string"},"device_ids":{"items":{"type":"string"},"type":"array"},"on_failure":{"description":"OnFailure controls what happens after an item lands in ItemFailed:\n - \"continue\" (default): keep dispatching, batch ends StateFinished\n with non-zero failure counts.\n - \"stop\": abort the rollout, batch ends StateFailed.\n - \"pause\": reserved, rejected by the validator today.\nDispatch mode is always parallel in V1 (sequential/rolling, with\nmax_in_flight/canary_size, are stored with defaults and not yet\nsettable through the API).","enum":["continue","stop","pause"],"type":"string"},"payload":{"description":"Payload is type-dependent: FirmwarePayload when Type==\"firmware\",\nConfigPayload when Type==\"config\". The driver registry validates it\nper type, which is why we accept a raw JSON object here.","type":"object"},"tag_filter_logic":{"enum":["any","all"],"type":"string"},"tag_ids":{"items":{"type":"string"},"type":"array"},"type":{"enum":["firmware","config"],"type":"string"}},"type":"object"},"DeviceBatch":{"properties":{"canary_size":{"type":"integer"},"canceled_at":{"format":"date-time","type":"string"},"comment":{"type":"string"},"counts":{"$ref":"#/definitions/DeviceBatchCounts"},"created_at":{"format":"date-time","type":"string"},"created_by_id":{"type":"string"},"created_by_type":{"type":"string"},"dispatch_mode":{"type":"string"},"failed_at":{"format":"date-time","type":"string"},"finished_at":{"format":"date-time","type":"string"},"id":{"type":"string"},"max_in_flight":{"type":"integer"},"on_failure":{"type":"string"},"payload":{"description":"Payload is the per-type request body (FirmwarePayload for\ntype=firmware, ConfigPayload for type=config). Stored raw to avoid\ncoupling the Batch row to the driver's exact schema.","type":"object"},"selector":{"description":"Selector is the BatchSelector verbatim as the caller submitted it.\nEncoded as a raw JSON object so we don't unmarshal/re-marshal the\npayload on read; swagger sees it as a generic object.","type":"object"},"space_id":{"type":"string"},"started_at":{"format":"date-time","type":"string"},"state":{"type":"string"},"type":{"type":"string"},"updated_at":{"format":"date-time","type":"string"}},"type":"object"},"DeviceBatchCounts":{"properties":{"canceled":{"type":"integer"},"dispatched":{"type":"integer"},"failed":{"type":"integer"},"running":{"type":"integer"},"scheduled":{"type":"integer"},"succeeded":{"type":"integer"},"total":{"type":"integer"}},"type":"object"},"DeviceBatchItem":{"properties":{"applied_at":{"format":"date-time","type":"string"},"batch_id":{"type":"string"},"canceled_at":{"format":"date-time","type":"string"},"delivered_at":{"format":"date-time","type":"string"},"device_id":{"type":"string"},"device_name":{"type":"string"},"device_serial_number":{"description":"Populated only on the list path; nil when not joined or device absent.","type":"string"},"dispatched_at":{"format":"date-time","type":"string"},"failed_at":{"format":"date-time","type":"string"},"id":{"type":"string"},"reason":{"type":"string"},"scheduled_at":{"format":"date-time","type":"string"},"source_id":{"type":"string"},"state":{"type":"string"}},"type":"object"},"DeviceBatchPreview":{"properties":{"device_count":{"type":"integer"}},"type":"object"},"DeviceFirmware":{"properties":{"bytes_downloaded":{"description":"TODO: bytes_downloaded","type":"integer"},"device_id":{"type":"string"},"download_started_at":{"format":"date-time","type":"string"},"firmware_bundle":{"type":"string"},"firmware_id":{"type":"string"},"firmware_name":{"type":"string"},"firmware_size":{"type":"integer"},"firmware_version":{"type":"string"},"id":{"type":"string"},"reason":{"type":"string"},"scheduled_at":{"format":"date-time","type":"string"},"state":{"type":"string"},"swap_started_at":{"format":"date-time","type":"string"},"target":{"type":"string"},"updated_at":{"format":"date-time","type":"string"}},"type":"object"},"SpaceDevice":{"properties":{"app_fw_bundle":{"type":"string"},"app_fw_name":{"type":"string"},"app_fw_version":{"type":"string"},"ble_passkey":{"type":"string"},"comment":{"maxLength":500,"type":"string"},"config_hash":{"type":"string"},"config_id":{"type":"string"},"created_at":{"format":"date-time","type":"string"},"decoder_hash":{"type":"string"},"deleted_at":{"type":"string"},"encoder_hash":{"type":"string"},"external_id":{"type":"string"},"hw_revision":{"type":"string"},"hw_variant":{"type":"string"},"id":{"type":"string"},"identity":{"type":"string"},"label":{"additionalProperties":{"type":"string"},"type":"object"},"last_seen":{"format":"date-time","type":"string"},"lte_fw_version":{"example":"v1.7.0","type":"string"},"lte_iccid":{"type":"string"},"lte_imei":{"type":"string"},"lte_imsi":{"type":"string"},"name":{"maxLength":32,"minLength":2,"type":"string"},"product_name":{"type":"string"},"serial_number":{"type":"string"},"session_id":{"type":"integer"},"space_id":{"type":"string"},"tags":{"items":{"$ref":"#/definitions/device.Tag"},"type":"array"},"token":{"type":"string"},"vendor_name":{"type":"string"}},"type":"object"},"SpaceUpdateUser":{"properties":{"space_role":{"enum":["user","admin"],"type":"string"}},"type":"object"},"SpaceUser":{"properties":{"company":{"type":"string"},"created_at":{"type":"string"},"email":{"format":"email","maxLength":255,"type":"string"},"firstname":{"type":"string"},"id":{"type":"string"},"is_verified":{"format":"bool","type":"boolean"},"lastname":{"type":"string"},"middlename":{"type":"string"},"picture":{"type":"string"},"space_invited":{"format":"bool","type":"boolean"},"space_role":{"enum":["user","admin","owner"],"type":"string"},"system_role":{"type":"string"},"timezone":{"type":"string"}},"type":"object"},"auth.LoginRequest":{"properties":{"email":{"format":"email","type":"string"},"password":{"type":"string"}},"type":"object"},"auth.LoginResponse":{"properties":{"access_token":{"type":"string"}},"type":"object"},"auth.Oauth2Provider":{"properties":{"icon":{"type":"string"},"name":{"type":"string"},"provider":{"type":"string"}},"type":"object"},"auth.Oauth2StartRequest":{"properties":{"provider":{"type":"string"}},"type":"object"},"auth.Oauth2StartResponse":{"properties":{"url":{"type":"string"}},"type":"object"},"auth.PasswordForgotRequest":{"properties":{"email":{"type":"string"}},"type":"object"},"auth.PasswordResetRequest":{"properties":{"password":{"type":"string"},"token":{"type":"string"}},"type":"object"},"auth.Session":{"properties":{"client":{"type":"string"},"created_ip":{"type":"string"},"expires_at":{"type":"string"},"id":{"type":"string"},"is_current":{"type":"boolean"},"issued_at":{"type":"string"},"last_ip":{"type":"string"},"last_seen":{"type":"string"},"revoked_at":{"type":"string"},"user_id":{"type":"string"}},"type":"object"},"command.CreateResponse":{"properties":{"id":{"type":"string"}},"type":"object"},"config.Config":{"properties":{"body":{"items":{"type":"string"},"type":"array"},"created_at":{"type":"string"},"device_id":{"type":"string"},"hash":{"type":"string"},"id":{"type":"string"},"type":{"type":"string"}},"type":"object"},"config.CreateResponse":{"properties":{"id":{"type":"string"}},"type":"object"},"connector.Connector":{"properties":{"created_at":{"type":"string"},"deleted_at":{"type":"string"},"direction":{"enum":["up","down"],"example":"up","type":"string"},"id":{"type":"string"},"name":{"type":"string"},"retry_delays":{"example":[10,30,60,600,1800,3600,10800,21600,43200],"items":{"type":"integer"},"type":"array"},"space_id":{"type":"string"},"state":{"enum":["enabled","disabled","suspended"],"example":"enabled","type":"string"},"tags":{"items":{"$ref":"#/definitions/connector.Tag"},"type":"array"},"transformation":{"type":"string"},"triggers":{"example":["session","data"],"items":{"type":"string"},"type":"array"},"type":{"enum":["webhook"],"example":"webhook","type":"string"}},"type":"object"},"connector.ConnectorStatistics":{"properties":{"id":{"type":"string"},"max_attempts":{"type":"integer"},"name":{"type":"string"},"retry_delays":{"items":{"type":"integer"},"type":"array"},"space_id":{"type":"string"},"summaries":{"items":{"$ref":"#/definitions/connector.SumItem"},"type":"array"}},"type":"object"},"connector.CreateConnector":{"properties":{"direction":{"enum":["up","down"],"example":"up","type":"string"},"name":{"type":"string"},"retry_delays":{"example":[10,30,60,600,1800,3600,10800,21600,43200],"items":{"type":"integer"},"type":"array"},"state":{"default":"enabled","enum":["enabled","disabled","suspended"],"example":"enabled","type":"string"},"tags":{"items":{"$ref":"#/definitions/connector.Tag"},"type":"array"},"transformation":{"type":"string"},"triggers":{"example":["data"],"items":{"type":"string"},"type":"array"},"type":{"enum":["webhook"],"example":"webhook","type":"string"}},"type":"object"},"connector.SumItem":{"properties":{"attempts":{"items":{"type":"integer"},"type":"array"},"failed":{"type":"integer"},"success":{"type":"integer"},"time":{"type":"string"}},"type":"object"},"connector.Tag":{"properties":{"color":{"type":"string"},"id":{"type":"string"},"name":{"type":"string"}},"type":"object"},"connector.UpdateConnector":{"properties":{"direction":{"enum":["up","down"],"example":"up","type":"string"},"name":{"maxLength":32,"minLength":2,"type":"string"},"retry_delays":{"example":[10,30,60,600,1800,3600,10800,21600,43200],"items":{"type":"integer"},"type":"array"},"state":{"enum":["enabled","disabled","suspended"],"example":"enabled","type":"string"},"tags":{"items":{"$ref":"#/definitions/connector.Tag"},"type":"array"},"transformation":{"type":"string"},"triggers":{"example":["data"],"items":{"type":"string"},"type":"array"}},"type":"object"},"device.CreateDevice":{"properties":{"comment":{"maxLength":500,"type":"string"},"external_id":{"maxLength":128,"type":"string"},"identity":{"maxLength":81,"type":"string"},"label":{"additionalProperties":{"type":"string"},"type":"object"},"name":{"maxLength":32,"minLength":2,"type":"string"},"secret":{"maxLength":4096,"type":"string"},"secret_type":{"enum":["psk"],"type":"string"},"serial_number":{"maxLength":32,"type":"string"},"tags":{"items":{"$ref":"#/definitions/device.Tag"},"type":"array"},"token":{"type":"string"}},"type":"object"},"device.DeviceInfo":{"properties":{"apn":{"type":"string"},"attr1":{"description":"customAttribute1","type":"string"},"attr2":{"description":"customAttribute2","type":"string"},"iccid":{"type":"string"},"imsi":{"type":"string"},"ip":{"type":"string"},"profile":{"type":"string"},"session":{"type":"boolean"},"session_bytes_in":{"type":"integer"},"session_bytes_out":{"type":"integer"},"session_last_cell_id":{"type":"string"},"session_last_data_transmitted":{"type":"string"},"session_last_start":{"type":"string"},"session_last_stop":{"type":"string"},"state":{"type":"string"}},"type":"object"},"device.Tag":{"properties":{"color":{"type":"string"},"id":{"type":"string"},"name":{"type":"string"}},"type":"object"},"device.UpdateDevice":{"properties":{"comment":{"maxLength":500,"type":"string"},"external_id":{"maxLength":128,"type":"string"},"label":{"additionalProperties":{"type":"string"},"type":"object"},"name":{"maxLength":32,"minLength":2,"type":"string"},"secret":{"maxLength":4096,"type":"string"},"secret_type":{"enum":["psk"],"type":"string"},"tags":{"items":{"$ref":"#/definitions/device.Tag"},"type":"array"}},"type":"object"},"device.UpdateDeviceInfo":{"properties":{"attr1":{"type":"string"},"attr2":{"type":"string"},"profile":{"type":"string"},"state":{"type":"string"}},"type":"object"},"downlink.CreateResponse":{"properties":{"id":{"type":"string"}},"type":"object"},"event.Event":{"properties":{"body":{"type":"string"},"connector_id":{"type":"string"},"create_at":{"type":"string"},"device_id":{"type":"string"},"id":{"type":"string"},"message_id":{"type":"string"},"type":{"type":"string"}},"type":"object"},"firmware.CreateRequest":{"properties":{"firmware":{"type":"string"},"target":{"type":"string"}},"type":"object"},"key.CreateKey":{"properties":{"comment":{"maxLength":256,"type":"string"},"name":{"maxLength":32,"minLength":2,"type":"string"},"permissions":{"items":{"type":"string"},"type":"array"},"tags":{"items":{"$ref":"#/definitions/key.Tag"},"type":"array"}},"type":"object"},"key.CreateKeyResponse":{"properties":{"comment":{"type":"string"},"expires_at":{"type":"string"},"id":{"type":"string"},"last_ip":{"type":"string"},"last_seen":{"description":"LastSeen and LastIp come from key_sessions (usage/audit). They are null\nuntil the key has been used at least once.","type":"string"},"name":{"type":"string"},"permissions":{"items":{"type":"string"},"type":"array"},"secret":{"description":"shown once, never stored in plaintext","type":"string"},"space_id":{"type":"string"},"tags":{"items":{"$ref":"#/definitions/key.Tag"},"type":"array"},"user_id":{"description":"UserId is set for personal (user-scoped) tokens; SpaceId is set for\nspace-scoped keys. Exactly one is non-empty (keys_owner_xor).","type":"string"}},"type":"object"},"key.CreatePersonalKey":{"properties":{"comment":{"maxLength":256,"type":"string"},"expires_at":{"type":"string"},"full_access":{"description":"FullAccess, when true, stores an empty permission set — the token then\ncarries the owner's full live rights (and any added later), the \"empty =\nunrestricted\" model (ADR 0005). It is the explicit API form of that empty\nset, so a client never has to infer intent from an empty list. When true,\nPermissions is ignored (forced empty in Valid).","type":"boolean"},"name":{"maxLength":32,"minLength":2,"type":"string"},"permissions":{"items":{"type":"string"},"type":"array"}},"type":"object"},"key.CreatePersonalKeyResponse":{"properties":{"comment":{"type":"string"},"expires_at":{"type":"string"},"full_access":{"type":"boolean"},"id":{"type":"string"},"last_ip":{"type":"string"},"last_seen":{"description":"LastSeen and LastIp come from key_sessions (usage/audit). They are null\nuntil the key has been used at least once.","type":"string"},"name":{"type":"string"},"permissions":{"items":{"type":"string"},"type":"array"},"secret":{"description":"shown once, never stored in plaintext","type":"string"},"space_id":{"type":"string"},"tags":{"items":{"$ref":"#/definitions/key.Tag"},"type":"array"},"user_id":{"description":"UserId is set for personal (user-scoped) tokens; SpaceId is set for\nspace-scoped keys. Exactly one is non-empty (keys_owner_xor).","type":"string"}},"type":"object"},"key.Key":{"properties":{"comment":{"type":"string"},"expires_at":{"type":"string"},"id":{"type":"string"},"last_ip":{"type":"string"},"last_seen":{"description":"LastSeen and LastIp come from key_sessions (usage/audit). They are null\nuntil the key has been used at least once.","type":"string"},"name":{"type":"string"},"permissions":{"items":{"type":"string"},"type":"array"},"space_id":{"type":"string"},"tags":{"items":{"$ref":"#/definitions/key.Tag"},"type":"array"},"user_id":{"description":"UserId is set for personal (user-scoped) tokens; SpaceId is set for\nspace-scoped keys. Exactly one is non-empty (keys_owner_xor).","type":"string"}},"type":"object"},"key.PersonalKey":{"properties":{"comment":{"type":"string"},"expires_at":{"type":"string"},"full_access":{"type":"boolean"},"id":{"type":"string"},"last_ip":{"type":"string"},"last_seen":{"description":"LastSeen and LastIp come from key_sessions (usage/audit). They are null\nuntil the key has been used at least once.","type":"string"},"name":{"type":"string"},"permissions":{"items":{"type":"string"},"type":"array"},"space_id":{"type":"string"},"tags":{"items":{"$ref":"#/definitions/key.Tag"},"type":"array"},"user_id":{"description":"UserId is set for personal (user-scoped) tokens; SpaceId is set for\nspace-scoped keys. Exactly one is non-empty (keys_owner_xor).","type":"string"}},"type":"object"},"key.Tag":{"properties":{"color":{"type":"string"},"id":{"type":"string"},"name":{"type":"string"}},"type":"object"},"key.UpdateKey":{"properties":{"comment":{"maxLength":256,"type":"string"},"name":{"maxLength":32,"minLength":2,"type":"string"},"permissions":{"items":{"type":"string"},"type":"array"},"tags":{"items":{"$ref":"#/definitions/key.Tag"},"type":"array"}},"type":"object"},"key.UpdatePersonalKey":{"properties":{"comment":{"maxLength":256,"type":"string"},"expires_at":{"type":"string"},"full_access":{"description":"FullAccess: see CreatePersonalKey. When true, Permissions is forced empty.","type":"boolean"},"name":{"maxLength":32,"minLength":2,"type":"string"},"permissions":{"items":{"type":"string"},"type":"array"}},"type":"object"},"message.DownlinkMessage":{"properties":{"body":{},"device_id":{"type":"string"},"raw":{"type":"string"},"type":{"type":"string"}},"type":"object"},"message.Event":{"properties":{"body":{"type":"string"},"connector_id":{"type":"string"},"create_at":{"type":"string"},"device_id":{"type":"string"},"id":{"type":"string"},"message_id":{"type":"string"},"type":{"type":"string"}},"type":"object"},"message.Message":{"properties":{"body":{"type":"string"},"codec_hash":{"type":"string"},"created_at":{"type":"string"},"device_id":{"type":"string"},"device_name":{"type":"string"},"device_serial_number":{"type":"string"},"direction":{"type":"string"},"down_attempt":{"type":"integer"},"down_scheduled_at":{"type":"string"},"down_state":{"description":"Only for downlink messages","type":"string"},"down_state_at":{"type":"string"},"id":{"type":"string"},"raw":{"type":"string"},"type":{"type":"string"}},"type":"object"},"message.UpdateMessage":{"properties":{"down_state":{"enum":["cancelled"],"example":"cancelled","type":"string"}},"type":"object"},"profile.Authentication":{"properties":{"created_at":{"type":"string"},"data":{"type":"string"},"id":{"type":"string"},"identity_id":{"type":"string"},"provider":{"type":"string"}},"type":"object"},"profile.PasswordChange":{"properties":{"current_password":{"type":"string"},"new_password":{"maxLength":100,"minLength":10,"type":"string"}},"type":"object"},"profile.Profile":{"properties":{"company":{"type":"string"},"created_at":{"type":"string"},"email":{"format":"email","maxLength":255,"type":"string"},"firstname":{"type":"string"},"id":{"type":"string"},"is_verified":{"format":"bool","type":"boolean"},"lastname":{"type":"string"},"middlename":{"type":"string"},"picture":{"type":"string"},"system_role":{"type":"string"},"timezone":{"type":"string"}},"type":"object"},"profile.UpdateProfile":{"properties":{"company":{"maxLength":100,"type":"string"},"firstname":{"maxLength":100,"type":"string"},"lastname":{"maxLength":100,"type":"string"},"middlename":{"maxLength":100,"type":"string"},"picture":{"maxLength":500,"type":"string"},"timezone":{"maxLength":100,"type":"string"}},"type":"object"},"registration.RequestCompletionUser":{"properties":{"code":{"type":"string"},"email":{"format":"email","maxLength":255,"type":"string"},"id":{"type":"string"},"password":{"maxLength":100,"minLength":10,"type":"string"},"provider":{"type":"string"},"space_id":{"type":"string"},"state":{"type":"string"},"token":{"type":"string"}},"type":"object"},"registration.RequestNewUser":{"properties":{"code":{"type":"string"},"email":{"format":"email","maxLength":255,"type":"string"},"password":{"maxLength":100,"minLength":10,"type":"string"},"provider":{"type":"string"},"state":{"type":"string"}},"type":"object"},"registration.Response":{"properties":{"access_token":{"description":"AccessToken is populated only when the signup itself proves\nemail possession (OAuth providers that return email_verified)\n— in that case the user is immediately logged in and the\nfrontend does not have to redirect through /auth/login. Empty\nfor the password flow; that user must complete email\nverification first.","type":"string"},"id":{"type":"string"}},"type":"object"},"registration.VerificationUser":{"properties":{"email":{"format":"email","maxLength":255,"type":"string"},"token":{"type":"string"}},"type":"object"},"retention.MonthSummary":{"properties":{"failed_step":{"type":"string"},"month":{"type":"string"},"partial":{"type":"boolean"},"partitions":{"items":{"type":"string"},"type":"array"},"reason":{"$ref":"#/definitions/retention.Reason"},"size_bytes":{"type":"integer"}},"type":"object"},"retention.Reason":{"enum":["age","size","resume"],"type":"string","x-enum-varnames":["ReasonAge","ReasonSize","ReasonResume"]},"retention.RunDetail":{"properties":{"archive_failed":{"items":{"type":"string"},"type":"array"},"db_size_after":{"type":"integer"},"db_size_before":{"type":"integer"},"dropped":{"items":{"$ref":"#/definitions/retention.MonthSummary"},"type":"array"},"dry_run":{"type":"boolean"},"error":{"type":"string"},"finished_at":{"type":"string"},"max_db_size":{"type":"integer"},"min_months":{"type":"integer"},"months":{"type":"integer"},"partial":{"$ref":"#/definitions/retention.MonthSummary"},"size_limit_unsatisfied":{"type":"boolean"},"started_at":{"type":"string"}},"type":"object"},"session.Session":{"properties":{"device_id":{"type":"string"},"down":{"additionalProperties":{},"type":"object"},"id":{"type":"integer"},"up":{"additionalProperties":{},"type":"object"}},"type":"object"},"space.CreateSpace":{"properties":{"name":{"type":"string"}},"type":"object"},"space.Space":{"properties":{"created_at":{"type":"string"},"id":{"type":"string"},"invited":{"type":"boolean"},"name":{"type":"string"},"owner_id":{"type":"string"},"type":{"type":"string"},"user_role":{"type":"string"}},"type":"object"},"space.UpdateSpace":{"properties":{"name":{"maxLength":32,"minLength":2,"type":"string"}},"type":"object"},"tag.CreateTag":{"properties":{"access_type":{"default":"read","type":"string"},"color":{"default":"#007FE3","description":"DefaultColor","maxLength":7,"type":"string"},"name":{"maxLength":32,"minLength":2,"type":"string"}},"type":"object"},"tag.Tag":{"properties":{"access_type":{"type":"string"},"color":{"maxLength":7,"type":"string"},"created_at":{"format":"date-time","type":"string"},"id":{"type":"string"},"name":{"maxLength":32,"minLength":2,"type":"string"},"space_id":{"type":"string"}},"type":"object"},"tag.UpdateTag":{"properties":{"access_type":{"type":"string"},"color":{"maxLength":7,"type":"string"},"name":{"maxLength":32,"minLength":2,"type":"string"}},"type":"object"},"user.InviteUser":{"properties":{"email":{"description":"user email","format":"email","maxLength":255,"type":"string"},"space_role":{"description":"user role in the space","enum":["user","admin"],"type":"string"}},"type":"object"},"user.Space":{"properties":{"id":{"type":"string"},"name":{"type":"string"},"role":{"type":"string"}},"type":"object"},"variable.CreateVariable":{"properties":{"comment":{"maxLength":500,"type":"string"},"device_id":{"type":"string"},"environment":{"type":"string"},"locked":{"type":"boolean"},"name":{"maxLength":32,"minLength":3,"type":"string"},"value":{"type":"string"}},"type":"object"},"variable.UpdateVariable":{"properties":{"comment":{"maxLength":500,"type":"string"},"device_id":{"type":"string"},"environment":{"type":"string"},"locked":{"type":"boolean"},"name":{"maxLength":32,"minLength":3,"type":"string"},"value":{"type":"string"}},"type":"object"},"variable.Variable":{"properties":{"comment":{"maxLength":500,"type":"string"},"created_at":{"description":"calculated from id","format":"date-time","type":"string"},"device_id":{"type":"string"},"device_name":{"description":"populated from device","type":"string"},"environment":{"type":"string"},"id":{"description":"UUID v7 with timestamp","type":"string"},"locked":{"default":false,"description":"Locked determines if the variable is protected from modification or deletion.\nMust be unlocked (set to false) before it can be updated or deleted.","example":false,"type":"boolean"},"name":{"maxLength":32,"minLength":3,"type":"string"},"space_id":{"type":"string"},"updated_at":{"format":"date-time","type":"string"},"value":{"type":"string"}},"type":"object"}},"host":"","info":{"contact":{"email":"infrastructure@hardwario.com","name":"API Support","url":"https://forum.hardwario.com/"},"description":"This is HARDWARIO CLOUD REST API.","title":"HARDWARIO CLOUD API","version":""},"paths":{"/v2/auth/login":{"post":{"consumes":["application/json"],"description":"User login","parameters":[{"description":"Login data","in":"body","name":"request","required":true,"schema":{"$ref":"#/definitions/auth.LoginRequest"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/auth.LoginResponse"}},"401":{"description":"Bad password or user not found","schema":{"type":"plain"}}},"summary":"User login","tags":["auth"]}},"/v2/auth/logout":{"post":{"consumes":["application/json"],"description":"Revoke the current session (the JWT used for this request).","produces":["application/json"],"responses":{"204":{"description":"No Content"},"401":{"description":"Unauthorized","schema":{"type":"plain"}}},"security":[{"Bearer":[]}],"summary":"Logout","tags":["auth"]}},"/v2/auth/oauth2/providers":{"get":{"consumes":["application/json"],"description":"List configured oauth2 providers (name, key, icon only). The\nauth URL is not returned here so the page load does not write\nstate rows to the DB; call POST /v2/auth/oauth2/start with the\nchosen provider key to obtain the URL.","produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/auth.Oauth2Provider"},"type":"array"}}},"summary":"Get oauth2 providers","tags":["auth"]}},"/v2/auth/oauth2/start":{"post":{"consumes":["application/json"],"description":"Issue a single-use state + PKCE verifier for the requested\nprovider and return the provider auth URL with state and\ncode_challenge embedded. The state row is created only when\nthe user clicks a provider button, not on every login page load.","parameters":[{"description":"Provider key","in":"body","name":"request","required":true,"schema":{"$ref":"#/definitions/auth.Oauth2StartRequest"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/auth.Oauth2StartResponse"}},"400":{"description":"Unknown provider","schema":{"type":"plain"}}},"summary":"Start oauth2 login flow","tags":["auth"]}},"/v2/auth/password/forgot":{"post":{"consumes":["application/json"],"description":"Issue a single-use reset token and email a reset link\nto the given address. The response is intentionally the\nsame shape regardless of whether the email exists or\nwhether the rate limit was hit, so the endpoint cannot\nbe used to enumerate accounts. The email is normalized\n(lower-cased, trimmed) before lookup.","parameters":[{"description":"Email","in":"body","name":"request","required":true,"schema":{"$ref":"#/definitions/auth.PasswordForgotRequest"}}],"produces":["application/json"],"responses":{"204":{"description":"No Content","schema":{"type":"string"}}},"summary":"Request a password reset","tags":["auth"]}},"/v2/auth/password/reset":{"put":{"consumes":["application/json"],"description":"Consume a single-use reset token and set a new password.\nReturns 403 on an invalid or expired token; the same\nresponse a brute-force attacker would see on a wrong\nguess. After 5 failed attempts from a single IP within\n10 minutes further reset attempts are throttled with\n403 regardless of token validity.","parameters":[{"description":"Reset payload","in":"body","name":"request","required":true,"schema":{"$ref":"#/definitions/auth.PasswordResetRequest"}}],"produces":["application/json"],"responses":{"204":{"description":"No Content","schema":{"type":"string"}},"400":{"description":"Bad Request","schema":{"type":"plain"}},"403":{"description":"Invalid token","schema":{"type":"plain"}}},"summary":"Reset password using a token","tags":["auth"]}},"/v2/auth/sessions/{id}":{"delete":{"consumes":["application/json"],"description":"Revoke a specific session of the authenticated user. Use to\nsign out a different device than the one calling the API.","parameters":[{"description":"Session ID","in":"path","name":"id","required":true,"type":"string"}],"produces":["application/json"],"responses":{"204":{"description":"No Content"},"401":{"description":"Unauthorized","schema":{"type":"plain"}},"404":{"description":"Not found","schema":{"type":"plain"}}},"security":[{"Bearer":[]}],"summary":"Revoke a session","tags":["auth"]}},"/v2/profile":{"get":{"consumes":["application/json"],"description":"Get profile","produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/profile.Profile"}},"401":{"description":"Unauthorized","schema":{"type":"plain"}}},"security":[{"Bearer":[]}],"summary":"Get profile","tags":["profile"]},"put":{"consumes":["application/json"],"description":"Update profile","parameters":[{"description":"Profile data","in":"body","name":"request","required":true,"schema":{"$ref":"#/definitions/profile.UpdateProfile"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/profile.Profile"}},"400":{"description":"Bad Request","schema":{"type":"plain"}},"401":{"description":"Unauthorized","schema":{"type":"plain"}},"403":{"description":"Forbidden","schema":{"type":"plain"}}},"security":[{"Bearer":[]}],"summary":"Update profile","tags":["profile"]}},"/v2/profile/authentications":{"get":{"consumes":["application/json"],"description":"Get authentications","produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/profile.Authentication"},"type":"array"}},"401":{"description":"Unauthorized","schema":{"type":"plain"}}},"security":[{"Bearer":[]}],"summary":"Get authentications","tags":["profile"]},"post":{"consumes":["application/json"],"description":"Create authentication","produces":["application/json"],"responses":{"201":{"description":"Created","schema":{"type":"string"}},"400":{"description":"Bad Request","schema":{"type":"plain"}},"401":{"description":"Unauthorized","schema":{"type":"plain"}}},"security":[{"Bearer":[]}],"summary":"Create authentication","tags":["profile"]}},"/v2/profile/authentications/{id}":{"delete":{"consumes":["application/json"],"description":"Delete authentication","parameters":[{"description":"Authentication ID","in":"path","name":"id","required":true,"type":"string"}],"produces":["application/json"],"responses":{"204":{"description":"No Content","schema":{"type":"string"}},"401":{"description":"Unauthorized","schema":{"type":"plain"}}},"security":[{"Bearer":[]}],"summary":"Delete authentication","tags":["profile"]}},"/v2/profile/password":{"put":{"consumes":["application/json"],"description":"Change the authenticated user's password. Requires the\ncurrent password to be supplied — a stolen session\nalone cannot lock the legitimate owner out. After a\nsuccessful change the user receives a confirmation\nemail; existing sessions are NOT revoked (the email\nlinks to /profile/sessions for manual review).","parameters":[{"description":"Password change payload","in":"body","name":"request","required":true,"schema":{"$ref":"#/definitions/profile.PasswordChange"}}],"produces":["application/json"],"responses":{"204":{"description":"No Content","schema":{"type":"string"}},"400":{"description":"Bad Request","schema":{"type":"plain"}},"401":{"description":"Unauthorized","schema":{"type":"plain"}},"403":{"description":"Wrong current password","schema":{"type":"plain"}}},"security":[{"Bearer":[]}],"summary":"Change password","tags":["profile"]}},"/v2/profile/permissions":{"get":{"description":"The flat, deduplicated union of the caller's role permissions\nacross their system role and every space membership. Feeds the\ntoken permission picker (offer only what the user actually holds).","produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"items":{"type":"string"},"type":"array"}}},"security":[{"Bearer":[]}],"summary":"Get my effective permissions","tags":["profile"]}},"/v2/profile/sessions":{"get":{"consumes":["application/json"],"description":"List active and revoked sessions of the authenticated user.\nThe session matching the JWT used for this request is marked\nwith is_current=true.","produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/auth.Session"},"type":"array"}},"401":{"description":"Unauthorized","schema":{"type":"plain"}}},"security":[{"Bearer":[]}],"summary":"List sessions","tags":["profile"]}},"/v2/profile/tokens":{"get":{"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/key.PersonalKey"},"type":"array"}}},"security":[{"Bearer":[]}],"summary":"List personal tokens","tags":["profile"]},"post":{"parameters":[{"description":"Token data","in":"body","name":"request","required":true,"schema":{"$ref":"#/definitions/key.CreatePersonalKey"}}],"produces":["application/json"],"responses":{"201":{"description":"Created","schema":{"$ref":"#/definitions/key.CreatePersonalKeyResponse"}}},"security":[{"Bearer":[]}],"summary":"Create personal token","tags":["profile"]}},"/v2/profile/tokens/{id}":{"delete":{"parameters":[{"description":"Token ID","in":"path","name":"id","required":true,"type":"string"}],"responses":{"204":{"description":"No Content"}},"security":[{"Bearer":[]}],"summary":"Delete personal token","tags":["profile"]},"get":{"parameters":[{"description":"Token ID","in":"path","name":"id","required":true,"type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/key.PersonalKey"}}},"security":[{"Bearer":[]}],"summary":"Get personal token","tags":["profile"]},"put":{"parameters":[{"description":"Token ID","in":"path","name":"id","required":true,"type":"string"},{"description":"Token data","in":"body","name":"request","required":true,"schema":{"$ref":"#/definitions/key.UpdatePersonalKey"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/key.PersonalKey"}}},"security":[{"Bearer":[]}],"summary":"Update personal token","tags":["profile"]}},"/v2/profile/tokens/{id}/rotate":{"post":{"parameters":[{"description":"Token ID","in":"path","name":"id","required":true,"type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/key.CreatePersonalKeyResponse"}}},"security":[{"Bearer":[]}],"summary":"Rotate personal token secret","tags":["profile"]}},"/v2/registration/complete":{"post":{"consumes":["application/json"],"description":"Complete the registration with given values","parameters":[{"description":"User data","in":"body","name":"request","required":true,"schema":{"$ref":"#/definitions/registration.RequestCompletionUser"}}],"produces":["application/json"],"responses":{"201":{"description":"Created","schema":{"$ref":"#/definitions/registration.Response"}},"400":{"description":"Bad Request","schema":{"type":"plain"}},"403":{"description":"Forbidden","schema":{"type":"plain"}}},"summary":"Complete the registration","tags":["registration"]}},"/v2/registration/new":{"post":{"consumes":["application/json"],"description":"Registration new user with given values","parameters":[{"description":"User data","in":"body","name":"request","required":true,"schema":{"$ref":"#/definitions/registration.RequestNewUser"}}],"produces":["application/json"],"responses":{"201":{"description":"Created","schema":{"$ref":"#/definitions/registration.Response"}},"400":{"description":"Bad Request","schema":{"type":"plain"}},"403":{"description":"Forbidden","schema":{"type":"plain"}}},"summary":"Registration a new user","tags":["registration"]}},"/v2/registration/verify":{"put":{"consumes":["application/json"],"description":"Verified user","parameters":[{"description":"User verification data","in":"body","name":"request","required":true,"schema":{"$ref":"#/definitions/registration.VerificationUser"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/registration.Response"}},"400":{"description":"Bad Request","schema":{"type":"plain"}},"403":{"description":"Forbidden","schema":{"type":"plain"}},"404":{"description":"Not Found","schema":{"type":"plain"}},"409":{"description":"Conflict","schema":{"type":"plain"}}},"summary":"Verified user","tags":["registration"]}},"/v2/spaces":{"get":{"consumes":["application/json"],"description":"Get array of all spaces","parameters":[{"default":100,"description":"The numbers of items to return","in":"query","maximum":100,"minimum":1,"name":"limit","type":"integer"},{"description":"Last item ID from previous response","in":"query","name":"offset","type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/space.Space"},"type":"array"}},"400":{"description":"Bad Request","schema":{"type":"plain"}},"401":{"description":"Unauthorized","schema":{"type":"plain"}},"403":{"description":"Forbidden","schema":{"type":"plain"}}},"security":[{"Bearer":[]}],"summary":"Get all spaces","tags":["spaces"]},"post":{"consumes":["application/json"],"description":"Creates new space with given values","parameters":[{"description":"Space data","in":"body","name":"request","required":true,"schema":{"$ref":"#/definitions/space.CreateSpace"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/space.Space"}},"400":{"description":"Bad Request","schema":{"type":"plain"}},"401":{"description":"Unauthorized","schema":{"type":"plain"}},"403":{"description":"Forbidden","schema":{"type":"plain"}}},"security":[{"Bearer":[]}],"summary":"Create a new space","tags":["spaces"]}},"/v2/spaces/{id}":{"delete":{"consumes":["application/json"],"description":"Deletes existing space","parameters":[{"description":"Space ID","in":"path","name":"id","required":true,"type":"string"}],"produces":["application/json"],"responses":{"204":{"description":"No Content","schema":{"type":"string"}},"400":{"description":"Bad Request","schema":{"type":"plain"}},"401":{"description":"Unauthorized","schema":{"type":"plain"}},"403":{"description":"Forbidden","schema":{"type":"plain"}},"404":{"description":"Not Found","schema":{"type":"plain"}}},"security":[{"Bearer":[]}],"summary":"Delete a space","tags":["spaces"]},"get":{"consumes":["application/json"],"description":"Get a space based on a unique ID","parameters":[{"description":"Space ID","in":"path","name":"id","required":true,"type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/space.Space"}},"400":{"description":"Bad Request","schema":{"type":"plain"}},"401":{"description":"Unauthorized","schema":{"type":"plain"}},"403":{"description":"Forbidden","schema":{"type":"plain"}},"404":{"description":"Not Found","schema":{"type":"plain"}}},"security":[{"Bearer":[]}],"summary":"Get single space","tags":["spaces"]},"put":{"consumes":["application/json"],"description":"Updates existing space with given values","parameters":[{"description":"Space ID","in":"path","name":"id","required":true,"type":"string"},{"description":"Space data","in":"body","name":"request","required":true,"schema":{"$ref":"#/definitions/space.UpdateSpace"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/space.Space"}},"400":{"description":"Bad Request","schema":{"type":"plain"}},"401":{"description":"Unauthorized","schema":{"type":"plain"}},"403":{"description":"Forbidden","schema":{"type":"plain"}},"404":{"description":"Not Found","schema":{"type":"plain"}}},"security":[{"Bearer":[]}],"summary":"Update space","tags":["spaces"]}},"/v2/spaces/{id}/accept":{"put":{"consumes":["application/json"],"description":"Accept invite to space","produces":["application/json"],"responses":{"204":{"description":"No Content"},"400":{"description":"Bad Request","schema":{"type":"plain"}},"401":{"description":"Unauthorized","schema":{"type":"plain"}},"403":{"description":"Forbidden","schema":{"type":"plain"}}},"security":[{"Bearer":[]}],"summary":"Accept invite","tags":["spaces"]}},"/v2/spaces/{space_id}/batches":{"get":{"parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"type":"string"},{"description":"Filter by type","enum":["firmware","config"],"in":"query","name":"type","type":"string"},{"description":"Filter by state","in":"query","name":"state","type":"string"},{"description":"Filter by author id","in":"query","name":"created_by_id","type":"string"},{"default":20,"description":"Number of items to return","in":"query","maximum":1000,"minimum":1,"name":"limit","type":"integer"},{"description":"Last batch id from previous response","in":"query","name":"offset","type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/DeviceBatch"},"type":"array"}},"400":{"description":"Bad Request","schema":{"type":"plain"}},"401":{"description":"Unauthorized","schema":{"type":"plain"}},"403":{"description":"Forbidden","schema":{"type":"plain"}}},"security":[{"Bearer":[]},{"ApiKey":[]}],"summary":"List device batches","tags":["batches"]},"post":{"consumes":["application/json"],"description":"Create a batch firmware or config operation targeting a set of devices selected by ids, tags or all devices in the space.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"type":"string"},{"description":"Batch parameters","in":"body","name":"request","required":true,"schema":{"$ref":"#/definitions/CreateDeviceBatch"}}],"produces":["application/json"],"responses":{"201":{"description":"Created","schema":{"$ref":"#/definitions/DeviceBatch"}},"400":{"description":"Bad Request","schema":{"type":"plain"}},"401":{"description":"Unauthorized","schema":{"type":"plain"}},"403":{"description":"Forbidden","schema":{"type":"plain"}}},"security":[{"Bearer":[]},{"ApiKey":[]}],"summary":"Create a device batch operation","tags":["batches"]}},"/v2/spaces/{space_id}/batches/count":{"get":{"description":"Returns the total number of batches matching the same","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"type":"string"},{"description":"Filter by type","enum":["firmware","config"],"in":"query","name":"type","type":"string"},{"description":"Filter by state","in":"query","name":"state","type":"string"},{"description":"Filter by author id","in":"query","name":"created_by_id","type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"type":"integer"}},"400":{"description":"Bad Request","schema":{"type":"plain"}},"401":{"description":"Unauthorized","schema":{"type":"plain"}},"403":{"description":"Forbidden","schema":{"type":"plain"}}},"security":[{"Bearer":[]},{"ApiKey":[]}],"summary":"Count device batches matching the filters","tags":["batches"]}},"/v2/spaces/{space_id}/batches/preview":{"post":{"consumes":["application/json"],"description":"Validates the request the same way Create does (payload schema,","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"type":"string"},{"description":"Batch parameters (same shape as Create)","in":"body","name":"request","required":true,"schema":{"$ref":"#/definitions/CreateDeviceBatch"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/DeviceBatchPreview"}},"400":{"description":"Bad Request","schema":{"type":"plain"}},"401":{"description":"Unauthorized","schema":{"type":"plain"}},"403":{"description":"Forbidden","schema":{"type":"plain"}}},"security":[{"Bearer":[]},{"ApiKey":[]}],"summary":"Preview a device batch operation","tags":["batches"]}},"/v2/spaces/{space_id}/batches/{id}":{"delete":{"description":"Cancel a running batch. Items still scheduled or queued are","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"type":"string"},{"description":"Batch ID","in":"path","name":"id","required":true,"type":"string"}],"responses":{"204":{"description":"No Content","schema":{"type":"string"}},"401":{"description":"Unauthorized","schema":{"type":"plain"}},"403":{"description":"Forbidden","schema":{"type":"plain"}},"404":{"description":"Not Found","schema":{"type":"plain"}},"409":{"description":"Conflict","schema":{"type":"plain"}}},"security":[{"Bearer":[]},{"ApiKey":[]}],"summary":"Cancel a device batch","tags":["batches"]},"get":{"parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"type":"string"},{"description":"Batch ID","in":"path","name":"id","required":true,"type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/DeviceBatch"}},"400":{"description":"Bad Request","schema":{"type":"plain"}},"401":{"description":"Unauthorized","schema":{"type":"plain"}},"403":{"description":"Forbidden","schema":{"type":"plain"}},"404":{"description":"Not Found","schema":{"type":"plain"}}},"security":[{"Bearer":[]},{"ApiKey":[]}],"summary":"Get device batch","tags":["batches"]}},"/v2/spaces/{space_id}/batches/{id}/items":{"get":{"parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"type":"string"},{"description":"Batch ID","in":"path","name":"id","required":true,"type":"string"},{"description":"Filter by item state","in":"query","name":"state","type":"string"},{"default":20,"description":"Number of items to return","in":"query","maximum":1000,"minimum":1,"name":"limit","type":"integer"},{"description":"Last item id from previous response","in":"query","name":"offset","type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/DeviceBatchItem"},"type":"array"}},"400":{"description":"Bad Request","schema":{"type":"plain"}},"401":{"description":"Unauthorized","schema":{"type":"plain"}},"403":{"description":"Forbidden","schema":{"type":"plain"}},"404":{"description":"Not Found","schema":{"type":"plain"}}},"security":[{"Bearer":[]},{"ApiKey":[]}],"summary":"List items in a device batch","tags":["batches"]}},"/v2/spaces/{space_id}/batches/{id}/items/count":{"get":{"parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"type":"string"},{"description":"Batch ID","in":"path","name":"id","required":true,"type":"string"},{"description":"Filter by item state","in":"query","name":"state","type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"type":"integer"}},"400":{"description":"Bad Request","schema":{"type":"plain"}},"401":{"description":"Unauthorized","schema":{"type":"plain"}},"403":{"description":"Forbidden","schema":{"type":"plain"}},"404":{"description":"Not Found","schema":{"type":"plain"}}},"security":[{"Bearer":[]},{"ApiKey":[]}],"summary":"Count items in a device batch matching the filters","tags":["batches"]}},"/v2/spaces/{space_id}/batches/{id}/items/{item_id}":{"delete":{"description":"Cancel one item of a running batch without affecting the","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"type":"string"},{"description":"Batch ID","in":"path","name":"id","required":true,"type":"string"},{"description":"Batch item ID","in":"path","name":"item_id","required":true,"type":"string"}],"responses":{"204":{"description":"No Content","schema":{"type":"string"}},"401":{"description":"Unauthorized","schema":{"type":"plain"}},"403":{"description":"Forbidden","schema":{"type":"plain"}},"404":{"description":"Not Found","schema":{"type":"plain"}},"409":{"description":"Conflict","schema":{"type":"plain"}}},"security":[{"Bearer":[]},{"ApiKey":[]}],"summary":"Cancel a single device batch item","tags":["batches"]}},"/v2/spaces/{space_id}/connectors":{"get":{"consumes":["application/json"],"description":"Get array of all connectors","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"type":"string"},{"default":100,"description":"The numbers of items to return","in":"query","maximum":100,"minimum":1,"name":"limit","type":"integer"},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/connector.Connector"},"type":"array"}},"400":{"description":"Bad Request","schema":{"type":"plain"}},"401":{"description":"Unauthorized","schema":{"type":"plain"}},"403":{"description":"Forbidden","schema":{"type":"plain"}}},"security":[{"Bearer":[]},{"ApiKey":[]}],"summary":"Get all connectors","tags":["connectors"]},"post":{"consumes":["application/json"],"description":"Creates new connector with given values","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"type":"string"},{"description":"Connector data","in":"body","name":"request","required":true,"schema":{"$ref":"#/definitions/connector.CreateConnector"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/connector.Connector"}},"400":{"description":"Bad Request","schema":{"type":"plain"}},"401":{"description":"Unauthorized","schema":{"type":"plain"}},"403":{"description":"Forbidden","schema":{"type":"plain"}},"409":{"description":"Conflict","schema":{"type":"plain"}}},"security":[{"Bearer":[]},{"ApiKey":[]}],"summary":"Create a new connector","tags":["connectors"]}},"/v2/spaces/{space_id}/connectors/{id}":{"delete":{"consumes":["application/json"],"description":"Deletes existing connector","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"type":"string"},{"description":"Connector ID","in":"path","name":"id","required":true,"type":"string"}],"produces":["application/json"],"responses":{"204":{"description":"No Content","schema":{"type":"string"}},"400":{"description":"Bad Request","schema":{"type":"plain"}},"401":{"description":"Unauthorized","schema":{"type":"plain"}},"403":{"description":"Forbidden","schema":{"type":"plain"}},"404":{"description":"Not Found","schema":{"type":"plain"}}},"security":[{"Bearer":[]},{"ApiKey":[]}],"summary":"Delete a connector","tags":["connectors"]},"get":{"consumes":["application/json"],"description":"Get a connector based on a unique ID","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"type":"string"},{"description":"Connector ID","in":"path","name":"id","required":true,"type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/connector.Connector"}},"400":{"description":"Bad Request","schema":{"type":"plain"}},"401":{"description":"Unauthorized","schema":{"type":"plain"}},"403":{"description":"Forbidden","schema":{"type":"plain"}},"404":{"description":"Not Found","schema":{"type":"plain"}}},"security":[],"summary":"Get single connector","tags":["connectors"]},"put":{"consumes":["application/json"],"description":"Updates existing connector with given values","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"type":"string"},{"description":"Connector ID","in":"path","name":"id","required":true,"type":"string"},{"description":"Connector data","in":"body","name":"request","required":true,"schema":{"$ref":"#/definitions/connector.UpdateConnector"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/connector.Connector"}},"400":{"description":"Bad Request","schema":{"type":"plain"}},"401":{"description":"Unauthorized","schema":{"type":"plain"}},"403":{"description":"Forbidden","schema":{"type":"plain"}},"404":{"description":"Not Found","schema":{"type":"plain"}}},"security":[{"Bearer":[]},{"ApiKey":[]}],"summary":"Update connector","tags":["connectors"]}},"/v2/spaces/{space_id}/connectors/{id}/statistics":{"get":{"consumes":["application/json"],"description":"Get statistics for a connector","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"type":"string"},{"description":"Connector ID","in":"path","name":"id","required":true,"type":"string"},{"default":7,"description":"Range in days (1-30)","in":"query","maximum":30,"minimum":1,"name":"days","type":"integer"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/connector.ConnectorStatistics"}},"400":{"description":"Bad Request","schema":{"type":"plain"}},"401":{"description":"Unauthorized","schema":{"type":"plain"}},"403":{"description":"Forbidden","schema":{"type":"plain"}},"404":{"description":"Not Found","schema":{"type":"plain"}}},"security":[{"Bearer":[]},{"ApiKey":[]}],"summary":"Get connector statistics","tags":["connectors"]}},"/v2/spaces/{space_id}/devices":{"get":{"consumes":["application/json"],"description":"Get array of all devices","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"type":"string"},{"default":20,"description":"The numbers of items to return","in":"query","maximum":1000,"minimum":1,"name":"limit","type":"integer"},{"description":"Last item ID from previous response","in":"query","name":"offset","type":"string"},{"description":"Device name, case insensitive","in":"query","maxLength":32,"minLength":3,"name":"name","type":"string"},{"description":"External ID","in":"query","maxLength":128,"minLength":3,"name":"external_id","type":"string"},{"description":"Serial number","in":"query","maxLength":10,"minLength":3,"name":"serial_number","type":"string"},{"collectionFormat":"multi","description":"Array of tag IDs","in":"query","items":{"type":"string"},"name":"tag_ids","type":"array"},{"default":"any","description":"Tag filter logic","enum":["any","all"],"in":"query","name":"tag_filter_logic","type":"string"},{"default":"id","description":"Sort by","enum":["id","created_at","name","serial_number","external_id","last_seen","session_id"],"in":"query","name":"sort_by","type":"string"},{"default":"asc","description":"Order by","enum":["asc","desc"],"in":"query","name":"order_by","type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/SpaceDevice"},"type":"array"}},"400":{"description":"Bad Request","schema":{"type":"plain"}},"401":{"description":"Unauthorized","schema":{"type":"plain"}},"403":{"description":"Forbidden","schema":{"type":"plain"}}},"security":[{"Bearer":[]},{"ApiKey":[]}],"summary":"Get all devices","tags":["devices"]},"post":{"consumes":["application/json"],"description":"Creates new device with given values","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"type":"string"},{"description":"Device data","in":"body","name":"request","required":true,"schema":{"$ref":"#/definitions/device.CreateDevice"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/SpaceDevice"}},"400":{"description":"Bad Request","schema":{"type":"plain"}},"401":{"description":"Unauthorized","schema":{"type":"plain"}},"403":{"description":"Forbidden","schema":{"type":"plain"}},"409":{"description":"Conflict","schema":{"type":"plain"}}},"security":[{"Bearer":[]},{"ApiKey":[]}],"summary":"Create a new device","tags":["devices"]}},"/v2/spaces/{space_id}/devices/count":{"get":{"consumes":["application/json"],"description":"Get count of devices","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"type":"string"},{"description":"Device name, case insensitive","in":"query","maxLength":32,"minLength":3,"name":"name","type":"string"},{"description":"External ID","in":"query","maxLength":128,"minLength":3,"name":"external_id","type":"string"},{"description":"Serial number","in":"query","maxLength":10,"minLength":3,"name":"serial_number","type":"string"},{"collectionFormat":"multi","description":"Array of tag IDs","in":"query","items":{"type":"string"},"name":"tag_ids[]","type":"array"},{"default":"any","description":"Tag filter logic","enum":["any","all"],"in":"query","name":"tag_filter_logic","type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"Count of devices","schema":{"type":"integer"}},"400":{"description":"Bad Request","schema":{"type":"plain"}},"401":{"description":"Unauthorized","schema":{"type":"plain"}},"403":{"description":"Forbidden","schema":{"type":"plain"}}},"security":[{"Bearer":[]},{"ApiKey":[]}],"summary":"Get devices count","tags":["devices"]}},"/v2/spaces/{space_id}/devices/{id}":{"delete":{"consumes":["application/json"],"description":"Deletes existing device","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"type":"string"},{"description":"Device ID","in":"path","name":"id","required":true,"type":"string"}],"produces":["application/json"],"responses":{"204":{"description":"No Content","schema":{"type":"string"}},"400":{"description":"Bad Request","schema":{"type":"plain"}},"401":{"description":"Unauthorized","schema":{"type":"plain"}},"403":{"description":"Forbidden","schema":{"type":"plain"}},"404":{"description":"Not Found","schema":{"type":"plain"}}},"security":[{"Bearer":[]},{"ApiKey":[]}],"summary":"Delete a device","tags":["devices"]},"get":{"consumes":["application/json"],"description":"Get a device based on a unique ID","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"type":"string"},{"description":"Device ID","in":"path","name":"id","required":true,"type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/SpaceDevice"}},"400":{"description":"Bad Request","schema":{"type":"plain"}},"401":{"description":"Unauthorized","schema":{"type":"plain"}},"403":{"description":"Forbidden","schema":{"type":"plain"}},"404":{"description":"Not Found","schema":{"type":"plain"}}},"security":[{"Bearer":[]},{"ApiKey":[]}],"summary":"Get single device","tags":["devices"]},"put":{"consumes":["application/json"],"description":"Updates existing device with given values","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"type":"string"},{"description":"Device ID","in":"path","name":"id","required":true,"type":"string"},{"description":"Device data","in":"body","name":"request","required":true,"schema":{"$ref":"#/definitions/device.UpdateDevice"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/SpaceDevice"}},"400":{"description":"Bad Request","schema":{"type":"plain"}},"401":{"description":"Unauthorized","schema":{"type":"plain"}},"403":{"description":"Forbidden","schema":{"type":"plain"}},"404":{"description":"Not Found","schema":{"type":"plain"}}},"security":[{"Bearer":[]},{"ApiKey":[]}],"summary":"Update device","tags":["devices"]}},"/v2/spaces/{space_id}/devices/{id}/commands":{"post":{"consumes":["application/json"],"description":"Create device command","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"type":"string"},{"description":"Device ID","in":"path","name":"id","required":true,"type":"string"},{"description":"Body","example":"[\"help\", \"led switch yellow on\"]","in":"body","name":"cmds","required":true,"schema":{"items":{"type":"string"},"type":"array"}}],"produces":["application/json"],"responses":{"201":{"description":"Created","schema":{"$ref":"#/definitions/command.CreateResponse"}},"400":{"description":"Bad Request","schema":{"type":"plain"}},"401":{"description":"Unauthorized","schema":{"type":"plain"}},"403":{"description":"Forbidden","schema":{"type":"plain"}},"409":{"description":"Conflict","schema":{"type":"plain"}}},"security":[{"Bearer":[]},{"ApiKey":[]}],"summary":"Create device command","tags":["devices"]}},"/v2/spaces/{space_id}/devices/{id}/commands/{message_id}":{"delete":{"consumes":["application/json"],"description":"Cancel command","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"type":"string"},{"description":"Device ID","in":"path","name":"id","required":true,"type":"string"},{"description":"Message ID","in":"path","name":"message_id","required":true,"type":"string"}],"produces":["application/json"],"responses":{"204":{"description":"No Content","schema":{"type":"string"}},"400":{"description":"Bad Request","schema":{"type":"plain"}},"401":{"description":"Unauthorized","schema":{"type":"plain"}},"403":{"description":"Forbidden","schema":{"type":"plain"}},"404":{"description":"Not Found","schema":{"type":"plain"}}},"security":[{"Bearer":[]},{"ApiKey":[]}],"summary":"Cancel command","tags":["devices"]}},"/v2/spaces/{space_id}/devices/{id}/config":{"get":{"consumes":["application/json"],"description":"Get current device config (latest uplink or manual)","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"type":"string"},{"description":"Device ID","in":"path","name":"id","required":true,"type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/config.Config"}},"400":{"description":"Bad Request","schema":{"type":"plain"}},"401":{"description":"Unauthorized","schema":{"type":"plain"}},"403":{"description":"Forbidden","schema":{"type":"plain"}},"404":{"description":"Not Found","schema":{"type":"plain"}}},"security":[{"Bearer":[]},{"ApiKey":[]}],"summary":"Get current config","tags":["devices"]},"put":{"consumes":["application/json"],"description":"Save config manually. Useful for LoRa or other devices that cannot upload config themselves.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"type":"string"},{"description":"Device ID","in":"path","name":"id","required":true,"type":"string"},{"description":"Body","in":"body","name":"config","required":true,"schema":{"items":{"type":"string"},"type":"array"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/config.Config"}},"400":{"description":"Bad Request","schema":{"type":"plain"}},"401":{"description":"Unauthorized","schema":{"type":"plain"}},"403":{"description":"Forbidden","schema":{"type":"plain"}}},"security":[{"Bearer":[]},{"ApiKey":[]}],"summary":"Save manual config","tags":["devices"]}},"/v2/spaces/{space_id}/devices/{id}/configs":{"get":{"consumes":["application/json"],"description":"List all config records (uplink, downlink, manual)","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"type":"string"},{"description":"Device ID","in":"path","name":"id","required":true,"type":"string"},{"default":20,"description":"Limit","in":"query","name":"limit","type":"integer"},{"description":"Offset (config ID for pagination)","in":"query","name":"offset","type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/config.Config"},"type":"array"}},"400":{"description":"Bad Request","schema":{"type":"plain"}},"401":{"description":"Unauthorized","schema":{"type":"plain"}},"403":{"description":"Forbidden","schema":{"type":"plain"}}},"security":[{"Bearer":[]},{"ApiKey":[]}],"summary":"List config history","tags":["devices"]},"post":{"consumes":["application/json"],"description":"Queue config commands to be downloaded by device","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"type":"string"},{"description":"Device ID","in":"path","name":"id","required":true,"type":"string"},{"description":"Body","in":"body","name":"config","required":true,"schema":{"items":{"type":"string"},"type":"array"}}],"produces":["application/json"],"responses":{"201":{"description":"Created","schema":{"$ref":"#/definitions/config.CreateResponse"}},"400":{"description":"Bad Request","schema":{"type":"plain"}},"401":{"description":"Unauthorized","schema":{"type":"plain"}},"403":{"description":"Forbidden","schema":{"type":"plain"}},"409":{"description":"Conflict","schema":{"type":"plain"}}},"security":[{"Bearer":[]},{"ApiKey":[]}],"summary":"Send config to device (downlink)","tags":["devices"]}},"/v2/spaces/{space_id}/devices/{id}/configs/{config_id}":{"get":{"consumes":["application/json"],"description":"Get specific config record from history","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"type":"string"},{"description":"Device ID","in":"path","name":"id","required":true,"type":"string"},{"description":"Config ID","in":"path","name":"config_id","required":true,"type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/config.Config"}},"400":{"description":"Bad Request","schema":{"type":"plain"}},"401":{"description":"Unauthorized","schema":{"type":"plain"}},"403":{"description":"Forbidden","schema":{"type":"plain"}},"404":{"description":"Not Found","schema":{"type":"plain"}}},"security":[{"Bearer":[]},{"ApiKey":[]}],"summary":"Get config by ID","tags":["devices"]}},"/v2/spaces/{space_id}/devices/{id}/configs/{message_id}":{"delete":{"consumes":["application/json"],"description":"Cancel pending downlink config that hasn't been sent yet","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"type":"string"},{"description":"Device ID","in":"path","name":"id","required":true,"type":"string"},{"description":"Message ID","in":"path","name":"message_id","required":true,"type":"string"}],"produces":["application/json"],"responses":{"204":{"description":"No Content","schema":{"type":"string"}},"400":{"description":"Bad Request","schema":{"type":"plain"}},"401":{"description":"Unauthorized","schema":{"type":"plain"}},"403":{"description":"Forbidden","schema":{"type":"plain"}},"404":{"description":"Not Found","schema":{"type":"plain"}}},"security":[{"Bearer":[]},{"ApiKey":[]}],"summary":"Cancel pending config","tags":["devices"]}},"/v2/spaces/{space_id}/devices/{id}/downlinks":{"post":{"consumes":["application/json"],"description":"Create device downlink data","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"type":"string"},{"description":"Device ID","in":"path","name":"id","required":true,"type":"string"},{"description":"Body","in":"body","name":"data","required":true,"schema":{"additionalProperties":true,"type":"object"}}],"produces":["application/json"],"responses":{"201":{"description":"Created","schema":{"$ref":"#/definitions/downlink.CreateResponse"}},"400":{"description":"Bad Request","schema":{"type":"plain"}},"401":{"description":"Unauthorized","schema":{"type":"plain"}},"403":{"description":"Forbidden","schema":{"type":"plain"}},"409":{"description":"Conflict","schema":{"type":"plain"}}},"security":[{"Bearer":[]},{"ApiKey":[]}],"summary":"Create device downlink data","tags":["devices"]}},"/v2/spaces/{space_id}/devices/{id}/downlinks/{message_id}":{"delete":{"consumes":["application/json"],"description":"Cancel downlink","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"type":"string"},{"description":"Device ID","in":"path","name":"id","required":true,"type":"string"},{"description":"Message ID","in":"path","name":"message_id","required":true,"type":"string"}],"produces":["application/json"],"responses":{"204":{"description":"No Content","schema":{"type":"string"}},"400":{"description":"Bad Request","schema":{"type":"plain"}},"401":{"description":"Unauthorized","schema":{"type":"plain"}},"403":{"description":"Forbidden","schema":{"type":"plain"}},"404":{"description":"Not Found","schema":{"type":"plain"}}},"security":[{"Bearer":[]},{"ApiKey":[]}],"summary":"Cancel downlink","tags":["devices"]}},"/v2/spaces/{space_id}/devices/{id}/events":{"get":{"description":"Stored events of one device, oldest first, from `after` on. The access is that of GET messages: a key limited to tags sees the events of its devices only.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"type":"string"},{"description":"Device ID","in":"path","name":"id","required":true,"type":"string"},{"default":20,"description":"The numbers of items to return","in":"query","maximum":1000,"minimum":1,"name":"limit","type":"integer"},{"description":"Last item ID from previous response","format":"uuid","in":"query","name":"offset","type":"string"},{"description":"After time (default 24 hours ago) in UTC format (YYYY-mm-ddTHH:MM:SS) or RFC3339","format":"date-time","in":"query","name":"after","type":"string"},{"description":"This event type and the types it is a dot-separated prefix of, e.g. udp.data","in":"query","name":"type","type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/event.Event"},"type":"array"}},"400":{"description":"Bad Request","schema":{"type":"plain"}},"401":{"description":"Unauthorized","schema":{"type":"plain"}},"403":{"description":"Forbidden","schema":{"type":"plain"}},"404":{"description":"Not Found","schema":{"type":"plain"}}},"security":[{"Bearer":[]},{"ApiKey":[]}],"summary":"Get the events of a device","tags":["devices"]}},"/v2/spaces/{space_id}/devices/{id}/firmware":{"get":{"consumes":["application/json"],"description":"Get array of all firmware for device","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"type":"string"},{"description":"Device ID","in":"path","name":"id","required":true,"type":"string"},{"default":20,"description":"The numbers of items to return","in":"query","maximum":1000,"minimum":1,"name":"limit","type":"integer"},{"description":"Last item ID from previous response","in":"query","name":"offset","type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/DeviceFirmware"},"type":"array"}},"400":{"description":"Bad Request","schema":{"type":"plain"}},"401":{"description":"Unauthorized","schema":{"type":"plain"}},"403":{"description":"Forbidden","schema":{"type":"plain"}}},"security":[{"Bearer":[]},{"ApiKey":[]}],"summary":"Get all firmware for device","tags":["devices"]},"post":{"consumes":["application/json"],"description":"Creates new firmware download for device with given values","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"type":"string"},{"description":"Device ID","in":"path","name":"id","required":true,"type":"string"},{"description":"Firmware data","in":"body","name":"request","required":true,"schema":{"$ref":"#/definitions/firmware.CreateRequest"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/DeviceFirmware"}},"400":{"description":"Bad Request","schema":{"type":"plain"}},"401":{"description":"Unauthorized","schema":{"type":"plain"}},"403":{"description":"Forbidden","schema":{"type":"plain"}},"409":{"description":"Conflict","schema":{"type":"plain"}}},"security":[{"Bearer":[]},{"ApiKey":[]}],"summary":"Create a new firmware download for device","tags":["devices"]}},"/v2/spaces/{space_id}/devices/{id}/firmware/{firmware_id}":{"delete":{"consumes":["application/json"],"description":"Cancel a scheduled or in-progress firmware download. Idempotent:\nan already-canceled update returns 204. Once the device is\nswapping (past the point of no return) or the update has already\nfinished, it can no longer be cancelled (409).","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"type":"string"},{"description":"Device ID","in":"path","name":"id","required":true,"type":"string"},{"description":"Firmware ID","in":"path","name":"firmware_id","required":true,"type":"string"}],"produces":["application/json"],"responses":{"204":{"description":"No Content","schema":{"type":"string"}},"400":{"description":"Bad Request","schema":{"type":"plain"}},"401":{"description":"Unauthorized","schema":{"type":"plain"}},"403":{"description":"Forbidden","schema":{"type":"plain"}},"404":{"description":"Not Found","schema":{"type":"plain"}},"409":{"description":"Conflict","schema":{"type":"plain"}}},"security":[{"Bearer":[]},{"ApiKey":[]}],"summary":"Cancel firmware download for device","tags":["devices"]},"get":{"consumes":["application/json"],"description":"Get firmware download for device","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"type":"string"},{"description":"Device ID","in":"path","name":"id","required":true,"type":"string"},{"description":"Firmware ID","in":"path","name":"firmware_id","required":true,"type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/DeviceFirmware"}},"400":{"description":"Bad Request","schema":{"type":"plain"}},"401":{"description":"Unauthorized","schema":{"type":"plain"}},"403":{"description":"Forbidden","schema":{"type":"plain"}}},"security":[{"Bearer":[]},{"ApiKey":[]}],"summary":"Get firmware download for device","tags":["devices"]}},"/v2/spaces/{space_id}/devices/{id}/sessions":{"get":{"consumes":["application/json"],"description":"Get array of all sessions","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"type":"string"},{"description":"Device ID","in":"path","name":"id","required":true,"type":"string"},{"default":20,"description":"The numbers of items to return","in":"query","maximum":1000,"minimum":1,"name":"limit","type":"integer"},{"description":"Last item ID from previous response","in":"query","name":"offset","type":"integer"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/session.Session"},"type":"array"}},"400":{"description":"Bad Request","schema":{"type":"plain"}},"401":{"description":"Unauthorized","schema":{"type":"plain"}},"403":{"description":"Forbidden","schema":{"type":"plain"}}},"security":[{"Bearer":[]},{"ApiKey":[]}],"summary":"Get all sessions","tags":["devices"]}},"/v2/spaces/{space_id}/devices/{id}/sessions/{session_id}":{"get":{"consumes":["application/json"],"description":"Get a session based on a unique ID","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"type":"string"},{"description":"Device ID","in":"path","name":"id","required":true,"type":"string"},{"description":"Session ID","in":"path","name":"session_id","required":true,"type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/session.Session"}},"400":{"description":"Bad Request","schema":{"type":"plain"}},"401":{"description":"Unauthorized","schema":{"type":"plain"}},"403":{"description":"Forbidden","schema":{"type":"plain"}},"404":{"description":"Not Found","schema":{"type":"plain"}}},"security":[{"Bearer":[]},{"ApiKey":[]}],"summary":"Get single session","tags":["devices"]}},"/v2/spaces/{space_id}/keys":{"get":{"consumes":["application/json"],"description":"Get array of all keys","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"type":"string"},{"default":100,"description":"The numbers of items to return","in":"query","maximum":100,"minimum":1,"name":"limit","type":"integer"},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/key.Key"},"type":"array"}},"400":{"description":"Bad Request","schema":{"type":"plain"}},"401":{"description":"Unauthorized","schema":{"type":"plain"}},"403":{"description":"Forbidden","schema":{"type":"plain"}}},"security":[{"Bearer":[]},{"ApiKey":[]}],"summary":"Get all keys","tags":["keys"]},"post":{"consumes":["application/json"],"description":"Creates new key with given values","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"type":"string"},{"description":"Key data","in":"body","name":"request","required":true,"schema":{"$ref":"#/definitions/key.CreateKey"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/key.CreateKeyResponse"}},"400":{"description":"Bad Request","schema":{"type":"plain"}},"401":{"description":"Unauthorized","schema":{"type":"plain"}},"403":{"description":"Forbidden","schema":{"type":"plain"}},"409":{"description":"Conflict","schema":{"type":"plain"}}},"security":[{"Bearer":[]},{"ApiKey":[]}],"summary":"Create a new key","tags":["keys"]}},"/v2/spaces/{space_id}/keys/{id}":{"delete":{"consumes":["application/json"],"description":"Deletes existing key","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"type":"string"},{"description":"Key ID","in":"path","name":"id","required":true,"type":"string"}],"produces":["application/json"],"responses":{"204":{"description":"No Content","schema":{"type":"string"}},"400":{"description":"Bad Request","schema":{"type":"plain"}},"401":{"description":"Unauthorized","schema":{"type":"plain"}},"403":{"description":"Forbidden","schema":{"type":"plain"}},"404":{"description":"Not Found","schema":{"type":"plain"}}},"security":[{"Bearer":[]},{"ApiKey":[]}],"summary":"Delete a key","tags":["keys"]},"get":{"consumes":["application/json"],"description":"Get a key based on a unique ID","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"type":"string"},{"description":"Key ID","in":"path","name":"id","required":true,"type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/key.Key"}},"400":{"description":"Bad Request","schema":{"type":"plain"}},"401":{"description":"Unauthorized","schema":{"type":"plain"}},"403":{"description":"Forbidden","schema":{"type":"plain"}},"404":{"description":"Not Found","schema":{"type":"plain"}}},"security":[{"Bearer":[]},{"ApiKey":[]}],"summary":"Get single key","tags":["keys"]},"put":{"consumes":["application/json"],"description":"Updates existing key with given values","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"type":"string"},{"description":"key ID","in":"path","name":"id","required":true,"type":"string"},{"description":"key data","in":"body","name":"request","required":true,"schema":{"$ref":"#/definitions/key.UpdateKey"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/key.Key"}},"400":{"description":"Bad Request","schema":{"type":"plain"}},"401":{"description":"Unauthorized","schema":{"type":"plain"}},"403":{"description":"Forbidden","schema":{"type":"plain"}},"404":{"description":"Not Found","schema":{"type":"plain"}}},"security":[{"Bearer":[]},{"ApiKey":[]}],"summary":"Update key","tags":["keys"]}},"/v2/spaces/{space_id}/keys/{id}/rotate":{"post":{"consumes":["application/json"],"description":"Generates a new secret for an existing key. The key id,\npermissions and tags are preserved; only the secret changes.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"type":"string"},{"description":"Key ID","in":"path","name":"id","required":true,"type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/key.CreateKeyResponse"}},"400":{"description":"Bad Request","schema":{"type":"plain"}},"401":{"description":"Unauthorized","schema":{"type":"plain"}},"403":{"description":"Forbidden","schema":{"type":"plain"}},"404":{"description":"Not Found","schema":{"type":"plain"}}},"security":[{"Bearer":[]},{"ApiKey":[]}],"summary":"Rotate a key secret","tags":["keys"]}},"/v2/spaces/{space_id}/messages":{"get":{"consumes":["application/json"],"description":"Get array of all messages","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"type":"string"},{"description":"Device ID","format":"uuid","in":"query","name":"device_id","type":"string"},{"description":"Tag ID","format":"uuid","in":"query","name":"tag_id","type":"string"},{"default":20,"description":"The numbers of items to return","in":"query","maximum":1000,"minimum":1,"name":"limit","type":"integer"},{"description":"Last item ID from previous response","in":"query","name":"offset","type":"string"},{"description":"Link type","in":"query","name":"direction","type":"string"},{"collectionFormat":"multi","description":"Message types; type=a,b (one plain parameter) or type=a\u0026type=b is accepted too, but do not mix it with type[]","in":"query","items":{"enum":["data","stats","session","config","encoder","decoder","shell","firmware"],"type":"string"},"name":"type[]","type":"array"},{"description":"After time (default 24 hours ago) in UTC format (YYYY-mm-ddTHH:MM:SS) or RFC3339","format":"date-time","in":"query","name":"after","type":"string"},{"description":"Before time (default now) in UTC format (YYYY-mm-ddTHH:MM:SS) or RFC3339","format":"date-time","in":"query","name":"before","type":"string"},{"collectionFormat":"multi","description":"Leave these fields out of each message; omit=a,b (one plain parameter) or omit=a\u0026omit=b is accepted too, but do not mix it with omit[]","in":"query","items":{"enum":["raw","body"],"type":"string"},"name":"omit[]","type":"array"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/message.Message"},"type":"array"}},"400":{"description":"Bad Request","schema":{"type":"plain"}},"401":{"description":"Unauthorized","schema":{"type":"plain"}},"403":{"description":"Forbidden","schema":{"type":"plain"}}},"security":[{"Bearer":[]},{"ApiKey":[]}],"summary":"Get all messages","tags":["messages"]},"post":{"consumes":["application/json"],"description":"Add a new downlink message","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"type":"string"},{"description":"Downlink message","in":"body","name":"request","required":true,"schema":{"$ref":"#/definitions/message.DownlinkMessage"}}],"produces":["application/json"],"responses":{"201":{"description":"Created","schema":{"$ref":"#/definitions/message.Message"}},"400":{"description":"Bad Request","schema":{"type":"plain"}},"401":{"description":"Unauthorized","schema":{"type":"plain"}},"403":{"description":"Forbidden","schema":{"type":"plain"}}},"security":[{"Bearer":[]},{"ApiKey":[]}],"summary":"Add a new downlink message","tags":["messages"]}},"/v2/spaces/{space_id}/messages/{id}":{"get":{"consumes":["application/json"],"description":"Get a message based on a unique ID","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"type":"string"},{"description":"Message ID","in":"path","name":"id","required":true,"type":"string"},{"collectionFormat":"multi","description":"Leave these fields out of each message; omit=a,b (one plain parameter) or omit=a\u0026omit=b is accepted too, but do not mix it with omit[]","in":"query","items":{"enum":["raw","body"],"type":"string"},"name":"omit[]","type":"array"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/message.Message"}},"400":{"description":"Bad Request","schema":{"type":"plain"}},"401":{"description":"Unauthorized","schema":{"type":"plain"}},"403":{"description":"Forbidden","schema":{"type":"plain"}},"404":{"description":"Not Found","schema":{"type":"plain"}}},"security":[{"Bearer":[]},{"ApiKey":[]}],"summary":"Get single message","tags":["messages"]},"put":{"consumes":["application/json"],"description":"Update a message","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"type":"string"},{"description":"Message ID","in":"path","name":"id","required":true,"type":"string"},{"description":"update message","in":"body","name":"request","required":true,"schema":{"$ref":"#/definitions/message.UpdateMessage"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/message.Message"}},"400":{"description":"Bad Request","schema":{"type":"plain"}},"401":{"description":"Unauthorized","schema":{"type":"plain"}},"403":{"description":"Forbidden","schema":{"type":"plain"}}},"security":[{"Bearer":[]},{"ApiKey":[]}],"summary":"Update a message","tags":["messages"]}},"/v2/spaces/{space_id}/messages/{id}/events":{"get":{"consumes":["application/json"],"description":"Get all events for a message","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"type":"string"},{"description":"Message ID","in":"path","name":"id","required":true,"type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/message.Event"},"type":"array"}},"400":{"description":"Bad Request","schema":{"type":"plain"}},"401":{"description":"Unauthorized","schema":{"type":"plain"}},"403":{"description":"Forbidden","schema":{"type":"plain"}}},"security":[{"Bearer":[]},{"ApiKey":[]}],"summary":"Get all events for a message","tags":["messages"]}},"/v2/spaces/{space_id}/stream":{"get":{"description":"Server-sent events, one connection per view. `event: message` carries a message as GET messages/{id} returns it, when it appears or changes its delivery state, with `\"op\": \"create\"` or `\"op\": \"update\"` and `\"changed\"`, the names of the fields the change set; a name in `changed` may be absent from the item (the field became null, or omit[] leaves it out). The content is the state when the stream read it, at least as new as the change; `op` has no order across servers (an update may come before its create), so apply items as an upsert by id. With `kind[]=event`, `event: event` carries a stored event as GET devices/{id}/events lists it; a key limited to tags gets the events of its devices and never connector events. `omit[]` leaves out raw and body of messages and body of events, as on GET messages. `event: resync` means items may have been missed because of a server-side failure; reload what is displayed. `event: close` with {\"reason\"} ends the stream: lagged (the client did not keep up), shutdown, auth (the credentials expired or were revoked; renew them); reconnect, then reload. A client too slow to take a delivery in time, or a broken connection, ends without a close item: the connection just ends; reconnect the same way. A comment line every 25 s keeps proxies from closing the stream. Nothing is replayed: open the stream, wait for the first comment line (`: ok`), then load the current state through the regular API; whatever changes after that arrives on the stream. Do the same after every reconnect. The credentials are checked again every 30 s; an expired or revoked one ends the stream within a minute. Use HTTP/2 to the API: browsers allow only 6 HTTP/1.1 connections per origin.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"type":"string"},{"collectionFormat":"multi","description":"Only these devices, at most 100; leaves out connector events. device_id=a,b (one plain parameter) or device_id=a\u0026device_id=b is accepted too, but do not mix it with device_id[].","in":"query","items":{"type":"string"},"name":"device_id[]","type":"array"},{"collectionFormat":"multi","description":"Only these message types; events are not filtered by type. type=a,b (one plain parameter) or type=a\u0026type=b is accepted too, but do not mix it with type[].","in":"query","items":{"enum":["data","stats","session","config","encoder","decoder","shell","firmware"],"type":"string"},"name":"type[]","type":"array"},{"collectionFormat":"multi","description":"What to stream: message (the default), event, or both. A key limited to tags gets the events of its devices and never connector events. kind=a,b (one plain parameter) or kind=a\u0026kind=b is accepted too, but do not mix it with kind[].","in":"query","items":{"enum":["message","event"],"type":"string"},"name":"kind[]","type":"array"},{"collectionFormat":"multi","description":"Leave these fields out of each item: raw (messages), body (messages and events). omit=a,b (one plain parameter) or omit=a\u0026omit=b is accepted too, but do not mix it with omit[].","in":"query","items":{"enum":["raw","body"],"type":"string"},"name":"omit[]","type":"array"}],"produces":["text/event-stream"],"responses":{"200":{"description":"text/event-stream","schema":{"type":"string"}},"400":{"description":"Bad Request","schema":{"type":"plain"}},"401":{"description":"Unauthorized","schema":{"type":"plain"}},"403":{"description":"Forbidden","schema":{"type":"plain"}},"503":{"description":"Service Unavailable","schema":{"type":"plain"}}},"security":[{"Bearer":[]},{"ApiKey":[]}],"summary":"Stream of messages and events of a space","tags":["messages"]}},"/v2/spaces/{space_id}/tags":{"get":{"consumes":["application/json"],"description":"Get array of all tags","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"type":"string"},{"default":20,"description":"The numbers of items to return","in":"query","maximum":1000,"minimum":1,"name":"limit","type":"integer"},{"description":"Last item ID from previous response","in":"query","name":"offset","type":"string"},{"description":"Filter by tag IDs","in":"query","name":"ids[]","type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/tag.Tag"},"type":"array"}},"400":{"description":"Bad Request","schema":{"type":"plain"}},"401":{"description":"Unauthorized","schema":{"type":"plain"}},"403":{"description":"Forbidden","schema":{"type":"plain"}}},"security":[{"Bearer":[]},{"ApiKey":[]}],"summary":"Get all tags","tags":["tags"]},"post":{"consumes":["application/json"],"description":"Creates new tag with given values","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"type":"string"},{"description":"Tag data","in":"body","name":"request","required":true,"schema":{"$ref":"#/definitions/tag.CreateTag"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/tag.Tag"}},"400":{"description":"Bad Request","schema":{"type":"plain"}},"401":{"description":"Unauthorized","schema":{"type":"plain"}},"403":{"description":"Forbidden","schema":{"type":"plain"}},"409":{"description":"Conflict","schema":{"type":"plain"}}},"security":[{"Bearer":[]},{"ApiKey":[]}],"summary":"Create a new tag","tags":["tags"]}},"/v2/spaces/{space_id}/tags/{id}":{"delete":{"consumes":["application/json"],"description":"Deletes existing tag. Use force query parameter with tag name to delete a tag that is in use.","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"type":"string"},{"description":"Tag ID","in":"path","name":"id","required":true,"type":"string"},{"description":"Tag name to confirm force deletion","in":"query","name":"force","type":"string"}],"produces":["application/json"],"responses":{"204":{"description":"No Content","schema":{"type":"string"}},"400":{"description":"Bad Request","schema":{"type":"plain"}},"401":{"description":"Unauthorized","schema":{"type":"plain"}},"403":{"description":"Forbidden","schema":{"type":"plain"}},"404":{"description":"Not Found","schema":{"type":"plain"}},"409":{"description":"Conflict","schema":{"type":"plain"}}},"security":[{"Bearer":[]},{"ApiKey":[]}],"summary":"Delete a tag","tags":["tags"]},"get":{"consumes":["application/json"],"description":"Get a tag based on a unique ID","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"type":"string"},{"description":"Tag ID","in":"path","name":"id","required":true,"type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/tag.Tag"}},"400":{"description":"Bad Request","schema":{"type":"plain"}},"401":{"description":"Unauthorized","schema":{"type":"plain"}},"403":{"description":"Forbidden","schema":{"type":"plain"}},"404":{"description":"Not Found","schema":{"type":"plain"}}},"security":[{"Bearer":[]},{"ApiKey":[]}],"summary":"Get single tag","tags":["tags"]},"put":{"consumes":["application/json"],"description":"Updates existing tag with given values","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"type":"string"},{"description":"Tag ID","in":"path","name":"id","required":true,"type":"string"},{"description":"Tag data","in":"body","name":"request","required":true,"schema":{"$ref":"#/definitions/tag.UpdateTag"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/tag.Tag"}},"400":{"description":"Bad Request","schema":{"type":"plain"}},"401":{"description":"Unauthorized","schema":{"type":"plain"}},"403":{"description":"Forbidden","schema":{"type":"plain"}},"404":{"description":"Not Found","schema":{"type":"plain"}}},"security":[],"summary":"Update a tag","tags":["tags"]}},"/v2/spaces/{space_id}/users":{"get":{"consumes":["application/json"],"description":"Get array of all users","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"type":"string"},{"default":20,"description":"The numbers of items to return","in":"query","maximum":100,"minimum":1,"name":"limit","type":"integer"},{"default":0,"description":"The number of items to skip before starting to collect the result set","in":"query","minimum":0,"name":"offset","type":"integer"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/SpaceUser"},"type":"array"}},"400":{"description":"Bad Request","schema":{"type":"plain"}},"401":{"description":"Unauthorized","schema":{"type":"plain"}},"403":{"description":"Forbidden","schema":{"type":"plain"}}},"security":[{"Bearer":[]},{"ApiKey":[]}],"summary":"Get all users","tags":["users"]}},"/v2/spaces/{space_id}/users/count":{"get":{"consumes":["application/json"],"description":"Get count of users","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"type":"string"},{"description":"Email, case insensitive","in":"query","maxLength":256,"minLength":3,"name":"email","type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"Count of users","schema":{"type":"integer"}},"400":{"description":"Bad Request","schema":{"type":"plain"}},"401":{"description":"Unauthorized","schema":{"type":"plain"}},"403":{"description":"Forbidden","schema":{"type":"plain"}}},"security":[{"Bearer":[]},{"ApiKey":[]}],"summary":"Get users count","tags":["users"]}},"/v2/spaces/{space_id}/users/invite":{"post":{"consumes":["application/json"],"description":"Invite new user with given values","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"type":"string"},{"description":"User data","in":"body","name":"request","required":true,"schema":{"$ref":"#/definitions/user.InviteUser"}}],"produces":["application/json"],"responses":{"201":{"description":"Created","schema":{"$ref":"#/definitions/SpaceUser"}},"400":{"description":"Bad Request","schema":{"type":"plain"}},"401":{"description":"Unauthorized","schema":{"type":"plain"}},"403":{"description":"Forbidden","schema":{"type":"plain"}}},"security":[{"Bearer":[]},{"ApiKey":[]}],"summary":"Invite a new user","tags":["users"]}},"/v2/spaces/{space_id}/users/{id}":{"delete":{"consumes":["application/json"],"description":"Deletes existing user","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"type":"string"},{"description":"User ID","in":"path","name":"id","required":true,"type":"string"}],"produces":["application/json"],"responses":{"204":{"description":"No Content","schema":{"type":"string"}},"400":{"description":"Bad Request","schema":{"type":"plain"}},"401":{"description":"Unauthorized","schema":{"type":"plain"}},"403":{"description":"Forbidden","schema":{"type":"plain"}},"404":{"description":"Not Found","schema":{"type":"plain"}}},"security":[{"Bearer":[]},{"ApiKey":[]}],"summary":"Delete a user","tags":["users"]},"get":{"consumes":["application/json"],"description":"Get a user based on a unique ID","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"type":"string"},{"description":"User ID","in":"path","name":"id","required":true,"type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/SpaceUser"}},"400":{"description":"Bad Request","schema":{"type":"plain"}},"401":{"description":"Unauthorized","schema":{"type":"plain"}},"403":{"description":"Forbidden","schema":{"type":"plain"}},"404":{"description":"Not Found","schema":{"type":"plain"}}},"security":[{"Bearer":[]},{"ApiKey":[]}],"summary":"Get single user","tags":["users"]},"put":{"consumes":["application/json"],"description":"Updates existing user with given values","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"type":"string"},{"description":"User ID","in":"path","name":"id","required":true,"type":"string"},{"description":"User data","in":"body","name":"request","required":true,"schema":{"$ref":"#/definitions/SpaceUpdateUser"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/SpaceUser"}},"400":{"description":"Bad Request","schema":{"type":"plain"}},"401":{"description":"Unauthorized","schema":{"type":"plain"}},"403":{"description":"Forbidden","schema":{"type":"plain"}},"404":{"description":"Not Found","schema":{"type":"plain"}}},"security":[{"Bearer":[]},{"ApiKey":[]}],"summary":"Update a user","tags":["users"]}},"/v2/spaces/{space_id}/variables":{"get":{"consumes":["application/json"],"description":"Get array of all variables","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"type":"string"},{"description":"Device ID, case insensitive","in":"query","name":"device_id","type":"string"},{"description":"Name, case insensitive","in":"query","maxLength":32,"minLength":3,"name":"name","type":"string"},{"description":"Comment","in":"query","maxLength":500,"minLength":3,"name":"comment","type":"string"},{"description":"Environment","in":"query","minLength":3,"name":"environment","type":"string"},{"description":"Secure","in":"query","name":"secure","type":"boolean"},{"default":100,"description":"The numbers of items to return","in":"query","maximum":100,"minimum":1,"name":"limit","type":"integer"},{"description":"The number of items to skip before starting to collect the result set","in":"query","name":"offset","type":"string"},{"description":"Sort by field","enum":["\"name\"","\"created_at\"","\"updated_at\""],"in":"query","name":"sort_by","type":"string"},{"description":"Order by field","enum":["\"asc\"","\"desc\""],"in":"query","name":"order_by","type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/variable.Variable"},"type":"array"}},"400":{"description":"Bad Request","schema":{"type":"plain"}},"401":{"description":"Unauthorized","schema":{"type":"plain"}},"403":{"description":"Forbidden","schema":{"type":"plain"}}},"security":[{"Bearer":[]},{"ApiKey":[]}],"summary":"Get all variables","tags":["variables"]},"post":{"consumes":["application/json"],"description":"Creates new variables with given values","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"type":"string"},{"description":"variable data","in":"body","name":"request","required":true,"schema":{"$ref":"#/definitions/variable.CreateVariable"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/variable.Variable"}},"400":{"description":"Bad Request","schema":{"type":"plain"}},"401":{"description":"Unauthorized","schema":{"type":"plain"}},"403":{"description":"Forbidden","schema":{"type":"plain"}},"409":{"description":"Conflict","schema":{"type":"plain"}}},"security":[{"Bearer":[]},{"ApiKey":[]}],"summary":"Create a new variables","tags":["variables"]}},"/v2/spaces/{space_id}/variables/count":{"get":{"consumes":["application/json"],"description":"Get count of variables","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"type":"string"},{"description":"Device ID, case insensitive","in":"query","name":"device_id","type":"string"},{"description":"Name, case insensitive","in":"query","maxLength":32,"minLength":3,"name":"name","type":"string"},{"description":"Comment","in":"query","maxLength":500,"minLength":3,"name":"comment","type":"string"},{"description":"Environment","in":"query","minLength":3,"name":"environment","type":"string"},{"description":"Secure","in":"query","name":"secure","type":"boolean"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/variable.Variable"},"type":"array"}},"400":{"description":"Bad Request","schema":{"type":"plain"}},"401":{"description":"Unauthorized","schema":{"type":"plain"}},"403":{"description":"Forbidden","schema":{"type":"plain"}}},"security":[{"Bearer":[]},{"ApiKey":[]}],"summary":"Get variables count","tags":["variables"]}},"/v2/spaces/{space_id}/variables/{id}":{"delete":{"consumes":["application/json"],"description":"Delete variable by ID","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"type":"string"},{"description":"Variable ID","in":"path","name":"id","required":true,"type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/variable.Variable"}},"400":{"description":"Bad Request","schema":{"type":"plain"}},"401":{"description":"Unauthorized","schema":{"type":"plain"}},"403":{"description":"Forbidden","schema":{"type":"plain"}},"404":{"description":"Not Found","schema":{"type":"plain"}},"409":{"description":"Conflict","schema":{"type":"plain"}}},"security":[{"Bearer":[]},{"ApiKey":[]}],"summary":"Delete variable","tags":["variables"]},"get":{"consumes":["application/json"],"description":"Get variable by ID","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"type":"string"},{"description":"Variable ID","in":"path","name":"id","required":true,"type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/variable.Variable"}},"400":{"description":"Bad Request","schema":{"type":"plain"}},"401":{"description":"Unauthorized","schema":{"type":"plain"}},"403":{"description":"Forbidden","schema":{"type":"plain"}},"404":{"description":"Not Found","schema":{"type":"plain"}}},"security":[{"Bearer":[]},{"ApiKey":[]}],"summary":"Get variable by ID","tags":["variables"]},"put":{"consumes":["application/json"],"description":"Update variable by ID","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"type":"string"},{"description":"Variable ID","in":"path","name":"id","required":true,"type":"string"},{"description":"variable data","in":"body","name":"request","required":true,"schema":{"$ref":"#/definitions/variable.UpdateVariable"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/variable.Variable"}},"400":{"description":"Bad Request","schema":{"type":"plain"}},"401":{"description":"Unauthorized","schema":{"type":"plain"}},"403":{"description":"Forbidden","schema":{"type":"plain"}},"404":{"description":"Not Found","schema":{"type":"plain"}},"409":{"description":"Conflict","schema":{"type":"plain"}}},"security":[{"Bearer":[]},{"ApiKey":[]}],"summary":"Update variable","tags":["variables"]}},"/v2/spaces/{space_id}/variables/{id}/lock":{"put":{"consumes":["application/json"],"description":"Lock variable by ID","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"type":"string"},{"description":"Variable ID","in":"path","name":"id","required":true,"type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/variable.Variable"}},"400":{"description":"Bad Request","schema":{"type":"plain"}},"401":{"description":"Unauthorized","schema":{"type":"plain"}},"403":{"description":"Forbidden","schema":{"type":"plain"}},"404":{"description":"Not Found","schema":{"type":"plain"}},"409":{"description":"Conflict","schema":{"type":"plain"}}},"security":[{"Bearer":[]},{"ApiKey":[]}],"summary":"Lock variable","tags":["variables"]}},"/v2/spaces/{space_id}/variables/{id}/unlock":{"put":{"consumes":["application/json"],"description":"Unlock variable by ID","parameters":[{"description":"Space ID","in":"path","name":"space_id","required":true,"type":"string"},{"description":"Variable ID","in":"path","name":"id","required":true,"type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/variable.Variable"}},"400":{"description":"Bad Request","schema":{"type":"plain"}},"401":{"description":"Unauthorized","schema":{"type":"plain"}},"403":{"description":"Forbidden","schema":{"type":"plain"}},"404":{"description":"Not Found","schema":{"type":"plain"}},"409":{"description":"Conflict","schema":{"type":"plain"}}},"security":[{"Bearer":[]},{"ApiKey":[]}],"summary":"Unlock variable","tags":["variables"]}}},"schemes":[],"securityDefinitions":{"ApiKey":{"description":"\"Use Api key for working with API\"","in":"header","name":"X-API-KEY","type":"apiKey"},"Bearer":{"description":"Type \"Bearer\" followed by a space and JWT token.","in":"header","name":"Authorization","type":"apiKey"}},"swagger":"2.0"}