Siirry sisältöön

Kehittäjäopas

Lähetä julkaisuja Amapostaan omasta sisältöputkestasi: lataa mediaa, luo julkaisu kaikille kanaville, ajasta se ja saa ilmoitus sen ilmestymisestä.

Tunnistautuminen

Luo API-avain hallintapaneelin asetusten kohdassa API ja webhookit. Avaimet alkavat merkkijonolla ss_live_, kuuluvat yhteen työtilaan ja voidaan rajata tiettyihin projekteihin. Lähetä avain bearer-tunnuksena jokaisessa pyynnössä:

Tarkista avain
curl https://www.amaposta.com/api/v1/me \
  -H "Authorization: Bearer ss_live_…"

Vastaus nimeää avaimen, sen oikeudet ja työtilan. Jokaisella avaimella on vähintään yksi oikeus:

OikeusSallii
content:readLue projekteja, kanavia, julkaisuja ja mediaa.
content:writeLataa mediaa ja luo tai muokkaa julkaisuja.
posts:publishAjasta ja julkaise ilman tarkistusta. Ilman tätä julkaisut menevät tarkistusjonoon hyväksyntöjä käyttävissä projekteissa ja jäävät muualla luonnoksiksi.

Kullakin avaimella voi tehdä 120 pyyntöä minuutissa. Sen jälkeen saat vastauksen 429 koodilla rate_limited; odota hetki ja yritä uudelleen.

Projektit ja kanavat

Julkaisut kuuluvat projektiin. Listaa avaimellesi näkyvät projektit ja sitten yhden projektin kanavat. Tarvitset kanavan tunnuksen kohdistaaksesi julkaisun siihen tai muuttaaksesi sen tekstiä.

Listaa projektit ja kanavat
curl https://www.amaposta.com/api/v1/projects \
  -H "Authorization: Bearer $AMAPOSTA_KEY"

curl https://www.amaposta.com/api/v1/projects/$PROJECT_ID/channels \
  -H "Authorization: Bearer $AMAPOSTA_KEY"

Kanavalla on provider (youtube, instagram, tiktok, x, facebook, custom tai sandbox), status (active, expiring, needs_reconnect, error tai disabled) ja tuetut julkaisutyypit kentässä supports.

Lataa mediaa

Kuvat ja videot ladataan kerran projektia kohti, ja niitä voi käyttää rajattomassa määrässä julkaisuja. Lataamiseen on kolme tapaa.

Suora lataus

Lähetä tiedosto multipart-lomakedatana kentässä file. Sopii parhaiten enintään muutaman sadan Mt:n tiedostoille.

POST /api/v1/projects/{project_id}/media
curl https://www.amaposta.com/api/v1/projects/$PROJECT_ID/media \
  -H "Authorization: Bearer $AMAPOSTA_KEY" \
  -F "[email protected]"

Etukäteen allekirjoitettu lataus suurille tiedostoille

Pyydä latausosoite, lähetä tavut PUT-pyynnöllä suoraan tallennustilaan ja ilmoita sitten Amapostalle valmistumisesta.

Kolme pyyntöä
# 1. Ask for an upload URL. The response is {"media": { … }, "upload_url": "…"}
curl https://www.amaposta.com/api/v1/projects/$PROJECT_ID/media/uploads \
  -H "Authorization: Bearer $AMAPOSTA_KEY" \
  -H "Content-Type: application/json" \
  -d '{"filename": "batch-142.mp4", "content_type": "video/mp4", "size_bytes": 48213844}'

# 2. Upload the bytes to upload_url
curl -X PUT "$UPLOAD_URL" \
  -H "Content-Type: video/mp4" \
  --upload-file batch-142.mp4

# 3. Finish the upload
curl -X POST https://www.amaposta.com/api/v1/media/$MEDIA_ID/complete \
  -H "Authorization: Bearer $AMAPOSTA_KEY"

Tuo verkko-osoitteesta

Anna Amapostalle julkinen osoite, niin se lataa tiedoston taustalla. Voit myös ohittaa tämän vaiheen ja antaa kentän media_url julkaisua luodessasi.

POST /api/v1/projects/{project_id}/media/import
curl https://www.amaposta.com/api/v1/projects/$PROJECT_ID/media/import \
  -H "Authorization: Bearer $AMAPOSTA_KEY" \
  -H "Content-Type: application/json" \
  -d '{"url": "https://cdn.example.com/batch-142.mp4"}'

Jokainen lataus palauttaa mediaobjektin. Sen status muuttuu tilasta pending tilaan processing ja sitten ready (tai failed, jolloin mukana on error). Käsittelyn jälkeen mukana ovat width, height, duration_ms ja pikkukuva. Kysy tilaa kutsulla GET /api/v1/media/{id} tai kuuntele media.ready-webhookia. Palautettu url on allekirjoitettu ja voimassa 12 tuntia.

Luo julkaisu

POST /api/v1/projects/{project_id}/posts luo yhden julkaisun, jolla on toimitus kullekin kanavalle. Amaposta mukauttaa sen alustakohtaisesti: otsikot välitetään vain alustoille, joilla on otsikkokenttä, ja aihetunnisteet välitetään YouTubeen tunnisteina ja muualle tekstin osana.

Luo videojulkaisu ja lisää se jonoon
curl https://www.amaposta.com/api/v1/projects/$PROJECT_ID/posts \
  -H "Authorization: Bearer $AMAPOSTA_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: episode-142" \
  -d @- <<'JSON'
{
  "kind": "video",
  "title": "How we roast a batch in 12 minutes",
  "description": "From green beans to first crack. We filmed one batch start to finish.",
  "hashtags": ["coffee", "behindthescenes"],
  "media_url": "https://cdn.example.com/batch-142.mp4",
  "cover_url": "https://cdn.example.com/batch-142-cover.jpg",
  "overrides": {
    "<x-channel-id>": {
      "description": "Batch 142 is out: green beans to first crack in 12 minutes."
    },
    "<youtube-channel-id>": {
      "options": { "privacy": "unlisted" }
    }
  },
  "schedule": { "mode": "queue" },
  "external_ref": "episode-142",
  "metadata": {
    "pipeline": { "name": "nightly-cut", "run": "2026-10-17" }
  }
}
JSON

Kentät

KenttäMitä se tekee
kindtext, image tai video. Pakollinen.
titleKäytössä alustoilla, joilla on otsikkokenttä: YouTube, TikTokin kuvajulkaisut ja Facebookin videot.
descriptionKuvateksti, kuvaus tai julkaisun teksti. Hyväksytään myös nimillä body, caption tai text.
hashtagsLuettelo, jossa voi olla #-merkit tai ei.
media_id, media_urlLadatun mediatiedoston tunnus tai julkinen osoite, josta Amaposta lataa tiedoston. Tarvitaan kuva- ja videojulkaisuihin.
cover_media_id, cover_urlVideoiden kansikuva alustoilla, jotka tukevat sitä.
channelsJulkaisun kohdekanavien tunnukset. Jätä pois, jos haluat käyttää projektin kaikkia aktiivisia kanavia, jotka tukevat tätä julkaisutyyppiä.
overridesKanavakohtaiset muutokset kanavatunnuksella indeksoituina: title, description, hashtags ja alustan options, kuten YouTuben privacy.
schedulemode on at (mukana ISO 8601 -muotoinen at), now tai queue, joka käyttää seuraavaa vapaata julkaisuaikaa. Jätä kenttä pois luodaksesi luonnoksen.
external_refOma viitteesi, joka palautetaan julkaisussa ja Custom API -toimituksissa.
metadataJulkaisun mukana tallennettava vapaamuotoinen JSON. Merkitse tuotettu sisältö kentällä "pipeline"; hallintapaneeli näyttää sen ja webhookit ilmoittavat alkuperäksi pipeline.

Vastaus on julkaisu, jonka deliveries-kentässä on yksi tietue kanavaa kohti.

Turvalliset uusintayritykset

Verkoissa pyyntöjä katoaa. Lähetä Idempotency-Key-otsake julkaisua luodessasi, jolloin uusintayritys samalla avaimella palauttaa ensimmäisellä yrityksellä luodun julkaisun uuden luomisen sijaan. Käytä oman järjestelmäsi pysyvää arvoa, kuten työn tai jakson tunnusta. Avaimet katkaistaan 200 merkkiin.

Ajasta ja julkaise

Ajasta luonnos, julkaise se nyt, lisää jonoon tai poista kalenterista kutsulla POST /api/v1/posts/{post_id}/schedule.

Ajasta tiettyyn aikaan
curl https://www.amaposta.com/api/v1/posts/$POST_ID/schedule \
  -H "Authorization: Bearer $AMAPOSTA_KEY" \
  -H "Content-Type: application/json" \
  -d '{"mode": "at", "at": "2026-10-20T07:00:00Z"}'
  • atJulkaisee annettuna aikana, enintään kahden vuoden päästä.
  • nowJulkaisee heti.
  • queueKäyttää julkaisun kanavien seuraavaa vapaata julkaisuaikaa seuraavien 12 viikon aikana.
  • unscheduleSiirtää julkaisun takaisin luonnoksiin.

Ennen ajastamista suoritetaan samat tarkistukset kuin julkaisueditorissa. Jos jokin epäonnistuu, pyyntö palauttaa koodin 400 ja viestin, kuten Korjaa ennen ajastamista: YouTube vaatii otsikon. Ajastaminen vaatii posts:publish-oikeuden tai projektin, jossa hyväksynnät ovat käytössä. Tällöin julkaisu odottaa tarkistusjonossa.

Lue julkaisuja ja toimituksia

Listaa projektin julkaisut suodatettuina kentällä status (pilkuin erotetut tilat tai inbox, queue tai history), aikavälillä from/to sekä kentillä limit ja offset. Vastaus on {"items": […], "total": n}.

Tulevat julkaisut ja yhden julkaisun tiedot
curl "https://www.amaposta.com/api/v1/projects/$PROJECT_ID/posts?status=queue" \
  -H "Authorization: Bearer $AMAPOSTA_KEY"

curl https://www.amaposta.com/api/v1/posts/$POST_ID \
  -H "Authorization: Bearer $AMAPOSTA_KEY"

Julkaisulla on yleinen status (draft, in_review, changes_requested, ready, scheduled, publishing, published, partial tai failed) ja yksi toimitus kanavaa kohti:

deliveries[]
"deliveries": [
  {
    "id": "0192b7d4-…",
    "channel_id": "0192b7a1-…",
    "status": "published",
    "url": "https://www.youtube.com/watch?v=…",
    "error": null,
    "published_at": "2026-10-20T07:00:41Z"
  },
  {
    "id": "0192b7d4-…",
    "channel_id": "0192b7a9-…",
    "status": "failed",
    "url": null,
    "error": {
      "code": "endpoint_unavailable",
      "message": "Your endpoint returned 503 Service Unavailable",
      "hint": "Amaposta will retry with backoff."
    },
    "published_at": null
  }
]

Toimituksen tilat ovat pending, scheduled, publishing, processing, published, failed ja cancelled. DELETE /api/v1/posts/{post_id} poistaa julkaisun.

Virheet

Jokaisella virheellä on sama rakenne: error-objekti, jossa on pysyvä code, käyttäjälle näytettävä message sekä joskus fields (kenttäkohtaiset viestit) ja hint.

422 Unprocessable Entity
{
  "error": {
    "code": "validation",
    "message": "Please fix the highlighted fields.",
    "fields": {
      "kind": "Use text, image or video."
    }
  }
}
TilaKoodiMerkitys
400bad_requestPyyntöä ei voi toteuttaa pyydetyllä tavalla, esimerkiksi ajastaa julkaisua, joka ei läpäise tarkistuksia.
401unauthorizedAPI-avain puuttuu, on väärä tai on peruttu.
402plan_limitTyötilan tilaus ei salli tätä; limit kertoo, mikä raja on kyseessä.
403forbiddenAvaimelta puuttuu oikeus tai pääsy projektiin.
404not_foundProjektia, julkaisua, mediaa tai päätepistettä ei löydy.
409conflictMuutos on ristiriidassa nykytilan kanssa, esimerkiksi jo julkaistavan sisällön muokkaaminen.
422validationYksi tai useampi kenttä vaatii korjausta; katso fields.
429rate_limitedYli 120 pyyntöä minuutissa tällä avaimella.
502provider_errorAlusta hylkäsi pyynnön tai epäonnistui; hint kertoo toimintaohjeen.

Webhookit

Lisää päätepiste asetusten API ja webhookit -kohtaan, valitse haluamasi tapahtumat ja kopioi allekirjoitussalaisuus. Amaposta lähettää jokaisen tapahtuman osoitteeseesi POST-pyyntönä JSON-muodossa. Jos vastaus on muu kuin 2xx tai sitä ei tule 15 sekunnissa, pyyntöä yritetään uudelleen pitenevin välein. Jatkuvasti epäonnistuvat päätepisteet poistetaan käytöstä ja ylläpitäjille ilmoitetaan.

TapahtumaLähetetään, kun
post.createdJulkaisu luotiin (hallintapaneelissa tai APIlla)
post.scheduledJulkaisu ajastettiin
post.approvedJulkaisu hyväksyttiin
post.publishedJulkaisu ilmestyi kanavalle
post.failedJulkaiseminen kanavalla epäonnistui
channel.connectedKanava yhdistettiin tai yhdistettiin uudelleen
channel.disconnectedKanavan yhteys katkesi
media.readyLatauksen käsittely valmistui
media.failedLatausta ei voitu käsitellä
post.published
POST /your/webhook HTTP/1.1
Content-Type: application/json
User-Agent: Amaposta-Webhooks/1.0
X-Amaposta-Event: post.published
X-Amaposta-Event-Id: 0192b7e0-…
X-Amaposta-Signature: t=1792479641,v1=5f2b0c…

{
  "id": "0192b7e0-…",
  "type": "post.published",
  "created_at": "2026-10-20T07:00:41Z",
  "project_id": "0192a3f1-…",
  "data": {
    "post_id": "0192b7c8-…",
    "delivery_id": "0192b7d4-…",
    "channel_id": "0192b7a1-…",
    "provider": "youtube",
    "external_id": "…",
    "url": "https://www.youtube.com/watch?v=…"
  }
}

Varmista allekirjoitus

X-Amaposta-Signature on t=<unix seconds>,v1=<hex>, jossa v1 on raa'asta pyynnön rungosta laskettu HMAC_SHA256(secret, t + "." + body). Laske se itse, vertaa vakioaikaisesti ja hylkää vanhat aikaleimat uudelleentoistohyökkäysten estämiseksi.

Node.js
import crypto from "node:crypto";

// rawBody: the request body exactly as received (string or Buffer).
export function verifySignature(rawBody, header, secret, toleranceSeconds = 300) {
  const parts = Object.fromEntries(header.split(",").map((p) => p.split("=", 2)));
  const t = Number(parts.t);
  if (!t || Math.abs(Date.now() / 1000 - t) > toleranceSeconds) return false;
  const expected = crypto
    .createHmac("sha256", secret)
    .update(`${t}.${rawBody}`)
    .digest();
  const given = Buffer.from(parts.v1 ?? "", "hex");
  return given.length === expected.length && crypto.timingSafeEqual(given, expected);
}
Python
import hashlib
import hmac
import time


def verify_signature(raw_body: bytes, header: str, secret: str, tolerance: int = 300) -> bool:
    parts = dict(p.split("=", 1) for p in header.split(","))
    t = int(parts.get("t", "0"))
    if abs(time.time() - t) > tolerance:
        return False
    expected = hmac.new(secret.encode(), f"{t}.".encode() + raw_body, hashlib.sha256).hexdigest()
    return hmac.compare_digest(expected, parts.get("v1", ""))

Custom API -kanavat

Custom API -kanava julkaisee ylläpitämääsi HTTPS-päätepisteeseen: sisällönhallintajärjestelmään, uutiskirjetyökaluun tai alustalle, jota Amaposta ei vielä tue. Se näkyy kalenterissa, ja siihen sovelletaan tarkistuksia, hyväksyntöjä ja uusintayrityksiä kuten muihinkin kanaviin. Julkaisuhetkellä Amaposta lähettää yhden POST-pyynnön toimitusta kohti:

Mitä päätepisteesi vastaanottaa
POST /amaposta/publish HTTP/1.1
Authorization: Bearer <your API key>
Content-Type: application/json
Idempotency-Key: 0192b7d4-…
X-Amaposta-Delivery: 0192b7d4-…
X-Amaposta-Signature: t=1792479600,v1=9ac41e…

{
  "id": "0192b7d4-…",
  "type": "post.publish",
  "created_at": "2026-10-20T07:00:00Z",
  "content": {
    "kind": "video",
    "title": "How we roast a batch in 12 minutes",
    "text": "From green beans to first crack. We filmed one batch start to finish.",
    "hashtags": ["coffee", "behindthescenes"],
    "media": {
      "url": "https://…",
      "content_type": "video/mp4",
      "size_bytes": 48213844,
      "width": 1080,
      "height": 1920,
      "duration_ms": 58000,
      "filename": "batch-142.mp4"
    },
    "cover": null,
    "options": {}
  },
  "post": {
    "id": "0192b7c8-…",
    "external_ref": "episode-142",
    "scheduled_at": "2026-10-20T07:00:00Z",
    "metadata": {
      "pipeline": { "name": "nightly-cut" }
    }
  },
  "project": { "id": "0192a3f1-…", "name": "Spring launch" },
  "channel": { "id": "0192b7a9-…", "name": "api.example.com" }
}

Vastaaminen

  • 2xxJulkaistu. Voit palauttaa arvon {"id": "…", "url": "…"}, jolloin linkki näkyy julkaisussa.
  • 401, 403Avain hylättiin. Kanava merkitään uudelleenyhdistettäväksi ja ylläpitäjille ilmoitetaan. Älä käytä näitä koodeja virheelliselle allekirjoitukselle.
  • 5xx, 408, 429Tilapäinen. Amaposta yrittää uudelleen pitenevin välein.
  • Muu 4xxJulkaisu merkitään epäonnistuneeksi viestisi kera, ja käyttäjä voi korjata sen ja painaa Yritä uudelleen.
Vastaanotin Expressillä
app.post("/amaposta/publish", express.raw({ type: "application/json" }), async (req, res) => {
  const signature = req.get("X-Amaposta-Signature") ?? "";
  if (!verifySignature(req.body, signature, process.env.AMAPOSTA_SIGNING_SECRET)) {
    return res.status(400).json({ message: "Bad signature" });
  }
  const delivery = JSON.parse(req.body);
  const item = await publishToYourSystem(delivery.content, req.get("Idempotency-Key"));
  res.json({ id: item.id, url: item.url });
});

Päätepisteesi on oltava saavutettavissa internetistä; uudelleenohjauksia ei seurata. Kanavaa yhdistettäessä Amaposta tarkistaa sen GET-pyynnöllä määrittämääsi yhteystarkistuksen osoitteeseen tai OPTIONS-pyynnöllä päätepisteeseen.

Sandbox-kanavat

Sandbox-kanava toimii oikean kanavan tavoin, mutta mitään ei siirry Amapostan ulkopuolelle. Rakenna ja testaa sillä integraatiosi alusta loppuun: julkaisut ajastetaan, siirtyvät lähetykseen, julkaistaan tai epäonnistuvat ja laukaisevat samat webhookit. Sandbox-kanavat ovat maksuttomia kaikissa tilauksissa, eikä niitä lasketa kanavarajaan.

Valitse, miten kanava toimii lisäämisen jälkeen:

  • Onnistu ainaJokainen julkaisu onnistuu.
  • Epäonnistu silloin tällöinTutustu virheisiin ja uusintayrityksiin odottamatta oikeaa käyttökatkoa.
  • Epäonnistu ainaTestaa post.failed-käsittelysi.
  • Vanhentunut yhteysKatso, miltä uudelleenyhdistämisen ilmoitukset ja linkit näyttävät käyttöoikeuden vanhetessa.

Alustojen säännöt

Kunkin kanavatyypin tukema sisältö. Tarkistukset käyttävät samoja rajoja, joten useimmat ongelmat löytyvät jo ennen ajastamista.

Alusta Julkaisu Otsikko Teksti Aihetunnisteet Media
YouTube Video OtsikkoPakollinen, enintään 100 merkkiä KuvausEnintään 5 000 merkkiä Lähetetään tunnisteina, enintään 60 MP4, MOV, WebM, AVI, MKV; enintään 256 GB; 1 s–12 h
Tilit, joiden puhelinnumeroa ei ole vahvistettu, voivat ladata enintään 15 minuutin videoita eivätkä voi asettaa omia pikkukuvia. Jokainen lataus kuluttaa API-kiintiötä; Googlen oletuskiintiö sallii noin kuusi latausta päivässä sovellusta kohti.
Instagram Kuva Ei otsikkoa KuvatekstiEnintään 2 200 merkkiä Lisätään tekstiin, enintään 30 JPEG; enintään 8 MB
Video Ei otsikkoa KuvatekstiEnintään 2 200 merkkiä Lisätään tekstiin, enintään 30 MP4, MOV; enintään 300 MB; 3 s–15 min
Vaatii Instagramin yritys- tai sisällöntuottajatilin. Instagram sallii 50 APIn kautta julkaistua julkaisua tiliä kohti liukuvan 24 tunnin aikana. Pelkkää tekstiä sisältävät julkaisut eivät ole mahdollisia Instagramissa.
TikTok Kuva OtsikkoEnintään 90 merkkiä KuvausEnintään 4 000 merkkiä Lisätään tekstiin JPEG, WebP; enintään 20 MB
Video Ei otsikkoa KuvatekstiEnintään 2 200 merkkiä Lisätään tekstiin MP4, MOV, WebM; enintään 4 GB; 3 s–10 min
Julkaisut sovelluksista, jotka eivät ole läpäisseet TikTokin auditointia, näkyvät vain tekijälle. TikTok valitsee kansikuvan videoruudusta; omia kansikuvia ei tueta. Pelkkää tekstiä sisältävät julkaisut eivät ole mahdollisia TikTokissa.
X Teksti Ei otsikkoa JulkaisuPakollinen, enintään 280 (linkit lasketaan 23 merkkinä, emojit 2 merkkinä) Lisätään tekstiin Ei mitään
Kuva Ei otsikkoa JulkaisuEnintään 280 (linkit lasketaan 23 merkkinä, emojit 2 merkkinä) Lisätään tekstiin JPEG, PNG, WebP, GIF; enintään 5 MB
Video Ei otsikkoa JulkaisuEnintään 280 (linkit lasketaan 23 merkkinä, emojit 2 merkkinä) Lisätään tekstiin MP4, MOV; enintään 512 MB; 0,5 s–2:20 min
Kun käytät omaa X-kehittäjäsovellustasi, julkaisut kuluttavat sen käytön mukaan laskutettavia API-krediittejä. Aihetunnisteet lasketaan merkkirajaan.
Facebook Teksti Ei otsikkoa JulkaisuPakollinen, enintään 63 206 merkkiä Lisätään tekstiin Ei mitään
Kuva Ei otsikkoa KuvatekstiEnintään 63 206 merkkiä Lisätään tekstiin JPEG, PNG, GIF, WebP; enintään 10 MB
Video OtsikkoEnintään 255 merkkiä KuvausEnintään 63 206 merkkiä Lisätään tekstiin MP4, MOV; enintään 1 GB; 1 s–20 min
Julkaisee vain sivuille; henkilökohtaisiin profiileihin ei voi julkaista APIn kautta.
Custom API Teksti OtsikkoEi pituusrajaa KuvausEi pituusrajaa Lähetetään tunnisteina Ei mitään
Kuva OtsikkoEi pituusrajaa KuvausEi pituusrajaa Lähetetään tunnisteina JPEG, PNG, WebP, GIF
Video OtsikkoEi pituusrajaa KuvausEi pituusrajaa Lähetetään tunnisteina MP4, MOV, WebM
Jokainen pyyntö allekirjoitetaan HMAC-SHA256-otsakkeella, jotta voit varmistaa sen tulleen Amapostasta. Vastaa koodilla 2xx ja halutessasi JSONilla {"id": "…", "url": "…"}. Vastauksia 408, 429 ja 5xx yritetään uudelleen pitenevin välein; 401/403 merkitsevät kanavan uudelleenyhdistettäväksi; muut 4xx-koodit merkitsevät toimituksen epäonnistuneeksi, jotta voit korjata ongelman ja yrittää uudelleen.
Sandbox Teksti OtsikkoEnintään 200 merkkiä KuvausEnintään 5 000 merkkiä Lisätään tekstiin, enintään 30 Ei mitään
Kuva OtsikkoEnintään 200 merkkiä KuvausEnintään 5 000 merkkiä Lisätään tekstiin, enintään 30 JPEG, PNG, WebP, GIF
Video OtsikkoEnintään 200 merkkiä KuvausEnintään 5 000 merkkiä Lisätään tekstiin, enintään 30 MP4, MOV, WebM
Julkaiseminen kestää hetken, jotta näet tilan muuttuvan reaaliajassa.