Skip to content

Content Meta Tags ​

Capsule is now the recommended approach

For new integrations, use Capsule encryption with the resourceJWT instead of meta tags. The resourceJWT in the DCA manifest carries all content metadata (price, currency, content ID, pass), removing the need for separate meta tags. Meta tags remain supported for backward compatibility and for the content scraper. See the migration guide for details.

When you register a content URL with Sesamy, our scraper visits the page and reads metadata from the HTML to understand what the content is, how much it costs, and how to display it. This guide explains what tags to add to your pages so the scraper picks up the right information.

Quick Start ​

If your site already has Open Graph tags (most CMS platforms add them automatically), the scraper will pick up your title, description, and image without any extra work. To sell content through Sesamy you just need to add the price and currency:

html
<meta property="sesamy:price" content="29" />
<meta property="sesamy:currency" content="SEK" />

That's it for a basic setup. Read on for the full list of tags and more advanced options.


How the Scraper Reads Your Page ​

The scraper looks for content information in several places on your page. Most websites already have some of this metadata in place for search engines and social media sharing, so the scraper can often pick up the basics without you adding anything new.

Here are the sources the scraper reads, listed from highest to lowest priority. When the same piece of information (say, the description) is found in more than one place, the scraper uses the one with the highest priority and ignores the rest.

  1. <sesamy-content-data> element -- A custom HTML element you can place in your page body. This always takes the highest priority.
  2. sesamy: meta tags -- Meta tags using the Sesamy namespace. These override everything below.
  3. og: Open Graph tags -- The tags you already use for Facebook, LinkedIn, and other social platforms.
  4. article: meta tags -- Tags commonly used by news sites and blogs for article metadata.
  5. JSON-LD structured data -- Schema.org data embedded in <script type="application/ld+json"> blocks.
  6. Standard HTML -- Your page's <title> tag, <meta name="description">, <link rel="canonical">, and so on.

The order in the Priority Reference table is authoritative for each field, and it can differ slightly from the list above. Fields that take several values (tags, sections) take all values from the highest source that has any. Prices normally use the highest source too. The exception is when <sesamy-content-data> and sesamy:price give different amounts: the scraper then keeps both, content data first, and reports a priceConflict warning.

TIP

You have full control: if you want the scraper to see something different from what your Open Graph tags say, just add a sesamy: tag and it will take precedence. If you're happy with your existing tags, the scraper will use those automatically.


Where to Put Tags ​

You have two options for telling Sesamy about your content. You can use either one, or both.

Option 1: Meta Tags in <head> ​

Add <meta> tags to the <head> of your page using the sesamy: prefix:

html
<head>
  <meta property="sesamy:price" content="29" />
  <meta property="sesamy:currency" content="SEK" />
  <meta property="sesamy:publisher-content-id" content="article-123" />
</head>

These work just like Open Graph tags. Both property and name attributes are supported, so these two are equivalent:

html
<meta property="sesamy:price" content="29" />
<meta name="sesamy:price" content="29" />

Declare each tag once. If a single-value tag appears with both attributes, property is used. For prices, the property tags are used and name tags only count when there are no property ones. For tags and sections, values from both attributes are merged and identical values count once.

Option 2: The Content Data Element ​

Place a <sesamy-content-data> element in the <body> of your page. This is useful when you want to keep all Sesamy configuration in one place, or when you have multiple sellable items on the same page:

html
<body>
  <sesamy-content-data
    id="article-123"
    price="29"
    currency="SEK"
    description="An in-depth guide to..."
    image="https://example.com/image.jpg"
    item-src="https://example.com/articles/123"
  ></sesamy-content-data>
</body>

The element supplies id, price, currency, title, description and image, plus item-src for matching it to a page. Any other attribute on it is ignored by the scraper.


Available Tags ​

Pricing ​

These are the only tags you must provide. Everything else has sensible fallbacks from your existing page metadata.

TagDescriptionExample
sesamy:priceThe price of the content29
sesamy:currencyThe currency code (3 letters, e.g. SEK, EUR, USD)SEK
sesamy:is-sellableWhether this item is listed for sale. true or 1 enables it, false or 0 disables it, in any letter case. An explicit value always wins, so false turns off a page that has a price. If omitted, the item counts as sellable when at least one price is above 0true

Content data element equivalents: price, currency attributes.

Decimals use a dot (0.49) and are rounded to 2 places. Amounts that aren't plain numbers, such as 29,50 or 29 kr, are ignored.

If the <sesamy-content-data> price and the sesamy:price tag give different amounts, the scraper keeps both, content data first, and flags the page with a priceConflict warning. Make them match to get a single price.

Author and Tags ​

Author information and tags help Sesamy understand and categorize your content. These are important for discoverability and for displaying content correctly to readers.

TagFallback if not setDescriptionExample
sesamy:authorarticle:author, then JSON-LD author, then <meta name="author">, then page bylineThe author of the content. Displayed alongside the title in listingsJane Doe
sesamy:tagarticle:tagA content tag or keyword. Add as many as you need by repeating the tagTechnology
sesamy:sectionarticle:sectionA category or section name. Repeat for multiple sectionsBusiness

You can add multiple tags and sections -- just repeat the meta tag for each value:

html
<meta property="sesamy:author" content="Jane Doe" />
<meta property="sesamy:tag" content="Technology" />
<meta property="sesamy:tag" content="Innovation" />
<meta property="sesamy:tag" content="AI" />
<meta property="sesamy:section" content="Business" />
<meta property="sesamy:section" content="Opinion" />

If you don't use sesamy: tags for these, the scraper falls back to article: tags -- which many CMS platforms already generate:

html
<meta property="article:author" content="Jane Doe" />
<meta property="article:tag" content="Technology" />
<meta property="article:tag" content="Innovation" />
<meta property="article:section" content="Business" />

article:author values that are URLs (some platforms point it at a profile page) are skipped. With several article:author tags or several JSON-LD authors, the names are joined with a comma into one author string.

The scraper also reads author information from JSON-LD structured data before it falls back to the page byline:

html
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "NewsArticle",
  "author": {
    "@type": "Person",
    "name": "Jane Doe"
  }
}
</script>

Content Information ​

These tags let you control how your content appears in Sesamy. If you don't set them, the scraper falls back to your Open Graph tags, then to standard HTML -- so in many cases you won't need to set these at all.

TagFallback if not setDescriptionExample
sesamy:titleog:title, then twitter:title, then <title>, then JSON-LD headline, then an element with a post-title, entry-title or title-like <h1> classThe title of your content. Used as written; only repeated whitespace is collapsedMy Premium Article
sesamy:descriptionog:description, then <meta name="description">A short summaryAn in-depth look at...
sesamy:imageog:imageA cover or featured image URLhttps://example.com/hero.jpg

Content data element equivalents: title, description, image attributes.

If you don't set Sesamy-specific tags, the scraper reads these from your Open Graph tags:

html
<meta property="og:title" content="The Future of Digital Publishing" />
<meta property="og:description" content="How publishers are adapting to new models" />
<meta property="og:image" content="https://example.com/hero.jpg" />

It also picks up title and image from JSON-LD structured data as a further fallback:

html
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "NewsArticle",
  "headline": "The Future of Digital Publishing",
  "image": "https://example.com/hero.jpg"
}
</script>

Dates and Other Metadata ​

TagFallback if not setDescriptionExample
sesamy:published_timearticle:published_time, then JSON-LD datePublishedWhen the content was published2025-03-15T10:00:00Z
sesamy:brandId--A brand identifiermy-brand

Use ISO 8601 with a timezone, either Z or an offset such as 2025-03-15T10:00:00+02:00. The scraper converts these to UTC. A value without a timezone can't be placed in time, so it is kept as written.

If you don't set sesamy:published_time, the scraper falls back to the article: tag that most CMS platforms output:

html
<meta property="article:published_time" content="2025-03-15T10:00:00Z" />

It also reads the published date from JSON-LD:

html
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "NewsArticle",
  "datePublished": "2025-03-15T10:00:00Z"
}
</script>

Identity ​

TagDescriptionExample
sesamy:publisher-content-idYour internal ID for this contentarticle-456
sesamy:client-idYour Sesamy client identifiermy-client
sesamy:presentation-urlA custom URL for how the content is presentedhttps://example.com/read/456

Content data element equivalents: the id attribute maps to publisher-content-id.

Language ​

The scraper takes the language from <html lang> as a two-letter code, with the region dropped (sv-SE becomes sv). If that is missing it falls back to og:locale. There is no sesamy: tag for it.

Pass Products ​

For a pass or subscription product, these tags tell the scraper what kind of product it is:

TagDescription
sesamy:product-typeThe product type
sesamy:purchase-typeThe purchase type

The scraper reads them from sesamy: meta tags only. It does not read product-type, purchase-type, period or time attributes from a <sesamy-content-data> element. For the recurring period of a pass, use a JSON endpoint.

Tags the Scraper Ignores ​

sesamy:pass, sesamy:access-level and sesamy:paywall-url are read by the browser SDK, not by the scraper. Setting them doesn't change what the scraper stores. See Content Metadata & Fallback Mechanism for what they do.


Using Open Graph Tags ​

If your site already has Open Graph (og:) tags -- and most do -- the scraper reads them automatically. You don't need to duplicate this information in Sesamy tags. The scraper picks up the following OG tags:

html
<head>
  <meta property="og:title" content="The Future of Digital Publishing" />
  <meta property="og:description" content="How publishers are adapting to new models" />
  <meta property="og:image" content="https://example.com/hero.jpg" />
  <meta property="og:type" content="article" />
  <meta property="og:currency" content="SEK" />
</head>

These are used as fallbacks when no sesamy: tag is set for the same field.

You can also use the article: namespace tags that many CMS platforms generate for news articles:

html
<head>
  <meta property="article:author" content="Anna Svensson" />
  <meta property="article:published_time" content="2025-03-15T10:00:00Z" />
  <meta property="article:tag" content="Technology" />
  <meta property="article:tag" content="Innovation" />
  <meta property="article:section" content="Business" />
</head>

These are used as fallbacks when neither a sesamy: tag nor an og: tag provides the information.


Using JSON-LD Structured Data ​

If your site uses JSON-LD structured data (common with WordPress, news sites, and sites optimized for Google), the scraper reads that too. It reads the content type (@type) from JSON-LD first and uses og:type only when the JSON-LD has none.

html
<head>
  <script type="application/ld+json">
  {
    "@context": "https://schema.org",
    "@type": "NewsArticle",
    "headline": "The Future of Digital Publishing",
    "author": {
      "@type": "Person",
      "name": "Anna Svensson"
    },
    "datePublished": "2025-03-15T10:00:00Z",
    "image": "https://example.com/hero.jpg",
    "publisher": {
      "@type": "Organization",
      "name": "Example News"
    }
  }
  </script>
</head>

JSON-LD is lower priority than sesamy: and og: tags, so it serves as a safety net -- if your page has structured data but you haven't added any other meta tags, the scraper can still extract the basics.


Priority Reference ​

A quick-reference table showing exactly which source wins for each field. The scraper checks from left to right and stops at the first source that has a value. Where a cell lists more sources, the scraper keeps checking in the order shown.

Field1st (wins)2nd3rd4th
Price<sesamy-content-data>sesamy:price----
Currency<sesamy-content-data>sesamy:currencyog:currency<meta name="currency">
Title<sesamy-content-data>sesamy:titleog:titletwitter:title, <title>, JSON-LD headline, title-like elements
Description<sesamy-content-data>sesamy:descriptionog:description<meta name="description">
Image<sesamy-content-data>sesamy:imageog:image<meta name="image">, then JSON-LD image
Authorsesamy:authorarticle:authorJSON-LD author<meta name="author">, page byline
Tagssesamy:tag (all)article:tag (all)----
Sectionssesamy:section (all)article:section (all)----
Published timesesamy:published_timearticle:published_timeJSON-LD datePublished--
Content typeJSON-LD @typeog:type----
Publisher Content ID<sesamy-content-data id>sesamy:publisher-content-id----
Canonical URL<link rel="canonical"><link rel="self">Final URL--
Is sellablesesamy:is-sellableDerived (true if any price > 0)----

Pricing Formats ​

Simple Price ​

A single number is the most common format:

html
<meta property="sesamy:price" content="29" />

Price with ID and Tags ​

You can attach an identifier and tags to a price using semicolons. This is useful when you need to reference a specific price tier or categorize prices:

html
<!-- Format: id;amount;tag1;tag2 -->
<meta property="sesamy:price" content="premium;49;featured;exclusive" />

Multiple Prices ​

To offer several price options, you can either use multiple meta tags:

html
<meta property="sesamy:price" content="29" />
<meta property="sesamy:price" content="premium;49;featured" />

Or combine them with a pipe | separator in a single tag:

html
<meta property="sesamy:price" content="basic;29;standard|premium;49;featured" />

Multiple Items on One Page ​

If a single page contains several sellable items, add one <sesamy-content-data> element for each and use the item-src attribute to link each element to its content URL:

html
<sesamy-content-data
  id="article-1"
  price="19"
  currency="SEK"
  item-src="https://example.com/articles/1"
></sesamy-content-data>

<sesamy-content-data
  id="article-2"
  price="29"
  currency="SEK"
  item-src="https://example.com/articles/2"
></sesamy-content-data>

When the scraper visits the page for a specific content URL, it looks for the element whose item-src equals that URL. If there is no exact match, it compares again ignoring a trailing slash, the fragment and the letter case of the host. The query string still counts, so ?p=123 and ?p=456 stay different items.

If nothing matches, the scraper uses an element only when it is the single one on the page and has no item-src. Otherwise it ignores all of them and reads the page's sesamy: tags instead. The first element is not used as a fallback.


Full Example ​

A complete example showing a well-tagged article page. This page uses a mix of Sesamy-specific tags for pricing and categorization, and standard Open Graph tags for content display -- the scraper reads all of them.

html
<html lang="sv">
<head>
  <!-- Pricing (Sesamy-specific, required) -->
  <meta property="sesamy:price" content="29" />
  <meta property="sesamy:currency" content="SEK" />

  <!-- Author and categorization (Sesamy-specific) -->
  <meta property="sesamy:author" content="Anna Svensson" />
  <meta property="sesamy:tag" content="Technology" />
  <meta property="sesamy:tag" content="Innovation" />
  <meta property="sesamy:tag" content="Digital Media" />
  <meta property="sesamy:section" content="Business" />

  <!-- Identity (Sesamy-specific) -->
  <meta property="sesamy:publisher-content-id" content="article-456" />
  <meta property="sesamy:client-id" content="my-client" />

  <!-- Open Graph tags (the scraper uses these as fallback for title, description, image) -->
  <meta property="og:title" content="The Future of Digital Publishing" />
  <meta property="og:description" content="How publishers are adapting to new models" />
  <meta property="og:image" content="https://example.com/hero.jpg" />
  <meta property="og:type" content="article" />

  <!-- Article tags (fallback for published time) -->
  <meta property="article:published_time" content="2025-03-15T10:00:00Z" />

  <!-- JSON-LD structured data (lowest priority fallback) -->
  <script type="application/ld+json">
  {
    "@context": "https://schema.org",
    "@type": "NewsArticle",
    "headline": "The Future of Digital Publishing",
    "author": { "@type": "Person", "name": "Anna Svensson" },
    "datePublished": "2025-03-15T10:00:00Z",
    "publisher": { "@type": "Organization", "name": "Example News" }
  }
  </script>

  <!-- Standard HTML -->
  <title>The Future of Digital Publishing | Example News</title>
  <link rel="canonical" href="https://example.com/articles/future-of-publishing" />
</head>
<body>
  <article>
    <h1>The Future of Digital Publishing</h1>
    <p>How publishers are adapting to new business models...</p>
  </article>
</body>
</html>

The scraper picks up:

  • Title: "The Future of Digital Publishing" (from og:title)
  • Description: "How publishers are adapting to new models" (from og:description)
  • Author: Anna Svensson (from sesamy:author)
  • Image: https://example.com/hero.jpg (from og:image)
  • Price: 29 SEK (from sesamy:price and sesamy:currency)
  • Tags: Technology, Innovation, Digital Media (from sesamy:tag)
  • Section: Business (from sesamy:section)
  • Content type: NewsArticle (from JSON-LD @type)
  • Published time: 2025-03-15 (from article:published_time)
  • Language: sv (from <html lang>)
  • Canonical URL: https://example.com/articles/future-of-publishing (from <link rel="canonical">)

JSON Endpoints ​

If your content URL returns JSON instead of HTML (for example, a WordPress REST API endpoint), the scraper detects this automatically and reads the fields directly from the response body:

json
{
  "title": "My Premium Article",
  "description": "An in-depth look at digital publishing",
  "price": "29",
  "prices": [{ "amount": 29 }],
  "currency": "SEK",
  "image": "https://example.com/cover.jpg",
  "item_src": "https://example.com/api/articles/123",
  "publisherContentId": "article-123"
}

The response must be one object, or an array with exactly one item. Any other array length is rejected.

The field names in JSON map directly to their HTML equivalents -- item_src is the content URL, publisherContentId is the publisher's content ID, and so on. These fields are also read:

FieldWhat it becomes
urlThe presentation URL (sesamy:presentation-url)
product_typeThe product type
purchase_typeThe purchase type
periodThe recurring period length of a pass
timeThe recurring period time of a pass, as a whole number

The scraper reads prices from prices. The price field is deprecated: it is read as a whole number and does not feed prices, so a response with only price gets no prices.

prices is either an array of { "id", "amount", "tags" } objects (an entry without an amount is dropped) or a string in the same format as sesamy:price, for example "basic;29;standard|premium;49;featured".


Released under the MIT License.