DEVELOPERS

Loops API Docs

Full API Reference

Identify a Loops Server

Clients can connect to any instance domain. Before you register an app or surface a server's features, confirm the domain actually runs Loops and discover what it supports. There are two ways to do this: the Loops config endpoint (richest, a single call), or the cross-platform NodeInfo standard.

Option 1 — Server configuration

The config endpoint is public — no authentication required. It returns the software identity along with the server's capabilities and limits in one response.

GET/api/v1/config Reference
cURL
curl https://loops.video/api/v1/config \
  -H "Accept: application/json"
Response
{
  "app": {
    "name": "Loops.video",
    "url": "https://loops.video",
    "description": "The flagship Loops server, a new creative community for sharing videos and going viral.",
    "software": "loops",
    "version": "1.0.0-beta.12"
  },
  "media": {
    "max_video_size": 40,
    "max_video_duration": 180,
    "allowed_video_formats": ["mp4"]
  },
  "fyf": true,
  "registration": true,
  "registration_mode": "open",
  "federation": true,
  "pushNotifications": false,
  "starterKits": true,
  "atomFeeds": true,
  "hasKlipy": true,
  "account": {
    "max_bio_length": 500
  }
}

The field that confirms the software is app.software — a value of "loops" means you're talking to a Loops server.

JavaScript
async function getLoopsConfig(domain) {
  const config = await fetch('https://' + domain + '/api/v1/config', {
    headers: { Accept: 'application/json' },
  }).then((r) => r.json())

  // Not a Loops server
  if (config.app?.software !== 'loops') return null

  return config
}

app

FieldTypeDescription
namestringHuman-readable server name.
urlstringBase URL of the server.
descriptionstringShort description of the server.
softwarestringSoftware identifier. Equals "loops" on a Loops server.
versionstringRunning software version.

media

FieldTypeDescription
max_video_sizeintegerMaximum upload size, in megabytes.
max_video_durationintegerMaximum video length, in seconds.
allowed_video_formatsarrayAccepted upload formats, e.g. ["mp4"].

Capabilities

FieldTypeDescription
fyfbooleanWhether the For You feed is available.
registrationbooleanWhether new account registration is enabled.
registration_modestringHow registration is handled, e.g. "open".
federationbooleanWhether the server federates over ActivityPub.
pushNotificationsbooleanWhether push notifications are supported.
starterKitsbooleanWhether Starter Kits are enabled.
atomFeedsbooleanWhether Atom feeds are exposed.
hasKlipybooleanWhether Klipy GIF integration is enabled.

account

FieldTypeDescription
max_bio_lengthintegerMaximum bio length, in characters.

Option 2 — NodeInfo

NodeInfo is the fediverse-wide standard for server metadata, so it's the right choice if you're detecting several software types. It's a two-step lookup: fetch the well-known discovery document, then follow its link to the NodeInfo document itself.

cURL
curl https://loops.video/.well-known/nodeinfo
Discovery response
{
  "links": [
    {
      "rel": "http://nodeinfo.diaspora.software/ns/schema/2.0",
      "href": "https://loops.video/nodeinfo/2.0"
    }
  ]
}

Follow the href for the schema version you support — don't construct it yourself — then read software.name.

NodeInfo document
{
  "version": "2.0",
  "software": {
    "name": "loops",
    "version": "1.0.0-beta.12"
  },
  "protocols": ["activitypub"],
  "services": { "inbound": [], "outbound": [] },
  "openRegistrations": true,
  "usage": {
    "users": { "total": 12000 },
    "localPosts": 45000
  },
  "metadata": {}
}
JavaScript
async function isLoopsServer(domain) {
  const wellKnown = await fetch(
    'https://' + domain + '/.well-known/nodeinfo'
  ).then((r) => r.json())

  // Follow the link rather than building the URL yourself
  const href = wellKnown.links?.find(
    (l) => l.rel.endsWith('/schema/2.0')
  )?.href
  if (!href) return false

  const nodeinfo = await fetch(href).then((r) => r.json())
  return nodeinfo.software?.name === 'loops'
}
Which should I use? Reach for /api/v1/config when you're building specifically for Loops — it's one call and gives you limits and capabilities too. Use NodeInfo when your client supports multiple fediverse platforms and needs a generic way to detect the software.