{"openapi":"3.2.0","info":{"title":"Raktic API","version":"5.0.7","description":"The Raktic API stores and serves research image, video, object and sensor data.\n\nAccess is limited by datasource-specific permissions. Contact API Support after registration or when machine-to-machine credentials are required.\n\nLearn more about Raktic at [raktic.fi](https://raktic.fi).","contact":{"name":"API Support","email":"juha.autioniemi@lapinamk.fi"}},"servers":[{"url":"/api/v1","description":"Current server"}],"paths":{"/data-export/internal/claim":{"post":{"operationId":"postDataExportInternalClaim","summary":"POST /data-export/internal/claim","responses":{"200":{"description":"Operation result","content":{"application/json":{"schema":{}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{}}}},"403":{"description":"Insufficient scope","content":{"application/json":{"schema":{}}}},"409":{"description":"Conflicting job","content":{"application/json":{"schema":{}}}},"413":{"description":"Request too large","content":{"application/json":{"schema":{}}}},"503":{"description":"Temporarily unavailable","content":{"application/json":{"schema":{}}}}},"security":[{"bearerAuth":[]}],"x-node-red":{"httpNodeId":"e0a0000000000015","documentationNodeId":"e0a0000000000045","flow":"Data Export Job API"},"description":"Data Export worker operation. Requires a signed App ID access token with app.read and the configured worker identity.","tags":["Data Export jobs"]}},"/data-export/internal/jobs/{jobId}/complete":{"post":{"operationId":"postDataExportInternalJobsJobIdComplete","summary":"POST /data-export/internal/jobs/:jobId/complete","responses":{"200":{"description":"Operation result","content":{"application/json":{"schema":{}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{}}}},"403":{"description":"Insufficient scope","content":{"application/json":{"schema":{}}}},"409":{"description":"Conflicting job","content":{"application/json":{"schema":{}}}},"413":{"description":"Request too large","content":{"application/json":{"schema":{}}}},"503":{"description":"Temporarily unavailable","content":{"application/json":{"schema":{}}}}},"security":[{"bearerAuth":[]}],"x-node-red":{"httpNodeId":"e0a0000000000019","documentationNodeId":"e0a0000000000049","flow":"Data Export Job API"},"description":"Data Export worker operation. Requires a signed App ID access token with app.read and the configured worker identity.","tags":["Data Export jobs"],"parameters":[{"name":"jobId","in":"path","required":true,"schema":{"type":"string"},"description":"Export job identifier"}]}},"/data-export/internal/jobs/{jobId}/completion-state":{"get":{"operationId":"getDataExportInternalJobsJobIdCompletionState","summary":"GET /data-export/internal/jobs/:jobId/completion-state","responses":{"200":{"description":"Operation result","content":{"application/json":{"schema":{}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{}}}},"403":{"description":"Insufficient scope","content":{"application/json":{"schema":{}}}},"409":{"description":"Conflicting job","content":{"application/json":{"schema":{}}}},"413":{"description":"Request too large","content":{"application/json":{"schema":{}}}},"503":{"description":"Temporarily unavailable","content":{"application/json":{"schema":{}}}}},"security":[{"bearerAuth":[]}],"x-node-red":{"httpNodeId":"e0a000000000001b","documentationNodeId":"e0a000000000004b","flow":"Data Export Job API"},"description":"Data Export worker operation. Requires a signed App ID access token with app.read and the configured worker identity.","tags":["Data Export jobs"],"parameters":[{"name":"jobId","in":"path","required":true,"schema":{"type":"string"},"description":"Export job identifier"}]}},"/data-export/internal/jobs/{jobId}/fail":{"post":{"operationId":"postDataExportInternalJobsJobIdFail","summary":"POST /data-export/internal/jobs/:jobId/fail","responses":{"200":{"description":"Operation result","content":{"application/json":{"schema":{}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{}}}},"403":{"description":"Insufficient scope","content":{"application/json":{"schema":{}}}},"409":{"description":"Conflicting job","content":{"application/json":{"schema":{}}}},"413":{"description":"Request too large","content":{"application/json":{"schema":{}}}},"503":{"description":"Temporarily unavailable","content":{"application/json":{"schema":{}}}}},"security":[{"bearerAuth":[]}],"x-node-red":{"httpNodeId":"e0a000000000001a","documentationNodeId":"e0a000000000004a","flow":"Data Export Job API"},"description":"Data Export worker operation. Requires a signed App ID access token with app.read and the configured worker identity.","tags":["Data Export jobs"],"parameters":[{"name":"jobId","in":"path","required":true,"schema":{"type":"string"},"description":"Export job identifier"}]}},"/data-export/internal/jobs/{jobId}/notification-failed":{"post":{"operationId":"postDataExportInternalJobsJobIdNotificationFailed","summary":"POST /data-export/internal/jobs/:jobId/notification-failed","responses":{"200":{"description":"Operation result","content":{"application/json":{"schema":{}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{}}}},"403":{"description":"Insufficient scope","content":{"application/json":{"schema":{}}}},"409":{"description":"Conflicting job","content":{"application/json":{"schema":{}}}},"413":{"description":"Request too large","content":{"application/json":{"schema":{}}}},"503":{"description":"Temporarily unavailable","content":{"application/json":{"schema":{}}}}},"security":[{"bearerAuth":[]}],"x-node-red":{"httpNodeId":"e0a000000000001d","documentationNodeId":"e0a000000000004d","flow":"Data Export Job API"},"description":"Data Export worker operation. Requires a signed App ID access token with app.read and the configured worker identity.","tags":["Data Export jobs"],"parameters":[{"name":"jobId","in":"path","required":true,"schema":{"type":"string"},"description":"Export job identifier"}]}},"/data-export/internal/jobs/{jobId}/notification-sent":{"post":{"operationId":"postDataExportInternalJobsJobIdNotificationSent","summary":"POST /data-export/internal/jobs/:jobId/notification-sent","responses":{"200":{"description":"Operation result","content":{"application/json":{"schema":{}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{}}}},"403":{"description":"Insufficient scope","content":{"application/json":{"schema":{}}}},"409":{"description":"Conflicting job","content":{"application/json":{"schema":{}}}},"413":{"description":"Request too large","content":{"application/json":{"schema":{}}}},"503":{"description":"Temporarily unavailable","content":{"application/json":{"schema":{}}}}},"security":[{"bearerAuth":[]}],"x-node-red":{"httpNodeId":"e0a000000000001c","documentationNodeId":"e0a000000000004c","flow":"Data Export Job API"},"description":"Data Export worker operation. Requires a signed App ID access token with app.read and the configured worker identity.","tags":["Data Export jobs"],"parameters":[{"name":"jobId","in":"path","required":true,"schema":{"type":"string"},"description":"Export job identifier"}]}},"/data-export/internal/jobs/{jobId}/notification/send":{"post":{"operationId":"postDataExportInternalJobsJobIdNotificationSend","summary":"POST /data-export/internal/jobs/:jobId/notification/send","responses":{"200":{"description":"Operation result","content":{"application/json":{"schema":{}}}},"202":{"description":"Dispatch already in progress; retry same lease without resending","content":{"application/json":{"schema":{}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{}}}},"403":{"description":"Insufficient scope","content":{"application/json":{"schema":{}}}},"409":{"description":"Conflicting job","content":{"application/json":{"schema":{}}}},"413":{"description":"Request too large","content":{"application/json":{"schema":{}}}},"503":{"description":"Temporarily unavailable","content":{"application/json":{"schema":{}}}}},"security":[{"bearerAuth":[]}],"x-node-red":{"httpNodeId":"e0a0000000000022","documentationNodeId":"e0a0000000000052","flow":"Data Export Job API"},"description":"Data Export worker operation. Requires a signed App ID access token with app.read and the configured worker identity.","tags":["Data Export jobs"],"parameters":[{"name":"jobId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"workerId":{"type":"string","pattern":"^[A-Za-z0-9._:-]{1,128}$"},"leaseToken":{"type":"string","minLength":16,"maxLength":128}},"required":["workerId","leaseToken"],"additionalProperties":false}}}}}},"/data-export/internal/jobs/{jobId}/progress":{"post":{"operationId":"postDataExportInternalJobsJobIdProgress","summary":"POST /data-export/internal/jobs/:jobId/progress","responses":{"200":{"description":"Operation result","content":{"application/json":{"schema":{}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{}}}},"403":{"description":"Insufficient scope","content":{"application/json":{"schema":{}}}},"409":{"description":"Conflicting job","content":{"application/json":{"schema":{}}}},"413":{"description":"Request too large","content":{"application/json":{"schema":{}}}},"503":{"description":"Temporarily unavailable","content":{"application/json":{"schema":{}}}}},"security":[{"bearerAuth":[]}],"x-node-red":{"httpNodeId":"e0a0000000000018","documentationNodeId":"e0a0000000000048","flow":"Data Export Job API"},"description":"Data Export worker operation. Requires a signed App ID access token with app.read and the configured worker identity.","tags":["Data Export jobs"],"parameters":[{"name":"jobId","in":"path","required":true,"schema":{"type":"string"},"description":"Export job identifier"}]}},"/data-export/internal/jobs/{jobId}/renew-lease":{"post":{"operationId":"postDataExportInternalJobsJobIdRenewLease","summary":"POST /data-export/internal/jobs/:jobId/renew-lease","responses":{"200":{"description":"Operation result","content":{"application/json":{"schema":{}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{}}}},"403":{"description":"Insufficient scope","content":{"application/json":{"schema":{}}}},"409":{"description":"Conflicting job","content":{"application/json":{"schema":{}}}},"413":{"description":"Request too large","content":{"application/json":{"schema":{}}}},"503":{"description":"Temporarily unavailable","content":{"application/json":{"schema":{}}}}},"security":[{"bearerAuth":[]}],"x-node-red":{"httpNodeId":"e0a0000000000017","documentationNodeId":"e0a0000000000047","flow":"Data Export Job API"},"description":"Data Export worker operation. Requires a signed App ID access token with app.read and the configured worker identity.","tags":["Data Export jobs"],"parameters":[{"name":"jobId","in":"path","required":true,"schema":{"type":"string"},"description":"Export job identifier"}]}},"/data-export/internal/maintenance/prune-expired":{"post":{"operationId":"postDataExportInternalMaintenancePruneExpired","summary":"POST /data-export/internal/maintenance/prune-expired","responses":{"200":{"description":"Operation result","content":{"application/json":{"schema":{}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{}}}},"403":{"description":"Insufficient scope","content":{"application/json":{"schema":{}}}},"409":{"description":"Conflicting job","content":{"application/json":{"schema":{}}}},"413":{"description":"Request too large","content":{"application/json":{"schema":{}}}},"503":{"description":"Temporarily unavailable","content":{"application/json":{"schema":{}}}}},"security":[{"bearerAuth":[]}],"x-node-red":{"httpNodeId":"e0a000000000001e","documentationNodeId":"e0a000000000004e","flow":"Data Export Job API"},"description":"Data Export worker operation. Requires a signed App ID access token with app.read and the configured worker identity.","tags":["Data Export jobs"]}},"/data-export/internal/maintenance/prune-owner-slots":{"post":{"operationId":"postDataExportInternalMaintenancePruneOwnerSlots","summary":"POST /data-export/internal/maintenance/prune-owner-slots","responses":{"200":{"description":"Operation result","content":{"application/json":{"schema":{}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{}}}},"403":{"description":"Insufficient scope","content":{"application/json":{"schema":{}}}},"409":{"description":"Conflicting job","content":{"application/json":{"schema":{}}}},"413":{"description":"Request too large","content":{"application/json":{"schema":{}}}},"503":{"description":"Temporarily unavailable","content":{"application/json":{"schema":{}}}}},"security":[{"bearerAuth":[]}],"x-node-red":{"httpNodeId":"e0a000000000001f","documentationNodeId":"e0a000000000004f","flow":"Data Export Job API"},"description":"Data Export worker operation. Requires a signed App ID access token with app.read and the configured worker identity.","tags":["Data Export jobs"]}},"/data-export/internal/maintenance/reconcile-owner-slot":{"post":{"operationId":"postDataExportInternalMaintenanceReconcileOwnerSlot","summary":"POST /data-export/internal/maintenance/reconcile-owner-slot","responses":{"200":{"description":"Operation result","content":{"application/json":{"schema":{}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{}}}},"403":{"description":"Insufficient scope","content":{"application/json":{"schema":{}}}},"409":{"description":"Conflicting job","content":{"application/json":{"schema":{}}}},"413":{"description":"Request too large","content":{"application/json":{"schema":{}}}},"503":{"description":"Temporarily unavailable","content":{"application/json":{"schema":{}}}}},"security":[{"bearerAuth":[]}],"x-node-red":{"httpNodeId":"e0a0000000000020","documentationNodeId":"e0a0000000000050","flow":"Data Export Job API"},"description":"Data Export worker operation. Requires a signed App ID access token with app.read and the configured worker identity.","tags":["Data Export jobs"]}},"/data-export/internal/notifications/claim":{"post":{"operationId":"postDataExportInternalNotificationsClaim","summary":"POST /data-export/internal/notifications/claim","responses":{"200":{"description":"Operation result","content":{"application/json":{"schema":{}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{}}}},"403":{"description":"Insufficient scope","content":{"application/json":{"schema":{}}}},"409":{"description":"Conflicting job","content":{"application/json":{"schema":{}}}},"413":{"description":"Request too large","content":{"application/json":{"schema":{}}}},"503":{"description":"Temporarily unavailable","content":{"application/json":{"schema":{}}}}},"security":[{"bearerAuth":[]}],"x-node-red":{"httpNodeId":"e0a0000000000016","documentationNodeId":"e0a0000000000046","flow":"Data Export Job API"},"description":"Data Export worker operation. Requires a signed App ID access token with app.read and the configured worker identity.","tags":["Data Export jobs"]}},"/data-export/internal/notifications/claim-v2":{"post":{"operationId":"postDataExportInternalNotificationsClaimV2","summary":"POST /data-export/internal/notifications/claim-v2","responses":{"200":{"description":"Operation result","content":{"application/json":{"schema":{}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{}}}},"403":{"description":"Insufficient scope","content":{"application/json":{"schema":{}}}},"409":{"description":"Conflicting job","content":{"application/json":{"schema":{}}}},"413":{"description":"Request too large","content":{"application/json":{"schema":{}}}},"503":{"description":"Temporarily unavailable","content":{"application/json":{"schema":{}}}}},"security":[{"bearerAuth":[]}],"x-node-red":{"httpNodeId":"e0a0000000000021","documentationNodeId":"e0a0000000000051","flow":"Data Export Job API"},"description":"Data Export worker operation. Requires a signed App ID access token with app.read and the configured worker identity.","tags":["Data Export jobs"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"workerId":{"type":"string","pattern":"^[A-Za-z0-9._:-]{1,128}$"}},"required":["workerId"],"additionalProperties":false}}}}}},"/data-export/jobs":{"get":{"operationId":"getDataExportJobs","summary":"GET /data-export/jobs","responses":{"200":{"description":"Operation result","content":{"application/json":{"schema":{}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{}}}},"403":{"description":"Insufficient scope","content":{"application/json":{"schema":{}}}},"409":{"description":"Conflicting job","content":{"application/json":{"schema":{}}}},"413":{"description":"Request too large","content":{"application/json":{"schema":{}}}},"503":{"description":"Temporarily unavailable","content":{"application/json":{"schema":{}}}}},"security":[{"bearerAuth":[]}],"x-node-red":{"httpNodeId":"e0a0000000000010","documentationNodeId":"e0a0000000000040","flow":"Data Export Job API"},"description":"Data Export job operation. Requires a signed App ID user access token; ownership is derived from its subject.","tags":["Data Export jobs"]},"post":{"operationId":"postDataExportJobs","summary":"POST /data-export/jobs","responses":{"201":{"description":"Operation result","content":{"application/json":{"schema":{}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{}}}},"403":{"description":"Insufficient scope","content":{"application/json":{"schema":{}}}},"409":{"description":"Conflicting job","content":{"application/json":{"schema":{}}}},"413":{"description":"Request too large","content":{"application/json":{"schema":{}}}},"503":{"description":"Temporarily unavailable","content":{"application/json":{"schema":{}}}}},"security":[{"bearerAuth":[]}],"x-node-red":{"httpNodeId":"e0a0000000000011","documentationNodeId":"e0a0000000000041","flow":"Data Export Job API"},"description":"Create an export. Requires an App ID user token with app.read or the selected datasource read scope. Ownership and an optional notification recipient come from the authenticated identity.","tags":["Data Export jobs"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"selection":{"type":"object","properties":{"datasource":{"type":"string"}},"required":["datasource"],"additionalProperties":true},"notify":{"type":"boolean","default":false}},"required":["selection"],"additionalProperties":true}}},"description":"The optional notification is sent only to the authenticated user's App ID profile email."}}},"/data-export/jobs/{jobId}":{"get":{"operationId":"getDataExportJobsJobId","summary":"GET /data-export/jobs/:jobId","responses":{"200":{"description":"Operation result","content":{"application/json":{"schema":{}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{}}}},"403":{"description":"Insufficient scope","content":{"application/json":{"schema":{}}}},"409":{"description":"Conflicting job","content":{"application/json":{"schema":{}}}},"413":{"description":"Request too large","content":{"application/json":{"schema":{}}}},"503":{"description":"Temporarily unavailable","content":{"application/json":{"schema":{}}}}},"security":[{"bearerAuth":[]}],"x-node-red":{"httpNodeId":"e0a0000000000012","documentationNodeId":"e0a0000000000042","flow":"Data Export Job API"},"description":"Data Export job operation. Requires a signed App ID user access token; ownership is derived from its subject.","tags":["Data Export jobs"],"parameters":[{"name":"jobId","in":"path","required":true,"schema":{"type":"string"},"description":"Export job identifier"}]}},"/data-export/jobs/{jobId}/cancel":{"post":{"operationId":"postDataExportJobsJobIdCancel","summary":"POST /data-export/jobs/:jobId/cancel","responses":{"200":{"description":"Operation result","content":{"application/json":{"schema":{}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{}}}},"403":{"description":"Insufficient scope","content":{"application/json":{"schema":{}}}},"409":{"description":"Conflicting job","content":{"application/json":{"schema":{}}}},"413":{"description":"Request too large","content":{"application/json":{"schema":{}}}},"503":{"description":"Temporarily unavailable","content":{"application/json":{"schema":{}}}}},"security":[{"bearerAuth":[]}],"x-node-red":{"httpNodeId":"e0a0000000000013","documentationNodeId":"e0a0000000000043","flow":"Data Export Job API"},"description":"Data Export job operation. Requires a signed App ID user access token; ownership is derived from its subject.","tags":["Data Export jobs"],"parameters":[{"name":"jobId","in":"path","required":true,"schema":{"type":"string"},"description":"Export job identifier"}]}},"/data-export/jobs/{jobId}/download-object":{"get":{"operationId":"getDataExportJobsJobIdDownloadObject","summary":"GET /data-export/jobs/:jobId/download-object","responses":{"200":{"description":"Operation result","content":{"application/json":{"schema":{}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{}}}},"403":{"description":"Insufficient scope","content":{"application/json":{"schema":{}}}},"409":{"description":"Conflicting job","content":{"application/json":{"schema":{}}}},"413":{"description":"Request too large","content":{"application/json":{"schema":{}}}},"503":{"description":"Temporarily unavailable","content":{"application/json":{"schema":{}}}}},"security":[{"bearerAuth":[]}],"x-node-red":{"httpNodeId":"e0a0000000000014","documentationNodeId":"e0a0000000000044","flow":"Data Export Job API"},"description":"Data Export job operation. Requires a signed App ID user access token; ownership is derived from its subject.","tags":["Data Export jobs"],"parameters":[{"name":"jobId","in":"path","required":true,"schema":{"type":"string"},"description":"Export job identifier"}]}},"/datasource":{"get":{"operationId":"getDatasource","summary":"List accessible datasources","responses":{"200":{"description":"Request OK.","content":{"application/json":{"schema":{}}}},"400":{"description":"Error. Check response body for details.","content":{"application/json":{"schema":{}}}},"401":{"description":"Unauthorized. Check response body for details.","content":{"application/json":{"schema":{}}}},"406":{"description":"No acceptable response encoding. Empty response body."},"429":{"description":"Too many requests.","content":{"application/json":{"schema":{}}}},"500":{"description":"Internal server error. Please contact system administrator if this happens often.","content":{"application/json":{"schema":{}}}}},"security":[{"bearerAuth":[]},{"queryToken":[]},{"apiUser":[],"apiKey":[]}],"x-node-red":{"httpNodeId":"3bbb92c5.2254de","documentationNodeId":"5fbc8a9d.42f9b4","flow":"/datasources"},"description":"Lists metadata for datasources available to the authenticated caller. JSON responses support br (Brotli), gzip, deflate and identity via Accept-Encoding; an unacceptable encoding returns an empty HTTP 406 response.","tags":["Datasource operations"],"parameters":[{"name":"gallery_id","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"}},"description":"Gallery identifier. Return datasources available for selected gallery.","style":"form","explode":true},{"name":"Accept-Encoding","in":"header","required":false,"schema":{"type":"string"},"description":"Accepted response encodings: br, gzip, deflate, identity; quality weights and wildcard are supported. q=0 forbids an encoding."}]}},"/datasource/id/{id}":{"get":{"operationId":"getDatasourceIdId","summary":"Get datasource metadata","responses":{"200":{"description":"Request OK.","content":{"application/json":{"schema":{}}}},"400":{"description":"Error. Check response body for details.","content":{"application/json":{"schema":{}}}},"401":{"description":"Unauthorized. Check response body for details.","content":{"application/json":{"schema":{}}}},"429":{"description":"Too many requests.","content":{"application/json":{"schema":{}}}},"500":{"description":"Internal server error. Please contact system administrator if this happens often.","content":{"application/json":{"schema":{}}}}},"security":[{"bearerAuth":[]},{"queryToken":[]},{"apiUser":[],"apiKey":[]}],"x-node-red":{"httpNodeId":"8c5aabe3.67e378","documentationNodeId":"83a0765e.c5a8a8","flow":"/datasources"},"description":"Returns metadata for one datasource when the caller has access to it.","tags":["Datasource operations"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/galleries":{"get":{"operationId":"getGalleries","summary":"List accessible galleries","responses":{"200":{"description":"Request OK.","content":{"application/json":{"schema":{}}}},"400":{"description":"Error. Check response body for details.","content":{"application/json":{"schema":{}}}},"401":{"description":"Unauthorized. Check response body for details.","content":{"application/json":{"schema":{}}}},"406":{"description":"No acceptable response encoding. Empty response body."},"429":{"description":"Too many requests.","content":{"application/json":{"schema":{}}}},"500":{"description":"Internal server error. Please contact system administrator if this happens often.","content":{"application/json":{"schema":{}}}}},"security":[{"bearerAuth":[]},{"queryToken":[]},{"apiUser":[],"apiKey":[]}],"x-node-red":{"httpNodeId":"429b57550a449929","documentationNodeId":"0d7732d60a7fcc61","flow":"/datasources"},"description":"Lists gallery metadata available to the authenticated caller. JSON responses support br (Brotli), gzip, deflate and identity via Accept-Encoding; an unacceptable encoding returns an empty HTTP 406 response.","tags":["Datasource operations"],"parameters":[{"name":"Accept-Encoding","in":"header","required":false,"schema":{"type":"string"},"description":"Accepted response encodings: br, gzip, deflate, identity; quality weights and wildcard are supported. q=0 forbids an encoding."}]}},"/image":{"get":{"operationId":"getImage","summary":"List image metadata","responses":{"200":{"description":"Request OK.","content":{"application/json":{"schema":{}}}},"400":{"description":"Error. Check response body for details..","content":{"application/json":{"schema":{}}}},"401":{"description":"Unauthorized. Check response body for details..","content":{"application/json":{"schema":{}}}},"406":{"description":"No acceptable response encoding. Empty response body."},"429":{"description":"Too many request.","content":{"application/json":{"schema":{}}}},"500":{"description":"Internal server error. Please contact system administrator if this happens often.","content":{"application/json":{"schema":{}}}}},"security":[{"bearerAuth":[]},{"queryToken":[]},{"apiUser":[],"apiKey":[]}],"x-node-red":{"httpNodeId":"28b555aa.46afea","documentationNodeId":"99ebcc31.e7249","flow":"/image"},"description":"Lists image metadata available to the authenticated caller. Supports datasource and time filters, pagination and selected fields. JSON responses support br (Brotli), gzip, deflate and identity via Accept-Encoding; an unacceptable encoding returns an empty HTTP 406 response.","tags":["Image operations"],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer"},"description":"Limit number of returned values. Default is 100 and maximum value is 1000."},{"name":"start_time","in":"query","required":false,"schema":{"type":"string","format":"date-time"},"description":"Set start time. Values after start_time are returned. Time format is ISO8601 UTC,  2021-04-26T00:00:00Z. This is the time when image is actually created."},{"name":"end_time","in":"query","required":false,"schema":{"type":"string","format":"date-time"},"description":"Set end time. Values after end time are not returned. End time parameter can not be used alone. Time format is ISO8601 UTC,  2021-04-26T00:00:00Z. This is the time when image is actually created."},{"name":"datasource","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"}},"description":"Limit returned values by datasource(s).","style":"form","explode":true},{"name":"bookmark","in":"query","required":false,"schema":{"type":"string"},"description":"Use returned bookmark to fetch more results."},{"name":"sort","in":"query","required":false,"schema":{"type":"string"},"description":"Sort results by time. Possible values are \"asc\" or \"desc\"."},{"name":"fields","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"}},"description":"Array of fields that will be returned in response  To get available fields, please query single document without fields parameters.","style":"form","explode":true},{"name":"server_timestamp_start","in":"query","required":false,"schema":{"type":"string","format":"date-time"},"description":"Set start time to query using server timestamp. Values after server_timestamp_start are returned. Time format is ISO8601 UTC,  2021-04-26T00:00:00Z. Do not use this parameter together with \"start_time\" or \"end_time\". This is the time when server has received the image."},{"name":"server_timestamp_end","in":"query","required":false,"schema":{"type":"string","format":"date-time"},"description":"Set endtime to query using server timestamp. Values after server_timestamp_end are returned. Time format is ISO8601 UTC,  2021-04-26T00:00:00Z. Do not use this parameter together with \"start_time\" or \"end_time\". This is the time when server has received the image."},{"name":"Accept-Encoding","in":"header","required":false,"schema":{"type":"string"},"description":"Accepted response encodings: br, gzip, deflate, identity; quality weights and wildcard are supported. q=0 forbids an encoding."}]}},"/image/add":{"post":{"operationId":"postImageAdd","summary":"Add or update an image","responses":{"200":{"description":"Request OK.","content":{"application/json":{"schema":{}}}},"400":{"description":"Error. Check response body for details.","content":{"application/json":{"schema":{}}}},"401":{"description":"Unauthorized. Check response body for details.","content":{"application/json":{"schema":{}}}},"429":{"description":"Too many requests.","content":{"application/json":{"schema":{}}}},"500":{"description":"Internal server error. Please contact system administrator if this happens often.","content":{"application/json":{"schema":{}}}}},"security":[{"bearerAuth":[]},{"queryToken":[]},{"apiUser":[],"apiKey":[]}],"x-node-red":{"httpNodeId":"d224571c.86df68","documentationNodeId":"327587a5.cec128","flow":"/image"},"description":"Adds one image or updates an existing image document. Supply _id and _rev when updating an existing document.","tags":["Image operations"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"}}},"description":"JSON document supplied by an API client. If you wish to update document data add document '_id' and '_rev' to payload."}}},"/image/delete/id/{id}":{"delete":{"operationId":"deleteImageDeleteIdId","summary":"Delete an image","responses":{"200":{"description":"Request OK.","content":{"application/json":{"schema":{}}}},"400":{"description":"Error. Check response body for details.","content":{"application/json":{"schema":{}}}},"401":{"description":"Unauthorized. Check response body for details.","content":{"application/json":{"schema":{}}}},"429":{"description":"Too many requests.","content":{"application/json":{"schema":{}}}},"500":{"description":"Internal server error. Please contact system administrator if this happens often.","content":{"application/json":{"schema":{}}}},"502":{"description":"Object storage deletion failed; metadata was retained for retry.","content":{"application/json":{"schema":{}}}}},"security":[{"bearerAuth":[]},{"queryToken":[]},{"apiUser":[],"apiKey":[]}],"x-node-red":{"httpNodeId":"6ec43101.f86a7","documentationNodeId":"1945b6bb.32c129","flow":"/image"},"description":"Deletes the image document and any object storage images referenced by its metadata.","tags":["Image operations"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Image id"}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"delete_object":{"type":"boolean"}}}}},"description":"If true delete images from Object Storage. Otherwise leave objects in Object Storage and deletes only metadata document from Cloudant instance. Default is not to delete images."}}},"/image/id/{id}":{"get":{"operationId":"getImageIdId","summary":"Get image metadata","responses":{"200":{"description":"Request OK.","content":{"application/json":{"schema":{}}}},"400":{"description":"Error. Check response body for details.","content":{"application/json":{"schema":{}}}},"401":{"description":"Unauthorized. Check response body for details.","content":{"application/json":{"schema":{}}}},"429":{"description":"Too many requests.","content":{"application/json":{"schema":{}}}},"500":{"description":"Internal server error. Please contact system administrator if this happens often.","content":{"application/json":{"schema":{}}}}},"security":[{"bearerAuth":[]},{"queryToken":[]},{"apiUser":[],"apiKey":[]}],"x-node-red":{"httpNodeId":"6efe249b.da780c","documentationNodeId":"75883737.2f22d8","flow":"/image"},"description":"Returns metadata for the image identified by id.","tags":["Image operations"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/image/id/{id}/data/{type}":{"get":{"operationId":"getImageIdIdDataType","summary":"Download image data","responses":{"200":{"description":"Request OK.","content":{"image/jpeg":{"schema":{"type":"string","format":"binary"}},"image/png":{"schema":{"type":"string","format":"binary"}}}},"400":{"description":"Error. Check response body for details.","content":{"application/json":{"schema":{}}}},"401":{"description":"Unauthorized. Check response body for details.","content":{"application/json":{"schema":{}}}},"429":{"description":"Too many requests.","content":{"application/json":{"schema":{}}}},"500":{"description":"Internal server error. Please contact system administrator if this happens often.","content":{"application/json":{"schema":{}}}}},"security":[{"bearerAuth":[]},{"queryToken":[]},{"apiUser":[],"apiKey":[]}],"x-node-red":{"httpNodeId":"d8abef17.a05d1","documentationNodeId":"be82482e.a2af08","flow":"/image"},"description":"Downloads the selected image representation.","tags":["Image operations"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Image identification"},{"name":"type","in":"path","required":true,"schema":{"type":"string"},"description":"Image type. Possible types are 'original' and 'annotated'."}]}},"/refresh":{"post":{"operationId":"postRefresh","summary":"Token refresh unavailable","responses":{"501":{"description":"Token refresh is unavailable. Request a new token with POST /token.","content":{"application/json":{"schema":{}}}}},"security":[],"x-node-red":{"httpNodeId":"1f413cf9.6a2ed3","documentationNodeId":"9d0523bf.65d8b","flow":"/token"},"description":"This endpoint is disabled and returns HTTP 501. Obtain a new token with POST /token.","tags":["Authorize"]}},"/sensordata/add":{"post":{"operationId":"postSensordataAdd","summary":"Add a sensor reading","responses":{"200":{"description":"OK.","content":{"application/json":{"schema":{}}}},"201":{"description":"OK.","content":{"application/json":{"schema":{}}}},"400":{"description":"Error.","content":{"application/json":{"schema":{}}}},"401":{"description":"Unauthorized.","content":{"application/json":{"schema":{}}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{}}}}},"security":[{"bearerAuth":[]},{"queryToken":[]},{"apiUser":[],"apiKey":[]}],"x-node-red":{"httpNodeId":"4c46a4785c677e2a","documentationNodeId":"e35b887c36418b34","flow":"/add"},"description":"Adds one sensor reading using the required device_id and device_type headers.","tags":["Sensor data operations"],"parameters":[{"name":"device_id","in":"header","required":true,"schema":{"type":"string"},"description":"Device unique identifier."},{"name":"device_type","in":"header","required":true,"schema":{"type":"string"},"description":"Device type."},{"name":"hub_id","in":"header","required":false,"schema":{"type":"string"},"description":"Device unique identifier. Typically cellular modem IMEI."}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}},"description":"JSON payload."}}},"/sensordata/add/multiple":{"post":{"operationId":"postSensordataAddMultiple","summary":"Add multiple sensor readings","responses":{"200":{"description":"OK. Returns array of objects. Each object has device_id as key and status code as value.","headers":{"X-Operation-Id":{"description":"Persistent write tracking operation ID; individual database writes may still be pending.","schema":{"type":"string","format":"uuid"}}},"content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":{"type":"integer"}}}}}},"400":{"description":"Error.","content":{"application/json":{"schema":{}}}},"401":{"description":"Unauthorized.","content":{"application/json":{"schema":{}}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{}}}},"503":{"description":"Write tracking could not be persisted; no target write was started.","content":{"application/json":{"schema":{}}}}},"security":[{"bearerAuth":[]},{"queryToken":[]},{"apiUser":[],"apiKey":[]}],"x-node-red":{"httpNodeId":"eaddd03013c232c0","documentationNodeId":"4ea06a63fd452f44","flow":"/add"},"description":"Accepts multiple sensor readings. HTTP 200 means authorized write targets were recorded in the tracking database; individual database writes can still be pending. The X-Operation-Id header identifies the operation.","tags":["Sensor data operations"],"parameters":[{"name":"hub_id","in":"header","required":false,"schema":{"type":"string"},"description":"Device unique identifier. Typically cellular modem IMEI."}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"array","items":{"type":"object"}}}},"description":"Array of JSON payloads."}}},"/sensordata/archive/query":{"post":{"operationId":"postSensordataArchiveQuery","summary":"Query archived sensor data","responses":{"200":{"description":"Sensor data query results.","content":{"application/json":{"schema":{}}}},"400":{"description":"Invalid query.","content":{"application/json":{"schema":{}}}},"401":{"description":"Unauthorized.","content":{"application/json":{"schema":{}}}},"406":{"description":"No acceptable response encoding. Empty response body."},"429":{"description":"Too many requests.","content":{"application/json":{"schema":{}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{}}}}},"security":[{"bearerAuth":[]},{"queryToken":[]},{"apiUser":[],"apiKey":[]}],"x-node-red":{"httpNodeId":"4f6350ee33b33573","documentationNodeId":"cc04b259f91136fe","flow":"/find"},"description":"Queries the configured sensor archive for a selected datasource. JSON responses support br (Brotli), gzip, deflate and identity via Accept-Encoding; an unacceptable encoding returns an empty HTTP 406 response. Large responses can take substantial time and are buffered before delivery.","tags":["Sensor data operations"],"parameters":[{"name":"Accept-Encoding","in":"header","required":false,"schema":{"type":"string"},"description":"Accepted response encodings: br, gzip, deflate, identity; quality weights and wildcard are supported. q=0 forbids an encoding."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url_path":{"type":"string"},"datasource":{"type":"string"}},"required":["url_path","datasource"]}}},"description":"**url_path:** Use CouchDB view query syntax:<br> <code>{database}/_design/{design_doc_name}/_view/{view_name}?{parameters}</code>  <br></br>  For example:<br> <code>fronius/_design/average_local_time/_view/by_did_subdids_sid_date?reduce=true&group_level=6&group=true&start_key=[\"240.1441800\",\"inv\",\"2\",2022,4,1,0,0,0]&end_key=[\"240.1441800\",\"inv\",\"2\",2030,1,1,0,0,0]</code>  <br><br>Currently its not possible to query available design docs and views.<br><br>Default value for design doc is <b>\"average\"</b> and default value for view is <b>\"by_did_subdids_sid_date\"</b> if datasource uses the nested sensor format and <b>\"by_did_sid_date\"</b> if basic format is used.\n\n**datasource:** Datasource identification eg. \"s-1\"."}}},"/sensordata/config":{"get":{"operationId":"getSensordataConfig","summary":"Get device configuration","responses":{"200":{"description":"JSON object of parameters.","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Error.","content":{"application/json":{"schema":{}}}},"401":{"description":"Not authorized.","content":{"application/json":{"schema":{}}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{}}}}},"security":[{"hubId":[]}],"x-node-red":{"httpNodeId":"985909924998c097","documentationNodeId":"1f03ce06b7d16110","flow":"/add"},"description":"Returns configuration parameters for the authorized device.","tags":["Sensor data operations"]}},"/sensordata/datasource/{datasource}/find":{"post":{"operationId":"postSensordataDatasourceDatasourceFind","summary":"Find sensor data in a datasource","responses":{"200":{"description":"Sensor data query results.","content":{"application/json":{"schema":{}}}},"400":{"description":"Invalid query.","content":{"application/json":{"schema":{}}}},"401":{"description":"Unauthorized.","content":{"application/json":{"schema":{}}}},"406":{"description":"No acceptable response encoding. Empty response body."},"429":{"description":"Too many requests.","content":{"application/json":{"schema":{}}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{}}}}},"security":[{"bearerAuth":[]},{"queryToken":[]},{"apiUser":[],"apiKey":[]}],"x-node-red":{"httpNodeId":"eb916c10866d41e6","documentationNodeId":"b0b2b22892428570","flow":"/find"},"description":"Runs a JSON selector query in the selected Cloudant or archive datasource. JSON responses support br (Brotli), gzip, deflate and identity via Accept-Encoding; an unacceptable encoding returns an empty HTTP 406 response. Large responses are buffered before delivery.","tags":["Sensor data operations"],"parameters":[{"name":"datasource","in":"path","required":true,"schema":{"type":"string"},"description":"Datasource."},{"name":"Accept-Encoding","in":"header","required":false,"schema":{"type":"string"},"description":"Accepted response encodings: br, gzip, deflate, identity; quality weights and wildcard are supported. q=0 forbids an encoding. Example: br, gzip;q=0.8, deflate;q=0.5."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"query":{"type":"object"},"archive":{"type":"boolean"}},"required":["query","archive"]}}},"description":"**query:** Find documents using a declarative JSON querying syntax.\n\n**archive:** True = use archive database and false = use cloud database."}}},"/sensordata/datasource/{datasource}/sensor/{sensor}":{"get":{"operationId":"getSensordataDatasourceDatasourceSensorSensor","summary":"Get sensor readings","responses":{"200":{"description":"Request OK.","content":{"application/json":{"schema":{}}}},"400":{"description":"Error. Check response body for details..","content":{"application/json":{"schema":{}}}},"401":{"description":"Unauthorized. Check response body for details..","content":{"application/json":{"schema":{}}}},"406":{"description":"No acceptable response encoding. Empty response body."},"429":{"description":"Too many request.","content":{"application/json":{"schema":{}}}},"500":{"description":"Internal server error. Please contact system administrator if this happens often.","content":{"application/json":{"schema":{}}}}},"security":[{"bearerAuth":[]},{"queryToken":[]},{"apiUser":[],"apiKey":[]}],"x-node-red":{"httpNodeId":"7623bdbaaf5f2cb9","documentationNodeId":"0d2bbff52e138be3","flow":"/sensordata"},"description":"Returns RAW or aggregated readings for a sensor and time range. RAW queries may require many pages and can produce large responses. JSON responses support br (Brotli), gzip, deflate and identity via Accept-Encoding; an unacceptable encoding returns an empty HTTP 406 response.","tags":["Sensor data operations"],"parameters":[{"name":"datasource","in":"path","required":true,"schema":{"type":"string"},"description":"Datasource ID."},{"name":"sensor","in":"path","required":true,"schema":{"type":"string"},"description":"Sensor ID."},{"name":"start_time","in":"query","required":true,"schema":{"type":"string","format":"date-time"},"description":"ISO8601 UTC timestamp."},{"name":"end_time","in":"query","required":true,"schema":{"type":"string","format":"date-time"},"description":"ISO8601 UTC timestamp."},{"name":"aggregation","in":"query","required":false,"schema":{"type":"string"},"description":"Aggregation level. Returns aggregated values over selected time period. Possible time periods: year, month, day, hour, minute or none. For example if \"hour\" is selected, returns exactly one value for each hour."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer"},"description":"Limit number of returned results."},{"name":"skip","in":"query","required":false,"schema":{"type":"integer"},"description":"Skip results starting from beginning."},{"name":"format","in":"query","required":false,"schema":{"type":"string"},"description":"Response formatting. Default is raw. Options = \"raw\", \"plotly\", \"chartjs\""},{"name":"timezone","in":"query","required":false,"schema":{"type":"string"},"description":"Timezone for timestamp. Default is UTC. Timezone format is standard format, for example \"Europe/Helsinki\"."},{"name":"Accept-Encoding","in":"header","required":false,"schema":{"type":"string"},"description":"Accepted response encodings: br, gzip, deflate, identity; quality weights and wildcard are supported. q=0 forbids an encoding. Example: br, gzip;q=0.8, deflate;q=0.5."},{"name":"archive","in":"query","required":false,"schema":{"type":"boolean"},"description":"true = use archive database and false = use cloud database."}]}},"/token":{"post":{"operationId":"postToken","summary":"Issue an access token","responses":{"200":{"description":"Request OK.","content":{"application/json":{"schema":{}}}},"400":{"description":"Error. Check response body for details.","content":{"application/json":{"schema":{}}}},"401":{"description":"Unauthorized. Check response body for details.","content":{"application/json":{"schema":{}}}},"429":{"description":"Too many requests.","content":{"application/json":{"schema":{}}}},"500":{"description":"Internal server error. Please contact system administrator if this happens often.","content":{"application/json":{"schema":{}}}}},"security":[],"x-node-red":{"httpNodeId":"da72b19b3b64857c","documentationNodeId":"391b30b068066440","flow":"/token"},"description":"Exchanges the supplied username and password for an access token. Send the token with protected API requests, preferably in the Authorization header.","tags":["Authorize"],"requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"type":"object","properties":{"username":{"type":"string","format":"email","description":"Email address"},"password":{"type":"string","format":"password","description":"Password"}},"required":["username","password"]}}}}}},"/video":{"get":{"operationId":"getVideo","summary":"List video metadata","responses":{"200":{"description":"Request OK.","content":{"application/json":{"schema":{}}}},"400":{"description":"Error. Check response body for details..","content":{"application/json":{"schema":{}}}},"401":{"description":"Unauthorized. Check response body for details..","content":{"application/json":{"schema":{}}}},"406":{"description":"No acceptable response encoding. Empty response body."},"429":{"description":"Too many request.","content":{"application/json":{"schema":{}}}},"500":{"description":"Internal server error. Please contact system administrator if this happens often.","content":{"application/json":{"schema":{}}}}},"security":[{"bearerAuth":[]},{"queryToken":[]},{"apiUser":[],"apiKey":[]}],"x-node-red":{"httpNodeId":"dbe4f04ab542bb2a","documentationNodeId":"e79d6b522fbd52df","flow":"/video"},"description":"Lists video metadata available to the authenticated caller. Supports datasource and time filters, pagination and selected fields. JSON responses support br (Brotli), gzip, deflate and identity via Accept-Encoding; an unacceptable encoding returns an empty HTTP 406 response.","tags":["Video operations"],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer"},"description":"Limit number of returned values. Default is 100 and maximum value is 1000."},{"name":"start_time","in":"query","required":false,"schema":{"type":"string","format":"date-time"},"description":"Set start time. Values after start_time are returned. Time format is ISO8601 UTC,  2021-04-26T00:00:00Z."},{"name":"end_time","in":"query","required":false,"schema":{"type":"string","format":"date-time"},"description":"Set end time. Values after end time are not returned. End time parameter can not be used alone. Time format is ISO8601 UTC,  2021-04-26T00:00:00Z."},{"name":"datasource","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"}},"description":"Limit returned values by datasource(s).","style":"form","explode":true},{"name":"bookmark","in":"query","required":false,"schema":{"type":"string"},"description":"Use bookmark to fetch more results."},{"name":"sort","in":"query","required":false,"schema":{"type":"string"},"description":"Sort results by time. Possible values are \"asc\" or \"desc\"."},{"name":"fields","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"}},"description":"Array of fields that will be returned in response  To get available fields, please query single document without fields parameters.","style":"form","explode":true},{"name":"Accept-Encoding","in":"header","required":false,"schema":{"type":"string"},"description":"Accepted response encodings: br, gzip, deflate, identity; quality weights and wildcard are supported. q=0 forbids an encoding."}]}},"/video/add":{"post":{"operationId":"postVideoAdd","summary":"Add or update a video","responses":{"200":{"description":"Metadata stored in Cloudant; COS upload outcome is tracked separately.","headers":{"X-Operation-Id":{"description":"Persistent write tracking operation ID.","schema":{"type":"string","format":"uuid"}}},"content":{"application/json":{"schema":{}}}},"400":{"description":"Error. Check response body for details.","content":{"application/json":{"schema":{}}}},"401":{"description":"Unauthorized. Check response body for details.","content":{"application/json":{"schema":{}}}},"429":{"description":"Too many requests.","content":{"application/json":{"schema":{}}}},"500":{"description":"Internal server error. Please contact system administrator if this happens often.","content":{"application/json":{"schema":{}}}},"503":{"description":"Write tracking could not be persisted; no target write was started.","content":{"application/json":{"schema":{}}}}},"security":[{"bearerAuth":[]},{"queryToken":[]},{"apiUser":[],"apiKey":[]}],"x-node-red":{"httpNodeId":"84a3a5d5d3c52c4d","documentationNodeId":"d37c70712ee2b420","flow":"/video"},"description":"Adds one video clip or updates an existing video document. Supply _id and _rev when updating an existing document. The X-Operation-Id header identifies the tracked write.","tags":["Video operations"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"}}},"description":"JSON document supplied by an API client. If you wish to update document data add document '_id' and '_rev' to payload."}}},"/video/delete/id/{id}":{"delete":{"operationId":"deleteVideoDeleteIdId","summary":"Delete a video","responses":{"200":{"description":"Request OK.","content":{"application/json":{"schema":{}}}},"400":{"description":"Error. Check response body for details.","content":{"application/json":{"schema":{}}}},"401":{"description":"Unauthorized. Check response body for details.","content":{"application/json":{"schema":{}}}},"429":{"description":"Too many requests.","content":{"application/json":{"schema":{}}}},"500":{"description":"Internal server error. Please contact system administrator if this happens often.","content":{"application/json":{"schema":{}}}},"502":{"description":"Object storage deletion failed; metadata was retained for retry.","content":{"application/json":{"schema":{}}}}},"security":[{"bearerAuth":[]},{"queryToken":[]},{"apiUser":[],"apiKey":[]}],"x-node-red":{"httpNodeId":"caf96a26036db3f9","documentationNodeId":"c4abcdb203457561","flow":"/video"},"description":"Deletes the video document and any object storage clip referenced by its metadata.","tags":["Video operations"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Video clip unique identifier."}]}},"/video/id/{id}":{"get":{"operationId":"getVideoIdId","summary":"Get video metadata","responses":{"200":{"description":"Request OK.","content":{"application/json":{"schema":{}}}},"400":{"description":"Error. Check response body for details.","content":{"application/json":{"schema":{}}}},"401":{"description":"Unauthorized. Check response body for details.","content":{"application/json":{"schema":{}}}},"429":{"description":"Too many requests.","content":{"application/json":{"schema":{}}}},"500":{"description":"Internal server error. Please contact system administrator if this happens often.","content":{"application/json":{"schema":{}}}}},"security":[{"bearerAuth":[]},{"queryToken":[]},{"apiUser":[],"apiKey":[]}],"x-node-red":{"httpNodeId":"ea0b57f52a8c8c2e","documentationNodeId":"d5652f84a4b24225","flow":"/video"},"description":"Returns metadata for the video identified by id.","tags":["Video operations"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Video clip unique identifier."}]}},"/video/id/{id}/data/{type}":{"get":{"operationId":"getVideoIdIdDataType","summary":"Download video data","responses":{"200":{"description":"Full video representation.","headers":{"Accept-Ranges":{"description":"bytes when range retrieval is supported.","schema":{"type":"string"}},"Content-Length":{"description":"Length of this response in bytes.","schema":{"type":"integer"}},"ETag":{"description":"Strong validator of the stored object, when available.","schema":{"type":"string"}},"Last-Modified":{"description":"Stored object modification date, when available.","schema":{"type":"string"}}},"content":{"video/x-matroska":{"schema":{"type":"string","format":"binary"}},"video/mp4":{"schema":{"type":"string","format":"binary"}},"video/webm":{"schema":{"type":"string","format":"binary"}},"video/*":{"schema":{"type":"string","format":"binary"}}}},"206":{"description":"Requested byte range.","headers":{"Accept-Ranges":{"description":"bytes when range retrieval is supported.","schema":{"type":"string"}},"Content-Length":{"description":"Length of this response in bytes.","schema":{"type":"integer"}},"ETag":{"description":"Strong validator of the stored object, when available.","schema":{"type":"string"}},"Last-Modified":{"description":"Stored object modification date, when available.","schema":{"type":"string"}},"Content-Range":{"schema":{"type":"string"},"description":"bytes start-end/total"}},"content":{"video/x-matroska":{"schema":{"type":"string","format":"binary"}},"video/mp4":{"schema":{"type":"string","format":"binary"}},"video/webm":{"schema":{"type":"string","format":"binary"}},"video/*":{"schema":{"type":"string","format":"binary"}}}},"400":{"description":"Error. Check response body for details.","content":{"application/json":{"schema":{}}}},"401":{"description":"Unauthorized. Check response body for details.","content":{"application/json":{"schema":{}}}},"404":{"description":"Video object not found.","content":{"application/json":{"schema":{}}}},"415":{"description":"Stored metadata does not describe a valid video MIME type.","content":{"application/json":{"schema":{}}}},"416":{"description":"Invalid, multiple or unsatisfiable byte range.","headers":{"Content-Range":{"schema":{"type":"string"},"description":"bytes */total when supplied by storage."}},"content":{"application/json":{"schema":{}}}},"429":{"description":"Too many requests.","content":{"application/json":{"schema":{}}}},"500":{"description":"Internal server error. Please contact system administrator if this happens often.","content":{"application/json":{"schema":{}}}},"502":{"description":"Invalid or failed storage response.","content":{"application/json":{"schema":{}}}},"503":{"description":"Storage temporarily unavailable.","content":{"application/json":{"schema":{}}}},"504":{"description":"Storage request timed out.","content":{"application/json":{"schema":{}}}}},"security":[{"bearerAuth":[]},{"queryToken":[]},{"apiUser":[],"apiKey":[]}],"x-node-red":{"httpNodeId":"09034fb2a362dbab","documentationNodeId":"2b47fc2ed346e8b0","flow":"/video"},"description":"Streams the original stored video after datasource read authorization. Supports one byte Range (including open-ended and suffix ranges). If-Range accepts a strong ETag or HTTP date; a stale validator returns the full current representation. Multiple or malformed ranges return 416. Storage timeouts return 504 before headers, or close an already-started transfer.","tags":["Video operations"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Video clip unique identifier."},{"name":"type","in":"path","required":true,"schema":{"type":"string"},"description":"Video representation: 'original'."},{"name":"Range","in":"header","required":false,"schema":{"type":"string"},"description":"One byte range, for example bytes=0-1023, bytes=1024- or bytes=-1024."},{"name":"If-Range","in":"header","required":false,"schema":{"type":"string"},"description":"Strong ETag or HTTP date. Used only with Range."}]}}},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"IBM App ID access token."},"queryToken":{"type":"apiKey","in":"query","name":"token","description":"Access token supplied as a query parameter. Prefer the Authorization header when possible."},"apiUser":{"type":"apiKey","in":"header","name":"x-api-user","description":"Machine client username. Use together with x-api-key."},"apiKey":{"type":"apiKey","in":"header","name":"x-api-key","description":"Machine client API key. Use together with x-api-user."},"hubId":{"type":"apiKey","in":"header","name":"hub_id","description":"Vehicle hub identifier."}}},"externalDocs":{"description":"Raktic website","url":"https://raktic.fi"},"tags":[{"name":"Authorize"},{"name":"Data Export jobs"},{"name":"Datasource operations"},{"name":"Image operations"},{"name":"Sensor data operations"},{"name":"Video operations"}]}