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

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

Operation: upload.

Authentication: session or developmentSession.

Parameters

NameLocationRequiredTypeConstraints / description
churchIdpathYesstring (uuid)
filenamequeryYesstringminLength: 1; maxLength: 255; Original file name shown to readers.
OriginheaderYesstring

Request body (required)

  • application/pdf: array of integer (int32)

Responses

StatusDescriptionBodyHeaders
201Checked and stored; ready to attachapplication/json: AssetResponse
400application/json: ErrorBody
401application/json: ErrorBody
403application/json: ErrorBody
404application/json: ErrorBody
413File larger than 20 MBapplication/json: ErrorBody
415application/json: ErrorBody
422The file is not a usable PDFapplication/json: ErrorBody
429Rate limit exceededapplication/json: ErrorBody
500Unexpected server errorapplication/json: ErrorBody

GET /api/v1/churches/{churchId}/assets/{assetId}/contentπŸ”—

Operation: download.

Authentication: session or developmentSession.

Parameters

NameLocationRequiredTypeConstraints / description
churchIdpathYesstring (uuid)
assetIdpathYesstring (uuid)
downloadqueryNobooleanSend attachment instead of inline as the Content-Disposition.
RangeheaderNostring or nullSingle byte range, e.g. bytes=0-1023

Responses

StatusDescriptionBodyHeaders
200File bytes; ETag is the quoted SHA-256application/pdf: any
206Requested byte rangeapplication/pdf: any
401application/json: ErrorBody
404application/json: ErrorBody
413Request body exceeds 32 KiBapplication/json: ErrorBody
416Range not satisfiableNo body
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}/arrangementsπŸ”—

Operation: list_arrangements.

Authentication: session or developmentSession.

Parameters

NameLocationRequiredTypeConstraints / description
churchIdpathYesstring (uuid)
songIdpathYesstring (uuid)

Responses

StatusDescriptionBodyHeaders
200application/json: Arrangements
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}/arrangementsπŸ”—

Operation: create_arrangement.

Authentication: session or developmentSession.

Parameters

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

Request body (required)

Responses

StatusDescriptionBodyHeaders
201application/json: ArrangementResponseETag: 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}/arrangements/{arrangementId}πŸ”—

Operation: get_arrangement.

Authentication: session or developmentSession.

Parameters

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

Responses

StatusDescriptionBodyHeaders
200application/json: ArrangementResponseETag: string β€” Quoted current arrangement 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}/arrangements/{arrangementId}πŸ”—

Operation: update_arrangement.

Authentication: session or developmentSession.

Parameters

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

Request body (required)

Responses

StatusDescriptionBodyHeaders
200application/json: ArrangementResponseETag: string
400application/json: ErrorBody
401application/json: ErrorBody
403application/json: ErrorBody
404application/json: ErrorBody
409application/json: ErrorBody
412Stale version; currentArrangement 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}/arrangements/{arrangementId}/revisionsπŸ”—

Operation: arrangement_revisions.

Authentication: session or developmentSession.

Parameters

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

Responses

StatusDescriptionBodyHeaders
200application/json: ArrangementRevisions
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}/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}/assets/{assetId}/contentπŸ”—

Operation: public_download.

Authentication: public.

Parameters

NameLocationRequiredTypeConstraints / description
churchIdpathYesstring (uuid)
assetIdpathYesstring (uuid)
downloadqueryNobooleanSend attachment instead of inline as the Content-Disposition.
RangeheaderNostring or null

Responses

StatusDescriptionBodyHeaders
200Files of current arrangements of active songs onlyapplication/pdf: any
206application/pdf: any
404application/json: ErrorBody
413Request body exceeds 32 KiBapplication/json: ErrorBody
416Range not satisfiableNo body
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}/arrangementsπŸ”—

Operation: public_arrangements.

Authentication: public.

Parameters

NameLocationRequiredTypeConstraints / description
churchIdpathYesstring (uuid)
songIdpathYesstring (uuid)

Responses

StatusDescriptionBodyHeaders
200application/json: Arrangements
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πŸ”—

ArrangementπŸ”—

PropertyRequiredTypeConstraints / description
filesYesarray of AssetFiles in display order; the first is the main file.
idYesstring (uuid)
labelYesstring
lyricVersionIdsYesarray of string (uuid)
revisionIdYesstring (uuid)
songIdYesstring (uuid)
sourceKeyNostring or null
tempoNointeger or null (int32)
updatedAtYesstring (date-time)
versionYesinteger (int32)Increments with each saved revision; send it quoted in If-Match.
JSON schema
{
  "type": "object",
  "required": [
    "id",
    "songId",
    "version",
    "revisionId",
    "label",
    "lyricVersionIds",
    "files",
    "updatedAt"
  ],
  "properties": {
    "files": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/Asset"
      },
      "description": "Files in display order; the first is the main file."
    },
    "id": {
      "type": "string",
      "format": "uuid"
    },
    "label": {
      "type": "string"
    },
    "lyricVersionIds": {
      "type": "array",
      "items": {
        "type": "string",
        "format": "uuid"
      }
    },
    "revisionId": {
      "type": "string",
      "format": "uuid"
    },
    "songId": {
      "type": "string",
      "format": "uuid"
    },
    "sourceKey": {
      "type": [
        "string",
        "null"
      ]
    },
    "tempo": {
      "type": [
        "integer",
        "null"
      ],
      "format": "int32"
    },
    "updatedAt": {
      "type": "string",
      "format": "date-time"
    },
    "version": {
      "type": "integer",
      "format": "int32",
      "description": "Increments with each saved revision; send it quoted in If-Match."
    }
  }
}

ArrangementDocumentπŸ”—

The revisioned content of an arrangement. Files are referenced by asset ID in display order; the first file is the main one.

PropertyRequiredTypeConstraints / description
assetIdsYesarray of string (uuid)maxItems: 20; Ready assets of the church; the first is the main file.
labelYesstringminLength: 1; maxLength: 80; Name such as "Standard" or "Band".
lyricVersionIdsYesarray of string (uuid)maxItems: 20; Lyric versions of the same song this arrangement is used with.
sourceKeyNostring or nullmaxLength: 3; Key the material is written in, such as D or F#m.
tempoNointeger or null (int32)minimum: 20; maximum: 400; Beats per minute.

Unknown properties are rejected.

JSON schema
{
  "type": "object",
  "description": "The revisioned content of an arrangement. Files are referenced by asset ID\nin display order; the first file is the main one.",
  "required": [
    "label",
    "lyricVersionIds",
    "assetIds"
  ],
  "properties": {
    "assetIds": {
      "type": "array",
      "items": {
        "type": "string",
        "format": "uuid"
      },
      "description": "Ready assets of the church; the first is the main file.",
      "maxItems": 20
    },
    "label": {
      "type": "string",
      "description": "Name such as \"Standard\" or \"Band\".",
      "maxLength": 80,
      "minLength": 1
    },
    "lyricVersionIds": {
      "type": "array",
      "items": {
        "type": "string",
        "format": "uuid"
      },
      "description": "Lyric versions of the same song this arrangement is used with.",
      "maxItems": 20
    },
    "sourceKey": {
      "type": [
        "string",
        "null"
      ],
      "description": "Key the material is written in, such as `D` or `F#m`.",
      "example": "D",
      "maxLength": 3
    },
    "tempo": {
      "type": [
        "integer",
        "null"
      ],
      "format": "int32",
      "description": "Beats per minute.",
      "maximum": 400,
      "minimum": 20
    }
  },
  "additionalProperties": false
}

ArrangementResponseπŸ”—

PropertyRequiredTypeConstraints / description
arrangementYesArrangement
JSON schema
{
  "type": "object",
  "required": [
    "arrangement"
  ],
  "properties": {
    "arrangement": {
      "$ref": "#/components/schemas/Arrangement"
    }
  }
}

ArrangementRevisionπŸ”—

PropertyRequiredTypeConstraints / description
createdAtYesstring (date-time)
filesYesarray of Asset
idYesstring (uuid)
labelYesstring
lyricVersionIdsYesarray of string (uuid)
sourceKeyNostring or null
tempoNointeger or null (int32)
versionYesinteger (int32)
JSON schema
{
  "type": "object",
  "required": [
    "id",
    "version",
    "label",
    "lyricVersionIds",
    "files",
    "createdAt"
  ],
  "properties": {
    "createdAt": {
      "type": "string",
      "format": "date-time"
    },
    "files": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/Asset"
      }
    },
    "id": {
      "type": "string",
      "format": "uuid"
    },
    "label": {
      "type": "string"
    },
    "lyricVersionIds": {
      "type": "array",
      "items": {
        "type": "string",
        "format": "uuid"
      }
    },
    "sourceKey": {
      "type": [
        "string",
        "null"
      ]
    },
    "tempo": {
      "type": [
        "integer",
        "null"
      ],
      "format": "int32"
    },
    "version": {
      "type": "integer",
      "format": "int32"
    }
  }
}

ArrangementRevisionsπŸ”—

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

ArrangementsπŸ”—

PropertyRequiredTypeConstraints / description
arrangementsYesarray of ArrangementmaxItems: 20
JSON schema
{
  "type": "object",
  "required": [
    "arrangements"
  ],
  "properties": {
    "arrangements": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/Arrangement"
      },
      "maxItems": 20
    }
  }
}

AssetπŸ”—

A checked, immutable file such as a sheet-music PDF.

PropertyRequiredTypeConstraints / description
createdAtYesstring (date-time)
filenameYesstring
idYesstring (uuid)
mediaTypeYesstring
pageCountNointeger or null (int64)
sha256YesstringLowercase hex SHA-256 of the bytes; also the download ETag.
sizeYesinteger (int64)Size in bytes.
JSON schema
{
  "type": "object",
  "description": "A checked, immutable file such as a sheet-music PDF.",
  "required": [
    "id",
    "filename",
    "mediaType",
    "size",
    "sha256",
    "createdAt"
  ],
  "properties": {
    "createdAt": {
      "type": "string",
      "format": "date-time"
    },
    "filename": {
      "type": "string"
    },
    "id": {
      "type": "string",
      "format": "uuid"
    },
    "mediaType": {
      "type": "string",
      "example": "application/pdf"
    },
    "pageCount": {
      "type": [
        "integer",
        "null"
      ],
      "format": "int64"
    },
    "sha256": {
      "type": "string",
      "description": "Lowercase hex SHA-256 of the bytes; also the download ETag."
    },
    "size": {
      "type": "integer",
      "format": "int64",
      "description": "Size in bytes."
    }
  }
}

AssetResponseπŸ”—

PropertyRequiredTypeConstraints / description
assetYesAsset
JSON schema
{
  "type": "object",
  "required": [
    "asset"
  ],
  "properties": {
    "asset": {
      "$ref": "#/components/schemas/Asset"
    }
  }
}

CatalogueπŸ”—

PropertyRequiredTypeConstraints / description
churchYesChurch
hasMoreYesboolean
lyricMatchesYesarray of LyricMatchLyric versions of the listed songs whose text matched the search.
sheetMusicSongIdsYesarray of string (uuid)Listed songs with at least one sheet-music file in a current arrangement.
songsYesarray of Song
JSON schema
{
  "type": "object",
  "required": [
    "church",
    "songs",
    "hasMore",
    "lyricMatches",
    "sheetMusicSongIds"
  ],
  "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."
    },
    "sheetMusicSongIds": {
      "type": "array",
      "items": {
        "type": "string",
        "format": "uuid"
      },
      "description": "Listed songs with at least one sheet-music file in a current arrangement."
    },
    "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
currentArrangementNoArrangement or null
currentLyricsNoLyricVersion or null
errorYesstring
JSON schema
{
  "type": "object",
  "required": [
    "error"
  ],
  "properties": {
    "current": {
      "oneOf": [
        {
          "$ref": "#/components/schemas/Song"
        },
        {
          "type": "null"
        }
      ]
    },
    "currentArrangement": {
      "oneOf": [
        {
          "$ref": "#/components/schemas/Arrangement",
          "description": "The current arrangement when an arrangement save is rejected as stale."
        },
        {
          "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.