{"openapi":"3.1.0","info":{"title":"imageRelease Rights Check API","version":"1.0.0","summary":"Check images against the imageRelease trust ledger and find out what rights you hold.","description":"Send an image and get back what imageRelease knows about it: whether it is registered, the rights recorded for it, and whether your organisation may use it.\n\nUse https://imagerelease.uk directly. Other hostnames redirect, and a redirect drops the uploaded image.\n\nFields are only ever added within /v1, never renamed, removed or changed in meaning, so ignore fields you don\u0027t recognise."},"servers":[{"url":"https://imagerelease.uk/api/ext/v1","description":"Live (irk_live_ keys)"}],"security":[{"apiKey":[]}],"tags":[{"name":"Checks","description":"Check images against the ledger."},{"name":"Registrations","description":"Register images in the ledger. For our own sites\u0027 integrations (the imageRelease Umbraco package); needs the registrations:write scope."},{"name":"Account","description":"Your key and your usage."}],"paths":{"/checks":{"post":{"tags":["Checks"],"operationId":"checkImage","summary":"Check one image","description":"Upload one image (JPEG, PNG, WebP or TIFF, up to 20 MB) as multipart/form-data in a field called \u0022image\u0022. The type is read from the file\u0027s contents, not its name. The image is compared with the ledger and then discarded, except that a weak match may keep a 512 pixel copy for our team to confirm by eye: not linked to your organisation, deleted once reviewed and in any case within 90 days.\n\nCounts one image against your monthly quota when it succeeds. Needs the checks:read scope.","requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","required":["image"],"properties":{"image":{"type":"string","format":"binary","description":"The image to check."}}}}}},"responses":{"200":{"description":"The image was checked. matched is false when we hold no record of it.","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-Quota-Limit":{"$ref":"#/components/headers/QuotaLimit"},"X-Quota-Remaining":{"$ref":"#/components/headers/QuotaRemaining"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckResult"}}}},"400":{"$ref":"#/components/responses/Problem","description":"No image, or the upload could not be read (invalid_image)."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"$ref":"#/components/responses/Forbidden"},"413":{"$ref":"#/components/responses/Problem","description":"The image is over 20 MB (image_too_large)."},"415":{"$ref":"#/components/responses/Problem","description":"Not multipart/form-data, or not a JPEG, PNG, WebP or TIFF image (invalid_image)."},"429":{"$ref":"#/components/responses/TooMany"},"503":{"$ref":"#/components/responses/Problem","description":"The check could not be done just now; try again shortly (check_unavailable)."}}}},"/checks/{checkId}/report":{"post":{"tags":["Checks"],"operationId":"reportMatch","summary":"Report a wrong match","description":"Tell us that a match in one of your organisation\u0027s checks is not the same image. Reports go to our team to improve matching; the matched image\u0027s owner is not told and no dispute is filed. Checks can be reported for 90 days. Reporting the same match again returns the first report. Needs the checks:read scope.","parameters":[{"name":"checkId","in":"path","required":true,"description":"The checkId from the check\u0027s result.","schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"match":{"type":"integer","minimum":0,"description":"The 0-based place of the match in the check\u0027s matches. Can be left out when the check had one match."},"reason":{"type":"string","maxLength":1000,"description":"Why it is wrong, in your words (optional). Don\u0027t include personal details."},"imageUrl":{"type":"string","format":"uri","maxLength":500,"description":"A public https link to the image you checked (optional), so our team can compare it with the registered image. We keep only the link and fetch the image when we review the report; it isn\u0027t stored."}}},"example":{"match":0,"reason":"Our photo shows a wreath-making workshop; the match is a dance troupe.","imageUrl":"https://example.com/media/wreath-making.jpg"}}}},"responses":{"201":{"description":"Received.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MatchReport"}}}},"200":{"description":"This match was already reported; the first report is returned (status already_reported).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MatchReport"}}}},"400":{"$ref":"#/components/responses/Problem","description":"match is negative, reason is too long, or imageUrl isn\u0027t an https link of up to 500 characters (invalid_report)."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/Problem","description":"No check with that id was made with your organisation\u0027s keys in the last 90 days (check_not_found)."},"422":{"$ref":"#/components/responses/Problem","description":"The check has no such match, or had several and match was left out (match_not_found)."},"429":{"$ref":"#/components/responses/TooMany"}}}},"/registrations":{"post":{"tags":["Registrations"],"operationId":"registerImage","summary":"Register one image","description":"Upload one image (same rules as /checks) plus a JSON object in a form field called \u0022metadata\u0022 saying where it came from and what its uploader declared. The image is registered in the ledger against your organisation and is not stored or altered. Counts against your plan\u0027s registration allowance. Needs the registrations:write scope.\n\nThe uploader is recorded only as a pseudonymous reference (member:{id}, user:{id} or system); names and email addresses are refused. You are the controller of this data and imageRelease your processor: tell the people who upload to your site, in your privacy notice (suggested wording on the docs page, Privacy section).","requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","required":["image","metadata"],"properties":{"image":{"type":"string","format":"binary"},"metadata":{"$ref":"#/components/schemas/RegistrationMetadata","description":"Sent as a JSON string in the form field (up to 8 KB)."}}},"encoding":{"metadata":{"contentType":"application/json"}}}}},"responses":{"201":{"description":"Registered.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegistrationResult"}}}},"400":{"$ref":"#/components/responses/Problem","description":"No image, malformed upload, or invalid metadata (invalid_image, invalid_metadata)."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/Problem","description":"supersedesRegistrationId isn\u0027t one of your organisation\u0027s registrations (supersede_not_found). Nothing was registered."},"409":{"$ref":"#/components/responses/Problem","description":"supersedesRegistrationId is a different image, or isn\u0027t active (already superseded, revoked or expired) (supersede_refused). Nothing was registered."},"413":{"$ref":"#/components/responses/Problem","description":"The image is over 20 MB (image_too_large)."},"415":{"$ref":"#/components/responses/Problem","description":"Not multipart/form-data, or not a JPEG, PNG, WebP or TIFF image (invalid_image)."},"422":{"$ref":"#/components/responses/Problem","description":"The image couldn\u0027t be processed (invalid_image)."},"429":{"$ref":"#/components/responses/TooMany","description":"Rate limit reached (rate_limited), plan\u0027s registration allowance used (registration_limit_reached), or too many failed keys (too_many_failed_attempts)."},"503":{"$ref":"#/components/responses/Problem","description":"Couldn\u0027t register or confirm the allowance just now; try again shortly (registration_unavailable)."}}}},"/registrations/{registrationId}":{"delete":{"tags":["Registrations"],"operationId":"revokeRegistration","summary":"Revoke a registration","description":"Revoke one of your organisation\u0027s registrations, for example when the image is deleted from your site. The ledger keeps it, marked revoked. Needs the registrations:write scope.","parameters":[{"name":"registrationId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"Revoked."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/Problem","description":"No registration with that id belongs to your organisation (not_found)."},"429":{"$ref":"#/components/responses/TooMany"}}}},"/registrations/{registrationId}/use-ended":{"post":{"tags":["Registrations"],"operationId":"endUse","summary":"Record that a use ended","description":"Feature use-ended. Your site no longer shows the image: a past event\u0027s picture was swapped out, or the image was deleted. The registration stays active, as the record that the use happened; revoke only a registration made by mistake. Set once: the same time again (or none) returns the recorded one with changed false. If the image is shown again, register it again. Needs the registrations:write scope.","parameters":[{"name":"registrationId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"usedUntil":{"type":"string","format":"date-time","description":"When the use ended; now when left out. UTC when it has no offset. Not in the future, not before the use began."}}},"example":{"usedUntil":"2026-11-03T00:00:00Z"}}}},"responses":{"200":{"description":"Recorded (or already recorded with this time: changed false).","content":{"application/json":{"schema":{"type":"object","properties":{"registrationId":{"type":"string","format":"uuid"},"usedUntilUtc":{"type":["string","null"],"format":"date-time"},"changed":{"type":"boolean"}}}}}},"400":{"$ref":"#/components/responses/Problem","description":"usedUntil is in the future or before the use began (invalid_use_ended)."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/Problem","description":"No registration with that id belongs to your organisation (not_found)."},"409":{"$ref":"#/components/responses/Problem","description":"The end of this use is already recorded with a different time (use_already_ended)."},"429":{"$ref":"#/components/responses/TooMany"},"503":{"$ref":"#/components/responses/Problem","description":"Couldn\u0027t record it just now; try again (registration_unavailable)."}}}},"/declarants/erase":{"post":{"tags":["Registrations"],"operationId":"eraseDeclarant","summary":"Erase an uploader\u0027s reference","description":"Feature declarant-erase. When you erase a member or user from your site, remove their reference from your organisation\u0027s registrations: wherever it was sent as uploaderRef or declarantRef, it is replaced with [erased]. The registrations stay, as your record of the images. Safe to repeat. Needs the registrations:write scope.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["declarantRef"],"properties":{"declarantRef":{"type":"string","description":"member:{id} or user:{id}, exactly as you sent it."},"site":{"type":"string","description":"Only registrations from this site (your host name). All of your organisation\u0027s when left out."},"dryRun":{"type":"boolean","default":false,"description":"Count the registrations that would change, and change nothing."}}},"example":{"declarantRef":"member:5678","site":"example.com","dryRun":false}}}},"responses":{"200":{"description":"Done (or counted, on a dry run).","content":{"application/json":{"schema":{"type":"object","properties":{"dryRun":{"type":"boolean"},"registrationsRedacted":{"type":"integer","description":"Registrations whose reference was replaced (or would be, on a dry run). 0 when there were none, or they were already erased."}}}}}},"400":{"$ref":"#/components/responses/Problem","description":"declarantRef isn\u0027t member:{id} or user:{id}, or site isn\u0027t a host name (invalid_erasure)."},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"$ref":"#/components/responses/Forbidden"},"429":{"$ref":"#/components/responses/TooMany"},"503":{"$ref":"#/components/responses/Problem","description":"Couldn\u0027t erase just now; try again (erasure_unavailable)."}}}},"/me":{"get":{"tags":["Account"],"operationId":"getKey","summary":"Which key you are using","description":"Returns the key\u0027s name, organisation (with a link to its verify page), environment, scopes and limits. Use it to check your set-up. Needs the checks:read scope.","responses":{"200":{"description":"Your key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Key"}}}},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"$ref":"#/components/responses/Forbidden"},"429":{"$ref":"#/components/responses/TooMany"}}}},"/usage":{"get":{"tags":["Account"],"operationId":"getUsage","summary":"This month\u0027s usage","description":"Images checked and requests made this calendar month (UTC), against your quota, with a day-by-day breakdown. Needs the checks:read scope.","responses":{"200":{"description":"Usage this month.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Usage"}}}},"401":{"$ref":"#/components/responses/Unauthorised"},"403":{"$ref":"#/components/responses/Forbidden"},"429":{"$ref":"#/components/responses/TooMany"}}}},"/ping":{"get":{"tags":["Account"],"operationId":"ping","summary":"Is the API reachable","description":"No key needed.","security":[],"responses":{"200":{"description":"The API is up.","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","const":"ok"},"apiVersion":{"type":"string","const":"v1"},"timeUtc":{"type":"string","format":"date-time"}}}}}}}}}},"components":{"securitySchemes":{"apiKey":{"type":"http","scheme":"bearer","description":"Your API key: Authorization: Bearer irk_live_... (irk_test_ keys work only on the test environment). Keep it on your server; never put it in a web page or app."}},"headers":{"RateLimitLimit":{"description":"Requests allowed per minute for this key.","schema":{"type":"integer"}},"RateLimitRemaining":{"description":"Requests left in the current minute.","schema":{"type":"integer"}},"QuotaLimit":{"description":"Images allowed per calendar month (UTC). Not sent for unlimited keys.","schema":{"type":"integer"}},"QuotaRemaining":{"description":"Images left this month. Not sent for unlimited keys.","schema":{"type":"integer"}},"RetryAfter":{"description":"Seconds to wait before trying again.","schema":{"type":"integer"}}},"responses":{"Problem":{"description":"An error. See code for what went wrong.","content":{"application/problem\u002Bjson":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"Unauthorised":{"description":"The key is missing, invalid, for the other environment, revoked, suspended or expired (missing_api_key, invalid_api_key, wrong_environment, api_key_revoked, api_key_suspended, api_key_expired).","headers":{"WWW-Authenticate":{"description":"Always Bearer.","schema":{"type":"string"}}},"content":{"application/problem\u002Bjson":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"Forbidden":{"description":"The key doesn\u0027t have the scope this endpoint needs (insufficient_scope).","content":{"application/problem\u002Bjson":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"TooMany":{"description":"Rate limit reached (rate_limited), monthly quota used (quota_exceeded), or too many failed keys from your address (too_many_failed_attempts). Wait for Retry-After seconds.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/problem\u002Bjson":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"schemas":{"Problem":{"type":"object","description":"RFC 9457 problem details. Branch on code; title and detail are for people and may change.","required":["status","code"],"properties":{"type":{"type":"string","const":"about:blank"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"code":{"type":"string","enum":["not_found","internal_error","missing_api_key","invalid_api_key","wrong_environment","api_key_revoked","api_key_suspended","api_key_expired","insufficient_scope","invalid_image","image_too_large","check_unavailable","rate_limited","quota_exceeded","too_many_failed_attempts","invalid_metadata","registration_limit_reached","registration_unavailable"]},"traceId":{"type":"string","description":"Quote this when asking for help."}}},"MatchReport":{"type":"object","required":["reportId","checkId","match","status"],"properties":{"reportId":{"type":"string","format":"uuid"},"checkId":{"type":"string","format":"uuid"},"match":{"type":"integer","description":"The 0-based place of the reported match in the check\u0027s matches."},"status":{"type":"string","enum":["received","already_reported"]}}},"CheckResult":{"type":"object","required":["checkedUtc","matched","canUse","summary","c2pa","matches"],"properties":{"checkId":{"type":"string","format":"uuid","nullable":true,"description":"This check\u0027s id. Quote it to report a wrong match (POST /checks/{checkId}/report) within 90 days. Null when it couldn\u0027t be recorded."},"checkedUtc":{"type":"string","format":"date-time"},"matched":{"type":"boolean","description":"True when the image matches at least one registered image."},"canUse":{"$ref":"#/components/schemas/CanUse","description":"The overall answer for your organisation: the best of the registrations\u0027 answers."},"summary":{"type":"string","description":"One plain-English sentence you can show to people as it is."},"c2pa":{"$ref":"#/components/schemas/C2pa"},"matches":{"type":"array","items":{"$ref":"#/components/schemas/Match"}}}},"CanUse":{"type":"string","enum":["allowed","not_yet_valid","expired","revoked","open_licence","no_rights_declared","not_licensed_to_you","superseded","unknown"],"description":"allowed: your organisation registered the image as its own, with permission or under an open licence, or accepted a licence for it that is in force. not_yet_valid / expired / revoked: your organisation\u0027s rights exist but are not in force. open_licence: another organisation registered the image as available under an open licence; that is their declaration, not verified by imageRelease, so check openLicence.sourceUrl before use. no_rights_declared: your organisation registered the image but declared no rights to it. not_licensed_to_you: the image is registered, but not to your organisation. superseded (on a registration only, never the overall answer): your organisation replaced this registration with a newer one for the same image; the newer one gives the answer. unknown: we hold no record of the image. Treat a value you don\u0027t recognise as not permission to use the image."},"C2pa":{"type":"object","description":"Content Credentials (C2PA) found in the uploaded file itself.","properties":{"present":{"type":"boolean"},"valid":{"type":["boolean","null"]},"issuer":{"type":["string","null"]}}},"Match":{"type":"object","properties":{"level":{"type":"string","enum":["exact","high","medium"],"description":"How closely the image matches. Edited copies (cropped, resized, recompressed) usually match at high or medium."},"distance":{"type":"integer","description":"0 is identical; 15 is the furthest that still counts as a match."},"trust":{"type":"string","enum":["unverified","verified","professional","disputed"]},"disputeCount":{"type":"integer"},"registeredUtc":{"type":["string","null"],"format":"date-time"},"registrations":{"type":"array","items":{"$ref":"#/components/schemas/Registration"}}}},"Registration":{"type":"object","description":"One set of rights recorded for the image. Terms and the reference are only shown when your organisation is the owner or the licensee (visibility party); for other organisations\u0027 registrations you see the type, status and date, plus openLicence when the image was registered under an open licence. A check never says who holds the rights.","properties":{"type":{"type":"string","enum":["image_rights_request","media_licence","photography_agreement","standalone"]},"status":{"type":"string","enum":["active","expired","revoked","superseded"]},"registeredUtc":{"type":["string","null"],"format":"date-time"},"relationship":{"type":"string","enum":["owner","licensee","none"],"description":"owner: your organisation registered it. licensee: a licence for it was accepted from the email address of one of your organisation\u0027s members. none: neither."},"visibility":{"type":"string","enum":["party","public"]},"canUse":{"$ref":"#/components/schemas/CanUse"},"reasons":{"type":"array","items":{"type":"string"},"description":"Plain-English reasons for canUse."},"displayRef":{"type":["string","null"],"description":"The imageRelease reference, e.g. ML-20261008-2C2D84. Party view only."},"terms":{"oneOf":[{"$ref":"#/components/schemas/Terms"},{"type":"null"}],"description":"Party view only."},"provenance":{"oneOf":[{"$ref":"#/components/schemas/Provenance"},{"type":"null"}],"description":"Party view only, for images your organisation registered through /registrations."},"assertion":{"type":["string","null"],"enum":["owns","licensed","uses",null],"description":"Party view only: what the registration says about the image."},"basis":{"type":["string","null"],"enum":["declared_by_uploader","declared_by_recorder","owner_issued",null],"description":"Party view only: who stands behind the statement. owner_issued: the rights holder granted it through imageRelease."},"usedFromUtc":{"type":["string","null"],"format":"date-time","description":"Party view only: when the use began."},"usedUntilUtc":{"type":["string","null"],"format":"date-time","description":"Party view only: when your organisation said the use ended; null while in use."},"supersedesRegistrationId":{"type":["string","null"],"format":"uuid","description":"Party view only: the earlier registration of the same image this one replaced."},"supersededBy":{"type":["string","null"],"format":"uuid","description":"Party view only: the registration that replaced this one (status superseded)."},"openLicence":{"oneOf":[{"$ref":"#/components/schemas/OpenLicence"},{"type":"null"}],"description":"Set when the registration declares an open licence, for every caller (no uploader or other provenance)."}}},"Terms":{"type":"object","description":"The rights as recorded when the image was registered. Fields are null when not recorded.","properties":{"validFrom":{"type":["string","null"],"format":"date-time"},"validUntil":{"type":["string","null"],"format":"date-time","description":"Null means no end date (for example, in perpetuity)."},"territory":{"type":["string","null"]},"exclusivity":{"type":["string","null"]},"usageTypes":{"type":"array","items":{"type":"string"},"description":"Permitted uses, as worded in the agreement."},"modificationsAllowed":{"type":["string","null"]},"assignmentAllowed":{"type":["boolean","null"]},"ai":{"type":"object","properties":{"training":{"type":["string","null"],"enum":["allowed","prohibited",null]},"generative":{"type":["string","null"],"enum":["allowed","prohibited",null]},"dataMining":{"type":["string","null"],"enum":["allowed","prohibited",null]}}},"credit":{"type":"object","properties":{"required":{"type":["boolean","null"]},"wording":{"type":["string","null"]}}},"governingLaw":{"type":["string","null"]}}},"Key":{"type":"object","properties":{"keyId":{"type":"string","format":"uuid"},"name":{"type":"string"},"organisationKey":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["live","test"]},"keyHint":{"type":"string","description":"The last characters of the key, to tell keys apart."},"scopes":{"type":"array","items":{"type":"string","enum":["checks:read","registrations:read","registrations:write"]}},"monthlyQuota":{"type":"integer","description":"-1 means unlimited."},"rateLimitPerMinute":{"type":"integer"},"createdUtc":{"type":"string","format":"date-time"},"expiresUtc":{"type":["string","null"],"format":"date-time"},"organisation":{"oneOf":[{"$ref":"#/components/schemas/Organisation"},{"type":"null"}],"description":"The key\u0027s organisation; null if it can\u0027t be found."},"features":{"type":"array","items":{"type":"string"},"description":"Newer features this server accepts, e.g. assertion-fields, supersede, use-ended. Metadata fields this server doesn\u0027t know are ignored, not refused, so send a newer field only when its feature is listed. Missing or empty: none."}}},"Organisation":{"type":"object","properties":{"name":{"type":"string","description":"The organisation\u0027s business name, or its name."},"slug":{"type":"string","description":"The organisation\u0027s URL segment on imageRelease."},"verifyUrl":{"type":"string","format":"uri","description":"The organisation\u0027s verify page on imageRelease, with no query string. Append ?imageUrl= and a public https link to an image (URL-encoded) to fill in the page\u0027s link field. The page needs a member of the organisation to log in, and it fetches nothing until they press Verify."}}},"Usage":{"type":"object","properties":{"month":{"type":"string","description":"yyyy-MM, UTC."},"imagesChecked":{"type":"integer"},"requests":{"type":"integer"},"monthlyQuota":{"type":["integer","null"],"description":"Null means unlimited."},"remaining":{"type":["integer","null"]},"resetsUtc":{"type":"string","format":"date-time"},"rateLimitPerMinute":{"type":"integer"},"days":{"type":"array","items":{"type":"object","properties":{"date":{"type":"string","format":"date"},"requests":{"type":"integer"},"imagesChecked":{"type":"integer"},"imagesRegistered":{"type":"integer"}}}},"imagesRegistered":{"type":"integer"}}},"Provenance":{"type":"object","description":"Where an image registered through /registrations came from and what was declared.","properties":{"site":{"type":["string","null"]},"channel":{"type":["string","null"]},"declaration":{"$ref":"#/components/schemas/Declaration"},"uploader":{"type":["string","null"],"description":"Pseudonymous: member:{id}, user:{id} or system; [erased] after /declarants/erase."},"declarant":{"type":["string","null"],"description":"Who gave the answer, as sent in declarantRef (or the uploader); pseudonymous."},"rightsHolder":{"type":["string","null"],"description":"As given, not checked."},"onBehalfOf":{"type":["boolean","null"]},"attribution":{"type":["string","null"],"description":"As given, not checked."},"ownershipBasis":{"type":["string","null"],"enum":["created","assigned_in_writing",null]},"aiGenerated":{"type":["boolean","null"]},"sourceRef":{"type":["string","null"],"description":"The site\u0027s own identifier for the image."},"feed":{"type":["string","null"]},"uploadedUtc":{"type":["string","null"],"format":"date-time"},"licence":{"type":["string","null"],"enum":["unsplash","pexels","cc0","cc-by-4.0","cc-by-sa-4.0","public-domain","other",null]},"licenceName":{"type":["string","null"]},"sourceUrl":{"type":["string","null"],"format":"uri"}}},"Declaration":{"type":"string","enum":["owner","permission","not_declared","third_party_feed","historic","open_licence","not_sure"],"description":"owner: the uploader says they own the copyright. permission: they have the owner\u0027s permission. open_licence: used under an open licence (see licence). not_declared: nothing was declared. not_sure: the uploader answered that they don\u0027t know (feature assertion-fields). third_party_feed: imported from a feed; no rights claimed. historic: registered after the fact from an existing library. owner, permission and open_licence give allowed to the registering organisation. Assertion: owner is owns; permission and open_licence are licensed; the rest are uses."},"Assertion":{"type":"string","enum":["owns","licensed","uses"],"description":"What the registration says about the image: owns (created it or holds the copyright), licensed (may use it under a licence from someone), uses (it appears here; rights not known)."},"Basis":{"type":"string","enum":["declared_by_uploader","declared_by_recorder"],"description":"Who stands behind the statement. declared_by_uploader: an uploader\u0027s answer, passed on as given and not verified by you. declared_by_recorder: your organisation\u0027s own statement, including any default you apply when an uploader gave no answer. (owner_issued exists in the ledger, for licences the rights holder grants through imageRelease, and is never accepted here.)"},"RegistrationMetadata":{"type":"object","required":["sourceRef"],"properties":{"sourceRef":{"type":"string","maxLength":200,"description":"Your own identifier for the image, e.g. its media key."},"site":{"type":"string","description":"Your site\u0027s host name, e.g. example.com."},"channel":{"type":"string","maxLength":100,"description":"How the image arrived, e.g. backoffice, event-upload, feed:skiddle."},"declaration":{"$ref":"#/components/schemas/Declaration","default":"not_declared"},"uploaderRef":{"type":"string","description":"member:{id}, user:{id} or system. Never a name or email address.","default":"system"},"uploadedUtc":{"type":"string","format":"date-time"},"credit":{"type":"string","maxLength":200},"feedName":{"type":"string","maxLength":100},"ai":{"type":"object","properties":{"training":{"type":"string","enum":["allowed","prohibited"],"default":"prohibited"},"generative":{"type":"string","enum":["allowed","prohibited"],"default":"prohibited"},"dataMining":{"type":"string","enum":["allowed","prohibited"],"default":"prohibited"}}},"replacesRegistrationId":{"type":"string","format":"uuid","description":"Deprecated: use supersedesRegistrationId. The id this replaces; the new registration is made first, then the old one is revoked (which reads as withdrawn). Can\u0027t be sent with supersedesRegistrationId.","deprecated":true},"supersedesRegistrationId":{"type":"string","format":"uuid","description":"Feature supersede. A changed answer about the same image: your organisation\u0027s active registration of the same file. It becomes superseded in the same step (kept as history, not withdrawn) and stops counting towards your allowance. A different file (re-saved, cropped) is a new registration: register it without this, and end the old one\u0027s use. 404 supersede_not_found, 409 supersede_refused."},"licence":{"type":"string","enum":["unsplash","pexels","cc0","cc-by-4.0","cc-by-sa-4.0","public-domain","other"],"description":"Required with declaration open_licence, and only used with it."},"licenceName":{"type":"string","maxLength":100,"description":"The licence\u0027s name, e.g. Open Government Licence v3.0. Required with licence other and refused with any other licence. Up to 100 characters; must not contain an email address."},"sourceUrl":{"type":"string","format":"uri","maxLength":500,"description":"https only: where the image and its licence can be seen. Shown to callers, never fetched by imageRelease."},"assertion":{"$ref":"#/components/schemas/Assertion","description":"Feature assertion-fields. Optional: worked out from declaration, and refused if it doesn\u0027t match."},"basis":{"$ref":"#/components/schemas/Basis","description":"Feature assertion-fields. Default: declared_by_uploader when the declarant is member:{id}, otherwise declared_by_recorder. A default you apply is yours: send declared_by_recorder."},"declarantRef":{"type":"string","description":"Feature assertion-fields. Who gave the answer when it wasn\u0027t the uploader, e.g. an editor correcting it: member:{id}, user:{id} or system. Defaults to uploaderRef. Never a name or email address."},"rightsHolder":{"type":"string","maxLength":200,"description":"Feature assertion-fields. Owned or licensed images only: from whom it is licensed, or (with onBehalfOf) for whom it is owned. As given, not checked; no email addresses."},"onBehalfOf":{"type":"boolean","description":"Feature assertion-fields. True when the declarant acts as agent for rightsHolder, e.g. a PR company for a venue. Needs rightsHolder."},"attribution":{"type":"string","maxLength":200,"description":"Feature assertion-fields. Images used without known rights only: where the image came from, e.g. Theatre Royal press pack. As given, not checked; no email addresses. For owned or licensed images use rightsHolder, and credit for what to print."},"ownershipBasis":{"type":"string","enum":["created","assigned_in_writing"],"description":"Feature assertion-fields. With declaration owner only: the uploader made the image, or the copyright was assigned to them in writing."},"aiGenerated":{"type":"boolean","description":"Feature assertion-fields. What the uploader said about the image being AI-generated. Recorded, not checked."},"usedFrom":{"type":"string","format":"date-time","description":"Feature assertion-fields. When the use began; defaults to uploadedUtc."}}},"RegistrationResult":{"type":"object","properties":{"registrationId":{"type":"string","format":"uuid"},"imageId":{"type":"string","format":"uuid"},"displayRef":{"type":"string","description":"The ledger reference, e.g. SITE-20261009-E17A8A."},"registeredUtc":{"type":"string","format":"date-time"},"declaration":{"$ref":"#/components/schemas/Declaration"},"assertion":{"$ref":"#/components/schemas/Assertion"},"basis":{"$ref":"#/components/schemas/Basis"},"isNewImage":{"type":"boolean","description":"False when the same image was already in the ledger, from any organisation."},"existingRegistrations":{"type":"integer","description":"Registrations the image already had before this one. Check it with /checks to see whose."},"replacedRegistrationId":{"type":["string","null"],"format":"uuid"},"replacedRevoked":{"type":["boolean","null"],"description":"False means the replaced registration is still active: revoke it with DELETE."},"supersededRegistrationId":{"type":["string","null"],"format":"uuid","description":"Set when supersedesRegistrationId was sent: that registration is now superseded."}}},"OpenLicence":{"type":"object","description":"Shown to every caller when a registration declares an open licence: what the registering organisation says the licence is, and where to see it. Not verified by imageRelease.","properties":{"licence":{"type":"string","enum":["unsplash","pexels","cc0","cc-by-4.0","cc-by-sa-4.0","public-domain","other"]},"name":{"type":"string","description":"Display name, e.g. CC BY 4.0, or the name given for other."},"attributionRequired":{"type":["boolean","null"],"description":"True when the licence requires crediting the author; null when unknown (other)."},"credit":{"type":["string","null"],"description":"The author to credit, where given."},"sourceUrl":{"type":["string","null"],"format":"uri"}}}}}}