API reference / Documentation

OpenAPI reference

Endpoints, parameters, responses, and schemas generated from the SongCollect OpenAPI specification.

This reference is generated from api/openapi.json (OpenAPI 3.1.0, API version 1.0.0). Read the foundation guide for session handling, permissions, and examples.

Download the OpenAPI specification. The running service also publishes it at /api/openapi.json. API paths below are relative to your SongCollect service origin.

Versioned, language-independent SongCollect interface. Browser sessions use an HttpOnly cookie. Every mutation requires the configured APP_ORIGIN header; native clients must retain the cookie and send that origin too. Native token authentication and cross-origin browser hosting are future work. Repeated Idempotency-Key requests replay the committed response; PUT requires the quoted revision ETag in If-Match. Public routes expose active song heads only.

AuthenticationπŸ”—

  • developmentSession: apiKey, sent in cookie as songcollect.
  • session: apiKey, sent in cookie as __Host-songcollect.

Security alternatives listed on an endpoint mean either cookie is accepted. Endpoints marked public do not require a session.

EndpointsπŸ”—

GET /api/health/liveπŸ”—

Operation: live.

Authentication: public.

Responses

StatusDescriptionBodyHeaders
200application/json: Health
413Request body exceeds 32 KiBapplication/json: ErrorBody
429Rate limit exceededapplication/json: ErrorBody
500Unexpected server errorapplication/json: ErrorBody

GET /api/health/readyπŸ”—

Operation: ready.

Authentication: public.

Responses

StatusDescriptionBodyHeaders
200application/json: Health
413Request body exceeds 32 KiBapplication/json: ErrorBody
429Rate limit exceededapplication/json: ErrorBody
500Unexpected server errorapplication/json: ErrorBody
503application/json: Health

GET /api/v1/churchesπŸ”—

Operation: churches.

Authentication: session or developmentSession.

Responses

StatusDescriptionBodyHeaders
200application/json: Churches
401application/json: ErrorBody
413Request body exceeds 32 KiBapplication/json: ErrorBody
429Rate limit exceededapplication/json: ErrorBody
500Unexpected server errorapplication/json: ErrorBody

GET /api/v1/churches/{churchId}/songsπŸ”—

Operation: list.

Authentication: session or developmentSession.

Parameters

NameLocationRequiredTypeConstraints / description
churchIdpathYesstring (uuid)
qqueryNostringmaxLength: 200
offsetqueryNointeger (int64)minimum: 0; maximum: 100000

Responses

StatusDescriptionBodyHeaders
200application/json: Catalogue
400application/json: ErrorBody
401application/json: ErrorBody
404application/json: ErrorBody
413Request body exceeds 32 KiBapplication/json: ErrorBody
429Rate limit exceededapplication/json: ErrorBody
500Unexpected server errorapplication/json: ErrorBody

POST /api/v1/churches/{churchId}/songsπŸ”—

Operation: create.

Authentication: session or developmentSession.

Parameters

NameLocationRequiredTypeConstraints / description
churchIdpathYesstring (uuid)
OriginheaderYesstring
Idempotency-KeyheaderYesstring (uuid)

Request body (required)

Responses

StatusDescriptionBodyHeaders
201application/json: SongResponseETag: string; Location: string
400application/json: ErrorBody
401application/json: ErrorBody
403application/json: ErrorBody
404application/json: ErrorBody
409application/json: ErrorBody
413Request body exceeds 32 KiBapplication/json: ErrorBody
429Rate limit exceededapplication/json: ErrorBody
500Unexpected server errorapplication/json: ErrorBody

GET /api/v1/churches/{churchId}/songs/{songId}πŸ”—

Operation: get.

Authentication: session or developmentSession.

Parameters

NameLocationRequiredTypeConstraints / description
churchIdpathYesstring (uuid)
songIdpathYesstring (uuid)

Responses

StatusDescriptionBodyHeaders
200application/json: SongResponseETag: string β€” Quoted current revision
400application/json: ErrorBody
401application/json: ErrorBody
404application/json: ErrorBody
413Request body exceeds 32 KiBapplication/json: ErrorBody
429Rate limit exceededapplication/json: ErrorBody
500Unexpected server errorapplication/json: ErrorBody

PUT /api/v1/churches/{churchId}/songs/{songId}πŸ”—

Operation: update.

Authentication: session or developmentSession.

Parameters

NameLocationRequiredTypeConstraints / description
churchIdpathYesstring (uuid)
songIdpathYesstring (uuid)
OriginheaderYesstring
Idempotency-KeyheaderYesstring (uuid)
If-MatchheaderYesstringStrong ETag from the base revision, e.g. "1"

Request body (required)

Responses

StatusDescriptionBodyHeaders
200application/json: SongResponseETag: string
400application/json: ErrorBody
401application/json: ErrorBody
403application/json: ErrorBody
404application/json: ErrorBody
409application/json: ErrorBody
412application/json: ErrorBody
413Request body exceeds 32 KiBapplication/json: ErrorBody
428application/json: ErrorBody
429Rate limit exceededapplication/json: ErrorBody
500Unexpected server errorapplication/json: ErrorBody

GET /api/v1/churches/{churchId}/songs/{songId}/lyricsπŸ”—

Operation: list_lyrics.

Authentication: session or developmentSession.

Parameters

NameLocationRequiredTypeConstraints / description
churchIdpathYesstring (uuid)
songIdpathYesstring (uuid)

Responses

StatusDescriptionBodyHeaders
200application/json: LyricVersions
400application/json: ErrorBody
401application/json: ErrorBody
404application/json: ErrorBody
413Request body exceeds 32 KiBapplication/json: ErrorBody
429Rate limit exceededapplication/json: ErrorBody
500Unexpected server errorapplication/json: ErrorBody

POST /api/v1/churches/{churchId}/songs/{songId}/lyricsπŸ”—

Operation: create_lyrics.

Authentication: session or developmentSession.

Parameters

NameLocationRequiredTypeConstraints / description
churchIdpathYesstring (uuid)
songIdpathYesstring (uuid)
OriginheaderYesstring
Idempotency-KeyheaderYesstring (uuid)

Request body (required)

Responses

StatusDescriptionBodyHeaders
201application/json: LyricVersionResponseETag: string; Location: string
400application/json: ErrorBody
401application/json: ErrorBody
403application/json: ErrorBody
404application/json: ErrorBody
409application/json: ErrorBody
413Request body exceeds 32 KiBapplication/json: ErrorBody
429Rate limit exceededapplication/json: ErrorBody
500Unexpected server errorapplication/json: ErrorBody

GET /api/v1/churches/{churchId}/songs/{songId}/lyrics/{lyricVersionId}πŸ”—

Operation: get_lyrics.

Authentication: session or developmentSession.

Parameters

NameLocationRequiredTypeConstraints / description
churchIdpathYesstring (uuid)
songIdpathYesstring (uuid)
lyricVersionIdpathYesstring (uuid)

Responses

StatusDescriptionBodyHeaders
200application/json: LyricVersionResponseETag: string β€” Quoted current lyric version
400application/json: ErrorBody
401application/json: ErrorBody
404application/json: ErrorBody
413Request body exceeds 32 KiBapplication/json: ErrorBody
429Rate limit exceededapplication/json: ErrorBody
500Unexpected server errorapplication/json: ErrorBody

PUT /api/v1/churches/{churchId}/songs/{songId}/lyrics/{lyricVersionId}πŸ”—

Operation: update_lyrics.

Authentication: session or developmentSession.

Parameters

NameLocationRequiredTypeConstraints / description
churchIdpathYesstring (uuid)
songIdpathYesstring (uuid)
lyricVersionIdpathYesstring (uuid)
OriginheaderYesstring
Idempotency-KeyheaderYesstring (uuid)
If-MatchheaderYesstringStrong ETag of the base lyric version, e.g. "1"

Request body (required)

Responses

StatusDescriptionBodyHeaders
200application/json: LyricVersionResponseETag: string
400application/json: ErrorBody
401application/json: ErrorBody
403application/json: ErrorBody
404application/json: ErrorBody
409application/json: ErrorBody
412Stale version; currentLyrics holds the latest revisionapplication/json: ErrorBody
413Request body exceeds 32 KiBapplication/json: ErrorBody
428application/json: ErrorBody
429Rate limit exceededapplication/json: ErrorBody
500Unexpected server errorapplication/json: ErrorBody

GET /api/v1/churches/{churchId}/songs/{songId}/lyrics/{lyricVersionId}/revisionsπŸ”—

Operation: lyric_revisions.

Authentication: session or developmentSession.

Parameters

NameLocationRequiredTypeConstraints / description
churchIdpathYesstring (uuid)
songIdpathYesstring (uuid)
lyricVersionIdpathYesstring (uuid)
beforeVersionqueryNointeger (int32)minimum: 1; maximum: 2147483647

Responses

StatusDescriptionBodyHeaders
200application/json: LyricRevisions
400application/json: ErrorBody
401application/json: ErrorBody
404application/json: ErrorBody
413Request body exceeds 32 KiBapplication/json: ErrorBody
429Rate limit exceededapplication/json: ErrorBody
500Unexpected server errorapplication/json: ErrorBody

GET /api/v1/churches/{churchId}/songs/{songId}/revisionsπŸ”—

Operation: revisions.

Authentication: session or developmentSession.

Parameters

NameLocationRequiredTypeConstraints / description
churchIdpathYesstring (uuid)
songIdpathYesstring (uuid)
beforeVersionqueryNointeger (int32)minimum: 1; maximum: 2147483647

Responses

StatusDescriptionBodyHeaders
200application/json: Revisions
400application/json: ErrorBody
401application/json: ErrorBody
404application/json: ErrorBody
413Request body exceeds 32 KiBapplication/json: ErrorBody
429Rate limit exceededapplication/json: ErrorBody
500Unexpected server errorapplication/json: ErrorBody

GET /api/v1/public/churches/{churchId}/songsπŸ”—

Operation: public_list.

Authentication: public.

Parameters

NameLocationRequiredTypeConstraints / description
churchIdpathYesstring (uuid)
qqueryNostringmaxLength: 200
offsetqueryNointeger (int64)minimum: 0; maximum: 100000

Responses

StatusDescriptionBodyHeaders
200application/json: Catalogue
400application/json: ErrorBody
404application/json: ErrorBody
413Request body exceeds 32 KiBapplication/json: ErrorBody
429Rate limit exceededapplication/json: ErrorBody
500Unexpected server errorapplication/json: ErrorBody

GET /api/v1/public/churches/{churchId}/songs/{songId}πŸ”—

Operation: public_get.

Authentication: public.

Parameters

NameLocationRequiredTypeConstraints / description
churchIdpathYesstring (uuid)
songIdpathYesstring (uuid)

Responses

StatusDescriptionBodyHeaders
200application/json: SongResponseETag: string
400application/json: ErrorBody
404application/json: ErrorBody
413Request body exceeds 32 KiBapplication/json: ErrorBody
429Rate limit exceededapplication/json: ErrorBody
500Unexpected server errorapplication/json: ErrorBody

GET /api/v1/public/churches/{churchId}/songs/{songId}/lyricsπŸ”—

Operation: public_lyrics.

Authentication: public.

Parameters

NameLocationRequiredTypeConstraints / description
churchIdpathYesstring (uuid)
songIdpathYesstring (uuid)

Responses

StatusDescriptionBodyHeaders
200application/json: LyricVersions
400application/json: ErrorBody
404application/json: ErrorBody
413Request body exceeds 32 KiBapplication/json: ErrorBody
429Rate limit exceededapplication/json: ErrorBody
500Unexpected server errorapplication/json: ErrorBody

POST /api/v1/sessionπŸ”—

Operation: login.

Authentication: public.

Parameters

NameLocationRequiredTypeConstraints / description
OriginheaderYesstringConfigured APP_ORIGIN

Request body (required)

Responses

StatusDescriptionBodyHeaders
204Signed in; HttpOnly session cookie setNo body
400application/json: ErrorBody
401application/json: ErrorBody
403application/json: ErrorBody
413Request body exceeds 32 KiBapplication/json: ErrorBody
429application/json: ErrorBody
500Unexpected server errorapplication/json: ErrorBody

DELETE /api/v1/sessionπŸ”—

Operation: logout.

Authentication: public.

Parameters

NameLocationRequiredTypeConstraints / description
OriginheaderYesstring

Responses

StatusDescriptionBodyHeaders
204Session revoked and cookie clearedNo body
403application/json: ErrorBody
413Request body exceeds 32 KiBapplication/json: ErrorBody
429Rate limit exceededapplication/json: ErrorBody
500Unexpected server errorapplication/json: ErrorBody

SchemasπŸ”—

CatalogueπŸ”—

PropertyRequiredTypeConstraints / description
churchYesChurch
hasMoreYesboolean
lyricMatchesYesarray of LyricMatchLyric versions of the listed songs whose text matched the search.
songsYesarray of Song
JSON schema
{
  "type": "object",
  "required": [
    "church",
    "songs",
    "hasMore",
    "lyricMatches"
  ],
  "properties": {
    "church": {
      "$ref": "#/components/schemas/Church"
    },
    "hasMore": {
      "type": "boolean"
    },
    "lyricMatches": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/LyricMatch"
      },
      "description": "Lyric versions of the listed songs whose text matched the search."
    },
    "songs": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/Song"
      }
    }
  }
}

ChurchπŸ”—

PropertyRequiredTypeConstraints / description
idYesstring (uuid)
nameYesstring
roleNoRole or null
timeZoneYesstring
JSON schema
{
  "type": "object",
  "required": [
    "id",
    "name",
    "timeZone"
  ],
  "properties": {
    "id": {
      "type": "string",
      "format": "uuid"
    },
    "name": {
      "type": "string"
    },
    "role": {
      "oneOf": [
        {
          "$ref": "#/components/schemas/Role"
        },
        {
          "type": "null"
        }
      ]
    },
    "timeZone": {
      "type": "string"
    }
  }
}

ChurchesπŸ”—

PropertyRequiredTypeConstraints / description
churchesYesarray of Church
JSON schema
{
  "type": "object",
  "required": [
    "churches"
  ],
  "properties": {
    "churches": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/Church"
      }
    }
  }
}

CredentialsπŸ”—

PropertyRequiredTypeConstraints / description
emailYesstring (email)maxLength: 254
passwordYesstringminLength: 1; maxLength: 256

Unknown properties are rejected.

JSON schema
{
  "type": "object",
  "required": [
    "email",
    "password"
  ],
  "properties": {
    "email": {
      "type": "string",
      "format": "email",
      "maxLength": 254
    },
    "password": {
      "type": "string",
      "maxLength": 256,
      "minLength": 1
    }
  },
  "additionalProperties": false
}

ErrorBodyπŸ”—

PropertyRequiredTypeConstraints / description
currentNoSong or null
currentLyricsNoLyricVersion or null
errorYesstring
JSON schema
{
  "type": "object",
  "required": [
    "error"
  ],
  "properties": {
    "current": {
      "oneOf": [
        {
          "$ref": "#/components/schemas/Song"
        },
        {
          "type": "null"
        }
      ]
    },
    "currentLyrics": {
      "oneOf": [
        {
          "$ref": "#/components/schemas/LyricVersion",
          "description": "The current lyric version when a lyric save is rejected as stale."
        },
        {
          "type": "null"
        }
      ]
    },
    "error": {
      "type": "string"
    }
  }
}

HealthπŸ”—

PropertyRequiredTypeConstraints / description
statusYesstring
JSON schema
{
  "type": "object",
  "required": [
    "status"
  ],
  "properties": {
    "status": {
      "type": "string"
    }
  }
}

LyricLineπŸ”—

PropertyRequiredTypeConstraints / description
idYesstring (uuid)Stable line identity. Keep it when editing the text; generate a new UUID for an added line.
textYesstringmaxLength: 200

Unknown properties are rejected.

JSON schema
{
  "type": "object",
  "required": [
    "id",
    "text"
  ],
  "properties": {
    "id": {
      "type": "string",
      "format": "uuid",
      "description": "Stable line identity. Keep it when editing the text; generate a new\nUUID for an added line."
    },
    "text": {
      "type": "string",
      "maxLength": 200
    }
  },
  "additionalProperties": false
}

LyricMatchπŸ”—

PropertyRequiredTypeConstraints / description
labelYesstring
languageYesstring
lyricVersionIdYesstring (uuid)
songIdYesstring (uuid)
JSON schema
{
  "type": "object",
  "required": [
    "songId",
    "lyricVersionId",
    "language",
    "label"
  ],
  "properties": {
    "label": {
      "type": "string"
    },
    "language": {
      "type": "string"
    },
    "lyricVersionId": {
      "type": "string",
      "format": "uuid"
    },
    "songId": {
      "type": "string",
      "format": "uuid"
    }
  }
}

LyricRevisionπŸ”—

PropertyRequiredTypeConstraints / description
createdAtYesstring (date-time)
idYesstring (uuid)
labelYesstring
sectionsYesarray of LyricSection
sequenceYesarray of string (uuid)
versionYesinteger (int32)
JSON schema
{
  "type": "object",
  "required": [
    "id",
    "version",
    "label",
    "sections",
    "sequence",
    "createdAt"
  ],
  "properties": {
    "createdAt": {
      "type": "string",
      "format": "date-time"
    },
    "id": {
      "type": "string",
      "format": "uuid"
    },
    "label": {
      "type": "string"
    },
    "sections": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/LyricSection"
      }
    },
    "sequence": {
      "type": "array",
      "items": {
        "type": "string",
        "format": "uuid"
      }
    },
    "version": {
      "type": "integer",
      "format": "int32"
    }
  }
}

LyricRevisionsπŸ”—

PropertyRequiredTypeConstraints / description
hasMoreYesboolean
revisionsYesarray of LyricRevisionmaxItems: 50
JSON schema
{
  "type": "object",
  "required": [
    "revisions",
    "hasMore"
  ],
  "properties": {
    "hasMore": {
      "type": "boolean"
    },
    "revisions": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/LyricRevision"
      },
      "maxItems": 50
    }
  }
}

LyricSectionπŸ”—

PropertyRequiredTypeConstraints / description
idYesstring (uuid)Stable section identity referenced by singing sequences.
linesYesarray of LyricLineminItems: 1; maxItems: 200
nameYesstringminLength: 1; maxLength: 80; Display name such as "Verse 1" or "Chorus"; unique within the document.

Unknown properties are rejected.

JSON schema
{
  "type": "object",
  "required": [
    "id",
    "name",
    "lines"
  ],
  "properties": {
    "id": {
      "type": "string",
      "format": "uuid",
      "description": "Stable section identity referenced by singing sequences."
    },
    "lines": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/LyricLine"
      },
      "maxItems": 200,
      "minItems": 1
    },
    "name": {
      "type": "string",
      "description": "Display name such as \"Verse 1\" or \"Chorus\"; unique within the document.",
      "maxLength": 80,
      "minLength": 1
    }
  },
  "additionalProperties": false
}

LyricVersionπŸ”—

PropertyRequiredTypeConstraints / description
idYesstring (uuid)
labelYesstring
languageYesstring
revisionIdYesstring (uuid)
sectionsYesarray of LyricSection
sequenceYesarray of string (uuid)
songIdYesstring (uuid)
updatedAtYesstring (date-time)
versionYesinteger (int32)Increments with each saved revision; send it quoted in If-Match.
JSON schema
{
  "type": "object",
  "required": [
    "id",
    "songId",
    "language",
    "version",
    "revisionId",
    "label",
    "sections",
    "sequence",
    "updatedAt"
  ],
  "properties": {
    "id": {
      "type": "string",
      "format": "uuid"
    },
    "label": {
      "type": "string"
    },
    "language": {
      "type": "string"
    },
    "revisionId": {
      "type": "string",
      "format": "uuid"
    },
    "sections": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/LyricSection"
      }
    },
    "sequence": {
      "type": "array",
      "items": {
        "type": "string",
        "format": "uuid"
      }
    },
    "songId": {
      "type": "string",
      "format": "uuid"
    },
    "updatedAt": {
      "type": "string",
      "format": "date-time"
    },
    "version": {
      "type": "integer",
      "format": "int32",
      "description": "Increments with each saved revision; send it quoted in If-Match."
    }
  }
}

LyricVersionResponseπŸ”—

PropertyRequiredTypeConstraints / description
lyricsYesLyricVersion
JSON schema
{
  "type": "object",
  "required": [
    "lyrics"
  ],
  "properties": {
    "lyrics": {
      "$ref": "#/components/schemas/LyricVersion"
    }
  }
}

LyricVersionsπŸ”—

PropertyRequiredTypeConstraints / description
lyricsYesarray of LyricVersionmaxItems: 20; Lyric versions of the song, ordered by language and creation.
JSON schema
{
  "type": "object",
  "required": [
    "lyrics"
  ],
  "properties": {
    "lyrics": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/LyricVersion"
      },
      "description": "Lyric versions of the song, ordered by language and creation.",
      "maxItems": 20
    }
  }
}

LyricsDocumentπŸ”—

The revisioned content of a lyric version.

PropertyRequiredTypeConstraints / description
labelYesstringmaxLength: 80; Edition label such as "Original" or "Simplified".
sectionsYesarray of LyricSectionminItems: 1; maxItems: 40
sequenceYesarray of string (uuid)maxItems: 100; Default singing sequence as section IDs. Sections may repeat. Empty means the section order is sung.

Unknown properties are rejected.

JSON schema
{
  "type": "object",
  "description": "The revisioned content of a lyric version.",
  "required": [
    "label",
    "sections",
    "sequence"
  ],
  "properties": {
    "label": {
      "type": "string",
      "description": "Edition label such as \"Original\" or \"Simplified\".",
      "maxLength": 80
    },
    "sections": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/LyricSection"
      },
      "maxItems": 40,
      "minItems": 1
    },
    "sequence": {
      "type": "array",
      "items": {
        "type": "string",
        "format": "uuid"
      },
      "description": "Default singing sequence as section IDs. Sections may repeat. Empty\nmeans the section order is sung.",
      "maxItems": 100
    }
  },
  "additionalProperties": false
}

MetadataπŸ”—

PropertyRequiredTypeConstraints / description
alternateTitlesYesarray of stringmaxItems: 20
authorsYesarray of stringmaxItems: 30
copyrightYesstringmaxLength: 1000
songbooksYesarray of SongbookmaxItems: 30
themesYesarray of stringmaxItems: 30
titleYesstringminLength: 1; maxLength: 200

Unknown properties are rejected.

JSON schema
{
  "type": "object",
  "required": [
    "title",
    "alternateTitles",
    "authors",
    "copyright",
    "themes",
    "songbooks"
  ],
  "properties": {
    "alternateTitles": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "maxItems": 20
    },
    "authors": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "maxItems": 30
    },
    "copyright": {
      "type": "string",
      "maxLength": 1000
    },
    "songbooks": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/Songbook"
      },
      "maxItems": 30
    },
    "themes": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "maxItems": 30
    },
    "title": {
      "type": "string",
      "maxLength": 200,
      "minLength": 1
    }
  },
  "additionalProperties": false
}

MetadataInputπŸ”—

PropertyRequiredTypeConstraints / description
alternateTitlesNoarray of stringmaxItems: 20
authorsNoarray of stringmaxItems: 30
copyrightNostringmaxLength: 1000
songbooksNoarray of SongbookmaxItems: 30
themesNoarray of stringmaxItems: 30
titleYesstringminLength: 1; maxLength: 200

Unknown properties are rejected.

JSON schema
{
  "type": "object",
  "required": [
    "title"
  ],
  "properties": {
    "alternateTitles": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "maxItems": 20
    },
    "authors": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "maxItems": 30
    },
    "copyright": {
      "type": "string",
      "maxLength": 1000
    },
    "songbooks": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/Songbook"
      },
      "maxItems": 30
    },
    "themes": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "maxItems": 30
    },
    "title": {
      "type": "string",
      "maxLength": 200,
      "minLength": 1
    }
  },
  "additionalProperties": false
}

NewLyricsπŸ”—

PropertyRequiredTypeConstraints / description
labelYesstringmaxLength: 80
languageYesstringminLength: 2; maxLength: 35; BCP 47 language tag, fixed for the lifetime of the lyric version.
sectionsYesarray of LyricSectionminItems: 1; maxItems: 40
sequenceYesarray of string (uuid)maxItems: 100

Unknown properties are rejected.

JSON schema
{
  "type": "object",
  "required": [
    "language",
    "label",
    "sections",
    "sequence"
  ],
  "properties": {
    "label": {
      "type": "string",
      "maxLength": 80
    },
    "language": {
      "type": "string",
      "description": "BCP 47 language tag, fixed for the lifetime of the lyric version.",
      "example": "de",
      "maxLength": 35,
      "minLength": 2
    },
    "sections": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/LyricSection"
      },
      "maxItems": 40,
      "minItems": 1
    },
    "sequence": {
      "type": "array",
      "items": {
        "type": "string",
        "format": "uuid"
      },
      "maxItems": 100
    }
  },
  "additionalProperties": false
}

RevisionπŸ”—

PropertyRequiredTypeConstraints / description
createdAtYesstring (date-time)
idYesstring (uuid)
metadataYesMetadata
versionYesinteger (int32)
JSON schema
{
  "type": "object",
  "required": [
    "id",
    "version",
    "metadata",
    "createdAt"
  ],
  "properties": {
    "createdAt": {
      "type": "string",
      "format": "date-time"
    },
    "id": {
      "type": "string",
      "format": "uuid"
    },
    "metadata": {
      "$ref": "#/components/schemas/Metadata"
    },
    "version": {
      "type": "integer",
      "format": "int32"
    }
  }
}

RevisionsπŸ”—

PropertyRequiredTypeConstraints / description
hasMoreYesboolean
revisionsYesarray of RevisionmaxItems: 50
JSON schema
{
  "type": "object",
  "required": [
    "revisions",
    "hasMore"
  ],
  "properties": {
    "hasMore": {
      "type": "boolean"
    },
    "revisions": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/Revision"
      },
      "maxItems": 50
    }
  }
}

RoleπŸ”—

Type: string. allowed: "Administrator", "Editor", "Viewer"

JSON schema
{
  "type": "string",
  "enum": [
    "Administrator",
    "Editor",
    "Viewer"
  ]
}

SongπŸ”—

PropertyRequiredTypeConstraints / description
idYesstring (uuid)
metadataYesMetadata
revisionIdYesstring (uuid)
updatedAtYesstring (date-time)
versionYesinteger (int32)
JSON schema
{
  "type": "object",
  "required": [
    "id",
    "version",
    "revisionId",
    "metadata",
    "updatedAt"
  ],
  "properties": {
    "id": {
      "type": "string",
      "format": "uuid"
    },
    "metadata": {
      "$ref": "#/components/schemas/Metadata"
    },
    "revisionId": {
      "type": "string",
      "format": "uuid"
    },
    "updatedAt": {
      "type": "string",
      "format": "date-time"
    },
    "version": {
      "type": "integer",
      "format": "int32"
    }
  }
}

SongResponseπŸ”—

PropertyRequiredTypeConstraints / description
songYesSong
JSON schema
{
  "type": "object",
  "required": [
    "song"
  ],
  "properties": {
    "song": {
      "$ref": "#/components/schemas/Song"
    }
  }
}

SongbookπŸ”—

PropertyRequiredTypeConstraints / description
bookYesstringminLength: 1; maxLength: 200
numberYesstringminLength: 1; maxLength: 30

Unknown properties are rejected.

JSON schema
{
  "type": "object",
  "required": [
    "book",
    "number"
  ],
  "properties": {
    "book": {
      "type": "string",
      "maxLength": 200,
      "minLength": 1
    },
    "number": {
      "type": "string",
      "maxLength": 30,
      "minLength": 1
    }
  },
  "additionalProperties": false
}

Search documentation

Type to search the documentation.