{"components":{"responses":{"unprocessable_entity":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Unprocessable Entity"}},"schemas":{"CACertificate":{"example":{"description":"Example CA","jitp":{"description":"Production","product_name":"ExampleProduct","tags":["prod"]},"not_after":"2050-04-20T00:33:09Z","not_before":"2025-04-20T00:28:09Z","serial":"4016688295714810857"},"properties":{"description":{"pattern":"[a-zA-Z][a-zA-Z0-9_]+","type":"string"},"inserted_at":{"description":"Creation timestamp","format":"date-time","type":"string"},"jitp":{"properties":{"description":{"type":"string"},"product_name":{"type":"string"},"tags":{"items":{"type":"string"},"type":"array"}},"type":"object"},"not_after":{"description":"Certificate expiration timestamp","format":"date-time","type":"string"},"not_before":{"description":"Certificate valid from timestamp","format":"date-time","type":"string"},"serial":{"type":"string"},"updated_at":{"description":"Last updated timestamp","format":"date-time","type":"string"}},"title":"CACertificate","type":"object"},"CACertificateCreationRequest":{"description":"POST body for creating a CA Certificate","example":{"cert":"base64 encoded certificate","description":"Example CA","jitp":{"description":"Production","product_id":33438,"tags":["prod"]},"verification_cert":"base64 encoded verification certificate"},"properties":{"cert":{"type":"string"},"description":{"type":"string"},"jitp":{"properties":{"description":{"type":"string"},"product_id":{"type":"integer"},"tags":{"items":{"type":"string"},"type":"array"}},"type":"object"},"verification_cert":{"type":"string"}},"required":["cert","verification_cert"],"title":"CACertificateCreationRequest","type":"object"},"CACertificateListResponse":{"description":"Response schema for multiple CA Certificates","example":{"data":[{"description":"Example CA","jitp":{"description":"Staging","product_name":"StagingProduct","tags":["staging"]},"not_after":"2050-04-20T00:33:09Z","not_before":"2025-04-20T00:28:09Z","serial":"4016688295714810857"},{"description":"Another Example CA","jitp":{"description":"QA","product_name":"QAProduct","tags":["qa"]},"not_after":"2050-04-20T00:33:09Z","not_before":"2025-04-20T00:28:09Z","serial":"8033376591429621714"}]},"properties":{"data":{"description":"The CA Certificate details","items":{"$ref":"#/components/schemas/CACertificate"},"type":"array"}},"title":"CACertificateListResponse","type":"object"},"CACertificateShowResponse":{"description":"Response schema for a single CA Certificate","example":{"data":{"description":"Example CA","jitp":{"description":"Production","product_name":"ExampleProduct","tags":["prod"]},"not_after":"2050-04-20T00:33:09Z","not_before":"2025-04-20T00:28:09Z","serial":"4016688295714810857"}},"properties":{"data":{"$ref":"#/components/schemas/CACertificate"}},"title":"CACertificateShowResponse","type":"object"},"CACertificateVerificationToken":{"example":{"verification_token":"abc.doerayme.boop_snoot"},"properties":{"verification_token":{"type":"string"}},"title":"CACertificateVerificationToken","type":"object"},"CACertificateVerificationTokenResponse":{"description":"Response schema for requesting a CA Certificate verification token","example":{"data":{"verification_token":"abc.doerayme.boop_snoot"}},"properties":{"data":{"$ref":"#/components/schemas/CACertificateVerificationToken"}},"title":"CACertificateVerificationTokenResponse","type":"object"},"CLISession":{"description":"A new CLI auth exchange session","example":{"confirmation_code":"312812","token":"218ed524-eb74-47d7-aedc-11e386961b72","url":"https://manage.nervescloud.com/auth/cli/218ed524-eb74-47d7-aedc-11e386961b72"},"properties":{"confirmation_code":{"description":"Confirmation code to help verify a valid auth exchange","type":"string"},"token":{"description":"Auth token","type":"string"},"url":{"description":"URL to complete the auth exchange","type":"string"}},"required":["token","url"],"title":"CLISession","type":"object"},"CLISessionStatus":{"description":"CLI auth exchange session status","example":{"status":"ready","user_token":"nhu_aaabbbccc123"},"properties":{"status":{"description":"status of the auth exchange","type":"string"},"user_token":{"description":"user auth token","type":"string"}},"required":["status"],"title":"CLISessionStatus","type":"object"},"ChangesetErrorResponse":{"description":"Validation error response","example":{"errors":{"identifier":["can't be blank"]}},"properties":{"errors":{"additionalProperties":{"items":{"type":"string"},"type":"array"},"type":"object"}},"title":"ChangesetErrorResponse","type":"object"},"Conditions":{"example":{"tag_operator":"and","tags":["beta"],"version":">= 1.0.0"},"properties":{"tag_operator":{"default":"and","description":"How device tags are matched: \"and\" (require all) or \"or\" (allow any)","enum":["and","or"],"type":"string"},"tags":{"items":{"type":"string"},"type":"array"},"version":{"type":"string"}},"title":"Conditions","type":"object"},"CurrentRelease":{"example":{"firmware":{"architecture":"arm","platform":"rpi0","uuid":"d9f8c63a-1234-5678-abcd-ef0123456789","version":"1.0.0"},"inserted_at":"2024-01-01T00:00:00Z","number":3,"updated_at":"2024-01-01T00:00:00Z"},"properties":{"firmware":{"$ref":"#/components/schemas/Firmware"},"inserted_at":{"format":"date-time","type":"string"},"number":{"type":"integer"},"updated_at":{"format":"date-time","type":"string"}},"title":"CurrentRelease","type":"object"},"DeploymentGroup":{"example":{"conditions":{"tags":["beta"],"version":">= 1.0.0"},"current_release":{"firmware":{"architecture":"arm","platform":"rpi0","uuid":"d9f8c63a-1234-5678-abcd-ef0123456789","version":"1.0.0"},"inserted_at":"2024-01-01T00:00:00Z","number":3,"updated_at":"2024-01-01T00:00:00Z"},"delta_updatable":false,"device_count":42,"firmware_uuid":"d9f8c63a-1234-5678-abcd-ef0123456789","is_active":true,"name":"production","notes":"Rolled out for the summer campaign hardware batch","releases_count":3,"state":"on"},"properties":{"conditions":{"$ref":"#/components/schemas/Conditions"},"current_release":{"$ref":"#/components/schemas/CurrentRelease"},"delta_updatable":{"type":"boolean"},"device_count":{"type":"integer"},"firmware_uuid":{"type":"string"},"is_active":{"type":"boolean"},"name":{"type":"string"},"notes":{"description":"Free-text notes describing why this deployment group exists","nullable":true,"type":"string"},"releases_count":{"type":"integer"},"state":{"enum":["on","off"],"type":"string"}},"title":"DeploymentGroup","type":"object"},"DeploymentGroupCreationRequest":{"description":"POST body for creating a Deployment Group","example":{"conditions":{"tags":["prod"],"version":">= 1.0.0"},"firmware":"d9f8c63a-1234-5678-abcd-ef0123456789","name":"production","notes":"Rolled out for the summer campaign hardware batch","state":"on"},"properties":{"conditions":{"$ref":"#/components/schemas/Conditions"},"delta_updatable":{"type":"boolean"},"firmware":{"description":"Firmware UUID","type":"string"},"name":{"type":"string"},"notes":{"description":"Free-text notes describing why this deployment group is being created","type":"string"},"state":{"enum":["on","off"],"type":"string"}},"required":["name","firmware"],"title":"DeploymentGroupCreationRequest","type":"object"},"DeploymentGroupListResponse":{"description":"Response schema for multiple Deployment Groups","properties":{"data":{"items":{"$ref":"#/components/schemas/DeploymentGroup"},"type":"array"}},"title":"DeploymentGroupListResponse","type":"object"},"DeploymentGroupResponse":{"description":"Response schema for a single Deployment Group","properties":{"data":{"$ref":"#/components/schemas/DeploymentGroup"}},"title":"DeploymentGroupResponse","type":"object"},"DeploymentGroupUpdateRequest":{"description":"PUT body for updating a Deployment Group","example":{"deployment":{"conditions":{"tags":["prod"],"version":">= 1.0.0"},"notes":"Rolled out for the summer campaign hardware batch","state":"on"}},"properties":{"deployment":{"properties":{"conditions":{"$ref":"#/components/schemas/Conditions"},"delta_updatable":{"type":"boolean"},"firmware":{"description":"Firmware UUID","type":"string"},"notes":{"description":"Free-text notes describing why this deployment group exists","type":"string"},"state":{"enum":["on","off"],"type":"string"}},"type":"object"}},"title":"DeploymentGroupUpdateRequest","type":"object"},"Device":{"example":{"connection_status":"connected","deployment_group":{"firmware_uuid":"6fd2bbc8-52b8-4826-5c2a-189968d0de23","firmware_version":"1.2.3","is_active":true,"name":"Prod Deployment"},"description":"A great device","firmware_metadata":{"architecture":"arm","author":"","description":"Prod Firmware","fwup_version":"1.10.1","id":"3f2264c3-cc52-2ba9-b77d-e441f8bb91b6","misc":"extra comments","platform":"rpi5","product":"AmazingProduct","uuid":"6fd2bbc8-52b8-4826-5c2a-189968d0de23","vcs_identifier":"","version":"1.2.3"},"identifier":"abc123","last_communication":"2050-04-20T00:33:09Z","online":true,"org_name":"BigCompany","product_name":"AmazingProduct","tags":"prod, customerABC","updates_blocked_until":"2050-04-20T00:33:09Z","updates_enabled":true,"version":"1.2.3"},"properties":{"connection_status":{"enum":["connected","disconnected"],"type":"string"},"deployment_group":{"properties":{"firmware_uuid":{"type":"string"},"firmware_version":{"type":"string"},"is_active":{"type":"boolean"},"name":{"type":"string"}},"type":"object"},"description":{"type":"string"},"firmware_metadata":{"properties":{"architecture":{"type":"string"},"author":{"type":"string"},"description":{"type":"string"},"fwup_version":{"type":"string"},"id":{"type":"string"},"misc":{"type":"string"},"platform":{"type":"string"},"product":{"type":"string"},"uuid":{"type":"string"},"vcs_identifier":{"type":"string"},"version":{"type":"string"}},"type":"object"},"identifier":{"type":"string"},"last_communication":{"deprecated":true,"format":"date-time","type":"string"},"online":{"type":"boolean"},"org_name":{"type":"string"},"product_name":{"type":"string"},"tags":{"type":"string"},"update_mode":{"description":"How the device receives firmware. automatic: pushed by its deployment group. device_managed: the device asks for updates itself. off: neither, only a manual push.","enum":["off","automatic","device_managed"],"type":"string"},"updates_blocked_until":{"description":"Device penalty box expiration timestamp","format":"date-time","type":"string"},"updates_enabled":{"description":"Whether the device takes updates at all. False only when update_mode is off.","type":"boolean"},"version":{"type":"string"}},"title":"Device","type":"object"},"DeviceBulkImport":{"description":"POST body for bulk creating a list of Devices","example":["Please refer to the Microchip Trust and Go Manifest documentation"],"title":"DeviceBulkImport","type":"object"},"DeviceCertificate":{"example":{"not_after":"2052-12-15T21:00:00Z","not_before":"2022-12-15T20:00:00Z","serial":"123456789101112"},"properties":{"not_after":{"format":"date-time","type":"string"},"not_before":{"format":"date-time","type":"string"},"serial":{"type":"string"}},"title":"DeviceCertificate","type":"object"},"DeviceCertificateAuthRequest":{"description":"POST body for testing certificate auth for a Device","example":{"certificate":"Base64 encoded certificate"},"properties":{"certificate":{"type":"string"}},"required":["certificate"],"title":"DeviceCertificateAuthRequest","type":"object"},"DeviceCertificateCreateRequest":{"description":"POST body for creating a Certificate for a Device","example":{"cert":"[Base64 encoded certificate]=="},"properties":{"cert":{"description":"Base64 encoded certificate","type":"string"}},"required":["cert"],"title":"DeviceCertificateCreateRequest","type":"object"},"DeviceCertificateListResponse":{"description":"Device Certificate list response","example":{"data":[{"not_after":"2052-12-15T21:00:00Z","not_before":"2022-12-15T20:00:00Z","serial":"123456789101112"},{"not_after":"2052-12-15T21:00:00Z","not_before":"2022-12-15T20:00:00Z","serial":"123456789202122"}]},"properties":{"data":{"description":"The device certificates details","items":{"$ref":"#/components/schemas/DeviceCertificate"},"type":"array"}},"title":"DeviceCertificateListResponse","type":"object"},"DeviceCertificateShowResponse":{"description":"Device Certificate show response","example":{"data":{"not_after":"2052-12-15T21:00:00Z","not_before":"2022-12-15T20:00:00Z","serial":"123456789101112"}},"properties":{"data":{"$ref":"#/components/schemas/DeviceCertificate"}},"title":"DeviceCertificateShowResponse","type":"object"},"DeviceCodeRequest":{"description":"POST body for sending Elixir code to a Device's console","example":{"code":"NervesHub.version()"},"properties":{"code":{"description":"Elixir code to execute","type":"string"}},"required":["code"],"title":"DeviceCodeRequest","type":"object"},"DeviceCreationRequest":{"description":"POST body for creating a Device","example":{"device":{"deployment_group_id":1,"description":"Example Device","identifier":"abc123","tags":"prod, customerJNK","updates_enabled":false}},"properties":{"device":{"properties":{"deployment_group_id":{"type":"integer"},"description":{"type":"string"},"identifier":{"type":"string"},"tags":{"type":"string"},"updates_enabled":{"type":"boolean"}},"required":["identifier"]}},"required":["device"],"title":"DeviceCreationRequest","type":"object"},"DeviceListResponse":{"description":"Response schema for multiple Devices","example":{"data":[{"connection_status":"connected","deployment_group":{"firmware_uuid":"6fd2bbc8-52b8-4826-5c2a-189968d0de23","firmware_version":"1.2.3","is_active":true,"name":"Prod Deployment"},"description":"A great device","firmware_metadata":{"architecture":"arm","author":"","description":"Prod Firmware","fwup_version":"1.10.1","id":"3f2264c3-cc52-2ba9-b77d-e441f8bb91b6","misc":"extra comments","platform":"rpi5","product":"AmazingProduct","uuid":"6fd2bbc8-52b8-4826-5c2a-189968d0de23","vcs_identifier":"","version":"1.2.3"},"identifier":"abc123","last_communication":"2050-04-20T00:33:09Z","online":true,"org_name":"BigCompany","product_name":"AmazingProduct","tags":"prod, customerABC","updates_blocked_until":"2050-04-20T00:33:09Z","updates_enabled":true,"version":"1.2.3"},{"connection_status":"disconnected","deployment_group":{"firmware_uuid":"6fd2bbc8-52b8-4826-5c2a-189968d0de23","firmware_version":"1.2.3","is_active":true,"name":"Prod Deployment"},"description":"Another great device","firmware_metadata":{"architecture":"arm","author":"","description":"Prod Firmware","fwup_version":"1.10.1","id":"3f2264c3-cc52-2ba9-b77d-e441f8bb91b6","misc":"extra comments","platform":"rpi5","product":"AmazingProduct","uuid":"6fd2bbc8-52b8-4826-5c2a-189968d0de23","vcs_identifier":"","version":"1.2.3"},"identifier":"def456","last_communication":"2050-04-20T00:33:09Z","online":false,"org_name":"BigCompany","product_name":"AmazingProduct","tags":"prod, customerDEF","updates_blocked_until":"2050-04-20T00:33:09Z","updates_enabled":true,"version":"1.2.3"}],"pagination":{"page_number":1,"page_size":10,"total_entries":2,"total_pages":1}},"properties":{"data":{"description":"The Device schema","items":{"$ref":"#/components/schemas/Device"},"type":"array"},"pagination":{"properties":{"page_number":{"type":"integer"},"page_size":{"type":"integer"},"total_entries":{"type":"integer"},"total_pages":{"type":"integer"}},"type":"object"}},"title":"DeviceListResponse","type":"object"},"DeviceLogLine":{"description":"A log line a device sent over the logging extension","example":{"level":"error","message":"Failed to reach the sensor bus","meta":{"file":"lib/thermostat/sensors.ex","line":"42"},"timestamp":"2026-08-16T09:14:00.123456Z"},"properties":{"level":{"description":"The level the device logged at. Usually an Elixir Logger level — debug, info, notice, warning, error, critical, alert, emergency — but a device can log at any level it likes","example":"error","type":"string"},"message":{"description":"The logged message","type":"string"},"meta":{"additionalProperties":{"type":"string"},"description":"The Logger metadata the device attached to the line, flattened to strings","type":"object"},"timestamp":{"description":"When the device logged the line, to microsecond precision","format":"date-time","type":"string"}},"title":"DeviceLogLine","type":"object"},"DeviceLogListResponse":{"description":"Device log list response","example":{"data":[{"level":"error","message":"Failed to reach the sensor bus","meta":{"file":"lib/thermostat/sensors.ex","line":"42"},"timestamp":"2026-08-16T09:14:00.123456Z"},{"level":"info","message":"Starting sensor poll","meta":{},"timestamp":"2026-08-16T09:13:59.998211Z"}]},"properties":{"data":{"description":"The matching log lines, newest first unless `order=asc` was given","items":{"$ref":"#/components/schemas/DeviceLogLine"},"type":"array"}},"title":"DeviceLogListResponse","type":"object"},"DeviceResponse":{"description":"Response schema for a single Device","example":{"data":{"connection_status":"connected","deployment_group":{"firmware_uuid":"6fd2bbc8-52b8-4826-5c2a-189968d0de23","firmware_version":"1.2.3","is_active":true,"name":"Prod Deployment"},"description":"A great device","firmware_metadata":{"architecture":"arm","author":"","description":"Prod Firmware","fwup_version":"1.10.1","id":"3f2264c3-cc52-2ba9-b77d-e441f8bb91b6","misc":"extra comments","platform":"rpi5","product":"AmazingProduct","uuid":"6fd2bbc8-52b8-4826-5c2a-189968d0de23","vcs_identifier":"","version":"1.2.3"},"identifier":"abc123","last_communication":"2050-04-20T00:33:09Z","online":true,"org_name":"BigCompany","product_name":"AmazingProduct","tags":"prod, customerABC","updates_blocked_until":"2050-04-20T00:33:09Z","updates_enabled":true,"version":"1.2.3"}},"properties":{"data":{"$ref":"#/components/schemas/Device"}},"title":"DeviceResponse","type":"object"},"DeviceUpdateRequest":{"description":"POST body for updating a Device","example":{"device":{"deployment_group_id":1,"description":"Example Device","tags":"prod, customerJNK","updates_enabled":false}},"properties":{"device":{"properties":{"deployment_group_id":{"type":"integer"},"description":{"type":"string"},"tags":{"type":"string"},"updates_enabled":{"type":"boolean"}}}},"title":"DeviceUpdateRequest","type":"object"},"DeviceUpgradeRequest":{"description":"POST body for upgrading a Device to a specific Firmware","example":{"uuid":"d9f8c63a-1234-5678-abcd-ef0123456789"},"properties":{"uuid":{"description":"Target firmware UUID","format":"uuid","type":"string"}},"required":["uuid"],"title":"DeviceUpgradeRequest","type":"object"},"ErrorResponse":{"description":"Error response","example":{"errors":{"detail":"Resource Not Found or Authorization Insufficient"}},"properties":{"errors":{"properties":{"detail":{"type":"string"}},"type":"object"}},"title":"ErrorResponse","type":"object"},"Firmware":{"example":{"architecture":"arm","author":"NervesHub","platform":"rpi0","product":"MyProduct","tool":"fwup","uuid":"d9f8c63a-1234-5678-abcd-ef0123456789","version":"1.0.0"},"properties":{"architecture":{"type":"string"},"author":{"type":"string"},"platform":{"type":"string"},"product":{"description":"Product name","type":"string"},"tool":{"description":"The update tool that handles this firmware, determined from the uploaded file","enum":["fwup","esp-idf"],"type":"string"},"uuid":{"format":"uuid","type":"string"},"version":{"type":"string"}},"title":"Firmware","type":"object"},"FirmwareListResponse":{"description":"Response schema for multiple Firmwares","example":{"data":[{"architecture":"arm","author":"NervesHub","platform":"rpi0","product":"MyProduct","uuid":"d9f8c63a-1234-5678-abcd-ef0123456789","version":"1.0.0"}]},"properties":{"data":{"description":"The Firmware details","items":{"$ref":"#/components/schemas/Firmware"},"type":"array"}},"title":"FirmwareListResponse","type":"object"},"FirmwareResponse":{"description":"Response schema for a single Firmware","example":{"data":{"architecture":"arm","author":"NervesHub","platform":"rpi0","product":"MyProduct","tool":"fwup","uuid":"d9f8c63a-1234-5678-abcd-ef0123456789","version":"1.0.0"}},"properties":{"data":{"$ref":"#/components/schemas/Firmware"}},"title":"FirmwareResponse","type":"object"},"FirmwareUploadErrorResponse":{"description":"Upload failure.\n\nChangeset failures (a duplicate UUID, say) are keyed by field. Failures\nraised before the changeset — an unrecognised format, a format this\nproduct does not accept, an unsigned image, a version that is not SemVer —\ncarry a single `detail` message instead.\n","example":{"errors":{"detail":"This ESP-IDF image is not signed. Sign it with `espsecure.py sign_data --version 2` and register the matching public key against your organization, or allow unsigned images in this product's settings."}},"oneOf":[{"$ref":"#/components/schemas/ChangesetErrorResponse"},{"$ref":"#/components/schemas/ErrorResponse"}],"title":"FirmwareUploadErrorResponse","type":"object"},"IrohEndpoint":{"description":"An iroh endpoint id registered to an organization","example":{"details":{},"identifier":"c8924b6c9b7a8528b1365ebec4b2e43b6edebef684f8521f12b8caaf6e1b2302","inserted_at":"2026-08-14T11:02:31Z","instance":"default","last_reported_at":"2026-08-16T09:14:00Z","owner":{"device_identifier":"example_device","type":"device","user_email":null,"user_name":null},"service":"iroh","source":"device_reported","updated_at":"2026-08-16T09:14:00Z"},"properties":{"details":{"additionalProperties":true,"type":"object"},"identifier":{"description":"The endpoint id — 64 hex characters","type":"string"},"inserted_at":{"format":"date-time","type":"string"},"instance":{"description":"Which endpoint of iroh this is. `default` for anything running a single one","type":"string"},"last_reported_at":{"format":"date-time","nullable":true,"type":"string"},"owner":{"$ref":"#/components/schemas/IrohEndpointOwner"},"service":{"enum":["iroh"],"type":"string"},"source":{"description":"`device_reported` means a device proved this key; `operator` means it was registered by hand","enum":["device_reported","operator"],"type":"string"},"updated_at":{"format":"date-time","type":"string"}},"title":"IrohEndpoint","type":"object"},"IrohEndpointCreateRequest":{"description":"POST body for registering an Iroh Endpoint against an Organization","example":{"identifier":"c8924b6c9b7a8528b1365ebec4b2e43b6edebef684f8521f12b8caaf6e1b2302","instance":"console","user_email":"member@example.com"},"properties":{"details":{"additionalProperties":true,"description":"Anything worth recording alongside the key. Non-authoritative, and never a secret","type":"object"},"identifier":{"description":"The endpoint id — the public key the endpoint proves it holds, not a ticket or a relay url","type":"string"},"instance":{"default":"default","description":"Names which endpoint this is, for something running more than one. Omit for a single one","type":"string"},"user_email":{"description":"Attach the endpoint to this member of the organization — their laptop, say. Omit for one the organization holds directly, or for a device that will claim it on its next connection. The address must belong to a member","nullable":true,"type":"string"}},"required":["identifier"],"title":"IrohEndpointCreateRequest","type":"object"},"IrohEndpointListResponse":{"description":"Iroh Endpoint list response","example":{"data":[{"details":{},"identifier":"c8924b6c9b7a8528b1365ebec4b2e43b6edebef684f8521f12b8caaf6e1b2302","inserted_at":"2026-08-14T11:02:31Z","instance":"default","last_reported_at":"2026-08-16T09:14:00Z","owner":{"device_identifier":"example_device","type":"device","user_email":null,"user_name":null},"service":"iroh","source":"device_reported","updated_at":"2026-08-16T09:14:00Z"},{"details":{},"identifier":"5f691e39f55415be337b2e4cc0dd7291586ab7c4356bf32bab60f46fc78f95d5","inserted_at":"2026-08-15T08:41:12Z","instance":"default","last_reported_at":null,"owner":{"device_identifier":null,"type":"user","user_email":"member@example.com","user_name":"Alex Doe"},"service":"iroh","source":"operator","updated_at":"2026-08-15T08:41:12Z"}]},"properties":{"data":{"description":"The organization's iroh endpoint ids","items":{"$ref":"#/components/schemas/IrohEndpoint"},"type":"array"}},"title":"IrohEndpointListResponse","type":"object"},"IrohEndpointOwner":{"description":"What holds this endpoint id","example":{"device_identifier":"example_device","type":"device","user_email":null,"user_name":null},"properties":{"device_identifier":{"description":"Set when `type` is `device`","nullable":true,"type":"string"},"type":{"description":"`device` for one a device proved, `user` for a member's own machine, `none` for one the organization holds directly","enum":["device","user","none"],"type":"string"},"user_email":{"description":"Set when `type` is `user`","nullable":true,"type":"string"},"user_name":{"description":"Set when `type` is `user`","nullable":true,"type":"string"}},"title":"IrohEndpointOwner","type":"object"},"IrohEndpointShowResponse":{"description":"Iroh Endpoint show response","example":{"data":{"details":{},"identifier":"c8924b6c9b7a8528b1365ebec4b2e43b6edebef684f8521f12b8caaf6e1b2302","inserted_at":"2026-08-14T11:02:31Z","instance":"default","last_reported_at":"2026-08-16T09:14:00Z","owner":{"device_identifier":"example_device","type":"device","user_email":null,"user_name":null},"service":"iroh","source":"device_reported","updated_at":"2026-08-16T09:14:00Z"}},"properties":{"data":{"$ref":"#/components/schemas/IrohEndpoint"}},"title":"IrohEndpointShowResponse","type":"object"},"NetworkIdentity":{"description":"A key a device holds on a network NervesHub does not run","example":{"details":{"relay":"https://relay.example.com"},"identifier":"c8924b6c9b7a8528b1365ebec4b2e43b6edebef684f8521f12b8caaf6e1b2302","inserted_at":"2026-08-14T11:02:31Z","instance":"default","last_reported_at":"2026-08-16T09:14:00Z","service":"iroh","source":"device_reported","updated_at":"2026-08-16T09:14:00Z"},"properties":{"details":{"additionalProperties":true,"description":"Per-service and non-authoritative — relay urls, an assigned address. Never a secret","type":"object"},"identifier":{"description":"The value possession of which is proven — a public key, not a handle that can be reassigned","type":"string"},"inserted_at":{"format":"date-time","type":"string"},"instance":{"description":"Which endpoint of that protocol. `default` for anything running a single one","type":"string"},"last_reported_at":{"format":"date-time","nullable":true,"type":"string"},"service":{"description":"The protocol","enum":["iroh","netbird","tailscale","wireguard"],"type":"string"},"source":{"description":"Whether anything proved this key. `device_reported` means a device did; `operator` means it was typed in","enum":["device_reported","operator"],"type":"string"},"updated_at":{"format":"date-time","type":"string"}},"title":"NetworkIdentity","type":"object"},"NetworkIdentityListResponse":{"description":"Network Identity list response","example":{"data":[{"details":{"relay":"https://relay.example.com"},"identifier":"c8924b6c9b7a8528b1365ebec4b2e43b6edebef684f8521f12b8caaf6e1b2302","inserted_at":"2026-08-14T11:02:31Z","instance":"default","last_reported_at":"2026-08-16T09:14:00Z","service":"iroh","source":"device_reported","updated_at":"2026-08-16T09:14:00Z"},{"details":{},"identifier":"5f691e39f55415be337b2e4cc0dd7291586ab7c4356bf32bab60f46fc78f95d5","inserted_at":"2026-08-14T11:02:31Z","instance":"console","last_reported_at":"2026-08-16T09:14:00Z","service":"iroh","source":"device_reported","updated_at":"2026-08-16T09:14:00Z"}]},"properties":{"data":{"description":"The identities this device holds","items":{"$ref":"#/components/schemas/NetworkIdentity"},"type":"array"}},"title":"NetworkIdentityListResponse","type":"object"},"Org":{"example":{"inserted_at":"2024-01-01T00:00:00Z","name":"example_org","products":[{"name":"MyProduct"}],"updated_at":"2024-01-01T00:00:00Z"},"properties":{"inserted_at":{"format":"date-time","type":"string"},"name":{"type":"string"},"products":{"description":"Included when requested via ?include=products","items":{"$ref":"#/components/schemas/Product"},"nullable":true,"type":"array"},"updated_at":{"format":"date-time","type":"string"}},"title":"Org","type":"object"},"OrgListResponse":{"description":"Response schema for multiple Organizations","example":{"data":[{"inserted_at":"2024-01-01T00:00:00Z","name":"example_org","updated_at":"2024-01-01T00:00:00Z"}]},"properties":{"data":{"description":"The Organizations","items":{"$ref":"#/components/schemas/Org"},"type":"array"}},"title":"OrgListResponse","type":"object"},"OrgUser":{"example":{"email":"jane@person.com","name":"Jane Person","role":"admin"},"properties":{"email":{"type":"string"},"name":{"type":"string"},"role":{"enum":["admin","manage","view"],"type":"string"}},"title":"OrgUser","type":"object"},"OrgUserCreationRequest":{"description":"POST body for adding or inviting a user to an organization","example":{"email":"jane@person.com","role":"manage"},"properties":{"email":{"type":"string"},"role":{"enum":["admin","manage","view"],"type":"string"}},"required":["email","role"],"title":"OrgUserCreationRequest","type":"object"},"OrgUserListResponse":{"description":"Response schema for multiple Organization Users","example":{"data":[{"email":"jane@person.com","name":"Jane Person","role":"admin"},{"email":"jane@person.com","name":"Jane Person","role":"view"}]},"properties":{"data":{"description":"The Organization Users details","items":{"$ref":"#/components/schemas/OrgUser"},"type":"array"}},"title":"OrgUserListResponse","type":"object"},"OrgUserShowResponse":{"description":"Response schema for a single Organization User","example":{"data":{"email":"jane@person.com","name":"Jane Person","role":"admin"}},"properties":{"data":{"$ref":"#/components/schemas/OrgUser"}},"title":"OrgUserShowResponse","type":"object"},"OrgUserUpdateRequest":{"description":"POST body for updating a users organization membership","example":{"role":"manage"},"properties":{"role":{"enum":["admin","manage","view"],"type":"string"}},"required":["role"],"title":"OrgUserUpdateRequest","type":"object"},"Product":{"example":{"allow_unsigned_atomvm_firmware":false,"allow_unsigned_esp_idf_firmware":false,"allowed_update_tools":["fwup"],"name":"Example Product","require_unique_firmware_version":true},"properties":{"allow_unsigned_atomvm_firmware":{"description":"Accept AtomVM packbeam archives that carry no signature entry.\n\nNothing in the AtomVM toolchain signs by default, so a product built\nwithout `nh-avm` has no way to sign yet.\n\nThis excuses a missing signature and nothing else: an archive that\ndoes carry one is always verified against the organization's\nregistered signing keys.\n","type":"boolean"},"allow_unsigned_esp_idf_firmware":{"description":"Accept ESP-IDF images that carry no Secure Boot v2 signature block.\n\nThis excuses a missing signature and nothing else: an image that does\ncarry a signature is always verified against the organization's\nregistered signing keys.\n","type":"boolean"},"allowed_update_tools":{"description":"The firmware formats this product accepts. `fwup` is always present.\n\nA format also has to be enabled for the instance before a product can\nlist it — see the ESP-IDF support documentation.\n","items":{"enum":["fwup","esp-idf","atomvm"],"type":"string"},"type":"array"},"name":{"pattern":"[a-zA-Z][a-zA-Z0-9_]+","type":"string"},"require_unique_firmware_version":{"description":"Reject uploaded firmware whose version already exists for this product's platform and architecture.","type":"boolean"}},"title":"Product","type":"object"},"ProductCreationRequest":{"description":"POST body for creating a product","example":{"product":{"name":"ExampleProduct"}},"properties":{"product":{"properties":{"name":{"type":"string"}},"required":["name"]}},"required":["product"],"title":"ProductCreationRequest","type":"object"},"ProductListResponse":{"description":"Response schema for multiple products","example":{"data":[{"allow_unsigned_atomvm_firmware":false,"allow_unsigned_esp_idf_firmware":false,"allowed_update_tools":["fwup"],"name":"Example Product","require_unique_firmware_version":true},{"allow_unsigned_esp_idf_firmware":true,"allowed_update_tools":["fwup","esp-idf"],"name":"Another Example Product","require_unique_firmware_version":true}]},"properties":{"data":{"description":"The products details","items":{"$ref":"#/components/schemas/Product"},"type":"array"}},"title":"ProductListResponse","type":"object"},"ProductShowResponse":{"description":"Response schema for a single Product","example":{"data":{"allow_unsigned_atomvm_firmware":false,"allow_unsigned_esp_idf_firmware":false,"allowed_update_tools":["fwup"],"name":"Example Product","require_unique_firmware_version":true}},"properties":{"data":{"$ref":"#/components/schemas/Product"}},"title":"ProductShowResponse","type":"object"},"ProductUpdateRequest":{"description":"PUT body for updating a product's settings.\n\nEvery field is optional; only the ones sent are changed. A product cannot\nbe renamed here — its name is its identifier in every URL — and sending\nany field not listed below is an error rather than being ignored.\n","example":{"allow_unsigned_atomvm_firmware":true,"allowed_update_tools":["fwup","atomvm"]},"properties":{"allow_unsigned_atomvm_firmware":{"type":"boolean"},"allow_unsigned_esp_idf_firmware":{"type":"boolean"},"allowed_update_tools":{"items":{"enum":["fwup","esp-idf","atomvm"],"type":"string"},"type":"array"},"require_unique_firmware_version":{"type":"boolean"}},"title":"ProductUpdateRequest","type":"object"},"SigningKey":{"example":{"key":"abc123=","name":"CI","scheme":"ed25519"},"properties":{"key":{"type":"string"},"name":{"type":"string"},"scheme":{"description":"Signature scheme this key belongs to","enum":["ed25519","secure_boot_v2_rsa"],"type":"string"}},"title":"SigningKey","type":"object"},"SigningKeyCreationRequest":{"description":"POST body for adding a Signing Key to an Organization.\n\n`scheme` defaults to `ed25519` when omitted, which is what every key was\nbefore ESP-IDF support — so existing clients keep working unchanged.\n","example":{"key":"-----BEGIN PUBLIC KEY-----\nMIIBoj...\n-----END PUBLIC KEY-----\n","name":"ESP release","scheme":"secure_boot_v2_rsa"},"properties":{"key":{"type":"string"},"name":{"type":"string"},"scheme":{"description":"Signature scheme this key belongs to","enum":["ed25519","secure_boot_v2_rsa"],"type":"string"}},"required":["name","key"],"title":"SigningKeyCreationRequest","type":"object"},"SigningKeyIndexResponse":{"description":"Response schema for multiple Signing Keys","example":{"data":[{"key":"abc123=","name":"QA","scheme":"ed25519"},{"key":"-----BEGIN PUBLIC KEY-----\nMIIBoj...\n-----END PUBLIC KEY-----\n","name":"ESP release","scheme":"secure_boot_v2_rsa"}]},"properties":{"data":{"description":"The Signing Key details","items":{"$ref":"#/components/schemas/SigningKey"},"type":"array"}},"title":"SigningKeyIndexResponse","type":"object"},"SigningKeyShowResponse":{"description":"Response schema for a single Signing Key","example":{"data":{"key":"abc123=","name":"QA","scheme":"ed25519"}},"properties":{"data":{"$ref":"#/components/schemas/SigningKey"}},"title":"SigningKeyShowResponse","type":"object"},"SupportScript":{"example":{"created_by":{"email":"waffles@doggo.com","id":"1","name":"Waffles t'Doggo"},"id":"1","inserted_at":"2026-03-28T08:10:20Z","name":"Clean Disk","tags":"cleanup","text":"Clean.disk()","updated_at":"2026-06-23T08:10:20Z"},"properties":{"created_by":{"properties":{"email":{"type":"string"},"id":{"type":"string"},"name":{"type":"string"}},"type":"object"},"id":{"type":"string"},"inserted_at":{"format":"date-time","type":"string"},"name":{"type":"string"},"tags":{"type":"string"},"text":{"type":"string"},"updated_at":{"format":"date-time","type":"string"}},"title":"SupportScript","type":"object"},"SupportScriptCreationRequest":{"description":"POST body for adding a Support Script to a Product","example":{"name":"Clean Disk","tags":"cleanup","text":"Disk.clean()"},"properties":{"name":{"type":"string"},"tags":{"type":"string"},"text":{"type":"string"}},"required":["name","text"],"title":"SupportScriptCreationRequest","type":"object"},"SupportScriptIndexResponse":{"description":"Response schema for multiple Support Scripts","example":{"data":[{"id":"1","name":"Clean Disk","tags":"cleanup"},{"id":"2","name":"Dim the lights","tags":"lights"}],"pagination":{"page_number":1,"page_size":20,"total_entries":2,"total_pages":1}},"properties":{"data":{"description":"The Support Script details","items":{"$ref":"#/components/schemas/SupportScriptMinimal"},"type":"array"},"pagination":{"properties":{"page_number":{"type":"integer"},"page_size":{"type":"integer"},"total_entries":{"type":"integer"},"total_pages":{"type":"integer"}},"type":"object"}},"title":"SupportScriptIndexResponse","type":"object"},"SupportScriptMinimal":{"example":{"id":"1","name":"Clean Disk","tags":"cleanup"},"properties":{"id":{"type":"string"},"name":{"type":"string"},"tags":{"type":"string"}},"title":"SupportScriptMinimal","type":"object"},"SupportScriptShowResponse":{"description":"Response schema for a single Support Script","example":{"data":{"created_by":{"email":"waffles@doggo.com","id":"1","name":"Waffles t'Doggo"},"id":"1","inserted_at":"2026-03-28T08:10:20Z","name":"Snoot Boop","tags":"snoots","text":"Snoot.boop()","updated_at":"2026-06-23T08:10:20Z"}},"properties":{"data":{"$ref":"#/components/schemas/SupportScript"}},"title":"SupportScriptShowResponse","type":"object"},"SupportScriptUpdateRequest":{"description":"POST body for updating a Support Script","example":{"name":"Clean Disk","tags":"cleanup","text":"Disk.clean()"},"properties":{"name":{"type":"string"},"tags":{"type":"string"},"text":{"type":"string"}},"title":"SupportScriptUpdateRequest","type":"object"},"User":{"description":"A registered user","example":{"email":"jane@iot-company.com","id":123,"inserted_at":"2017-09-12T12:34:55Z","name":"Jane User","updated_at":"2017-09-13T10:11:12Z"},"properties":{"email":{"description":"Email address","format":"email","type":"string"},"id":{"description":"User ID","type":"integer"},"inserted_at":{"description":"Creation timestamp","format":"date-time","type":"string"},"name":{"description":"Users name","pattern":"[a-zA-Z][a-zA-Z0-9_]+","type":"string"},"updated_at":{"description":"Update timestamp","format":"date-time","type":"string"}},"required":["name","email"],"title":"User","type":"object"},"UserAuthCLISessionRequest":{"description":"POST body for authenticating a user via CLI session","example":{"note":"nerves_hub_cli 2.0.0"},"properties":{"note":{"type":"string"}},"title":"UserAuthCLISessionRequest","type":"object"},"UserAuthCLISessionResponse":{"description":"Response for authenticating a new CLI session","example":{"data":{"token":"218ed524-eb74-47d7-aedc-11e386961b72","url":"https://manage.nervescloud.com/auth/cli/218ed524-eb74-47d7-aedc-11e386961b72"}},"properties":{"data":{"$ref":"#/components/schemas/CLISession"}},"title":"UserAuthCLISessionResponse","type":"object"},"UserAuthCLISessionStatusResponse":{"description":"Response for checking the status of a CLI auth exchange session","example":{"data":{"status":"ready","user_token":"nhu_aaabbbccc123"}},"properties":{"data":{"$ref":"#/components/schemas/CLISessionStatus"}},"title":"UserAuthCLISessionStatusResponse","type":"object"},"UserAuthRequest":{"description":"POST body for authenticating a user","example":{"email":"jane@iot-company.com","note":"Local automation","password":"my-secure-password"},"properties":{"email":{"type":"string"},"note":{"type":"string"},"password":{"type":"string"}},"required":["email","password"],"title":"UserAuthRequest","type":"object"},"UserResponse":{"description":"Response schema for single user","example":{"data":{"email":"jane@iot-company.com","id":123,"inserted_at":"2017-09-12T12:34:55Z","name":"Jane User","updated_at":"2017-09-13T10:11:12Z"}},"properties":{"data":{"$ref":"#/components/schemas/User"}},"title":"UserResponse","type":"object"}},"securitySchemes":{"bearer_auth":{"scheme":"bearer","type":"http"}}},"info":{"description":"The NervesCloud API gives users full access to their\nOrgs, Products, and corresponding Device fleets.\n\nThe API can be used to integrate with your own systems, providing full access to your Product and Device data.\n\nThe API is documented using the OpenAPI 3.0 specification.\n","title":"NervesCloud API","version":"2.0.0"},"openapi":"3.0.0","paths":{"/api/orgs/{org_name}/products/{product_name}":{"delete":{"callbacks":{},"operationId":"NervesHubWeb.API.ProductController.delete","parameters":[{"description":"Organization Name","example":"example_org","in":"path","name":"org_name","required":true,"schema":{"type":"string"}},{"description":"Product Name","example":"example_product","in":"path","name":"product_name","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"Empty response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Not Found"}},"security":[{"bearer_auth":[]}],"summary":"Delete an Organizations Product","tags":["Products"]},"get":{"callbacks":{},"operationId":"NervesHubWeb.API.ProductController.show","parameters":[{"description":"Organization Name","example":"example_org","in":"path","name":"org_name","required":true,"schema":{"type":"string"}},{"description":"Product Name","example":"example_product","in":"path","name":"product_name","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductShowResponse"}}},"description":"Product response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Not Found"}},"security":[{"bearer_auth":[]}],"summary":"Retrieves a Products details","tags":["Products"]},"patch":{"callbacks":{},"operationId":"NervesHubWeb.API.ProductController.update (2)","parameters":[{"description":"Organization Name","example":"example_org","in":"path","name":"org_name","required":true,"schema":{"type":"string"}},{"description":"Product Name","example":"example_product","in":"path","name":"product_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductUpdateRequest"}}},"description":"Product update request body","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductShowResponse"}}},"description":"Product response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Not Found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangesetErrorResponse"}}},"description":"Unprocessable Entity"}},"security":[{"bearer_auth":[]}],"summary":"Update a Product's settings","tags":["Products"]},"put":{"callbacks":{},"operationId":"NervesHubWeb.API.ProductController.update","parameters":[{"description":"Organization Name","example":"example_org","in":"path","name":"org_name","required":true,"schema":{"type":"string"}},{"description":"Product Name","example":"example_product","in":"path","name":"product_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductUpdateRequest"}}},"description":"Product update request body","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductShowResponse"}}},"description":"Product response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Not Found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangesetErrorResponse"}}},"description":"Unprocessable Entity"}},"security":[{"bearer_auth":[]}],"summary":"Update a Product's settings","tags":["Products"]}},"/api/orgs/{org_name}/products/{product_name}/scripts":{"get":{"callbacks":{},"deprecated":false,"operationId":"NervesHubWeb.API.ScriptController.index","parameters":[{"description":"Organization Name","example":"example_org","in":"path","name":"org_name","required":true,"schema":{"type":"string"}},{"description":"Product Name","example":"example_product","in":"path","name":"product_name","required":true,"schema":{"type":"string"}},{"description":"Pagination","in":"query","name":"pagination","required":false,"schema":{"properties":{"page":{"default":1,"example":"5","type":"integer"},"page_size":{"default":10,"example":"20","type":"integer"}},"type":"object"},"style":"deepObject"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SupportScriptIndexResponse"}}},"description":"Support Scripts List Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Forbidden"}},"security":[{"bearer_auth":[]}],"summary":"List Support Scripts","tags":["Support Scripts"]},"post":{"callbacks":{},"operationId":"NervesHubWeb.API.ScriptController.create","parameters":[{"description":"Organization Name","example":"example_org","in":"path","name":"org_name","required":true,"schema":{"type":"string"}},{"description":"Product Name","example":"example_product","in":"path","name":"product_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SupportScriptCreationRequest"}}},"description":"Support Script creation request body","required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SupportScriptShowResponse"}}},"description":"Support Scripts"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangesetErrorResponse"}}},"description":"Unprocessable Entity"}},"security":[{"bearer_auth":[]}],"summary":"Create a Support Script","tags":["Support Scripts"]}},"/api/orgs/{org_name}/iroh_endpoints/{identifier}":{"delete":{"callbacks":{},"description":"An endpoint a device reported is removed too, but the device records it\nagain the next time it connects — deleting one is not a way to stop a device\nholding a key it holds.\n","operationId":"NervesHubWeb.API.IrohEndpointController.delete","parameters":[{"description":"Organization Name","example":"example_org","in":"path","name":"org_name","required":true,"schema":{"type":"string"}},{"description":"The endpoint id — 64 hex characters","example":"c8924b6c9b7a8528b1365ebec4b2e43b6edebef684f8521f12b8caaf6e1b2302","in":"path","name":"identifier","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"Empty response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Not Found"}},"security":[{"bearer_auth":[]}],"summary":"Delete an Iroh Endpoint for an Organization","tags":["Iroh Endpoints"]},"get":{"callbacks":{},"operationId":"NervesHubWeb.API.IrohEndpointController.show","parameters":[{"description":"Organization Name","example":"example_org","in":"path","name":"org_name","required":true,"schema":{"type":"string"}},{"description":"The endpoint id — 64 hex characters","example":"c8924b6c9b7a8528b1365ebec4b2e43b6edebef684f8521f12b8caaf6e1b2302","in":"path","name":"identifier","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IrohEndpointShowResponse"}}},"description":"Iroh Endpoint"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Not Found"}},"security":[{"bearer_auth":[]}],"summary":"Show an Iroh Endpoint for an Organization","tags":["Iroh Endpoints"]}},"/api/orgs/{org_name}/ca_certificates":{"get":{"callbacks":{},"operationId":"NervesHubWeb.API.CACertificateController.index","parameters":[{"description":"Organization Name","example":"example_org","in":"path","name":"org_name","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CACertificateListResponse"}}},"description":"CA Certificate list response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Forbidden"}},"security":[{"bearer_auth":[]}],"summary":"List all CA Certificates for an Organization","tags":["CA Certificates"]},"post":{"callbacks":{},"operationId":"NervesHubWeb.API.CACertificateController.create","parameters":[{"description":"Organization Name","example":"example_org","in":"path","name":"org_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CACertificateCreationRequest"}}},"description":"CA Certificate creation request body","required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CACertificateShowResponse"}}},"description":"CA Certificate response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangesetErrorResponse"}}},"description":"Unprocessable Entity"}},"security":[{"bearer_auth":[]}],"summary":"Create a CA Certificate for an Organization","tags":["CA Certificates"]}},"/api/orgs/{org_name}/products/{product_name}/devices/{identifier}/logs":{"get":{"callbacks":{},"deprecated":false,"description":"The log lines this device sent over the logging extension, newest first.\n\nLines stay readable after the extension is turned off for the product or\nthe device — the setting governs what arrives, not what can be read. They\nare not kept forever, though: log lines are dropped three days after they\nwere logged.\n\nTo page back through history, ask for a `limit` and then pass the\n`timestamp` of the oldest line you received as the next request's\n`before`.\n","operationId":"NervesHubWeb.API.DeviceLogController.index.long","parameters":[{"description":"Organization Name","example":"example_org","in":"path","name":"org_name","required":true,"schema":{"type":"string"}},{"description":"Product Name","example":"example_product","in":"path","name":"product_name","required":true,"schema":{"type":"string"}},{"description":"Device Identifier","example":"abc123","in":"path","name":"identifier","required":true,"schema":{"type":"string"}},{"description":"Only lines logged at these levels. Comma separated for more than one. Matched as given — a level no device has logged at matches nothing","example":"error,warning","in":"query","name":"level","required":false,"schema":{"type":"string"}},{"description":"Only lines whose message contains this text, ignoring case. Matched literally, so `%` and `_` are searched for rather than treated as wildcards","example":"sensor bus","in":"query","name":"search","required":false,"schema":{"type":"string"}},{"description":"Only lines logged at or after this ISO 8601 timestamp","example":"2026-08-16T09:00:00Z","in":"query","name":"since","required":false,"schema":{"format":"date-time","type":"string"}},{"description":"Only lines logged strictly before this ISO 8601 timestamp. To page back through history, pass the timestamp of the oldest line you received","example":"2026-08-16T09:14:00.123456Z","in":"query","name":"before","required":false,"schema":{"format":"date-time","type":"string"}},{"description":"How many lines to return, from 1 to 1000","example":"250","in":"query","name":"limit","required":false,"schema":{"default":100,"type":"integer"}},{"description":"`desc` for newest first, `asc` for oldest first","example":"asc","in":"query","name":"order","required":false,"schema":{"default":"desc","enum":["desc","asc"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviceLogListResponse"}}},"description":"Device Log List Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Not Found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unusable query parameter"},"501":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"This platform has no analytics database, so no logs are stored"}},"security":[{"bearer_auth":[]}],"summary":"List the Log Lines a Device has sent","tags":["Device Logs"]}},"/api/orgs/{org_name}/products":{"get":{"callbacks":{},"operationId":"NervesHubWeb.API.ProductController.index","parameters":[{"description":"Organization Name","example":"example_org","in":"path","name":"org_name","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductListResponse"}}},"description":"Product list response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Forbidden"}},"security":[{"bearer_auth":[]}],"summary":"List all Products for an Organization","tags":["Products"]},"post":{"callbacks":{},"operationId":"NervesHubWeb.API.ProductController.create","parameters":[{"description":"Organization Name","example":"example_org","in":"path","name":"org_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductCreationRequest"}}},"description":"Product creation request body","required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductShowResponse"}}},"description":"Product response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangesetErrorResponse"}}},"description":"Unprocessable Entity"}},"security":[{"bearer_auth":[]}],"summary":"Create a new Product in an Organization","tags":["Products"]}},"/api/users/login":{"post":{"callbacks":{},"operationId":"NervesHubWeb.API.UserController.login","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserAuthRequest"}}},"description":"Authentication attributes","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserResponse"}}},"description":"User response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unauthorized"}},"security":[],"summary":"Authenticate a user (deprecated)","tags":["Auth"]}},"/api/orgs/{org_name}/products/{product_name}/devices/{identifier}/certificates/{serial}":{"delete":{"callbacks":{},"operationId":"NervesHubWeb.API.DeviceCertificateController.delete","parameters":[{"description":"Organization Name","example":"example_org","in":"path","name":"org_name","required":true,"schema":{"type":"string"}},{"description":"Product Name","example":"example_product","in":"path","name":"product_name","required":true,"schema":{"type":"string"}},{"description":"Device Identifier","example":"example_device","in":"path","name":"identifier","required":true,"schema":{"type":"string"}},{"description":"Certificate Serial","example":"123456789101112","in":"path","name":"serial","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"Empty response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Not Found"}},"security":[{"bearer_auth":[]}],"summary":"Delete a Device's Certificate","tags":["Device Certificates"]},"get":{"callbacks":{},"operationId":"NervesHubWeb.API.DeviceCertificateController.show","parameters":[{"description":"Organization Name","example":"example_org","in":"path","name":"org_name","required":true,"schema":{"type":"string"}},{"description":"Product Name","example":"example_product","in":"path","name":"product_name","required":true,"schema":{"type":"string"}},{"description":"Device Identifier","example":"example_device","in":"path","name":"identifier","required":true,"schema":{"type":"string"}},{"description":"Certificate Serial","example":"123456789101112","in":"path","name":"serial","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviceCertificateShowResponse"}}},"description":"Device Certificate show response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Not Found"}},"security":[{"bearer_auth":[]}],"summary":"Show a Certificate for a Device","tags":["Device Certificates"]}},"/api/orgs/{org_name}/products/{product_name}/devices/{identifier}/upgrade":{"post":{"callbacks":{},"deprecated":false,"operationId":"NervesHubWeb.API.DevicesController.upgrade.long","parameters":[{"description":"Organization Name","example":"example_org","in":"path","name":"org_name","required":true,"schema":{"type":"string"}},{"description":"Product Name","example":"example_product","in":"path","name":"product_name","required":true,"schema":{"type":"string"}},{"description":"Device Identifier","example":"abc123","in":"path","name":"identifier","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviceUpgradeRequest"}}},"description":"Firmware upgrade request body","required":true},"responses":{"204":{"description":"No content"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Not Found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangesetErrorResponse"}}},"description":"Unprocessable Entity"}},"security":[{"bearer_auth":[]}],"summary":"Request a Device upgrade to a different Firmware","tags":["Devices"]}},"/api/devices/{identifier}/reconnect":{"post":{"callbacks":{},"deprecated":false,"operationId":"NervesHubWeb.API.DevicesController.reconnect.short","parameters":[{"description":"Device Identifier","example":"abc123","in":"path","name":"identifier","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"No content"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Not Found"}},"security":[{"bearer_auth":[]}],"summary":"Request a Device reconnect","tags":["Devices (short URL)"]}},"/api/orgs/{org_name}/products/{product_name}/devices/{identifier}/reboot":{"post":{"callbacks":{},"deprecated":false,"operationId":"NervesHubWeb.API.DevicesController.reboot.long","parameters":[{"description":"Organization Name","example":"example_org","in":"path","name":"org_name","required":true,"schema":{"type":"string"}},{"description":"Product Name","example":"example_product","in":"path","name":"product_name","required":true,"schema":{"type":"string"}},{"description":"Device Identifier","example":"abc123","in":"path","name":"identifier","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"No content"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Not Found"}},"security":[{"bearer_auth":[]}],"summary":"Request a Device reboot","tags":["Devices"]}},"/api/devices/{identifier}/logs":{"get":{"callbacks":{},"deprecated":false,"description":"The log lines this device sent over the logging extension, newest first.\n\nLines stay readable after the extension is turned off for the product or\nthe device — the setting governs what arrives, not what can be read. They\nare not kept forever, though: log lines are dropped three days after they\nwere logged.\n\nTo page back through history, ask for a `limit` and then pass the\n`timestamp` of the oldest line you received as the next request's\n`before`.\n","operationId":"NervesHubWeb.API.DeviceLogController.index.short","parameters":[{"description":"Device Identifier","example":"abc123","in":"path","name":"identifier","required":true,"schema":{"type":"string"}},{"description":"Only lines logged at these levels. Comma separated for more than one. Matched as given — a level no device has logged at matches nothing","example":"error,warning","in":"query","name":"level","required":false,"schema":{"type":"string"}},{"description":"Only lines whose message contains this text, ignoring case. Matched literally, so `%` and `_` are searched for rather than treated as wildcards","example":"sensor bus","in":"query","name":"search","required":false,"schema":{"type":"string"}},{"description":"Only lines logged at or after this ISO 8601 timestamp","example":"2026-08-16T09:00:00Z","in":"query","name":"since","required":false,"schema":{"format":"date-time","type":"string"}},{"description":"Only lines logged strictly before this ISO 8601 timestamp. To page back through history, pass the timestamp of the oldest line you received","example":"2026-08-16T09:14:00.123456Z","in":"query","name":"before","required":false,"schema":{"format":"date-time","type":"string"}},{"description":"How many lines to return, from 1 to 1000","example":"250","in":"query","name":"limit","required":false,"schema":{"default":100,"type":"integer"}},{"description":"`desc` for newest first, `asc` for oldest first","example":"asc","in":"query","name":"order","required":false,"schema":{"default":"desc","enum":["desc","asc"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviceLogListResponse"}}},"description":"Device Log List Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Not Found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unusable query parameter"},"501":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"This platform has no analytics database, so no logs are stored"}},"security":[{"bearer_auth":[]}],"summary":"List the Log Lines a Device has sent","tags":["Devices (short URL)"]}},"/api/auth/cli_session/{token}":{"get":{"callbacks":{},"operationId":"NervesHubWeb.API.UserController.check_cli_session","parameters":[{"description":"CLI Session Token","example":"abc123token","in":"path","name":"token","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserAuthCLISessionStatusResponse"}}},"description":"Auth CLI session token response"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Not Found"}},"security":[],"summary":"Check the CLI authentication progress","tags":["Auth"]}},"/api/orgs/{org_name}/products/{product_name}/devices/{identifier}/penalty":{"delete":{"callbacks":{},"deprecated":false,"operationId":"NervesHubWeb.API.DevicesController.penalty.long","parameters":[{"description":"Organization Name","example":"example_org","in":"path","name":"org_name","required":true,"schema":{"type":"string"}},{"description":"Product Name","example":"example_product","in":"path","name":"product_name","required":true,"schema":{"type":"string"}},{"description":"Device Identifier","example":"abc123","in":"path","name":"identifier","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"No content"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Not Found"}},"security":[{"bearer_auth":[]}],"summary":"Clear the penalty box for a Device","tags":["Devices"]}},"/api/orgs/{org_name}/products/{product_name}/devices/import":{"post":{"callbacks":{},"deprecated":false,"operationId":"NervesHubWeb.API.DevicesController.bulk_import","parameters":[{"description":"Organization Name","example":"example_org","in":"path","name":"org_name","required":true,"schema":{"type":"string"}},{"description":"Product Name","example":"example_product","in":"path","name":"product_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviceBulkImport"}}},"description":"Certificate manifest","required":true},"responses":{"204":{"description":"No content"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangesetErrorResponse"}}},"description":"Unprocessable Entity"}},"security":[{"bearer_auth":[]}],"summary":"Bulk create Devices from a manifest. Only a Microchip Trust and Go manifest is currently supported.","tags":["Devices"]}},"/api/auth/cli_session":{"post":{"callbacks":{},"operationId":"NervesHubWeb.API.UserController.cli_session","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserAuthCLISessionRequest"}}},"description":"CLI Session attributes","required":false},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserAuthCLISessionResponse"}}},"description":"Auth CLI session token response"}},"security":[],"summary":"Start the CLI authentication process","tags":["Auth"]}},"/api/orgs/{org_name}/products/{product_name}/firmwares/{uuid}":{"delete":{"callbacks":{},"operationId":"NervesHubWeb.API.FirmwareController.delete","parameters":[{"description":"Organization Name","example":"example_org","in":"path","name":"org_name","required":true,"schema":{"type":"string"}},{"description":"Product Name","example":"example_product","in":"path","name":"product_name","required":true,"schema":{"type":"string"}},{"description":"Firmware UUID","example":"d9f8c63a-1234-5678-abcd-ef0123456789","in":"path","name":"uuid","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"Empty response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Not Found"}},"security":[{"bearer_auth":[]}],"summary":"Delete a Firmware","tags":["Firmwares"]},"get":{"callbacks":{},"operationId":"NervesHubWeb.API.FirmwareController.show","parameters":[{"description":"Organization Name","example":"example_org","in":"path","name":"org_name","required":true,"schema":{"type":"string"}},{"description":"Product Name","example":"example_product","in":"path","name":"product_name","required":true,"schema":{"type":"string"}},{"description":"Firmware UUID","example":"d9f8c63a-1234-5678-abcd-ef0123456789","in":"path","name":"uuid","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FirmwareResponse"}}},"description":"Firmware response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Not Found"}},"security":[{"bearer_auth":[]}],"summary":"Show a Firmware","tags":["Firmwares"]}},"/api/orgs/{org_name}/products/{product_name}/devices/{identifier}/code":{"post":{"callbacks":{},"deprecated":false,"operationId":"NervesHubWeb.API.DevicesController.code.long","parameters":[{"description":"Organization Name","example":"example_org","in":"path","name":"org_name","required":true,"schema":{"type":"string"}},{"description":"Product Name","example":"example_product","in":"path","name":"product_name","required":true,"schema":{"type":"string"}},{"description":"Device Identifier","example":"abc123","in":"path","name":"identifier","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviceCodeRequest"}}},"description":"Code execution request body","required":true},"responses":{"204":{"description":"No content"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Not Found"}},"security":[{"bearer_auth":[]}],"summary":"Request a Device run some Elixir code in it's console connection","tags":["Devices"]}},"/api/devices/{identifier}/code":{"post":{"callbacks":{},"deprecated":false,"operationId":"NervesHubWeb.API.DevicesController.code.short","parameters":[{"description":"Device Identifier","example":"abc123","in":"path","name":"identifier","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviceCodeRequest"}}},"description":"Code execution request body","required":true},"responses":{"204":{"description":"No content"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Not Found"}},"security":[{"bearer_auth":[]}],"summary":"Request a Device run some Elixir code in it's console connection","tags":["Devices (short URL)"]}},"/api/devices/{identifier}/scripts/{name_or_id}":{"post":{"callbacks":{},"deprecated":false,"operationId":"NervesHubWeb.API.ScriptController.send.short","parameters":[{"description":"Device Identifier","example":"abc123","in":"path","name":"identifier","required":true,"schema":{"type":"string"}},{"description":"Support Script Name or ID. Name takes priority.","example":"my-script","in":"path","name":"name_or_id","required":true,"schema":{"oneOf":[{"type":"string"},{"type":"integer"}]}},{"description":"How long to wait for a device response in milliseconds","example":"10000","in":"query","name":"timeout","required":false,"schema":{"type":"integer"}}],"responses":{"200":{"content":{"text/plain":{"schema":{"type":"string"}}},"description":"Script output"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Not Found"}},"security":[{"bearer_auth":[]}],"summary":"Send a Support Script to a Device","tags":["Devices (short URL)"]}},"/api/orgs/{org_name}/products/{product_name}/devices/{identifier}/certificates":{"get":{"callbacks":{},"operationId":"NervesHubWeb.API.DeviceCertificateController.index","parameters":[{"description":"Organization Name","example":"example_org","in":"path","name":"org_name","required":true,"schema":{"type":"string"}},{"description":"Product Name","example":"example_product","in":"path","name":"product_name","required":true,"schema":{"type":"string"}},{"description":"Device Identifier","example":"example_device","in":"path","name":"identifier","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviceCertificateListResponse"}}},"description":"Device Certificate list response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Forbidden"}},"security":[{"bearer_auth":[]}],"summary":"List all Certificates for a Device","tags":["Device Certificates"]},"post":{"callbacks":{},"operationId":"NervesHubWeb.API.DeviceCertificateController.create","parameters":[{"description":"Organization Name","example":"example_org","in":"path","name":"org_name","required":true,"schema":{"type":"string"}},{"description":"Product Name","example":"example_product","in":"path","name":"product_name","required":true,"schema":{"type":"string"}},{"description":"Device Identifier","example":"example_device","in":"path","name":"identifier","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviceCertificateCreateRequest"}}},"description":"Device Certificate create request","required":false},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviceCertificateShowResponse"}}},"description":"Device Certificate show response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangesetErrorResponse"}}},"description":"Unprocessable Entity"}},"security":[{"bearer_auth":[]}],"summary":"Create a Certificate for a Device","tags":["Device Certificates"]}},"/api/orgs/{org_name}/products/{product_name}/devices":{"get":{"callbacks":{},"deprecated":false,"operationId":"NervesHubWeb.API.DevicesController.index","parameters":[{"description":"Organization Name","example":"example_org","in":"path","name":"org_name","required":true,"schema":{"type":"string"}},{"description":"Product Name","example":"example_product","in":"path","name":"product_name","required":true,"schema":{"type":"string"}},{"description":"Sort By","example":"identifier","in":"query","name":"sort","required":false,"schema":{"type":"string"}},{"description":"Sort Direction","example":"asc","in":"query","name":"sort_direction","required":false,"schema":{"type":"string"}},{"description":"Pagination","in":"query","name":"pagination","required":false,"schema":{"properties":{"page":{"default":1,"example":"5","type":"integer"},"page_size":{"default":10,"example":"20","type":"integer"}},"type":"object"},"style":"deepObject"},{"description":"Filtering","in":"query","name":"filters","required":false,"schema":{"properties":{"advanced_query":{"description":"A query in the device list's advanced query language, the same one the\nweb UI's search bar uses. Values are quoted; expressions combine with\n`and`/`or`/`not` and parentheses. Custom health metrics are queried as\n`metric:<key>` with numeric comparisons against each device's latest\nreading. Input that doesn't look like a query expression is treated as\na free-text search across the device's textual fields; an invalid\nquery expression is rejected with a 422 and the parse error.\n\nExamples:\n* `metric:cpu_temp > 70`\n* `connection = \"connected\" and tags contains \"prod\"`\n* `health_status != \"healthy\" or alarm_status = \"with\"`\n* `metric:battery_soc < 20 and updates = \"enabled\"`\n","example":"metric:cpu_temp > 70 and connection = \"connected\"","type":"string"},"alarm":{"example":"SomeAlarm","type":"string"},"alarm_status":{"enum":["with","without"],"type":"string"},"connection":{"enum":["connected","disconnected","not_seen"],"type":"string"},"deployment_id":{"example":"12","type":"string"},"display_deleted":{"enum":["include","exclude","only"],"type":"string"},"firmware_version":{"example":"1.10.0","type":"string"},"has_no_tags":{"enum":["true","false"],"type":"string"},"health_status":{"enum":["healthy","unhealthy","warning","unknown"],"type":"string"},"identifier":{"example":"sn123","type":"string"},"only_updating":{"enum":["true","false"],"type":"string"},"platform":{"example":"rpi4","type":"string"},"search":{"example":"sn123","type":"string"},"tags":{"example":"prod,staging","type":"string"},"updates":{"enum":["enabled","disabled","automatic","device-managed","penalty-box"],"type":"string"}},"type":"object"},"style":"deepObject"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviceListResponse"}}},"description":"Device List Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Forbidden"}},"security":[{"bearer_auth":[]}],"summary":"List Devices","tags":["Devices"]}},"/api/orgs/{org_name}/keys/{name}":{"delete":{"callbacks":{},"operationId":"NervesHubWeb.API.KeyController.delete","parameters":[{"description":"Organization Name","example":"example_org","in":"path","name":"org_name","required":true,"schema":{"type":"string"}},{"description":"Signing Key Name","example":"example_key","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"Empty response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Not Found"}},"security":[{"bearer_auth":[]}],"summary":"Delete a Signing Key for an Organization","tags":["Signing Keys"]},"get":{"callbacks":{},"operationId":"NervesHubWeb.API.KeyController.show","parameters":[{"description":"Organization Name","example":"example_org","in":"path","name":"org_name","required":true,"schema":{"type":"string"}},{"description":"Signing Key Name","example":"example_key","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SigningKeyShowResponse"}}},"description":"Signing Key"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Not Found"}},"security":[{"bearer_auth":[]}],"summary":"Show a Signing Key for an Organization","tags":["Signing Keys"]}},"/api/orgs/{org_name}/users":{"get":{"callbacks":{},"operationId":"NervesHubWeb.API.OrgUserController.index","parameters":[{"description":"Organization Name","example":"example_org","in":"path","name":"org_name","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrgUserListResponse"}}},"description":"Organization users list response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Forbidden"}},"security":[{"bearer_auth":[]}],"summary":"List all members of an Organization","tags":["Organization Members"]},"post":{"callbacks":{},"deprecated":true,"operationId":"NervesHubWeb.API.OrgUserController.add","parameters":[{"description":"Organization Name","example":"example_org","in":"path","name":"org_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrgUserCreationRequest"}}},"description":"Org User creation request body","required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrgUserShowResponse"}}},"description":"Organization User - User is added to the organization"},"204":{"description":"Empty response - User is invited to the organization"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Forbidden"}},"security":[{"bearer_auth":[]}],"summary":"Add a user to an Organization","tags":["Organization Members"]}},"/api/orgs/{org_name}/products/{product_name}/devices/{identifier}/reconnect":{"post":{"callbacks":{},"deprecated":false,"operationId":"NervesHubWeb.API.DevicesController.reconnect.long","parameters":[{"description":"Organization Name","example":"example_org","in":"path","name":"org_name","required":true,"schema":{"type":"string"}},{"description":"Product Name","example":"example_product","in":"path","name":"product_name","required":true,"schema":{"type":"string"}},{"description":"Device Identifier","example":"abc123","in":"path","name":"identifier","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"No content"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Not Found"}},"security":[{"bearer_auth":[]}],"summary":"Request a Device reconnect","tags":["Devices"]}},"/api/orgs/{org_name}/products/{product_name}/devices/{identifier}":{"delete":{"callbacks":{},"deprecated":false,"operationId":"NervesHubWeb.API.DevicesController.delete","parameters":[{"description":"Organization Name","example":"example_org","in":"path","name":"org_name","required":true,"schema":{"type":"string"}},{"description":"Product Name","example":"example_product","in":"path","name":"product_name","required":true,"schema":{"type":"string"}},{"description":"Device Identifier","example":"abc123","in":"path","name":"identifier","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"No content"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Not Found"}},"security":[{"bearer_auth":[]}],"summary":"Delete a Device","tags":["Devices"]},"get":{"callbacks":{},"deprecated":false,"operationId":"NervesHubWeb.API.DevicesController.show.long","parameters":[{"description":"Organization Name","example":"example_org","in":"path","name":"org_name","required":true,"schema":{"type":"string"}},{"description":"Product Name","example":"example_product","in":"path","name":"product_name","required":true,"schema":{"type":"string"}},{"description":"Device Identifier","example":"abc123","in":"path","name":"identifier","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviceResponse"}}},"description":"Device Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Not Found"}},"security":[{"bearer_auth":[]}],"summary":"Show a Device","tags":["Devices"]},"post":{"callbacks":{},"deprecated":false,"operationId":"NervesHubWeb.API.DevicesController.create","parameters":[{"description":"Organization Name","example":"example_org","in":"path","name":"org_name","required":true,"schema":{"type":"string"}},{"description":"Product Name","example":"example_product","in":"path","name":"product_name","required":true,"schema":{"type":"string"}},{"description":"Device Identifier","example":"abc123","in":"path","name":"identifier","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviceCreationRequest"}}},"description":"Device creation request body","required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviceResponse"}}},"description":"Device Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangesetErrorResponse"}}},"description":"Unprocessable Entity"}},"security":[{"bearer_auth":[]}],"summary":"Create a Device","tags":["Devices"]},"put":{"callbacks":{},"deprecated":false,"operationId":"NervesHubWeb.API.DevicesController.update","parameters":[{"description":"Organization Name","example":"example_org","in":"path","name":"org_name","required":true,"schema":{"type":"string"}},{"description":"Product Name","example":"example_product","in":"path","name":"product_name","required":true,"schema":{"type":"string"}},{"description":"Device Identifier","example":"abc123","in":"path","name":"identifier","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviceUpdateRequest"}}},"description":"Device update request body","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviceResponse"}}},"description":"Device Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Not Found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangesetErrorResponse"}}},"description":"Unprocessable Entity"}},"security":[{"bearer_auth":[]}],"summary":"Update a Device","tags":["Devices"]}},"/api/users/me":{"get":{"callbacks":{},"operationId":"NervesHubWeb.API.UserController.me","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserResponse"}}},"description":"User response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unauthorized"}},"security":[{"bearer_auth":[]}],"summary":"Show details of the currently logged in user","tags":["Auth"]}},"/api/orgs/{org_name}/products/{product_name}/firmwares":{"get":{"callbacks":{},"operationId":"NervesHubWeb.API.FirmwareController.index","parameters":[{"description":"Organization Name","example":"example_org","in":"path","name":"org_name","required":true,"schema":{"type":"string"}},{"description":"Product Name","example":"example_product","in":"path","name":"product_name","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FirmwareListResponse"}}},"description":"Firmware list response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Forbidden"}},"security":[{"bearer_auth":[]}],"summary":"List all Firmwares for a Product","tags":["Firmwares"]},"post":{"callbacks":{},"description":"Accepts an fwup archive (`.fw`) or an ESP-IDF application image (`.bin`).\nThe format is determined from the file itself, not its name or extension.\n\nA product accepts only the formats listed in its `allowed_update_tools`,\nwhich is `[\"fwup\"]` by default. ESP-IDF additionally requires the platform\nto have `ESP_IDF_FIRMWARE_ENABLED` set.\n\n**Firmware must be signed** against a key registered to the organization: an\nEd25519 key for fwup and AtomVM, or an RSA-3072 Secure Boot v2 key for\nESP-IDF.\n\nTwo per-product settings excuse a *missing* signature, and nothing else.\n`allow_unsigned_esp_idf_firmware` accepts an ESP-IDF image with no signature\nblock, and `allow_unsigned_atomvm_firmware` accepts a packbeam with no\nsignature entry. Firmware that does carry a signature is always verified,\nand fwup archives are always verified.\n\nThe firmware's own metadata declares which product it belongs to, and that\nmust match the product in the path.\n","operationId":"NervesHubWeb.API.FirmwareController.create","parameters":[{"description":"Organization Name","example":"example_org","in":"path","name":"org_name","required":true,"schema":{"type":"string"}},{"description":"Product Name","example":"example_product","in":"path","name":"product_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"multipart/form-data":{}},"description":"Firmware file upload","required":false},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FirmwareResponse"}}},"description":"Firmware response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FirmwareUploadErrorResponse"}}},"description":"Upload rejected"}},"security":[{"bearer_auth":[]}],"summary":"Upload a Firmware for a Product","tags":["Firmwares"]}},"/api/orgs/{org_name}/products/{product_name}/devices/auth":{"post":{"callbacks":{},"deprecated":false,"operationId":"NervesHubWeb.API.DevicesController.auth","parameters":[{"description":"Organization Name","example":"example_org","in":"path","name":"org_name","required":true,"schema":{"type":"string"}},{"description":"Product Name","example":"example_product","in":"path","name":"product_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviceCertificateAuthRequest"}}},"description":"Device certificate auth request body","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviceResponse"}}},"description":"Device Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Forbidden"}},"security":[{"bearer_auth":[]}],"summary":"Test a Devices Certificate authentication","tags":["Devices"]}},"/api/orgs/{org_name}/products/{product_name}/devices/{identifier}/move":{"post":{"callbacks":{},"deprecated":false,"operationId":"NervesHubWeb.API.DevicesController.move.long","parameters":[{"description":"Organization Name","example":"example_org","in":"path","name":"org_name","required":true,"schema":{"type":"string"}},{"description":"Product Name","example":"example_product","in":"path","name":"product_name","required":true,"schema":{"type":"string"}},{"description":"Device Identifier","example":"abc123","in":"path","name":"identifier","required":true,"schema":{"type":"string"}},{"description":"New Organization Name","example":"new_example_org","in":"query","name":"new_org_name","required":true,"schema":{"type":"string"}},{"description":"New Product Name","example":"new_example_product","in":"query","name":"new_product_name","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviceResponse"}}},"description":"Device Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Not Found"}},"security":[{"bearer_auth":[]}],"summary":"Move a Device to a different Product","tags":["Devices"]}},"/api/devices/{identifier}/upgrade":{"post":{"callbacks":{},"deprecated":false,"operationId":"NervesHubWeb.API.DevicesController.upgrade.short","parameters":[{"description":"Device Identifier","example":"abc123","in":"path","name":"identifier","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviceUpgradeRequest"}}},"description":"Firmware upgrade request body","required":true},"responses":{"204":{"description":"No content"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Not Found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangesetErrorResponse"}}},"description":"Unprocessable Entity"}},"security":[{"bearer_auth":[]}],"summary":"Request a Device upgrade to a different Firmware","tags":["Devices (short URL)"]}},"/api/devices/{identifier}/penalty":{"delete":{"callbacks":{},"deprecated":false,"operationId":"NervesHubWeb.API.DevicesController.penalty.short","parameters":[{"description":"Device Identifier","example":"abc123","in":"path","name":"identifier","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"No content"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Not Found"}},"security":[{"bearer_auth":[]}],"summary":"Clear the penalty box for a Device","tags":["Devices (short URL)"]}},"/api/orgs/{org_name}/products/{product_name}/firmwares/{uuid}/download":{"get":{"callbacks":{},"operationId":"NervesHubWeb.API.FirmwareController.download","parameters":[{"description":"Organization Name","example":"example_org","in":"path","name":"org_name","required":true,"schema":{"type":"string"}},{"description":"Product Name","example":"example_product","in":"path","name":"product_name","required":true,"schema":{"type":"string"}},{"description":"Firmware UUID","example":"d9f8c63a-1234-5678-abcd-ef0123456789","in":"path","name":"uuid","required":true,"schema":{"type":"string"}}],"responses":{"302":{"description":"Redirect to firmware download URL"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Not Found"}},"security":[{"bearer_auth":[]}],"summary":"Download a Firmware","tags":["Firmwares"]}},"/api/users/auth":{"post":{"callbacks":{},"operationId":"NervesHubWeb.API.UserController.auth","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserAuthRequest"}}},"description":"Authentication attributes","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserResponse"}}},"description":"User response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unauthorized"}},"security":[],"summary":"Authenticate a user","tags":["Auth"]}},"/api/orgs/{org_name}/products/{product_name}/scripts/{id}":{"delete":{"callbacks":{},"operationId":"NervesHubWeb.API.ScriptController.delete","parameters":[{"description":"Organization Name","example":"example_org","in":"path","name":"org_name","required":true,"schema":{"type":"string"}},{"description":"Product Name","example":"example_product","in":"path","name":"product_name","required":true,"schema":{"type":"string"}},{"description":"Script ID","example":"123","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"Empty response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Not Found"}},"security":[{"bearer_auth":[]}],"summary":"Delete a Support Script by ID","tags":["Support Scripts"]},"get":{"callbacks":{},"operationId":"NervesHubWeb.API.ScriptController.show","parameters":[{"description":"Organization Name","example":"example_org","in":"path","name":"org_name","required":true,"schema":{"type":"string"}},{"description":"Product Name","example":"example_product","in":"path","name":"product_name","required":true,"schema":{"type":"string"}},{"description":"Script ID","example":"123","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SupportScriptShowResponse"}}},"description":"Support Scripts"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Not Found"}},"security":[{"bearer_auth":[]}],"summary":"Get a Support Script by ID","tags":["Support Scripts"]},"put":{"callbacks":{},"operationId":"NervesHubWeb.API.ScriptController.update","parameters":[{"description":"Organization Name","example":"example_org","in":"path","name":"org_name","required":true,"schema":{"type":"string"}},{"description":"Product Name","example":"example_product","in":"path","name":"product_name","required":true,"schema":{"type":"string"}},{"description":"Support Script ID","example":"123","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SupportScriptUpdateRequest"}}},"description":"Support Script update request body","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SupportScriptShowResponse"}}},"description":"Support Scripts"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Not Found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangesetErrorResponse"}}},"description":"Unprocessable Entity"}},"security":[{"bearer_auth":[]}],"summary":"Update a Support Script","tags":["Support Scripts"]}},"/api/orgs/{org_name}/users/{user_email}":{"delete":{"callbacks":{},"operationId":"NervesHubWeb.API.OrgUserController.remove","parameters":[{"description":"Organization Name","example":"example_org","in":"path","name":"org_name","required":true,"schema":{"type":"string"}},{"description":"User Email","example":"jane@person.com","in":"path","name":"user_email","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"Empty response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Not Found"}},"security":[{"bearer_auth":[]}],"summary":"Remove a user from an Organization","tags":["Organization Members"]},"get":{"callbacks":{},"operationId":"NervesHubWeb.API.OrgUserController.show","parameters":[{"description":"Organization Name","example":"example_org","in":"path","name":"org_name","required":true,"schema":{"type":"string"}},{"description":"User Email","example":"jane@person.com","in":"path","name":"user_email","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrgUserShowResponse"}}},"description":"Organization User"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Not Found"}},"security":[{"bearer_auth":[]}],"summary":"Show membership details of a user in an Organization","tags":["Organization Members"]},"put":{"callbacks":{},"operationId":"NervesHubWeb.API.OrgUserController.update","parameters":[{"description":"Organization Name","example":"example_org","in":"path","name":"org_name","required":true,"schema":{"type":"string"}},{"description":"User Email","example":"jane@person.com","in":"path","name":"user_email","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrgUserUpdateRequest"}}},"description":"Org User update request body","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrgUserShowResponse"}}},"description":"Organization User"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Not Found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangesetErrorResponse"}}},"description":"Unprocessable Entity"}},"security":[{"bearer_auth":[]}],"summary":"Update a user's role in an Organization","tags":["Organization Members"]}},"/api/orgs/{org_name}/users/invite":{"post":{"callbacks":{},"operationId":"NervesHubWeb.API.OrgUserController.invite","parameters":[{"description":"Organization Name","example":"example_org","in":"path","name":"org_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrgUserCreationRequest"}}},"description":"Org User creation request body","required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrgUserShowResponse"}}},"description":"Organization User - User is added to the organization"},"204":{"description":"Empty response - User is invited to the organization"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Forbidden"}},"security":[{"bearer_auth":[]}],"summary":"Invite a user to the Organization","tags":["Organization Members"]}},"/api/orgs/{org_name}/ca_certificates/{serial}":{"delete":{"callbacks":{},"operationId":"NervesHubWeb.API.CACertificateController.delete","parameters":[{"description":"Organization Name","example":"example_org","in":"path","name":"org_name","required":true,"schema":{"type":"string"}},{"description":"CA Certificate Serial","example":"5111552077003819958","in":"path","name":"serial","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"Empty response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Not Found"}},"security":[{"bearer_auth":[]}],"summary":"Delete an Organization's CA Certificate","tags":["CA Certificates"]},"get":{"callbacks":{},"operationId":"NervesHubWeb.API.CACertificateController.show","parameters":[{"description":"Organization Name","example":"example_org","in":"path","name":"org_name","required":true,"schema":{"type":"string"}},{"description":"CA Certificate Serial","example":"5111552077003819958","in":"path","name":"serial","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CACertificateShowResponse"}}},"description":"CA Certificate response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Not Found"}},"security":[{"bearer_auth":[]}],"summary":"View an Organization's CA Certificate","tags":["CA Certificates"]}},"/api/devices/{identifier}/scripts":{"get":{"callbacks":{},"deprecated":false,"operationId":"NervesHubWeb.API.DevicesController.scripts","parameters":[{"description":"Device Identifier","example":"abc123","in":"path","name":"identifier","required":true,"schema":{"type":"string"}},{"description":"Pagination","in":"query","name":"pagination","required":false,"schema":{"properties":{"page":{"default":1,"example":"5","type":"integer"},"page_size":{"default":10,"example":"20","type":"integer"}},"type":"object"},"style":"deepObject"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SupportScriptIndexResponse"}}},"description":"Support Scripts List Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Forbidden"}},"security":[{"bearer_auth":[]}],"summary":"List Support Scripts","tags":["Devices (short URL)"]}},"/api/devices/{identifier}/reboot":{"post":{"callbacks":{},"deprecated":false,"operationId":"NervesHubWeb.API.DevicesController.reboot.short","parameters":[{"description":"Device Identifier","example":"abc123","in":"path","name":"identifier","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"No content"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Not Found"}},"security":[{"bearer_auth":[]}],"summary":"Request a Device reboot","tags":["Devices (short URL)"]}},"/api/orgs/{org_name}/products/{product_name}/devices/{identifier}/scripts/{name_or_id}":{"post":{"callbacks":{},"deprecated":false,"operationId":"NervesHubWeb.API.ScriptController.send.long","parameters":[{"description":"Organization Name","example":"example_org","in":"path","name":"org_name","required":true,"schema":{"type":"string"}},{"description":"Product Name","example":"example_product","in":"path","name":"product_name","required":true,"schema":{"type":"string"}},{"description":"Device Identifier","example":"abc123","in":"path","name":"identifier","required":true,"schema":{"type":"string"}},{"description":"Support Script Name or ID. Name takes priority.","example":"my-script","in":"path","name":"name_or_id","required":true,"schema":{"oneOf":[{"type":"string"},{"type":"integer"}]}},{"description":"How long to wait for a device response in milliseconds","example":"10000","in":"query","name":"timeout","required":false,"schema":{"type":"integer"}}],"responses":{"200":{"content":{"text/plain":{"schema":{"type":"string"}}},"description":"Script output"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Not Found"}},"security":[{"bearer_auth":[]}],"summary":"Send a Support Script to a Device","tags":["Devices"]}},"/api/devices/{identifier}/move":{"post":{"callbacks":{},"deprecated":false,"operationId":"NervesHubWeb.API.DevicesController.move.short","parameters":[{"description":"Device Identifier","example":"abc123","in":"path","name":"identifier","required":true,"schema":{"type":"string"}},{"description":"New Organization Name","example":"new_example_org","in":"query","name":"new_org_name","required":true,"schema":{"type":"string"}},{"description":"New Product Name","example":"new_example_product","in":"query","name":"new_product_name","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviceResponse"}}},"description":"Device Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Not Found"}},"security":[{"bearer_auth":[]}],"summary":"Move a Device to a different Product","tags":["Devices (short URL)"]}},"/api/orgs/{org_name}/products/{product_name}/devices/{identifier}/network_identities":{"get":{"callbacks":{},"description":"The keys this device has reported holding on other networks — an iroh\nendpoint id, a NetBird, Tailscale or WireGuard public key.\n\n`service` is the protocol. `instance` names which endpoint of it, for a\ndevice running more than one — an iroh console and an iroh application, say.\nAnything running a single endpoint of a service uses `default`.\n","operationId":"NervesHubWeb.API.NetworkIdentityController.index","parameters":[{"description":"Organization Name","example":"example_org","in":"path","name":"org_name","required":true,"schema":{"type":"string"}},{"description":"Product Name","example":"example_product","in":"path","name":"product_name","required":true,"schema":{"type":"string"}},{"description":"Device Identifier","example":"example_device","in":"path","name":"identifier","required":true,"schema":{"type":"string"}},{"description":"Only identities for this protocol","example":"iroh","in":"query","name":"service","required":false,"schema":{"type":"string"}},{"description":"Only this endpoint of the protocol","example":"default","in":"query","name":"instance","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NetworkIdentityListResponse"}}},"description":"Network Identity list response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangesetErrorResponse"}}},"description":"Unknown service"}},"security":[{"bearer_auth":[]}],"summary":"List the Network Identities a Device holds","tags":["Network Identities"]}},"/api/orgs/{org_name}/products/{product_name}/deployments/{name}":{"delete":{"callbacks":{},"operationId":"NervesHubWeb.API.DeploymentGroupController.delete","parameters":[{"description":"Organization Name","example":"example_org","in":"path","name":"org_name","required":true,"schema":{"type":"string"}},{"description":"Product Name","example":"example_product","in":"path","name":"product_name","required":true,"schema":{"type":"string"}},{"description":"Deployment Group Name","example":"production","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"Empty response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Not Found"}},"security":[{"bearer_auth":[]}],"summary":"Delete a Product's Deployment Group","tags":["Deployment Groups"]},"get":{"callbacks":{},"operationId":"NervesHubWeb.API.DeploymentGroupController.show","parameters":[{"description":"Organization Name","example":"example_org","in":"path","name":"org_name","required":true,"schema":{"type":"string"}},{"description":"Product Name","example":"example_product","in":"path","name":"product_name","required":true,"schema":{"type":"string"}},{"description":"Deployment Group Name","example":"production","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeploymentGroupResponse"}}},"description":"Deployment Group response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Not Found"}},"security":[{"bearer_auth":[]}],"summary":"Show a Deployment Group","tags":["Deployment Groups"]},"put":{"callbacks":{},"operationId":"NervesHubWeb.API.DeploymentGroupController.update","parameters":[{"description":"Organization Name","example":"example_org","in":"path","name":"org_name","required":true,"schema":{"type":"string"}},{"description":"Product Name","example":"example_product","in":"path","name":"product_name","required":true,"schema":{"type":"string"}},{"description":"Deployment Group Name","example":"production","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeploymentGroupUpdateRequest"}}},"description":"Deployment Group update request body","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeploymentGroupResponse"}}},"description":"Deployment Group response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Not Found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangesetErrorResponse"}}},"description":"Unprocessable Entity"}},"security":[{"bearer_auth":[]}],"summary":"Update a Deployment Group","tags":["Deployment Groups"]}},"/api/orgs/{org_name}/iroh_endpoints":{"get":{"callbacks":{},"description":"Newest first.\n\n`search` matches the **start** of an endpoint id, and anywhere within a\ndevice identifier or a member's name. Prefix rather than substring on the\nkey because that is the half a caller has: logs and tables show a key\ntruncated, so the beginning is what can be copied out of one.\n","operationId":"NervesHubWeb.API.IrohEndpointController.index","parameters":[{"description":"Organization Name","example":"example_org","in":"path","name":"org_name","required":true,"schema":{"type":"string"}},{"description":"Only endpoints held by this kind of owner, matching the `owner.type` in the response","example":"user","in":"query","name":"owner","required":false,"schema":{"enum":["device","user","none"],"type":"string"}},{"description":"Match the start of an endpoint id, or part of a device identifier or member name","example":"c8924b6c","in":"query","name":"search","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IrohEndpointListResponse"}}},"description":"Iroh Endpoints"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unknown owner"}},"security":[{"bearer_auth":[]}],"summary":"List all Iroh Endpoints for an Organization","tags":["Iroh Endpoints"]},"post":{"callbacks":{},"description":"Records an endpoint id nobody has proven yet, which is the point and also\nthe risk. A key already registered anywhere is refused, without saying\nwhere — whether another organization holds one is that organization's\nbusiness.\n\nA key registered here for a device in this organization is claimed by that\ndevice the next time it connects and proves it, so registering ahead of\nprovisioning needs no cleanup.\n","operationId":"NervesHubWeb.API.IrohEndpointController.create","parameters":[{"description":"Organization Name","example":"example_org","in":"path","name":"org_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IrohEndpointCreateRequest"}}},"description":"Iroh Endpoint registration request body","required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IrohEndpointShowResponse"}}},"description":"Iroh Endpoint"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Forbidden"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Already registered"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangesetErrorResponse"}}},"description":"Unprocessable Entity"}},"security":[{"bearer_auth":[]}],"summary":"Register an Iroh Endpoint for an Organization","tags":["Iroh Endpoints"]}},"/status/alive":{"get":{"callbacks":{},"deprecated":false,"description":"Provides a simple health check to verify that the application is running, responsive, and can connect to the database.","operationId":"Status.alive","parameters":[],"responses":{"200":{"content":{"text/plain":{"schema":{"example":"Hello, Friend!","type":"string"}}},"description":"The application is running and the database is reachable."},"500":{"content":{"text/plain":{"schema":{"example":"Sorry, Friend :(","type":"string"}}},"description":"The application is running but the database is unreachable."}},"security":[],"summary":"Check platform status","tags":["Platform Status"]}},"/api/orgs":{"get":{"callbacks":{},"operationId":"NervesHubWeb.API.OrgController.index","parameters":[{"description":"Comma-separated list of associations to include (e.g. \"products\")","in":"query","name":"include","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrgListResponse"}}},"description":"Organization list response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Forbidden"}},"security":[{"bearer_auth":[]}],"summary":"List all Organizations the authenticated user belongs to","tags":["Organizations"]}},"/api/orgs/{org_name}/keys":{"get":{"callbacks":{},"operationId":"NervesHubWeb.API.KeyController.index","parameters":[{"description":"Organization Name","example":"example_org","in":"path","name":"org_name","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SigningKeyIndexResponse"}}},"description":"Signing Keys"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Forbidden"}},"security":[{"bearer_auth":[]}],"summary":"List all Firmware and Archive Signing Keys for an Organization","tags":["Signing Keys"]},"post":{"callbacks":{},"description":"The `scheme` decides how `key` is validated and what it can verify:\n\n  * `ed25519` (the default) — an fwup signing key, base64 encoded, as\n    produced by `fwup -g`. Verifies `.fw` archives.\n  * `secure_boot_v2_rsa` — a PEM-encoded RSA-3072 public key, the public\n    half of an `espsecure.py` Secure Boot v2 signing key. Verifies ESP-IDF\n    `.bin` images.\n\nA key is only ever a candidate for firmware of its own scheme.\n","operationId":"NervesHubWeb.API.KeyController.create","parameters":[{"description":"Organization Name","example":"example_org","in":"path","name":"org_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SigningKeyCreationRequest"}}},"description":"Signing Key creation request body","required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SigningKeyShowResponse"}}},"description":"Signing Key"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangesetErrorResponse"}}},"description":"Unprocessable Entity"}},"security":[{"bearer_auth":[]}],"summary":"Create a new Signing Key for an Organization","tags":["Signing Keys"]}},"/api/orgs/{org_name}/ca_certificates/verification_token":{"get":{"callbacks":{},"description":"Used to generate a short lived token for use during the creation of a CA Certificate.","operationId":"NervesHubWeb.API.CACertificateController.verification_token","parameters":[{"description":"Organization Name","example":"example_org","in":"path","name":"org_name","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CACertificateVerificationTokenResponse"}}},"description":"CA Certificate verification token response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Forbidden"}},"security":[{"bearer_auth":[]}],"summary":"Generate a token for verifying the ownership of a CA Certificate","tags":["CA Certificates"]}},"/api/orgs/{org_name}/products/{product_name}/deployments":{"get":{"callbacks":{},"operationId":"NervesHubWeb.API.DeploymentGroupController.index","parameters":[{"description":"Organization Name","example":"example_org","in":"path","name":"org_name","required":true,"schema":{"type":"string"}},{"description":"Product Name","example":"example_product","in":"path","name":"product_name","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeploymentGroupListResponse"}}},"description":"Deployment Group list response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Forbidden"}},"security":[{"bearer_auth":[]}],"summary":"List all Deployment Groups for a Product","tags":["Deployment Groups"]},"post":{"callbacks":{},"operationId":"NervesHubWeb.API.DeploymentGroupController.create","parameters":[{"description":"Organization Name","example":"example_org","in":"path","name":"org_name","required":true,"schema":{"type":"string"}},{"description":"Product Name","example":"example_product","in":"path","name":"product_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeploymentGroupCreationRequest"}}},"description":"Deployment Group creation request body","required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeploymentGroupResponse"}}},"description":"Deployment Group response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangesetErrorResponse"}}},"description":"Unprocessable Entity"}},"security":[{"bearer_auth":[]}],"summary":"Create a new Deployment Group for a Product","tags":["Deployment Groups"]}},"/api/devices/{identifier}":{"get":{"callbacks":{},"deprecated":false,"operationId":"NervesHubWeb.API.DevicesController.show.short","parameters":[{"description":"Device Identifier","example":"abc123","in":"path","name":"identifier","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviceResponse"}}},"description":"Device Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Not Found"}},"security":[{"bearer_auth":[]}],"summary":"Show a Device","tags":["Devices (short URL)"]}}},"security":[{"bearer_auth":[]}],"servers":[{"url":"https://manage.nervescloud.com","variables":{}}],"tags":[{"description":"User authentication and API token creation","name":"Auth"},{"description":"Organization Certificate Authority management","name":"CA Certificates"},{"description":"Device management, including action requests eg. upgrade, reboot, reconnect","name":"Devices"},{"description":"Log lines Devices have sent over the logging extension","name":"Device Logs"},{"description":"Device management, including action requests eg. upgrade, reboot, reconnect","name":"Devices (short URL)"},{"description":"Device Certificate management","name":"Device Certificates"},{"description":"Identities a Device holds on networks NervesHub does not run","name":"Network Identities"},{"description":"Deployment Group and release management","name":"Deployment Groups"},{"description":"Firmware uploading and management","name":"Firmwares"},{"description":"Organization iroh endpoint id registration","name":"Iroh Endpoints"},{"description":"Organization management","name":"Organizations"},{"description":"Organization User membership management","name":"Organization Members"},{"description":"Product management","name":"Products"},{"description":"Organization Signing Key management","name":"Signing Keys"},{"description":"Product Support Script management","name":"Support Scripts"},{"description":"Platform healthcheck","name":"Platform Status"}]}