Mode 1
Library
-
Input
pipe(...).images[0]A PIL image, bytes or a path -
- WatermarkPixelSeal, invisible; AudioSeal for audio, VideoSeal for video
- SignC2PA manifest over the final bytes, with your certificate
- KeyYour payload key and issuer number, a trial number until you register
- LogA hash-chained evidence entry, timestamped
-
ResultYou get the marked file back, plus three IDs
in.marked.pngfrom the CLI,marked.datain code- File ID
asset_id ast_01M5…SRZ2- The ID you look the file up by
- Signed record
manifest_id urn:c2pa:9125…b8a6- The C2PA record inside the file
- Log entry
entry_hash 7810…33fd- This file's line in your evidence log
- Warnings
warnings []- Empty: nothing was skipped
Real values from a run on 21 Oct 2026, shortened.
DetectAnyone can check the file laterlaidline detect in.marked.png, on the marking host- Verdict
- Marked by this system
- This install's own certificate or log knows it
- Grade
- A
- The best of A to D: a trusted signature with a timestamp
Before you register, the watermark tells other machines only that the file is marked, not that it is yours: a shared mark, grade D.
- File ID
Three steps in your own code. Images and audio mark on the CPU; video takes the async path.
- 1Load a marker once per process. It reads
laidline.yamlat start, not per request. - 2Mark before you encode or upload.
mark_imagewatermarks, encodes, signs and logs the image. - 3Return the file and its ID.
marked.b64()is the signed file; keepmarked.asset_idto find it later.
Methods: mark_image · mark_audio · mark_video · audio_stream · detect
from laidline import Marker, MarkContext
# 1 Load once per process
marker = Marker.from_config("laidline.yaml")
def handler(job):
ctx = MarkContext(request_id=job["id"])
prompt = job["input"]["prompt"]
image = pipe(prompt).images[0]
# 2 Mark before you encode or upload
marked = marker.mark_image(
image, fmt="png", ctx=ctx
)
# 3 Return the file and its ID
return {
"image_b64": marked.b64(),
"asset_id": marked.asset_id,
}