LikeWard
Developers

Licensed-likeness API

The same consent gate the website runs, over HTTP. Read the boundary set, dry-run for free, generate, and get back a signed provenance manifest — or a 403 naming the rule you broke.

Authentication

Create a key at /dashboard and send it as a bearer token. Directory and provenance endpoints need no key; anything that generates does, because every output names its requester on the manifest.

bash
curl https://likeward.helm7.com/api/v1/creators

1. Read the boundary set first

It carries the effectiveforbidden list — the creator’s own prohibitions merged with the platform’s non-waivable ones and the adult categories that stay forbidden unless explicitly permitted. That merged view is what the gate enforces, so reading the raw fields instead would be reading a different document.

bash
curl https://likeward.helm7.com/api/v1/creators/{slug}/boundaries

2. Dry-run — costs nothing

bash
curl -X POST https://likeward.helm7.com/api/v1/check \
  -H "authorization: Bearer lkw_live_…" \
  -H "content-type: application/json" \
  -d '{
    "creator": "example-slug",
    "prompt": "standing in a studio, neutral background",
    "context": "portrait",
    "realism": "illustrative"
  }'

Same evaluation as generate. No model call, no credit, no audit row.

3. Generate

bash
curl -X POST https://likeward.helm7.com/api/v1/generate \
  -H "authorization: Bearer lkw_live_…" \
  -H "content-type: application/json" \
  -d '{"creator":"example-slug","prompt":"…","context":"portrait","realism":"illustrative"}'

An authorised response carries provenance.manifest and provenance.signature. Note render.state: “authorised” and “rendered” are different outcomes, and an authorised request that could not be rendered charges nothing and says why.

Refusals

HTTP 403, with the rule and the evidence that triggered it. The evaluation is deterministic — the same request against the same boundary version refuses again, identically. Branch on the rule; do not retry.

json
{
  "id": "…",
  "decision": "refuse",
  "refusal": {
    "rule": "forbidden_depiction",
    "message": "Refused: this creator's boundary set (v3) does not license \"Alcohol, tobacco & gambling\".",
    "evidence": "matched \"casino\"",
    "category": "alcohol-tobacco-gambling"
  },
  "boundary": { "version": 3, "policyHash": "…", "enforcedForbidden": ["…"] }
}
RuleWhen it fires
creator_unavailableThe creator is not in the 'active' state, so nothing is licensed.
consent_revokedThe boundary set has been revoked. No further authorisation, ever, under it.
platform_prohibitionOne of the four categories no boundary set can permit. Checked first.
forbidden_depictionA category this creator forbids, or an adult category they never opened.
excluded_brandA brand excluded by the creator's existing commercial agreements.
context_not_permittedThe requested context is not on the creator's allowlist.
realism_exceeds_ceilingThe requested realism tier is above the creator's ceiling.
conversation_not_licensedmode=conversation, and the creator has not licensed it.
age_verification_requiredThe requesting account has not cleared document-based age assurance.
identity_verification_requiredphotoreal requested by an account that is age- but not identity-verified.
session_cap_reachedThe creator's rolling session cap. Blocking only when they set enforcement=block.
insufficient_creditChecked last, so a request that breaches consent is refused on those grounds.

Advisories

A creator can set a session cap that nudges rather than refuses. When it fires you get decision: "allow_with_advisory" and text in advisories. Surface it — it is the creator asking, and swallowing it turns a mechanic they chose back into decoration.

Provenance

bash
curl https://likeward.helm7.com/api/v1/provenance/{id}

curl -X POST https://likeward.helm7.com/api/v1/provenance/verify \
  -H "content-type: application/json" \
  -d '{"manifest": { … }, "signature": "…"}'

Both are open. A consent record only settles an argument if the party disputing it can check it without our permission. The manifest carries a SHA-256 of the prompt rather than the prompt itself.

Full machine-readable description: OpenAPI 3.1 · llms.txt · MCP server