Mine sisu juurde

Arendaja juhend

Saada oma sisutöövoost postitusi Amapostasse: laadi üles meedia, loo postitus igasse kanalisse, ajasta see ja saa teada, kui see on avaldatud.

Autentimine

Loo API-võti töölaual seadete jaotises „API ja veebihaagid”. Võtmed algavad märgiga ss_live_, kuuluvad ühte tööruumi ja neid saab piirata kindlate projektidega. Saada võti iga päringuga bearer-pääsutõendina:

Kontrolli võtit
curl https://www.amaposta.com/api/v1/me \
  -H "Authorization: Bearer ss_live_…"

Vastus sisaldab võtme nime, selle õigusulatusi ja tööruumi. Igal võtmel on üks või mitu õigusulatust:

ÕigusulatusLubab
content:readLoe projekte, kanaleid, postitusi ja meediat.
content:writeLaadi üles meediat ning loo või muuda postitusi.
posts:publishAjasta ja avalda ülevaatuseta. Ilma selle õiguseta lähevad postitused kinnitamist kasutavates projektides ülevaatuste postkasti ning jäävad mujal mustanditeks.

Iga võti saab teha 120 päringut minutis. Selle ületamisel saad vastuse 429 koodiga rate_limited; oota hetk ja proovi uuesti.

Projektid ja kanalid

Postitused asuvad projektis. Kuva projektid, mida sinu võti näeb, ja seejärel ühe projekti kanalid. Kanali sihtimiseks või selle teksti kohandamiseks vajad kanali ID-d.

Kuva projektid ja kanalid
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"

Kanalil on provider (youtube, instagram, tiktok, x, facebook, custom või sandbox), status (active, expiring, needs_reconnect, error või disabled) ja toetatud postituseliigid väljal supports.

Laadi meedia üles

Pildid ja videod laaditakse üles üks kord projekti kohta ning neid saab kasutada piiramatul arvul postitustes. Lisamiseks on kolm viisi.

Otseüleslaadimine

Saada fail multipart-vormiandmetena väljal nimega file. Sobib kõige paremini kuni mõnesaja MB suurustele failidele.

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]"

Eelallkirjastatud üleslaadimine suurtele failidele

Küsi üleslaadimis-URL, saada baidid PUT-päringuga otse salvestusruumi ja anna seejärel Amapostale teada, et oled lõpetanud.

Kolm päringut
# 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"

Impordi URL-ilt

Anna Amapostale avalik URL ja see laadib faili taustal alla. Võid selle sammu ka vahele jätta ja postituse loomisel edastada välja media_url.

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"}'

Iga üleslaadimine tagastab meediaobjekti. Selle status liigub olekust pending olekusse processing ja sealt ready (või failed, koos väljaga error). Pärast töötlemist sisaldab see välju width, height, duration_ms ja pisipilti. Päri regulaarselt GET /api/v1/media/{id} või kuula veebihaaki media.ready. Tagastatav url on allkirjastatud ja kehtib 12 tundi.

Loo postitus

POST /api/v1/projects/{project_id}/posts loob ühe postituse koos iga kanali edastusega. Amaposta kohandab seda platvormi järgi: pealkirjad saadetakse ainult sinna, kus on pealkirjaväli, teemaviited muutuvad YouTube'is siltideks ja mujal tekstisiseseks tekstiks.

Loo videopostitus ja lisa see järjekorda
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

Väljad

VäliMida see teeb
kindtext, image või video. Kohustuslik.
titleKasutatakse pealkirjaväljaga platvormidel: YouTube, TikToki fotopostitused, Facebooki videod.
descriptionPildiallkiri, kirjeldus või postituse tekst. Aktsepteeritakse ka väljadena body, caption või text.
hashtagsLoend koos märgiga # või ilma selleta.
media_id, media_urlÜleslaaditud meedia ID või avalik URL, millelt Amaposta faili sinu eest alla laadib. Vajalik pildi- ja videopostituste jaoks.
cover_media_id, cover_urlVideote kaanepilt seal, kus platvorm seda toetab.
channelsKanalite ID-d, kuhu postitada. Jäta välja, et kasutada kõiki projekti aktiivseid kanaleid, mis seda postituseliiki toetavad.
overridesKanalipõhised muudatused kanali ID järgi: title, description, hashtags ja platvormi options, näiteks YouTube'i privacy.
schedulemode on at (ISO 8601 vormingus at väärtusega), now või queue järgmise vaba avaldamisaja jaoks. Mustandi loomiseks jäta see välja.
external_refSinu enda viide, mis tagastatakse postitusel ja oma API edastustes.
metadataPostitusega salvestatav vabakujuline JSON. Lisa "pipeline" genereeritud sisu märkimiseks; töölaud kuvab selle ja veebihaagid annavad päritoluks pipeline.

Vastus on postitus, sealhulgas üks kirje väljal deliveries iga kanali kohta.

Turvalised korduskatsed

Võrgus lähevad päringud vahel kaotsi. Saada postituse loomisel päis Idempotency-Key ning sama võtmega korduskatse tagastab uue postituse loomise asemel esimesel katsel loodud postituse. Kasuta oma poolelt midagi püsivat, näiteks töö või episoodi ID-d. Võtmed kärbitakse 200 tähemärgini.

Ajasta ja avalda

Ajasta mustand, avalda see kohe, lisa järjekorda või eemalda kalendrist päringuga POST /api/v1/posts/{post_id}/schedule.

Ajasta kindlale ajale
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"}'
  • atAvaldab määratud ajal, kuni kaks aastat ette.
  • nowAvaldab kohe.
  • queueValib postituse kanalite järgmise vaba avaldamisaja järgneva 12 nädala jooksul.
  • unscheduleViib postituse tagasi mustanditesse.

Enne ajastamist tehakse samad kontrollid nagu koostajas. Kui mõni neist nurjub, tagastab päring 400 koos sõnumiga nagu Paranda enne ajastamist: YouTube vajab pealkirja. Ajastamiseks on vaja õigust posts:publish või projekti, kus kinnitamine on sisse lülitatud; viimasel juhul ootab postitus ülevaatuste postkastis.

Loe postitusi ja edastusi

Kuva projekti postitused, filtreerides välja status järgi (komadega eraldatud olekud või inbox, queue või history), ajavahemiku from/to ning väljade limit ja offset järgi. Vastus on {"items": […], "total": n}.

Mis on tulemas ja üks postitus üksikasjalikult
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"

Postitusel on üldine status (draft, in_review, changes_requested, ready, scheduled, publishing, published, partial või failed) ning iga kanali kohta üks edastus:

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
  }
]

Edastuse olekud on pending, scheduled, publishing, processing, published, failed ja cancelled. DELETE /api/v1/posts/{post_id} eemaldab postituse.

Vead

Kõigil vigadel on sama kuju: objekt error püsiva väljaga code, inimestele näidatava väljaga message ja vahel ka väljadega fields (väljade kaupa sõnumid) ning hint.

422 Unprocessable Entity
{
  "error": {
    "code": "validation",
    "message": "Please fix the highlighted fields.",
    "fields": {
      "kind": "Use text, image or video."
    }
  }
}
OlekKoodTähendus
400bad_requestPäringut ei saa soovitud kujul täita, näiteks ajastada postitust, mis ei läbi kontrolle.
401unauthorizedAPI-võti puudub, on vale või tühistatud.
402plan_limitTööruumi pakett ei luba seda; limit näitab, milline piirang rakendus.
403forbiddenVõtmel puudub õigusulatus või juurdepääs projektile.
404not_foundSellist projekti, postitust, meediat ega lõpp-punkti pole.
409conflictMuudatus läheb praeguse olekuga vastuollu, näiteks juba avaldatava postituse muutmine.
422validationÜks või mitu välja vajavad parandamist; vaata fields.
429rate_limitedSelle võtmega tehakse üle 120 päringu minutis.
502provider_errorPlatvorm keeldus või tekkis viga; hint selgitab, mida teha.

Veebihaagid

Lisa seadete jaotises „API ja veebihaagid” lõpp-punkt, vali soovitud sündmused ja kopeeri selle allkirjastamissaladus. Amaposta saadab iga sündmuse kohta sinu URL-ile JSON-i POST-päringuga. Kui vastus pole 2xx või vastust ei tule 15 sekundi jooksul, proovitakse kasvavate vahedega uuesti. Pidevalt nurjuvad lõpp-punktid lülitatakse välja ja administraatoreid teavitatakse.

SündmusSaatmise tingimus
post.createdPostitus loodi (töölaual või API kaudu)
post.scheduledPostitus ajastati
post.approvedPostitus kinnitati
post.publishedPostitus avaldati kanalis
post.failedPostituse avaldamine kanalis nurjus
channel.connectedKanal ühendati või taasühendati
channel.disconnectedKanali ühendus katkes
media.readyÜleslaaditud faili töötlemine lõppes
media.failedÜleslaaditud faili ei saanud töödelda
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=…"
  }
}

Kontrolli allkirja

X-Amaposta-Signature on t=<unix seconds>,v1=<hex>, kus v1 on päringu töötlemata sisu põhjal arvutatud HMAC_SHA256(secret, t + "." + body). Arvuta see ise, võrdle konstantse ajakuluga ja lükka vanad ajatemplid tagasi, et vältida taasesitusründeid.

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", ""))

Oma API kanalid

Oma API kanal avaldab sinu hallatavasse HTTPS-lõpp-punkti: sinu sisuhaldussüsteemi, uudiskirjatööriista või platvormile, mida Amaposta veel ei toeta. See kuvatakse kalendris ning läbib samad kontrollid, kinnitamised ja korduskatsed nagu iga teine kanal. Postituse avaldamisel saadab Amaposta iga edastuse kohta ühe POST-päringu:

Mida sinu lõpp-punkt vastu võtab
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" }
}

Kuidas vastata

  • 2xxAvaldatud. Soovi korral tagasta {"id": "…", "url": "…"} ja link ilmub postitusele.
  • 401, 403Võti lükati tagasi. Kanal märgitakse taasühendamist vajavaks ja administraatoreid teavitatakse. Ära kasuta neid vigase allkirja korral.
  • 5xx, 408, 429Ajutine. Amaposta proovib kasvavate vahedega uuesti.
  • Muud 4xxPostitus märgitakse sinu sõnumiga nurjunuks ning keegi saab selle parandada ja vajutada „Proovi uuesti”.
Vastuvõtja Expressis
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 });
});

Sinu lõpp-punkt peab olema internetist kättesaadav; ümbersuunamisi ei järgita. Kanali ühendamisel kontrollib Amaposta seda GET-päringuga sinu määratud tervisekontrolli URL-ile või OPTIONS-päringuga lõpp-punkti.

Liivakastikanalid

Liivakastikanal toimib nagu päris kanal, kuid miski ei välju Amapostast. Kasuta seda integratsiooni loomiseks ja terviklikuks testimiseks: postitused ajastatakse, jõuavad eetrisse, avaldatakse või nurjuvad ning käivitavad samad veebihaagid. Liivakastikanalid on kõigis pakettides tasuta ega lähe kanalite limiidi arvestusse.

Vali, kuidas see lisamisel käitub:

  • Õnnestu alatiIga postitus avaldatakse.
  • Nurju aeg-ajaltVaata tõrkeid ja korduskatseid päris katkestust ootamata.
  • Nurju alatiTesti sündmuse post.failed käsitlemist.
  • Aegunud ühendusVaata, millised on taasühendamise teavitused ja lingid juurdepääsu aegumisel.

Ühenda X oma rakenduse kaudu

X arvestab iga API-päringu, sealhulgas iga postituse tasu selle teinud arendajarakenduse ettemakstud krediidist. Seetõttu ühendad X-i oma X-i arendajarakenduse kaudu: seadista see iga tööruumi jaoks üks kord ja ühenda seejärel nii palju X-i kontosid kui soovid. Iga kontoga logitakse sisse X-is ja selle postituste eest tasutakse sinu rakenduse krediidist.

Hea teada

  • Rakendus salvestatakse kogu tööruumi jaoks ja selle saladus krüpteeritakse. Iga järgmise X-i konto saad ühendada ühe klõpsuga mis tahes projektist.
  • Kanalid säilitavad rakenduse, mille kaudu need ühendati. Kanali uuesti ühendamisel, ka kliendile mõeldud taasühendamislingi kaudu, kasutatakse jälle sama rakendust; sinu klient seda kunagi ei näe.
  • Rakenduse vahetamiseks vali X-i ühendamisel „Kasuta teist rakendust“. Kui lood uue Client Secreti, sisesta see seal ja ühenda oma X-i kanalid uuesti.
  • X-i konsool väljastab pääsutõendeid ainult kontole, millele rakendus kuulub. Oma klientide kontod ühendad oma rakenduse kaudu sisse logides; oma konto puhul saad endiselt sisestada pääsutõendid käsitsi.

Platvormi reeglid

Mida iga kanalitüüp aktsepteerib. Kontrollid kasutavad samu piiranguid, nii et enamik probleeme ilmneb enne postituse ajastamist, mitte avaldamise ajal.

Platvorm Postitus Pealkiri Tekst Teemaviited Meedia
YouTube Video PealkiriKohustuslik, kuni 100 tähemärki KirjeldusKuni 5000 tähemärki Saadetud siltidena, kuni 60 MP4, MOV, WebM, AVI, MKV; kuni 256 GB; 1 s kuni 12 t
Telefoninumbrit kinnitamata kontod saavad üles laadida kuni 15 minuti pikkusi videoid ega saa määrata kohandatud pisipilte. Iga üleslaadimine kulutab API kvooti; Google'i vaikekvoot lubab rakenduse kohta umbes kuus üleslaadimist päevas.
Instagram Pilt Pealkirja pole PildiallkiriKuni 2200 tähemärki Lisatud teksti, kuni 30 JPEG; kuni 8 MB
Video Pealkirja pole PildiallkiriKuni 2200 tähemärki Lisatud teksti, kuni 30 MP4, MOV; kuni 300 MB; 3 s kuni 15 min
Vajab Instagram Business- või Creator-kontot. Instagram lubab konto kohta 50 API kaudu avaldatud postitust libiseva 24 tunni jooksul. Ainult tekstiga postitused pole Instagramis võimalikud.
TikTok Pilt PealkiriKuni 90 tähemärki KirjeldusKuni 4000 tähemärki Lisatud teksti JPEG, WebP; kuni 20 MB
Video Pealkirja pole PildiallkiriKuni 2200 tähemärki Lisatud teksti MP4, MOV, WebM; kuni 4 GB; 3 s kuni 10 min
TikToki auditit läbimata rakenduste postitused on nähtavad ainult loojale. TikTok valib kaanepildi videokaadrist; kohandatud kaanepilte ei toetata. Ainult tekstiga postitused pole TikTokis võimalikud.
X Tekst Pealkirja pole PostitusKohustuslik, kuni 280 (lingid loetakse 23 ja emotikonid 2 tähemärgiks) Lisatud teksti Puudub
Pilt Pealkirja pole PostitusKuni 280 (lingid loetakse 23 ja emotikonid 2 tähemärgiks) Lisatud teksti JPEG, PNG, WebP, GIF; kuni 5 MB
Video Pealkirja pole PostitusKuni 280 (lingid loetakse 23 ja emotikonid 2 tähemärgiks) Lisatud teksti MP4, MOV; kuni 512 MB; 0,5 s kuni 2:20 min
Oma X-i arendajarakenduse korral kasutavad postitused selle kasutuspõhiseid API krediite. Teemaviited lähevad tähemärgilimiidi arvestusse.
Facebook Tekst Pealkirja pole PostitusKohustuslik, kuni 63 206 tähemärki Lisatud teksti Puudub
Pilt Pealkirja pole PildiallkiriKuni 63 206 tähemärki Lisatud teksti JPEG, PNG, GIF, WebP; kuni 10 MB
Video PealkiriKuni 255 tähemärki KirjeldusKuni 63 206 tähemärki Lisatud teksti MP4, MOV; kuni 1 GB; 1 s kuni 20 min
Avaldab ainult lehtedele; isiklikele profiilidele ei saa API kaudu postitada.
Oma API Tekst PealkiriPikkusepiiranguta KirjeldusPikkusepiiranguta Saadetud siltidena Puudub
Pilt PealkiriPikkusepiiranguta KirjeldusPikkusepiiranguta Saadetud siltidena JPEG, PNG, WebP, GIF
Video PealkiriPikkusepiiranguta KirjeldusPikkusepiiranguta Saadetud siltidena MP4, MOV, WebM
Iga päring allkirjastatakse HMAC-SHA256 päisega, et saaksid kontrollida, kas see tuli Amapostast. Vasta olekukoodiga 2xx ja soovi korral JSON-iga {"id": "…", "url": "…"}. Vastuste 408, 429 ja 5xx korral proovitakse kasvavate vahedega uuesti; 401/403 märgivad kanali taasühendamist vajavaks; muud 4xx vastused nurjavad edastuse, et saaksid probleemi parandada ja uuesti proovida.
Liivakast Tekst PealkiriKuni 200 tähemärki KirjeldusKuni 5000 tähemärki Lisatud teksti, kuni 30 Puudub
Pilt PealkiriKuni 200 tähemärki KirjeldusKuni 5000 tähemärki Lisatud teksti, kuni 30 JPEG, PNG, WebP, GIF
Video PealkiriKuni 200 tähemärki KirjeldusKuni 5000 tähemärki Lisatud teksti, kuni 30 MP4, MOV, WebM
Avaldamine võtab hetke, et saaksid oleku muutumist reaalajas jälgida.