{"openapi":"3.0.3","info":{"title":"vibz.cloud registry API","version":"0.1.0","description":"Consolidates the three identifiers of a Vibz wristband. Authenticate with `Authorization: Bearer <credential>`, using a vck_ credential or an access token from vibz-keys. Optional header `x-vibz-station` names the station in the access history."},"servers":[{"url":"https://cloud-dev.vibz.show"}],"security":[{"bearer":[]}],"components":{"securitySchemes":{"bearer":{"type":"http","scheme":"bearer"}},"schemas":{"Wristband":{"type":"object","properties":{"id":{"type":"integer","description":"Record number"},"chipUid":{"type":"string","nullable":true,"example":"F63020CEBD6D96DC","description":"RP2354A chip id, 16 hex digits"},"nfcUid":{"type":"string","nullable":true,"example":"1D06DA12970000","description":"Passive NFC tag UID, 7 bytes"},"vibzId":{"type":"string","nullable":true,"example":"UM5RFG","description":"ID printed on the QR label"},"qrUrl":{"type":"string","nullable":true,"example":"HTTPS://VIBZ.SHOW/Q/UM5RFG"},"version":{"type":"string","nullable":true,"example":"RED"},"seq":{"type":"integer","nullable":true},"status":{"type":"string","enum":["active","retired","rma"]},"station":{"type":"string","nullable":true},"createdAt":{"type":"string","format":"date-time"},"createdBy":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"},"updatedBy":{"type":"string"}}}}},"x-scopes":{"registry:read":"Look up wristbands and read their change history","registry:bind":"Bind identifiers in production","registry:admin":"See the table of all wristbands, correct bindings and change a wristband status","labels:read":"List label batches and download their files","labels:generate":"Generate new label series","audit:read":"Read the access history","system:read":"Read service statistics and metrics","label:write":"Report that a device was present, and with the key of a show, add wristbands to it or remove them","label:read-show":"Read the wristbands of the shows this key is limited to, and no others"},"paths":{"/healthz":{"get":{"summary":"The process is alive","responses":{"200":{"description":"Success"},"400":{"description":"Invalid input"}},"security":[]}},"/readyz":{"get":{"summary":"This node can serve traffic (load balancers use this)","responses":{"200":{"description":"Success"},"400":{"description":"Invalid input"}},"security":[]}},"/version":{"get":{"summary":"Running version and commit","responses":{"200":{"description":"Success"},"400":{"description":"Invalid input"}},"security":[]}},"/openapi.json":{"get":{"summary":"This API description","responses":{"200":{"description":"Success"},"400":{"description":"Invalid input"}},"security":[]}},"/metrics":{"get":{"summary":"Prometheus metrics","responses":{"200":{"description":"Success"},"400":{"description":"Invalid input"},"401":{"description":"Missing or invalid credential"},"403":{"description":"The credential lacks this right"}},"x-required-scope":"system:read"}},"/v1/me":{"get":{"summary":"The caller and its rights","responses":{"200":{"description":"Success"},"400":{"description":"Invalid input"},"401":{"description":"Missing or invalid credential"},"403":{"description":"The credential lacks this right"}}}},"/v1/stats":{"get":{"summary":"Counts, access volumes and service health","responses":{"200":{"description":"Success"},"400":{"description":"Invalid input"},"401":{"description":"Missing or invalid credential"},"403":{"description":"The credential lacks this right"}},"x-required-scope":"system:read"}},"/v1/lookup/{id}":{"get":{"summary":"Give any identifier (Vibz ID, label URL, chip UID, NFC UID), get the triplet","responses":{"200":{"description":"Success"},"400":{"description":"Invalid input"},"401":{"description":"Missing or invalid credential"},"403":{"description":"The credential lacks this right"}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"x-required-scope":"registry:read"}},"/v1/lookup":{"post":{"summary":"Look up to 1000 identifiers at once","responses":{"200":{"description":"Success"},"400":{"description":"Invalid input"},"401":{"description":"Missing or invalid credential"},"403":{"description":"The credential lacks this right"}},"x-required-scope":"registry:read"}},"/v1/bindings":{"post":{"summary":"Link the three identifiers of one wristband (production). Refused with a 409 if any of them is already known","responses":{"200":{"description":"Success"},"400":{"description":"Invalid input"},"401":{"description":"Missing or invalid credential"},"403":{"description":"The credential lacks this right"}},"x-required-scope":"registry:bind","requestBody":{"required":true,"content":{"application/json":{"example":{"chipUid":"F63020CEBD6D96DC","nfcUid":"1D06DA12970000","vibzId":"UM5RFG"}}}}}},"/v1/wristbands":{"get":{"summary":"The table of all wristbands (query: limit, after, status, order=oldest|newest)","responses":{"200":{"description":"Success"},"400":{"description":"Invalid input"},"401":{"description":"Missing or invalid credential"},"403":{"description":"The credential lacks this right"}},"x-required-scope":"registry:admin"}},"/v1/wristbands/{id}":{"get":{"summary":"One wristband by its record number","responses":{"200":{"description":"Success"},"400":{"description":"Invalid input"},"401":{"description":"Missing or invalid credential"},"403":{"description":"The credential lacks this right"}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"x-required-scope":"registry:read"}},"/v1/wristbands/{id}/history":{"get":{"summary":"Every change made to this record","responses":{"200":{"description":"Success"},"400":{"description":"Invalid input"},"401":{"description":"Missing or invalid credential"},"403":{"description":"The credential lacks this right"}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"x-required-scope":"registry:read"}},"/v1/wristbands/{id}/events":{"get":{"summary":"A record, its changes, and every access-history entry naming an identifier it has held, newest first (query: action, limit, cursor)","responses":{"200":{"description":"Success"},"400":{"description":"Invalid input"},"401":{"description":"Missing or invalid credential"},"403":{"description":"The credential lacks this right"}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"x-required-scope":"audit:read"}},"/v1/wristbands/{id}/correct":{"post":{"summary":"Replace identifiers of a record (needs a reason)","responses":{"200":{"description":"Success"},"400":{"description":"Invalid input"},"401":{"description":"Missing or invalid credential"},"403":{"description":"The credential lacks this right"}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"x-required-scope":"registry:admin","requestBody":{"required":true,"content":{"application/json":{"example":{"vibzId":"KNMV97","reason":"label replaced after damage"}}}}}},"/v1/wristbands/{id}/status":{"post":{"summary":"Set a record active, retired or rma (needs a reason)","responses":{"200":{"description":"Success"},"400":{"description":"Invalid input"},"401":{"description":"Missing or invalid credential"},"403":{"description":"The credential lacks this right"}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"x-required-scope":"registry:admin","requestBody":{"required":true,"content":{"application/json":{"example":{"status":"retired","reason":"broken at event"}}}}}},"/v1/pings":{"post":{"summary":"Devices were present: one { id, at }, or a list { devices: [{ id, at }] } of up to 1000. id is any identifier, and at the UTC moment: never in the future, and without it the moment of arrival counts","responses":{"200":{"description":"Success"},"400":{"description":"Invalid input"},"401":{"description":"Missing or invalid credential"},"403":{"description":"The credential lacks this right"}},"x-required-scope":"label:write","requestBody":{"required":true,"content":{"application/json":{"example":{"devices":[{"id":"UM5RFG"},{"id":"KNMV97","at":"2026-11-07T14:00:00Z"}]}}}}}},"/v1/wristbands/{id}/pings":{"get":{"summary":"When this device was present, newest first (query: limit, cursor)","responses":{"200":{"description":"Success"},"400":{"description":"Invalid input"},"401":{"description":"Missing or invalid credential"},"403":{"description":"The credential lacks this right"}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"x-required-scope":"audit:read"}},"/v1/show/wristbands":{"get":{"summary":"The wristbands of the shows this key is limited to (query: limit, after, show to keep one of them)","responses":{"200":{"description":"Success"},"400":{"description":"Invalid input"},"401":{"description":"Missing or invalid credential"},"403":{"description":"The credential lacks this right"}},"x-required-scope":"label:read-show"},"post":{"summary":"Add a wristband to this show, from any identifier","responses":{"200":{"description":"Success"},"400":{"description":"Invalid input"},"401":{"description":"Missing or invalid credential"},"403":{"description":"The credential lacks this right"}},"x-required-scope":"label:write","requestBody":{"required":true,"content":{"application/json":{"example":{"id":"UM5RFG"}}}}}},"/v1/show/wristbands/{id}":{"get":{"summary":"One wristband of the shows this key is limited to, from any identifier","responses":{"200":{"description":"Success"},"400":{"description":"Invalid input"},"401":{"description":"Missing or invalid credential"},"403":{"description":"The credential lacks this right"}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"x-required-scope":"label:read-show"},"delete":{"summary":"Take a wristband out of this show, from any identifier","responses":{"200":{"description":"Success"},"400":{"description":"Invalid input"},"401":{"description":"Missing or invalid credential"},"403":{"description":"The credential lacks this right"}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"x-required-scope":"label:write"}},"/v1/labels/batches":{"get":{"summary":"Label batches, newest first","responses":{"200":{"description":"Success"},"400":{"description":"Invalid input"},"401":{"description":"Missing or invalid credential"},"403":{"description":"The credential lacks this right"}},"x-required-scope":"labels:read"},"post":{"summary":"Generate a new series of unique IDs","responses":{"200":{"description":"Success"},"400":{"description":"Invalid input"},"401":{"description":"Missing or invalid credential"},"403":{"description":"The credential lacks this right"}},"x-required-scope":"labels:generate","requestBody":{"required":true,"content":{"application/json":{"example":{"version":"RED","count":1000,"note":"festival 2027"}}}}}},"/v1/labels/batches/{id}/labels.csv":{"get":{"summary":"Printer file of a batch (seq,id,url), or ?format=registry for version,seq,id,url","responses":{"200":{"description":"Success"},"400":{"description":"Invalid input"},"401":{"description":"Missing or invalid credential"},"403":{"description":"The credential lacks this right"}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"x-required-scope":"labels:read"}},"/v1/audit":{"get":{"summary":"Access history, newest first (query: data, actor, action, status, from, to, limit, cursor)","responses":{"200":{"description":"Success"},"400":{"description":"Invalid input"},"401":{"description":"Missing or invalid credential"},"403":{"description":"The credential lacks this right"}},"x-required-scope":"audit:read"}}}}