# Tangokalender > Community calendar for Argentine tango in Oslo, Norway: milongas, practicas, classes and festivals. > Events are submitted as JSON through a GitHub issue form and reviewed by an editor before they are published. ## Converting an event page to a submission When a user asks you to add an event to Tangokalender, or gives you an event description (for example copied from Facebook) together with these instructions: Pages to use (open them if you can browse; if you cannot, work from what the user gives you): - https://tango.oslo.no/schema/tango-event-submission.schema.json: the submission JSON Schema, with every field and the allowed values. Follow it exactly. - https://tango.oslo.no/events.json: the upcoming events, as stored. Check it before you answer: whether the event is already listed, which events belong to the same series, and how venues, addresses, organisers and teachers are already spelt. - https://github.com/Tangokalender/tangokalender.github.io/tree/main/events: every event as one JSON file, past dates too (events/YYYY/MM-month/YYYY-MM-DD-.json). Use it when the series has no upcoming dates left, e.g. a new term of a course. Rules: - Output ONLY a JSON value that conforms to this JSON Schema, with no explanation around it: https://tango.oslo.no/schema/tango-event-submission.schema.json - Required in every object: "title", "types", "start", "venue" (with "name" and "address"), "organizer" and "link". Everything else may be null or left out. - "organizer" is the group or person the source names as organiser. If none is named, use the page or profile that published the event (on Facebook: the event host). Ask the user if you cannot tell. - One JSON object per date. If the event repeats (e.g. "every Wednesday until 9 December"), output an array with one object per date and leave out dates the source says are cancelled. If no end date is given, include the next 4 dates. - "start" and "end" are Oslo local time: "YYYY-MM-DDTHH:MM", without a time zone. Use "YYYY-MM-DD" when no time is given (e.g. festivals). If the event ends after midnight, "end" has the next day's date. If the year is not stated, use the next upcoming occurrence of that date. - "types" is a list with one or more of: class (class or course), workshop (workshop or seminar), milonga (social dance evening), practica (practice evening), festival (festival or multi-day event with workshops), marathon (multi-day, mostly social dancing), outdoor (open-air / outdoor event (utetango); combine with e.g. milonga), other (anything else). Use several when the event combines them, e.g. ["class", "milonga"], or ["milonga", "outdoor"] for an open-air milonga. - "music_style" (only if the source states it) is a list of: alternative (alternative or neo tango), live_orchestra (live orchestra), traditional (traditional / golden-age tango). - Prices are whole Norwegian kroner as integers: "price_nok" (regular entry), "student_price_nok", "class_price_nok" (the class or course part). If a price covers a whole course or several dates (e.g. 910 kr for a 6-session course), put it in "class_price_nok" on each date, leave "price_nok" null, and say what it covers in "description" (e.g. "Pris for hele kurset."). - "venue" is {"name", "address", "city"}; "city" is usually "Oslo". - "link" is the URL of the event page (for example the Facebook event). "flyer_url" and "video_url" (YouTube or Vimeo) only if such links appear in the source. - "description": 1–3 short, neutral sentences (level, entry, dress code). No marketing language. Write it in the language of the source if that is Norwegian or English, otherwise in English. - "lang" is the language of "title" and "description": "nb" (Norwegian) or "en" (English). - "translations" only if the source itself has the text in both languages: {"en": {"title": …, "description": …}} for a Norwegian event (or {"nb": …} for an English one). Never translate yourself. - Use null (or [] for lists) for anything the source does not state. Never guess names, prices, times or addresses. - Write people's names (DJ, teachers, organiser) only as they appear in the public event. - If a date is already in the calendar (same title or organiser, venue and date), do not output it again. Tell the user that it is already listed and that corrections go through the «Rett opp» link on the event page. Existing events as templates: - When the event continues a series that is already in the calendar (a weekly milonga, a course, a monthly practica), or the user gives you an existing event as JSON, use the latest event of that series as a template. Find it in the pages above, by the same title, or by the same organiser and venue. - Copy "title" exactly: a new date with the same title and the same organiser or venue is added to the existing series. Also copy "types", "venue", "organizer", "teachers", "music_style", the prices, "description", "lang" and "translations", unless the source says something different. The source always wins over the template. - Take "start", "end", "dj", "flyer_url" and "video_url" from the source only. These change from date to date. "link" is the source's event page; use the template's only when the source has none. - Even for a new event, if the venue or the organiser is already in the calendar, write the name and address exactly as they are there. - Stored events are not submissions. Convert them: leave out "$schema", "id", "series", "status", "source", "source_url", "published_date", "first_seen", "last_verified", "crawl_timestamp" and "confidence". Shorten "start" and "end" to "YYYY-MM-DDTHH:MM" (no seconds, no "+01:00"/"+02:00"). Turn "video" {"platform", "id"} into "video_url" (https://www.youtube.com/watch?v= or https://vimeo.com/). Tell the user to paste your JSON into the form at https://github.com/Tangokalender/tangokalender.github.io/issues/new?template=nytt-arrangement-json.yml and to check it before submitting. ## Example Input: ``` Milonga del Fiordo 🎶 Fredag 12. mars kl. 21–01.30 på Kulturhuset Fjord, Storgata 9, Oslo. DJ: Gjeste-DJ. Inngang 150 kr, studenter 100 kr. Tradisjonell tango hele kvelden. Arr: Tangoforeningen Fjord. https://www.facebook.com/events/000000000000000 ``` Output: ```json { "title": "Milonga del Fiordo", "types": ["milonga"], "start": "2027-03-12T21:00", "end": "2027-03-13T01:30", "venue": {"name": "Kulturhuset Fjord", "address": "Storgata 9, Oslo", "city": "Oslo"}, "organizer": "Tangoforeningen Fjord", "dj": "Gjeste-DJ", "teachers": [], "music_style": ["traditional"], "price_nok": 150, "student_price_nok": 100, "class_price_nok": null, "description": "Milonga med tradisjonell tango hele kvelden.", "lang": "nb", "flyer_url": null, "video_url": null, "link": "https://www.facebook.com/events/000000000000000" } ``` ## Links - [Calendar](https://tango.oslo.no/) - [Submission JSON Schema](https://tango.oslo.no/schema/tango-event-submission.schema.json): what to output - [Stored event schema](https://tango.oslo.no/schema/tango-event.schema.json): how events are stored after review (ids, series and metadata are set by the bot) - [JSON submission form](https://github.com/Tangokalender/tangokalender.github.io/issues/new?template=nytt-arrangement-json.yml) - [Upcoming events as JSON](https://tango.oslo.no/events.json): the stored format; templates for new dates in a series, and the spellings of venues and organisers - [All event files](https://github.com/Tangokalender/tangokalender.github.io/tree/main/events): one JSON file per event, past dates included - [Instructions for people](https://tango.oslo.no/en/legg-til.html#ki) (also in [Norwegian](https://tango.oslo.no/legg-til.html#ki) and [Spanish](https://tango.oslo.no/es/legg-til.html#ki))