---
title: "Developer Docs | Attendir — API, Embed Widget & Machine-Readable Resources"
description: "Attendir developer documentation: embed widget, widget API with OpenAPI spec, llms.txt, markdown content negotiation, and self-serve onboarding for AI agents."
canonical: "https://attendir.com/docs"
lang: "en"
---

# Developer Docs | Attendir — API, Embed Widget & Machine-Readable Resources

Developers & Agents

Attendir Developer Documentation
================================

Machine-readable resources, the embeddable share widget, the widget API, and self-serve onboarding — everything a developer or AI agent needs to work with Attendir.

 

Machine-Readable Resources
--------------------------

Every structured surface Attendir publishes, at a predictable URL:

- [/llms.txt](https://attendir.com/llms.txt) — index of every page with descriptions, built for AI crawlers and agents
- [/llms-full.txt](https://attendir.com/llms-full.txt) — expanded reference with inline pricing tables, FAQs, and an index of every article
- [/openapi.json](https://attendir.com/openapi.json) — OpenAPI 3.1 specification for the public widget API
- [/.well-known/api-catalog](https://attendir.com/.well-known/api-catalog) — RFC 9727 API catalog: every API we publish as an RFC 9264 linkset, served as application/linkset+json and advertised from every page with a Link: rel="api-catalog" header
- [/auth.md](https://attendir.com/auth.md) — authentication reference: what exists, what does not, and how to request access
- [/sitemap.xml](https://attendir.com/sitemap.xml) — every indexable URL with last-modified dates
- [/robots.txt](https://attendir.com/robots.txt) — crawler policy (all major AI crawlers are welcome on public pages)
- [/blog/rss.xml](https://attendir.com/blog/rss.xml) — RSS feed of new articles
- [/.well-known/security.txt](https://attendir.com/.well-known/security.txt) — security contact (RFC 9116)
 
 

Markdown Content Negotiation
----------------------------

Every public marketing and content page on attendir.com serves a text/markdown variant through standard HTTP content negotiation. Request any URL with an Accept header that prefers markdown and you get clean markdown instead of HTML — q-values are honored, both variants carry Vary: Accept, and unsupported types get a 406:

 ```
curl -H "Accept: text/markdown" https://attendir.com/pricing
```

If sending headers is inconvenient, append .md to any page URL instead — [/pricing.md](https://attendir.com/pricing.md) returns the same markdown, and the homepage is at [/index.md](https://attendir.com/index.md). Every HTML page advertises its markdown URL twice: as <link rel="alternate" type="text/markdown"> in the head, and as an RFC 8288 Link: response header, so a HEAD request is enough to find it.

You may not need to ask at all. When a request's Accept header expresses no preference between the two variants — a bare \*/\*, or no Accept header — the User-Agent breaks the tie, and agents that read pages as text for a language model (GPTBot, ChatGPT-User, ClaudeBot, Claude-User, Perplexity-User, CCBot and peers) receive the markdown variant automatically. It is the same page with the same facts, just the cleaner serialization; those responses declare Vary: Accept, User-Agent. An explicit Accept header always wins, so Accept: text/html gets you HTML from any client. Search-index crawlers are deliberately left on HTML, because the markdown variant carries no JSON-LD. Every markdown response also names its own .md URL in a Content-Location header, so a client that never asked for a variant still learns the stable address of the document it received.

Each markdown variant opens with a YAML frontmatter block carrying its title, description, canonical URL and the BCP 47 lang of the document. Pages published in more than one language also list their translations under alternates as language tag → absolute URL, mirroring the page's hreflang cluster; a page that exists in one language only carries no alternates key, so the block never points at a translation that does not exist. The response repeats the language on the wire as Content-Language. Attendir's marketing site publishes in English at root URLs and German under /de/, so a detached German document still states that it is German and where its English edition lives.

Every link in a markdown variant is absolute, so the document stays navigable once it is detached from this origin — cached, chunked, or pasted into a context window. Blog posts and glossary terms are answered from their original Markdown sources. Nonexistent paths return a real HTTP 404 with a short markdown body linking back to this page, the sitemap, and llms.txt, so agents can recover instead of dead-ending.

 

Embeddable Share Widget
-----------------------

The Attendir widget renders a campaign's LinkedIn sharing flow on your own site — event page, registration confirmation, or sponsor page. It is a single script tag plus a container element; the script auto-discovers every \[data-campaign\] element on the page:

 ```
<div data-campaign="YOUR_CAMPAIGN_SHARE_LINK"></div>
<script src="https://attendir.com/widget/v1/attendir-widget.js" async></script>
```

Optional attributes: data-theme (light/dark), data-channels (comma-separated: linkedin, x, whatsapp, email, copy\_link), data-cta (custom call-to-action text), data-email / data-name (pre-fill the attendee). A JavaScript API is also exposed as window.AttendirWidget with render(), destroy(), and destroyAll(). The embed snippet with your campaign's share link is in the **Embed Widget** section of the campaign page.

 

Widget API
----------

The widget is built on a small public HTTP API under /api/widget/{share\_link}/, documented in the [OpenAPI 3.1 spec](https://attendir.com/openapi.json). The campaign's unguessable share-link UUID acts as a capability token — there are no separate API keys. All endpoints are stateless and CORS-enabled; all except email-html are rate-limited.

- GET /api/widget/{share\_link}/config — campaign, event, and widget configuration
- POST /api/widget/{share\_link}/impression — record a widget impression
- POST /api/widget/{share\_link}/advocate — create or retrieve an advocate record
- POST /api/widget/{share\_link}/share — record a share action on a channel
- POST /api/widget/{share\_link}/linkedin/share — publish a LinkedIn post (short-lived widget token from the OAuth popup)
- GET /api/widget/{share\_link}/email-html — static HTML block for embedding in emails
 
One scoping note: the widget's *LinkedIn* share flow validates the embedding page's origin against the campaign's allowed-domains list (secure by default), so on your own domain it works once your origin is registered for the campaign — email <info@attendir.com> to have it added. The other channels (X, WhatsApp, email, copy link) and everything else the widget does work on any site out of the box.

 

Authentication & Permissions
--------------------------------

Attendir does not currently expose a general-purpose account API with OAuth 2.0 scoped tokens — the public surface is the widget API above, authorized per campaign by its share-link capability token. Inside the product, integrations authenticate with each provider's own mechanism: authorization-code OAuth 2.0 for Eventbrite, OAuth 2.0 client credentials for Bizzabo and Cvent, API keys for Luma, and LinkedIn OAuth for attendees.

Need programmatic access to your own events, campaigns, or analytics? Email <info@attendir.com> — a scoped, token-authenticated API is on the roadmap and real use cases move it up.

The full reference — including an explicit list of what Attendir does *not* issue, so you never have to guess — is at [/auth](https://attendir.com/auth) (markdown at [/auth.md](https://attendir.com/auth.md)).

 

Self-Serve Onboarding
---------------------

Attendir is fully self-serve — no sales calls, no demos, no "contact us" gate:

- 1. [Create an account](https://attendir.com/register) with Google sign-in or email — takes under a minute
- 2. Every account starts with a **7-day free trial** — no credit card required
- 3. Plans: Lite at $490/month and Unlimited at $1,190/month, billed monthly or yearly — see [pricing](https://attendir.com/pricing)
- 4. Connect Eventbrite, Luma, Cvent, or Bizzabo — or create events manually — and launch a campaign in under 5 minutes
 
 

 

 

 

  Let your attendees do your event marketing
------------------------------------------

No credit card required. Set up your LinkedIn sharing cards campaign in minutes.

 [ Start free 7-day trial ](https://attendir.com/register)
