# Open Opus

> Look up classical music from a workflow. Open Opus is a free, hand-curated catalogue of around 220 composers and the works they wrote. Find a composer by name and get their dates, period and portrait; list what they wrote, narrowed to chamber, keyboard, orchestral, stage or vocal music and to the pieces worth hearing; search composers and pieces together when you do not yet know which you have; turn a nickname, a shorthand or a French title into the real entry for a piece; draw suggestions at random for a daily pick or a newsletter; and look up whether a performer conducts, sings or plays an instrument. Composers are picked from a list or typed by name, so nobody has to know that Beethoven is number 145. Every action reads: nothing here changes anything. No account or API key required.

App · Music & Podcasts · 8 actions. Web page: https://docs.lodol.com/docs/integrations/open-opus

## Actions

### Find a composer

Look up one composer by name and get their dates, the period they belong to, a portrait, the kinds of music they wrote, and whether they are among the best known. Use it to turn a name from a form, an email or a spreadsheet into a real composer before the next step asks for their works. A surname is enough, capitals and accents do not matter, and a misspelling comes back with the names it nearly matched rather than with nothing.

**Inputs**

- Composer (`composer`, text, required): Which composer. Pick one from the list, or type a name: a surname ('Beethoven'), a full name ('Ludwig van Beethoven') or a name arriving from an earlier step all work, capitals and accents do not matter, and 'dvorak' finds Dvorak. When a word fits more than one person the closest match is used and the result names who it was, so 'bach' is Johann Sebastian rather than one of his sons.

**Outputs**

- `alternatives` (list): Other composers the name nearly fitted, or the closest names in the catalogue when nothing matched at all
- `birth_date` (text): The full date of birth, only where Open Opus publishes a real day and month; empty for the great majority, which are recorded as a year alone
- `birth_year` (number): The year they were born
- `death_date` (text): The full date of death, on the same terms as the date of birth
- `death_year` (number): The year they died, and 0 when they are still living
- `found` (true/false): False when the catalogue has nobody by that name
- `full_name` (text): Their full name
- `genres` (list): The genres they have works in, which is what 'List a composer's works' can filter on
- `id` (number): Open Opus's id for this composer, which every other action takes
- `is_essential` (true/false): True when they are on its list of essential composers
- `is_living` (true/false): True when they are still alive
- `is_popular` (true/false): True when they are on Open Opus's list of best known composers
- `lifespan` (text): Their years, written out, such as 1770 to 1827
- `matched_on` (text): How the name was recognised: id, name, full name, or part of the name
- `name` (text): The name they are listed under
- `period` (text): The period Open Opus files them under
- `portrait_url` (text): A portrait of them, hosted by Open Opus
- `searched_for` (text): The name that was looked up

**Example output**

```json
{
  "alternatives": [],
  "birth_date": "",
  "birth_year": 1770,
  "death_date": "",
  "death_year": 1827,
  "found": true,
  "full_name": "Ludwig van Beethoven",
  "genres": [
    "Chamber",
    "Keyboard",
    "Orchestral",
    "Stage",
    "Vocal"
  ],
  "id": 145,
  "is_essential": true,
  "is_living": false,
  "is_popular": true,
  "lifespan": "1770 to 1827",
  "matched_on": "name",
  "name": "Beethoven",
  "period": "Early Romantic",
  "portrait_url": "https://assets.openopus.org/portraits/55910756-1568084860.jpg",
  "searched_for": "Beethoven"
}
```

### Find a piece by name

Turn the name someone calls a piece by into the real entry for it. It handles the three ways a title is usually written and the catalogue is not: a nickname ('the Moonlight Sonata'), a shorthand ('Symphony no 9'), and the title in another language ('Le sacre du printemps' is filed as The Rite of Spring). Use it to tidy a playlist, a concert listing or a spreadsheet of titles into pieces you can look up.

**Inputs**

- Composer (`composer`, text, required): Which composer. Pick one from the list, or type a name: a surname ('Beethoven'), a full name ('Ludwig van Beethoven') or a name arriving from an earlier step all work, capitals and accents do not matter, and 'dvorak' finds Dvorak. When a word fits more than one person the closest match is used and the result names who it was, so 'bach' is Johann Sebastian rather than one of his sons.
- Title (`title`, text, required): What the piece is called. A nickname, a shorthand or the title in another language all work; it does not have to be the catalogue title.

**Outputs**

- `alternatives` (list): Other pieces by the same composer the title also fitted
- `composer_full_name` (text): The composer's full name, so the result says who was read
- `composer_id` (number): The composer's id
- `composer_name` (text): The name the composer is listed under
- `composer_period` (text): The period the composer is filed under
- `found` (true/false): False when that composer has nothing by that name
- `genre` (text): Chamber, Keyboard, Orchestral, Stage or Vocal
- `id` (number): Open Opus's id for the piece
- `is_essential` (true/false): True when Open Opus counts it essential listening
- `is_popular` (true/false): True when Open Opus counts this among the composer's popular works
- `matched_by` (text): How it was found: catalogue when Open Opus's own matcher placed it, title when it was matched against the composer's work list here
- `search_terms` (list): Other names the piece goes by; often empty
- `searched_for` (text): The title that was looked up
- `subtitle` (text): A subtitle where there is one; often empty
- `title` (text): The full catalogue title

**Example output**

```json
{
  "alternatives": [],
  "composer_full_name": "Ludwig van Beethoven",
  "composer_id": 145,
  "composer_name": "Beethoven",
  "composer_period": "Early Romantic",
  "found": true,
  "genre": "Keyboard",
  "id": 16375,
  "is_essential": false,
  "is_popular": true,
  "matched_by": "title",
  "search_terms": [],
  "searched_for": "Moonlight Sonata",
  "subtitle": "",
  "title": "Piano Sonata no. 14 in C sharp minor, op. 27 no. 2, \"Moonlight\""
}
```

### Get a piece

Get everything the catalogue holds on one piece from its id: the full title, the subtitle, the kind of music, the catalogue number it is known by, whether it is popular or essential, and its composer's dates and portrait. The id comes from any of the other actions, so this is the step after a search or a list when the whole record is wanted.

**Inputs**

- Piece (`work_id`, number, required): The id of the piece, which every other action returns beside its title. Use 'Search for a composer or a piece' or 'Find a piece by name' when you have a title rather than an id. At least 1.

**Outputs**

- `catalogue` (text): The catalogue the piece is numbered in, such as op, BWV or K; empty where the title carries no number
- `catalogue_number` (text): Its number within that catalogue, such as 17
- `composer_full_name` (text): The composer's full name
- `composer_id` (number): The composer's id
- `composer_lifespan` (text): The composer's years, written out
- `composer_name` (text): The name the composer is listed under
- `composer_period` (text): The period the composer is filed under
- `composer_portrait_url` (text): A portrait of the composer, hosted by Open Opus
- `found` (true/false): False when the catalogue has no piece with that id
- `genre` (text): Chamber, Keyboard, Orchestral, Stage or Vocal
- `id` (number): Open Opus's id for this piece
- `is_essential` (true/false): True when Open Opus counts it essential listening
- `is_popular` (true/false): True when Open Opus counts this among the composer's popular works
- `search_terms` (list): Other names the piece goes by; often empty
- `subtitle` (text): A subtitle where there is one; often empty
- `title` (text): The full catalogue title

**Example output**

```json
{
  "catalogue": "op",
  "catalogue_number": "17",
  "composer_full_name": "Robert Schumann",
  "composer_id": 129,
  "composer_lifespan": "1810 to 1856",
  "composer_name": "Schumann",
  "composer_period": "Romantic",
  "composer_portrait_url": "https://assets.openopus.org/portraits/25233320-1568084946.jpg",
  "found": true,
  "genre": "Keyboard",
  "id": 15076,
  "is_essential": true,
  "is_popular": true,
  "search_terms": [
    "op 17"
  ],
  "subtitle": "",
  "title": "Fantasy in C major, op. 17"
}
```

### List a composer's works

List what one composer wrote, narrowed to a kind of music, to the popular or essential pieces, or to a word in the title. This is the action behind 'give me five Mozart piano pieces' or 'every Bach cantata'. The genre list beside the field holds only the genres that composer really has works in, and every piece comes back with the id the other actions take.

**Inputs**

- Composer (`composer`, text, required): Which composer. Pick one from the list, or type a name: a surname ('Beethoven'), a full name ('Ludwig van Beethoven') or a name arriving from an earlier step all work, capitals and accents do not matter, and 'dvorak' finds Dvorak. When a word fits more than one person the closest match is used and the result names who it was, so 'bach' is Johann Sebastian rather than one of his sons.
- Kind of music (`genre`, text): Only works of one kind. The list holds the kinds this composer actually wrote in, so it changes when you change the composer. Leave it empty for all of them.
- Which works (`which_works`, text): Open Opus marks a handful of each composer's works popular and a slightly wider set essential. Narrow to one of them for the pieces worth putting in front of someone, or leave it on everything for the full catalogue. One of: `any` (Everything), `popular` (Only the popular ones), `essential` (Only the essential ones). Default: `any`.
- Title contains (`title_contains`, text): Only works whose title contains this text. Case and accents are ignored and the words need not be next to each other, so 'cello sonata' finds all five of Beethoven's. Leave it empty for every title.
- How many to return (`limit`, number): How many works to return, in title order so the same step always returns the same ones. Defaults to 25. The result says how many matched altogether, which is worth reading: Bach alone has over 900 works in the catalogue. From 1 to 500. Default: `25`.

**Outputs**

- `composer_full_name` (text): The composer's full name, so the result says who was read
- `composer_id` (number): The composer's id
- `composer_lifespan` (text): The composer's years, written out
- `composer_name` (text): The name the composer is listed under
- `composer_period` (text): The period the composer is filed under
- `composer_portrait_url` (text): A portrait of the composer, hosted by Open Opus
- `count` (number): How many are in this result
- `genre` (text): The genre that was asked for, empty when all of them were
- `genres_available` (list): Every genre this composer has works in, which says why an empty result is empty
- `matched_count` (number): How many matched before the limit trimmed the list
- `title_contains` (text): The text the titles were narrowed to, empty when they were not
- `total_count` (number): How many works the composer has in the genre that was asked for, before the other filters
- `which_works` (text): Whether everything, the popular or the essential works were asked for
- `works` (list): The works that matched, in title order

**Example output**

```json
{
  "composer_full_name": "Ludwig van Beethoven",
  "composer_id": 145,
  "composer_lifespan": "1770 to 1827",
  "composer_name": "Beethoven",
  "composer_period": "Early Romantic",
  "composer_portrait_url": "https://assets.openopus.org/portraits/55910756-1568084860.jpg",
  "count": 3,
  "genre": "Orchestral",
  "genres_available": [
    "Chamber",
    "Keyboard",
    "Orchestral",
    "Stage",
    "Vocal"
  ],
  "matched_count": 5,
  "title_contains": "",
  "total_count": 44,
  "which_works": "popular",
  "works": [
    {
      "composer_full_name": "Ludwig van Beethoven",
      "composer_id": 145,
      "composer_name": "Beethoven",
      "composer_period": "Early Romantic",
      "genre": "Orchestral",
      "id": 16218,
      "is_essential": true,
      "is_popular": true,
      "search_terms": [],
      "subtitle": "",
      "title": "Piano Concerto no. 5 in E flat major, op. 73, \"Emperor\""
    },
    {
      "composer_full_name": "Ludwig van Beethoven",
      "composer_id": 145,
      "composer_name": "Beethoven",
      "composer_period": "Early Romantic",
      "genre": "Orchestral",
      "id": 16406,
      "is_essential": true,
      "is_popular": true,
      "search_terms": [],
      "subtitle": "",
      "title": "Symphony no. 5 in C minor, op. 67"
    },
    {
      "composer_full_name": "Ludwig van Beethoven",
      "composer_id": 145,
      "composer_name": "Beethoven",
      "composer_period": "Early Romantic",
      "genre": "Orchestral",
      "id": 16121,
      "is_essential": false,
      "is_popular": true,
      "search_terms": [],
      "subtitle": "",
      "title": "Symphony no. 6 in F major, op. 68, \"Pastoral\""
    }
  ]
}
```

### List composers

List composers from the whole catalogue, around 220 of them, narrowed by period, by the letter their name starts with, or to the best known or the essential ones. The three narrow together, so 'the famous Romantics' or 'everyone Baroque under B' is one step rather than three. Use it to build a programme, a quiz, a newsletter series or a picker of your own.

**Inputs**

- Period (`period`, text): Only composers from one period of music history. Leave it empty for every period. These are Open Opus's own judgements rather than a standard, and two of them surprise people: Beethoven and Schubert are filed as Early Romantic rather than Classical, and Debussy and Rachmaninoff as Late Romantic rather than 20th Century. One of: `Medieval`, `Renaissance`, `Baroque`, `Classical`, `Early Romantic`, `Romantic`, `Late Romantic`, `20th Century`, `Post-War`, `21st Century`.
- Surname starts with (`starts_with`, text): Only composers whose listed name starts with this letter. Leave it empty for the whole alphabet. One of: `a`, `b`, `c`, `d`, `e`, `f`, `g`, `h`, `i`, `j`, and 16 more.
- Which composers (`which_composers`, text): Open Opus keeps two hand-picked lists: a couple of dozen composers almost everyone has heard of, and a wider set it counts as essential. Narrow to one of them for a shortlist worth showing someone, or leave it on everyone for the whole catalogue. One of: `any` (Everyone), `popular` (Only the best known), `essential` (Only the essential ones). Default: `any`.
- How many to return (`limit`, number): How many composers to return, in alphabetical order by surname. Defaults to 50, and the result says how many matched altogether. From 1 to 250. Default: `50`.

**Outputs**

- `composers` (list): The composers that matched, in alphabetical order by surname
- `count` (number): How many are in this result
- `matched_count` (number): How many matched before the limit trimmed the list
- `period` (text): The period that was asked for, empty when all of them were
- `periods_present` (list): The periods these composers come from
- `starts_with` (text): The letter that was asked for, empty when all of them were
- `total_count` (number): How many the catalogue held before any filter was applied
- `which_composers` (text): Whether everyone, the best known or the essential ones were asked for

**Example output**

```json
{
  "composers": [
    {
      "birth_date": "",
      "birth_year": 1671,
      "death_date": "",
      "death_year": 1751,
      "full_name": "Tomaso Albinoni",
      "id": 27,
      "is_living": false,
      "lifespan": "1671 to 1751",
      "name": "Albinoni",
      "period": "Baroque",
      "portrait_url": "https://assets.openopus.org/portraits/20001817-1568084856.jpg"
    },
    {
      "birth_date": "",
      "birth_year": 1685,
      "death_date": "",
      "death_year": 1750,
      "full_name": "Johann Sebastian Bach",
      "id": 87,
      "is_living": false,
      "lifespan": "1685 to 1750",
      "name": "Bach",
      "period": "Baroque",
      "portrait_url": "https://assets.openopus.org/portraits/12091447-1568084857.jpg"
    },
    {
      "birth_date": "",
      "birth_year": 1644,
      "death_date": "",
      "death_year": 1704,
      "full_name": "Heinrich Franz von Biber",
      "id": 47,
      "is_living": false,
      "lifespan": "1644 to 1704",
      "name": "Biber",
      "period": "Baroque",
      "portrait_url": "https://assets.openopus.org/portraits/87867069-1568084863.jpg"
    }
  ],
  "count": 3,
  "matched_count": 22,
  "period": "Baroque",
  "periods_present": [
    "Baroque"
  ],
  "starts_with": "",
  "total_count": 22,
  "which_composers": "any"
}
```

### Look up performers

Say what each performer on a list does: the instrument they play, whether they conduct or sing, or that they are an orchestra rather than a person. Hand it the credits from a recording or a concert listing and get back a row per name, with the ones the catalogue does not know flagged rather than quietly dropped.

**Inputs**

- Names (`names`, list, required): The performers to look up, one per line. A list from an earlier step works as it is. Capitals do not matter.

**Outputs**

- `count` (number): How many names were looked up
- `known_count` (number): How many of them the catalogue recognised
- `performers` (list): One row per name, in the order they were given
- `roles` (list): The distinct roles among the names it recognised
- `unknown_count` (number): How many it did not
- `unknown_names` (list): The names it did not recognise, so a caller can say so

**Example output**

```json
{
  "count": 3,
  "known_count": 3,
  "performers": [
    {
      "known": true,
      "name": "Herbert von Karajan",
      "role": "Conductor"
    },
    {
      "known": true,
      "name": "Martha Argerich",
      "role": "Piano"
    },
    {
      "known": true,
      "name": "Berliner Philharmoniker",
      "role": "Orchestra"
    }
  ],
  "roles": [
    "Conductor",
    "Orchestra",
    "Piano"
  ],
  "unknown_count": 0,
  "unknown_names": []
}
```

### Search for a composer or a piece

Search the whole catalogue at once with whatever someone typed, and get the composers and the pieces that match back separately. This is the action for a search box, a chat message or a subject line, where you do not yet know whether the words name a person or a piece: 'four seasons' comes back with Vivaldi and with three different works called that.

**Inputs**

- Search (`search`, text, required): What to look for, in a composer's name or a piece's title. Three letters or more. Part of a word is enough.
- How many to return (`limit`, number): How many composers and how many pieces to return, at most, in alphabetical order. Defaults to 20, and the result says when there were more. From 1 to 100. Default: `20`.

**Outputs**

- `composer_count` (number): How many composers are in this result
- `composers` (list): The composers whose name matched, in alphabetical order
- `found` (true/false): False when nothing in the catalogue matched
- `matched_work_count` (number): How many pieces matched before the limit trimmed the list
- `more_available` (true/false): True when there were further matches the limit left out
- `searched_for` (text): The text that was searched
- `work_count` (number): How many pieces are in this result
- `works` (list): The pieces whose title matched, in title order

**Example output**

```json
{
  "composer_count": 2,
  "composers": [
    {
      "birth_date": "",
      "birth_year": 1937,
      "death_date": "",
      "death_year": 0,
      "full_name": "Philip Glass",
      "id": 95,
      "is_living": true,
      "lifespan": "born 1937",
      "name": "Glass",
      "period": "Post-War",
      "portrait_url": "https://assets.openopus.org/portraits/41848722-1568084901.jpg"
    },
    {
      "birth_date": "",
      "birth_year": 1678,
      "death_date": "",
      "death_year": 1741,
      "full_name": "Antonio Vivaldi",
      "id": 98,
      "is_living": false,
      "lifespan": "1678 to 1741",
      "name": "Vivaldi",
      "period": "Baroque",
      "portrait_url": "https://assets.openopus.org/portraits/64540242-1568084959.jpg"
    }
  ],
  "found": true,
  "matched_work_count": 2,
  "more_available": false,
  "searched_for": "four seasons",
  "work_count": 2,
  "works": [
    {
      "composer_full_name": "Antonio Vivaldi",
      "composer_id": 98,
      "composer_name": "Vivaldi",
      "composer_period": "Baroque",
      "genre": "Orchestral",
      "id": 28102,
      "is_essential": true,
      "is_popular": true,
      "search_terms": [
        "four seasons",
        "quattro stagioni"
      ],
      "subtitle": "Four violin concertos, op. 8",
      "title": "The Four Seasons"
    },
    {
      "composer_full_name": "Philip Glass",
      "composer_id": 95,
      "composer_name": "Glass",
      "composer_period": "Post-War",
      "genre": "Orchestral",
      "id": 10828,
      "is_essential": false,
      "is_popular": false,
      "search_terms": [],
      "subtitle": "",
      "title": "Violin Concerto no. 2, \"The American Four Seasons\""
    }
  ]
}
```

### Suggest pieces to listen to

Draw pieces at random from the catalogue, narrowed to a period, a kind of music, particular composers, or the best known corner of it. Every run returns something different, which is what a daily listening pick, a weekly newsletter, a radio-style rotation or a quiz needs. Ask for one piece or up to forty.

**Inputs**

- Composers (`composers`, list): Only these composers. Pick as many as you like, or leave it empty to draw from every composer.
- Period (`period`, text): Only composers from one period of music history. Leave it empty for every period. These are Open Opus's own judgements rather than a standard, and two of them surprise people: Beethoven and Schubert are filed as Early Romantic rather than Classical, and Debussy and Rachmaninoff as Late Romantic rather than 20th Century. One of: `Medieval`, `Renaissance`, `Baroque`, `Classical`, `Early Romantic`, `Romantic`, `Late Romantic`, `20th Century`, `Post-War`, `21st Century`.
- Kind of music (`genre`, text): Only one kind of music. Leave it empty for all of them. One of: `Chamber`, `Keyboard`, `Orchestral`, `Stage` (Stage (opera and ballet)), `Vocal`.
- How well known (`how_well_known`, text): How far into the catalogue to go. Everything reaches the cantata nobody has heard, which is the point for a discovery workflow and wrong for a newsletter; the popular and essential lists are Open Opus's own, and the last option keeps the composer famous while leaving the piece free to be an unfamiliar one. One of: `any` (Anything in the catalogue), `popular_works` (Popular pieces), `essential_works` (Essential pieces), `famous_composers` (Anything by a famous composer). Default: `any`.
- How many to suggest (`how_many`, number): How many pieces to return. Defaults to 10, and 40 is the most the catalogue draws at a time. From 1 to 40. Default: `10`.

**Outputs**

- `composer_count` (number): How many composers it was narrowed to
- `composers` (list): The composers it was narrowed to, empty when it was not
- `count` (number): How many are in this result
- `found` (true/false): False when nothing in the catalogue fits the filters
- `genre` (text): The genre that was asked for, empty when all of them were
- `how_well_known` (text): Which corner of the catalogue was drawn from
- `offered_count` (number): How many the catalogue drew before the limit trimmed them, which is at most 40
- `period` (text): The period that was asked for, empty when all of them were
- `works` (list): The suggestions, in the order the catalogue drew them

**Example output**

```json
{
  "composer_count": 0,
  "composers": [],
  "count": 3,
  "found": true,
  "genre": "Orchestral",
  "how_well_known": "essential_works",
  "offered_count": 40,
  "period": "Romantic",
  "works": [
    {
      "composer_full_name": "Johannes Brahms",
      "composer_id": 80,
      "composer_name": "Brahms",
      "composer_period": "Romantic",
      "genre": "Orchestral",
      "id": 7706,
      "is_essential": true,
      "is_popular": true,
      "search_terms": [
        "op 98 no. 4"
      ],
      "subtitle": "",
      "title": "Symphony no. 4 in E minor, op. 98"
    },
    {
      "composer_full_name": "Anton\u00edn Dvo\u0159\u00e1k",
      "composer_id": 189,
      "composer_name": "Dvo\u0159\u00e1k",
      "composer_period": "Romantic",
      "genre": "Orchestral",
      "id": 22354,
      "is_essential": true,
      "is_popular": true,
      "search_terms": [
        "op 88 no. 8"
      ],
      "subtitle": "",
      "title": "Symphony no. 8 in G major, B.163, op. 88"
    },
    {
      "composer_full_name": "Robert Schumann",
      "composer_id": 129,
      "composer_name": "Schumann",
      "composer_period": "Romantic",
      "genre": "Orchestral",
      "id": 15144,
      "is_essential": true,
      "is_popular": true,
      "search_terms": [
        "op 54"
      ],
      "subtitle": "",
      "title": "Piano Concerto in A minor, op. 54"
    }
  ]
}
```
