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.
curl https://loops.video/api/v1/config \
-H "Accept: application/json"{
"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.
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
| Field | Type | Description |
|---|---|---|
name | string | Human-readable server name. |
url | string | Base URL of the server. |
description | string | Short description of the server. |
software | string | Software identifier. Equals "loops" on a Loops server. |
version | string | Running software version. |
media
| Field | Type | Description |
|---|---|---|
max_video_size | integer | Maximum upload size, in megabytes. |
max_video_duration | integer | Maximum video length, in seconds. |
allowed_video_formats | array | Accepted upload formats, e.g. ["mp4"]. |
Capabilities
| Field | Type | Description |
|---|---|---|
fyf | boolean | Whether the For You feed is available. |
registration | boolean | Whether new account registration is enabled. |
registration_mode | string | How registration is handled, e.g. "open". |
federation | boolean | Whether the server federates over ActivityPub. |
pushNotifications | boolean | Whether push notifications are supported. |
starterKits | boolean | Whether Starter Kits are enabled. |
atomFeeds | boolean | Whether Atom feeds are exposed. |
hasKlipy | boolean | Whether Klipy GIF integration is enabled. |
account
| Field | Type | Description |
|---|---|---|
max_bio_length | integer | Maximum 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 https://loops.video/.well-known/nodeinfo{
"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.
{
"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": {}
}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'
}/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.