{"openapi":"3.1.0","info":{"title":"Outro public API","version":"1.0.0","summary":"What an anonymous caller can do on outro.is, the Icelandic artist booking platform.","description":"Outro (outro.is) is a booking platform for DJs, bands, musicians and entertainers in Iceland.\nAn organizer describes an event, artists reply with quotes, and payment and payout go through Outro.\n\nThis document covers the endpoints that need no account and no API key.\nError messages are in Icelandic. The site itself is in Icelandic, with English landing pages under `/en`.\n\nA site summary for language models is at https://outro.is/llms.txt.","contact":{"name":"Outro","email":"outro@outro.is","url":"https://outro.is/um-okkur"}},"externalDocs":{"description":"Site summary for AI agents","url":"https://outro.is/llms.txt"},"servers":[{"url":"https://outro.is"}],"security":[],"tags":[{"name":"Inquiries","description":"Ask Outro for artist suggestions for an event."},{"name":"Artists","description":"The artists listed on outro.is, read-only."},{"name":"Downloads","description":"Read-only files for public events and artists."},{"name":"Discovery","description":"Machine-readable descriptions of the site."}],"paths":{"/api/fyrirspurn":{"post":{"operationId":"sendInquiry","tags":["Inquiries"],"summary":"Send a free event inquiry","description":"Tell Outro about an event and the team follows up with the contact details given.\nNothing is booked and nothing is charged by this call.\n\nSend it only for a real person who asked for it: every accepted submission alerts the Outro team.\nSending the same inquiry again is safe, it is recognised as a duplicate.\n\nDo not send a `website` field. It is a spam trap, and a request that fills it is accepted and thrown away.\nAn `eventDate` in the past, or an `eventType` or `eventRegion` that is not in the lists below, is dropped from the inquiry rather than rejected.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InquiryRequest"},"example":{"contactName":"Jón Jónsson","email":"jon@example.is","eventDate":"2026-12-05","eventType":"arshatid","eventRegion":"capital","guestCount":"120","message":"Árshátíð fyrir 120 manns í Reykjavík. Okkur vantar DJ og veislustjóra."}}}},"responses":{"200":{"description":"Accepted, or recognised as a duplicate of an inquiry already received.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InquiryAccepted"}}}},"400":{"description":"The body is not JSON, or contactName, email or message is missing or invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests from this caller.","headers":{"Retry-After":{"description":"Seconds until the caller may try again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"The inquiry could not be saved. Trying again is safe.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/artists":{"get":{"operationId":"listArtists","tags":["Artists"],"summary":"List the artists shown on /listamenn","description":"The artists a visitor sees on outro.is/listamenn, in the order the page shows them. Read-only, no key, no model behind it.\n\n`category`, `eventType` and `date` narrow the list. `region` does not: every artist plays anywhere in Iceland, so artists based in that region come first and the rest follow. Compare `region` on each artist to tell them apart.\n`date` leaves out artists who have blocked that day. An artist who has not blocked it may still be booked, so treat it as a starting point for an inquiry and not as a confirmation.\n`q` matches part of the artist's name.\n\nThe order rotates once a day at midnight UTC, so a client that pages across midnight can see an artist twice or miss one.\nTo get suggestions for a described event, send an inquiry instead.","parameters":[{"name":"category","in":"query","required":false,"description":"A category slug. The valid ones are the `slug` values in `categories` of the artists returned, so list without it first.","schema":{"type":"string","pattern":"^[a-z0-9-]{1,60}$"},"example":"dj"},{"name":"region","in":"query","required":false,"description":"Where artists are based, which only moves them to the front. `capital` is Höfuðborgarsvæðið, `south` is Suðurland, `west` is Vesturland, `north` is Norðurland, `east` is Austurland.","schema":{"type":"string","enum":["capital","south","west","north","east"]}},{"name":"eventType","in":"query","required":false,"description":"The kind of event, the same values as `eventType` in an inquiry. Artists who have not been tagged for it are left out.","schema":{"type":"string","enum":["afmaeli","party","brudkaup","fyrirtaekjaskemmtun","jardarfor","tonleikar","arshatid","thorrablot","radstefna","utskrift","barnaskemmtun","jolahladbord","jolaball","utihatid","skemmtistadur","skirn","aettarmot","steggjun","gaesun","babyshower","ferming","annad"]}},{"name":"date","in":"query","required":false,"description":"The day of the event, yyyy-MM-dd. Leaves out artists who blocked it.","schema":{"type":"string","format":"date"},"example":"2026-12-05"},{"name":"q","in":"query","required":false,"description":"Part of an artist's name. Ignores case and diacritics, and every word must match.","schema":{"type":"string","maxLength":100}},{"name":"limit","in":"query","required":false,"description":"How many artists to return.","schema":{"type":"integer","minimum":1,"maximum":50,"default":20}},{"name":"offset","in":"query","required":false,"description":"How many artists to skip. Use `nextOffset` from the previous page.","schema":{"type":"integer","minimum":0,"default":0}}],"responses":{"200":{"description":"One page of artists. An empty `artists` array is a real answer.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ArtistList"}}}},"400":{"description":"A parameter is unknown, given twice, or has a value that is not allowed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests from this caller.","headers":{"Retry-After":{"description":"Seconds until the caller may try again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"The list could not be read right now. Not cached, try again.","headers":{"Retry-After":{"description":"Seconds until the caller may try again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/events/{slug}/ics":{"get":{"operationId":"getEventCalendarFile","tags":["Downloads"],"summary":"Calendar file for a public event","description":"An iCalendar (.ics) file for a published event. The slug is the last segment of the event page, `/vidburdir/{slug}`.","parameters":[{"name":"slug","in":"path","required":true,"description":"Slug of a published event.","schema":{"type":"string"}}],"responses":{"200":{"description":"The calendar file.","content":{"text/calendar":{"schema":{"type":"string"}}}},"404":{"description":"No published event has this slug.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/artists/{slug}/press-kit":{"get":{"operationId":"getArtistPressKit","tags":["Downloads"],"summary":"Press kit PDF for a public artist","description":"The artist's press kit as a PDF. The slug is the last segment of the artist page, `/listamenn/{slug}`. A hidden or unknown artist is a 404.","parameters":[{"name":"slug","in":"path","required":true,"description":"Slug of a visible artist.","schema":{"type":"string"}}],"responses":{"200":{"description":"The press kit.","content":{"application/pdf":{"schema":{"type":"string","format":"binary"}}}},"404":{"description":"No visible artist has this slug.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests from this caller.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"The PDF could not be rendered.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/":{"get":{"operationId":"getHomePage","tags":["Discovery"],"summary":"The home page, as HTML or Markdown","description":"The front page. Send `Accept: text/markdown` to get the page as Markdown. Any other Accept header gets HTML. The response carries `Vary: Accept`.","responses":{"200":{"description":"The home page.","content":{"text/html":{"schema":{"type":"string"}},"text/markdown":{"schema":{"type":"string"}}}}}}},"/listamenn":{"get":{"operationId":"getArtistRoster","tags":["Discovery"],"summary":"Every listed artist, as HTML or Markdown","description":"The artist roster in the page's default order. The Markdown form lists every artist on one line with categories, region and starting price when the artist publishes one. It takes no query parameters: `?q=` and `?category=` are ignored. Send `Accept: text/markdown` to get the page as Markdown. Any other Accept header gets HTML. The response carries `Vary: Accept`.","responses":{"200":{"description":"The roster.","content":{"text/html":{"schema":{"type":"string"}},"text/markdown":{"schema":{"type":"string"}}}}}}},"/listamenn/{id}":{"get":{"operationId":"getArtistPage","tags":["Discovery"],"summary":"One artist, as HTML or Markdown","description":"An artist's public profile. The Markdown form carries categories, region, bio, starting price when published, rating, occasions, links and upcoming nights, and leaves review comments out. `id` is the slug, which is the last segment of the artist page. Send `Accept: text/markdown` to get the page as Markdown. Any other Accept header gets HTML. The response carries `Vary: Accept`.","parameters":[{"name":"id","in":"path","required":true,"description":"Slug of a visible artist. A profile id or a slug the artist stopped using is answered with a redirect to the current slug.","schema":{"type":"string"}}],"responses":{"200":{"description":"The artist's page.","content":{"text/html":{"schema":{"type":"string"}},"text/markdown":{"schema":{"type":"string"}}}},"308":{"description":"The artist's page is at another slug. `Location` has it."},"404":{"description":"No visible artist has this slug. Hidden and unknown artists are the same answer. The Markdown form carries a Markdown body.","content":{"text/markdown":{"schema":{"type":"string"}}}}}}},"/verd":{"get":{"operationId":"getPriceIndex","tags":["Discovery"],"summary":"Starting prices by category, as HTML or Markdown","description":"Median and range of the starting prices artists publish, by category, recalculated every hour. A starting price is not a quote. Send `Accept: text/markdown` to get the page as Markdown. Any other Accept header gets HTML. The response carries `Vary: Accept`.","responses":{"200":{"description":"The price page.","content":{"text/html":{"schema":{"type":"string"}},"text/markdown":{"schema":{"type":"string"}}}}}}},"/hjalp/faq":{"get":{"operationId":"getFaq","tags":["Discovery"],"summary":"Questions and answers, as HTML or Markdown","description":"Frequently asked questions for organizers and for artists. Send `Accept: text/markdown` to get the page as Markdown. Any other Accept header gets HTML. The response carries `Vary: Accept`.","responses":{"200":{"description":"The FAQ.","content":{"text/html":{"schema":{"type":"string"}},"text/markdown":{"schema":{"type":"string"}}}}}}},"/vidburdir":{"get":{"operationId":"getEventList","tags":["Discovery"],"summary":"Events run by Outro, as HTML or Markdown","description":"Upcoming events. The Markdown form lists the nights Outro runs and leaves ticket prices and sale state to each event's own page. Send `Accept: text/markdown` to get the page as Markdown. Any other Accept header gets HTML. The response carries `Vary: Accept`.","responses":{"200":{"description":"The event list.","content":{"text/html":{"schema":{"type":"string"}},"text/markdown":{"schema":{"type":"string"}}}}}}},"/llms.txt":{"get":{"operationId":"getLlmsTxt","tags":["Discovery"],"summary":"Short site summary for language models","responses":{"200":{"description":"The summary, in Markdown.","content":{"text/plain":{"schema":{"type":"string"}}}}}}},"/llms-full.txt":{"get":{"operationId":"getLlmsFullTxt","tags":["Discovery"],"summary":"Long site summary for language models","responses":{"200":{"description":"The long summary, in Markdown.","content":{"text/plain":{"schema":{"type":"string"}}}}}}},"/sitemap.xml":{"get":{"operationId":"getSitemap","tags":["Discovery"],"summary":"Every public page","responses":{"200":{"description":"The sitemap.","content":{"application/xml":{"schema":{"type":"string"}}}}}}}},"components":{"schemas":{"Error":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"What went wrong, in Icelandic.","examples":["Ógilt netfang"]}}},"ArtistCategory":{"type":"object","required":["slug","name"],"properties":{"slug":{"type":"string","description":"Use as `category` to filter."},"name":{"type":"string","description":"The category's name, in Icelandic."}}},"Artist":{"type":"object","required":["slug","name","categories","region","url","priceFromIsk"],"properties":{"slug":{"type":"string","description":"The last segment of the profile URL. Also the `{slug}` of the press kit endpoint."},"name":{"type":"string","description":"The name the artist goes by."},"categories":{"type":"array","description":"Primary category first.","items":{"$ref":"#/components/schemas/ArtistCategory"}},"region":{"type":["string","null"],"description":"Where the artist is based, as the Icelandic label the site shows (for example Höfuðborgarsvæðið)."},"url":{"type":"string","format":"uri","description":"The artist's page on outro.is."},"priceFromIsk":{"type":["number","null"],"description":"The \"Frá X kr.\" on the artist's card, in ISK. Null when the artist does not show a price."}}},"ArtistList":{"type":"object","required":["artists","total","limit","offset","nextOffset"],"properties":{"artists":{"type":"array","items":{"$ref":"#/components/schemas/Artist"}},"total":{"type":"integer","description":"How many artists matched, before `limit` and `offset`."},"limit":{"type":"integer"},"offset":{"type":"integer"},"nextOffset":{"type":["integer","null"],"description":"The `offset` of the next page. Null on the last page."}}},"InquiryAccepted":{"type":"object","required":["ok"],"properties":{"ok":{"type":"boolean","const":true}}},"InquiryRequest":{"type":"object","required":["contactName","email","message"],"properties":{"contactName":{"type":"string","maxLength":100,"description":"Who to talk to."},"email":{"type":"string","format":"email"},"phone":{"type":"string","maxLength":30},"clientName":{"type":"string","maxLength":120,"description":"The company, school or club the event is for, if any."},"eventDate":{"type":"string","format":"date","description":"The day of the event, yyyy-MM-dd. A date before yesterday is ignored."},"eventType":{"type":"string","enum":["afmaeli","party","brudkaup","fyrirtaekjaskemmtun","jardarfor","tonleikar","arshatid","thorrablot","radstefna","utskrift","barnaskemmtun","jolahladbord","jolaball","utihatid","skemmtistadur","skirn","aettarmot","steggjun","gaesun","babyshower","ferming","annad"],"description":"What kind of event. Anything else is ignored."},"eventRegion":{"type":"string","enum":["capital","south","west","north","east"],"description":"Where in Iceland. capital is the Reykjavík area, south, west, north and east are the other regions."},"guestCount":{"type":"string","maxLength":20,"description":"How many guests, as text: `120`, or `about 80`."},"message":{"type":"string","minLength":10,"maxLength":4000,"description":"What the event is and what is needed. The more the team knows, the better the suggestions."}}}}}}