Skip to content

Content Rights ​

When you sign a file with Sign It, you can attach a Content Rights manifest - a machine-readable declaration of your terms, backed by your cryptographic signature. You approve it in your own Vault; no one in between can alter it.

Why It Matters ​

There's no standardized way for creators to declare terms for commercial use and AI training that is:

  • Verifiable - cryptographically signed, can't be forged
  • Discoverable - on Flowsta's tamper-proof network, built on Holochain, not buried in metadata
  • Machine-readable - AI crawlers and pipelines can check programmatically
  • Persistent - not dependent on a single server

Sign It addresses this gap. Your rights declaration is attached to cryptographic proof of authorship.

Fields ​

All fields are optional. You control what to include at signing time.

Each table shows the label the Vault offers, the value an app sends through the SDKs or the REST API, and the enum form the network stores and every verification response returns.

License ​

Vault labelValue you sendOn the networkMeaning
Copyright protectedall-rights-reservedAllRightsReservedNo permissions granted
Public domain (CC0)cc0CC0Public domain dedication
Free to share with credit (CC BY)cc-byCCBYAttribution required
Free to share with credit, same license (CC BY-SA)cc-by-saCCBYSAAttribution + ShareAlike
Free for non-commercial use with credit (CC BY-NC)cc-by-ncCCBYNCAttribution + NonCommercial
Non-commercial, credit, same license (CC BY-NC-SA)cc-by-nc-saCCBYNCSAAttribution + NonCommercial + ShareAlike
MIT LicensemitMITMIT License
Apache 2.0 Licenseapache-2Apache2Apache License 2.0
GPL 3.0 Licensegpl-3GPL3GNU GPL v3

The network also stores a custom license as { "Custom": "<text>" }, up to 128 characters. The Vault does not offer it, and neither SDK maps to it; you may meet it in records made by other apps, so treat license as string | { Custom: string } when you read responses.

Commercial Licensing ​

Vault labelValue you sendOn the networkMeaning
Not available for licensingnot_availableNotAvailableNot open to commercial licensing
Open to licensing enquiriesopen_to_licensingOpenToLicensingContact me to discuss licensing (via Flowsta relay)

AI Training Policy ​

Vault labelValue you sendOn the networkMeaning
Anyone can use this to train AIallowedAllowedFree to include in AI training data
Can train AI if they credit meallowed_with_attributionAllowedWithAttributionMay train on, but credit the creator
Get permission before training AIrequires_licenseRequiresLicenseMust obtain a license before training
Do not use to train AInot_allowedNotAllowedDo not include in AI training data

Contact Preference ​

Vault labelValue you sendOn the networkMeaning
Do not contact meno_contactNoContactDo not contact me about this file
Allow contact requestsallow_contact_requestsAllowContactRequestsI'm open to messages via Flowsta's blind relay

Contact Relay ​

When a signer sets "Allow contact requests", the verification page shows a Contact signer about licensing button under that signature. The requester fills in their name, email, purpose, and a message in the Contact Signer form. Flowsta relays this as an email to the signer.

Privacy guarantees:

  • The signer's email is never exposed to the requester
  • The API returns the same response whether the signer exists or not (prevents enumeration)
  • Rate limited: 3 messages per hour per IP
  • The signer decides whether to reply

What It Does NOT Do ​

  • It's not DRM - it doesn't prevent copying or training
  • It's not legally binding by itself - but a signed, timestamped, publicly verifiable declaration is strong evidence in disputes
  • It doesn't enforce compliance - but it makes terms clear and discoverable

Example ​

A photographer signs a photo in their Vault with:

Intent:      Authorship
AI Content:  No AI
License:     CC BY-NC
Commercial:  Open to licensing enquiries
AI Training: Get permission before training AI
Contact:     Allow contact requests

This means: "I created this photo without AI. You can share it non-commercially with attribution. For commercial use or AI training, contact me to arrange a license."

Anyone verifying the file sees this declaration, backed by the photographer's cryptographic identity.

API Endpoint ​

For AI training pipelines, search engines, and content platforms that need to check rights programmatically, Sign It exposes a machine-readable endpoint.

Request ​

GET https://auth-api.flowsta.com/api/v1/sign-it/content-rights?hash=<sha256>

Parameters:

NameRequiredDescription
hashyes64-character hex SHA-256 of the file you want to check. Anything else returns 400 invalid_hash

Response ​

json
{
  "file_hash": "abc123...",
  "signed": true,
  "signer_count": 2,
  "content_rights": {
    "ai_training": "NotAllowed",
    "licenses": ["CCBYNC"],
    "contact_available": true
  },
  "signers": [
    {
      "signer": "uhCAkynvT4p77x...",
      "signed_at": 1680000000000,
      "license": "CCBYNC",
      "ai_training": "NotAllowed",
      "commercial_licensing": "OpenToLicensing",
      "contact_preference": "AllowContactRequests"
    },
    {
      "signer": "uhCAkq83bT9mzz...",
      "signed_at": 1680000001000,
      "license": "CCBYNC",
      "ai_training": "RequiresLicense",
      "commercial_licensing": null,
      "contact_preference": null
    }
  ],
  "verify_url": "https://flowsta.com/sign-it/?hash=abc123..."
}

Notes on the shape:

  • content_rights is the aggregate across all active (non-revoked) signers. It's null if no active signature declared any rights.
  • content_rights.licenses is always an array of the distinct declared licenses, in the network's raw enum form (CCBYNC, AllRightsReserved, MIT, ...) - not prose like "CC BY-NC 4.0". One value when all signers agree; more when they don't. A custom license arrives as an object, { "Custom": "..." }.
  • content_rights.contact_available is true if any active signer allows contact requests.
  • signers lists each active signer's own declaration (values null where the signer didn't declare that field), so you can inspect disagreements yourself.

If the file has never been signed:

json
{
  "file_hash": "abc123...",
  "signed": false,
  "signer_count": 0,
  "content_rights": null,
  "signers": [],
  "verify_url": "https://flowsta.com/sign-it/?hash=abc123..."
}

Aggregation Rules ​

When multiple signers set different AI training policies, the most restrictive policy wins:

NotAllowed > RequiresLicense > AllowedWithAttribution > Allowed

Licenses are not ranked - licenses simply lists every distinct declared value. Revoked signatures are excluded from the aggregation entirely.

Rate Limit & Cache ​

60 requests/minute per IP. Responses include Cache-Control: public, max-age=300 (5 minutes) - safe for CDN edge caching, so pipelines checking millions of files won't flood the API.

For AI Training Pipelines ​

Before adding a file to a training corpus, check:

python
import hashlib, requests

def is_training_allowed(file_bytes: bytes) -> bool:
    h = hashlib.sha256(file_bytes).hexdigest()
    r = requests.get(
        "https://auth-api.flowsta.com/api/v1/sign-it/content-rights",
        params={"hash": h},
        timeout=5,
    )
    if r.status_code != 200 or not r.json().get("signed"):
        return True  # No signature, no explicit objection
    rights = r.json().get("content_rights") or {}
    policy = rights.get("ai_training")
    return policy in (None, "Allowed", "AllowedWithAttribution")

If the policy is RequiresLicense, use contact_available (and the verify_url) to reach the signer before proceeding.

Unsigned Files ​

The endpoint returns signed: false for any hash that has never been signed. Absence of a signature is not an objection - it just means the creator hasn't declared rights through Sign It. Pipelines should fall back to site-level signals (robots.txt, terms of service, licensing metadata).

Adopting the Standard ​

The Content Rights field set is open - there's no proprietary schema, no license to use, and no API key required to query. If you're building a content-rights system, we'd love the same enum values to become a de-facto standard so a single query surfaces rights regardless of which service signed the file.

Contact us at hello@flowsta.com if you're implementing this on your platform.

Documentation licensed under CC BY-SA 4.0.