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:
<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.
<sesamy-content-data>element -- A custom HTML element you can place in your page body. This always takes the highest priority.sesamy:meta tags -- Meta tags using the Sesamy namespace. These override everything below.og:Open Graph tags -- The tags you already use for Facebook, LinkedIn, and other social platforms.article:meta tags -- Tags commonly used by news sites and blogs for article metadata.- JSON-LD structured data -- Schema.org data embedded in
<script type="application/ld+json">blocks. - 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:
<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:
<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:
<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.
| Tag | Description | Example |
|---|---|---|
sesamy:price | The price of the content | 29 |
sesamy:currency | The currency code (3 letters, e.g. SEK, EUR, USD) | SEK |
sesamy:is-sellable | Whether 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 0 | true |
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.
| Tag | Fallback if not set | Description | Example |
|---|---|---|---|
sesamy:author | article:author, then JSON-LD author, then <meta name="author">, then page byline | The author of the content. Displayed alongside the title in listings | Jane Doe |
sesamy:tag | article:tag | A content tag or keyword. Add as many as you need by repeating the tag | Technology |
sesamy:section | article:section | A category or section name. Repeat for multiple sections | Business |
You can add multiple tags and sections -- just repeat the meta tag for each value:
<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:
<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:
<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.
| Tag | Fallback if not set | Description | Example |
|---|---|---|---|
sesamy:title | og:title, then twitter:title, then <title>, then JSON-LD headline, then an element with a post-title, entry-title or title-like <h1> class | The title of your content. Used as written; only repeated whitespace is collapsed | My Premium Article |
sesamy:description | og:description, then <meta name="description"> | A short summary | An in-depth look at... |
sesamy:image | og:image | A cover or featured image URL | https://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:
<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:
<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
| Tag | Fallback if not set | Description | Example |
|---|---|---|---|
sesamy:published_time | article:published_time, then JSON-LD datePublished | When the content was published | 2025-03-15T10:00:00Z |
sesamy:brandId | -- | A brand identifier | my-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:
<meta property="article:published_time" content="2025-03-15T10:00:00Z" />It also reads the published date from JSON-LD:
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "NewsArticle",
"datePublished": "2025-03-15T10:00:00Z"
}
</script>Identity
| Tag | Description | Example |
|---|---|---|
sesamy:publisher-content-id | Your internal ID for this content | article-456 |
sesamy:client-id | Your Sesamy client identifier | my-client |
sesamy:presentation-url | A custom URL for how the content is presented | https://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:
| Tag | Description |
|---|---|
sesamy:product-type | The product type |
sesamy:purchase-type | The 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:
<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:
<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.
<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.
| Field | 1st (wins) | 2nd | 3rd | 4th |
|---|---|---|---|---|
| Price | <sesamy-content-data> | sesamy:price | -- | -- |
| Currency | <sesamy-content-data> | sesamy:currency | og:currency | <meta name="currency"> |
| Title | <sesamy-content-data> | sesamy:title | og:title | twitter:title, <title>, JSON-LD headline, title-like elements |
| Description | <sesamy-content-data> | sesamy:description | og:description | <meta name="description"> |
| Image | <sesamy-content-data> | sesamy:image | og:image | <meta name="image">, then JSON-LD image |
| Author | sesamy:author | article:author | JSON-LD author | <meta name="author">, page byline |
| Tags | sesamy:tag (all) | article:tag (all) | -- | -- |
| Sections | sesamy:section (all) | article:section (all) | -- | -- |
| Published time | sesamy:published_time | article:published_time | JSON-LD datePublished | -- |
| Content type | JSON-LD @type | og:type | -- | -- |
| Publisher Content ID | <sesamy-content-data id> | sesamy:publisher-content-id | -- | -- |
| Canonical URL | <link rel="canonical"> | <link rel="self"> | Final URL | -- |
| Is sellable | sesamy:is-sellable | Derived (true if any price > 0) | -- | -- |
Pricing Formats
Simple Price
A single number is the most common format:
<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:
<!-- 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:
<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:
<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:
<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 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(fromog:image) - Price: 29 SEK (from
sesamy:priceandsesamy: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:
{
"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:
| Field | What it becomes |
|---|---|
url | The presentation URL (sesamy:presentation-url) |
product_type | The product type |
purchase_type | The purchase type |
period | The recurring period length of a pass |
time | The 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".
Related Resources
- Content Metadata & Fallback Mechanism -- How the client-side SDK resolves metadata at runtime
- Static Website Integration -- Complete integration walkthrough for static sites
- CMS Integrations Overview -- Authentication, content protection, and web components