{"openapi":"3.1.0","info":{"title":"LikeWard licensed-likeness API","version":"1.0.0","summary":"Consent-checked generation against creator-published boundary sets.","description":"Every generation request is evaluated server-side against the named creator's live boundary set before any model is called. A request that breaches it is refused with the rule it broke and the term that matched; it is never silently altered into something permitted. Authorised output carries a signed provenance manifest naming the creator, the boundary-set version, the requester and the time.\n\nThis API and the website call the same evaluation. There is no configuration of a client that loosens a creator's boundaries.","contact":{"name":"LikeWard support","email":"notifications@mail.likeward.helm7.com"},"license":{"name":"Proprietary"}},"servers":[{"url":"https://likeward.helm7.com"}],"tags":[{"name":"Directory","description":"Who is licensing, and on what terms. No key required."},{"name":"Generation","description":"Consent-checked generation and dry runs. API key required."},{"name":"Provenance","description":"Look up and verify consent records. No key required."},{"name":"Safety","description":"Takedown intake. No key required."}],"paths":{"/api/v1/creators":{"get":{"tags":["Directory"],"summary":"List creators licensing their likeness","description":"Returns every active creator with a summary of their boundary set. An empty list means no creator has been onboarded and activated on this deployment — it is never padded.","responses":{"200":{"description":"The directory","content":{"application/json":{}}},"503":{"description":"No database configured on this deployment"}}}},"/api/v1/creators/{slug}":{"get":{"tags":["Directory"],"summary":"One creator's public profile","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The creator"},"404":{"description":"Not listed"}}}},"/api/v1/creators/{slug}/boundaries":{"get":{"tags":["Directory"],"summary":"The machine-readable boundary set","description":"Read this before composing a request. It carries the EFFECTIVE forbidden list — the creator's own prohibitions merged with the platform's non-waivable ones and the adult categories that stay forbidden unless explicitly permitted — because the merged view is what the gate enforces, and any difference between the two would be a trap.","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The boundary set, with version history"},"404":{"description":"Not listed"},"409":{"description":"No boundary set on file"}}}},"/api/v1/check":{"post":{"tags":["Generation"],"summary":"Dry-run a request against the consent gate","description":"Same evaluation as /api/v1/generate. No model is called, no credit is charged and nothing is recorded. Use it to iterate on a prompt without spending.","security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerationRequest"}}}},"responses":{"200":{"description":"The evaluation, including a refusal if the request breaches the boundary set"},"400":{"description":"The request did not match the schema"},"401":{"description":"Missing, unrecognised or revoked API key"},"404":{"description":"No such creator"},"429":{"description":"Rate limited"}}}},"/api/v1/generate":{"post":{"tags":["Generation"],"summary":"Generate within a creator's licensed boundaries","description":"Evaluates the request against the creator's live boundary set, then — only if authorised — calls the image provider. Credits are charged only for an image that actually exists: an authorised request that could not be rendered costs nothing and says so.\n\nA refusal returns HTTP 403 with `refusal.rule` and `refusal.evidence`. Branch on the rule rather than retrying: the same request will be refused again, deterministically.","security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerationRequest"}}}},"responses":{"200":{"description":"Authorised. Carries the provenance manifest and its signature.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerationResult"}}}},"400":{"description":"The request did not match the schema"},"401":{"description":"Missing, unrecognised or revoked API key"},"403":{"description":"Refused by the consent gate. Names the rule and the matched evidence.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Refusal"}}}},"404":{"description":"No such creator"},"429":{"description":"Rate limited"}}}},"/api/v1/provenance/{id}":{"get":{"tags":["Provenance"],"summary":"Look up a consent record, re-check its signature, and read its licence state","description":"Open, no key. Two independent questions come back and both have to be checked before output is reused. `signatureValid` says the record is intact; `licence.status` says whether the permission it records still stands. A creator who revokes consent, or a takedown that is actioned, leaves an intact manifest whose licence is `revoked` — the output it describes is no longer licensed. `licensed` is the conjunction of the two and is the single field to branch on.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The record","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"creator":{"type":"string","nullable":true},"decision":{"type":"string","enum":["allow","allow_with_advisory","refuse"]},"licensed":{"type":"boolean","description":"True only when a manifest exists, its signature verifies, and the licence has not been revoked. Do not reuse output when this is false."},"signatureValid":{"type":"boolean"},"licence":{"type":"object","properties":{"status":{"type":"string","enum":["active","revoked"]},"revokedAt":{"type":"string","format":"date-time","nullable":true},"reason":{"type":"string","nullable":true}}},"manifest":{"type":"object","nullable":true},"signature":{"type":"string","nullable":true},"note":{"type":"string"}}}}}},"404":{"description":"No such generation"}}}},"/api/v1/provenance/verify":{"post":{"tags":["Provenance"],"summary":"Verify a manifest you are holding","description":"Open deliberately: a consent record only settles an argument if the party disputing it can check it without our permission.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["manifest","signature"],"properties":{"manifest":{"type":"object"},"signature":{"type":"string"}}}}}},"responses":{"200":{"description":"Verification verdict"}}}},"/api/v1/takedowns":{"post":{"tags":["Safety"],"summary":"Report misuse","description":"No key and no account. A due time 48 hours from intake is stamped on the report by the database default, so the clock starts when the report lands.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["kind","detail"],"properties":{"kind":{"type":"string","enum":["non-consensual","boundary-breach","revocation","impersonation","other"]},"creator":{"type":"string"},"generationId":{"type":"string"},"detail":{"type":"string","minLength":20,"maxLength":4000},"reporterEmail":{"type":"string","format":"email"}}}}}},"responses":{"201":{"description":"Recorded"},"429":{"description":"Rate limited"}}}}},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"An API key from /dashboard, sent as `Authorization: Bearer lkw_live_…`. There is no anonymous generation: every output names its requester on the provenance manifest."}},"schemas":{"GenerationRequest":{"type":"object","required":["creator","prompt","context"],"properties":{"creator":{"type":"string","description":"The creator's slug."},"prompt":{"type":"string","maxLength":2000},"context":{"type":"string","enum":["portrait","fashion-editorial","fitness","cosplay","brand-endorsement","music-performance","gaming-avatar","seasonal-holiday","travel-lifestyle","fan-art-stylised"],"description":"Allowlisted per creator. A context they have not permitted is refused."},"realism":{"type":"string","enum":["stylised","illustrative","photoreal"],"default":"illustrative","description":"May not exceed the creator's ceiling. 'photoreal' additionally requires a fully identity-verified requester."},"mode":{"type":"string","enum":["image","conversation"],"default":"image","description":"Conversation is refused unless the creator has licensed it."},"reference":{"type":"string","maxLength":200}}},"Refusal":{"type":"object","properties":{"id":{"type":"string"},"decision":{"type":"string","const":"refuse"},"refusal":{"type":"object","properties":{"rule":{"type":"string","enum":["creator_unavailable","consent_revoked","platform_prohibition","forbidden_depiction","excluded_brand","context_not_permitted","realism_exceeds_ceiling","conversation_not_licensed","age_verification_required","identity_verification_required","session_cap_reached","insufficient_credit"]},"message":{"type":"string"},"evidence":{"type":"string","description":"The matched term or crossed threshold."},"category":{"type":"string"}}},"boundary":{"$ref":"#/components/schemas/BoundaryStamp"}}},"BoundaryStamp":{"type":"object","properties":{"version":{"type":"integer"},"policyHash":{"type":"string"},"enforcedForbidden":{"type":"array","items":{"type":"string"}}}},"GenerationResult":{"type":"object","properties":{"id":{"type":"string"},"decision":{"type":"string","enum":["allow","allow_with_advisory"]},"advisories":{"type":"array","items":{"type":"string"},"description":"Attached when the creator's session cap or variety nudge fired in advisory mode."},"boundary":{"$ref":"#/components/schemas/BoundaryStamp"},"credits":{"type":"object","properties":{"charged":{"type":"integer"},"cost":{"type":"integer"},"remaining":{"type":"integer"},"source":{"type":"string","enum":["free","credits","subscription","none"]}}},"render":{"type":"object","properties":{"state":{"type":"string","enum":["rendered","unavailable","declined","skipped"],"description":"'unavailable' means the request was authorised and recorded but no image was produced — no credit is charged in that case."},"detail":{"type":"string"},"url":{"type":"string"},"contentHash":{"type":"string"},"watermarked":{"type":"boolean"}}},"provenance":{"type":"object","properties":{"manifest":{"type":"object"},"signature":{"type":"string","description":"HMAC-SHA256 over the canonicalised manifest."},"verify":{"type":"string","format":"uri"}}}}}}},"x-platform-prohibitions":{"description":"Depiction categories no boundary set can permit. Evaluated before the creator's own rules.","categories":[{"id":"minors-context","label":"Minors","reason":"A creator cannot consent on behalf of a child, and no boundary set may authorise output that sexualises or juvenilises a likeness. Refused platform-wide, before the creator's own rules are read."},{"id":"non-consensual-framing","label":"Non-consensual framing","reason":"The product exists to make consent legible. Output that performs the absence of consent contradicts the artifact it would be stamped with, whatever the boundary set says."},{"id":"deceptive-news-context","label":"Deceptive news & official framing","reason":"A licensed likeness in a fabricated news frame deceives third parties who never entered into the licence. Creators may license endorsement; they may not license the appearance of a fact."},{"id":"criminal-context","label":"Criminal & extremist context","reason":"Defamatory by construction and unlawful in most of the markets this operates in. Not a creator-level choice."}]},"externalDocs":{"description":"Boundary vocabulary","url":"https://likeward.helm7.com/boundaries"}}