Preskoči na sadržaj

Vodič za razvojne programere

Šaljite objave u Amapostu iz vlastitog procesa stvaranja sadržaja: prenesite medije, izradite objavu za svaki kanal, zakažite je i primite obavijest kada bude objavljena.

Autentifikacija

Izradite API ključ na nadzornoj ploči u odjeljku Postavke, API i webhookovi. Ključevi počinju s ss_live_, pripadaju jednom radnom prostoru i mogu se ograničiti na određene projekte. Šaljite ključ kao bearer token u svakom zahtjevu:

Provjera ključa
curl https://www.amaposta.com/api/v1/me \
  -H "Authorization: Bearer ss_live_…"

Odgovor sadrži naziv ključa, njegove dozvole i radni prostor. Svaki ključ ima jednu ili više dozvola:

DozvolaOmogućuje
content:readČitanje projekata, kanala, objava i medija.
content:writePrijenos medija te izradu i uređivanje objava.
posts:publishZakazivanje i objavljivanje bez pregleda. Bez ove dozvole objave idu među pristigle zahtjeve za pregled u projektima koji koriste odobravanje, a u ostalim projektima ostaju nacrti.

Svaki ključ može slati 120 zahtjeva u minuti. Nakon toga dobit ćete 429 s kodom rate_limited; pričekajte malo i pokušajte ponovno.

Projekti i kanali

Objave pripadaju projektu. Izlistajte projekte kojima vaš ključ ima pristup, a zatim kanale u jednom od njih. Za odabir kanala ili promjenu njegova teksta trebat će vam njegov ID.

Popis projekata i kanala
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"

Kanal ima provider (youtube, instagram, tiktok, x, facebook, custom ili sandbox), status (active, expiring, needs_reconnect, error ili disabled) i vrste objava koje podržava u polju supports.

Prenesi medije

Slike i videozapisi prenose se jednom po projektu i mogu se koristiti u neograničenom broju objava. Postoje tri načina prijenosa.

Izravan prijenos

Pošaljite datoteku kao multipart form data u polju naziva file. Najprikladnije za datoteke do nekoliko stotina MB.

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

Prijenos velikih datoteka unaprijed potpisanim URL-om

Zatražite URL za prijenos, pošaljite bajtove izravno u pohranu metodom PUT, a zatim javite Amaposti da ste završili.

Tri zahtjeva
# 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"

Uvoz s URL-a

Dajte Amaposti javni URL i ona će preuzeti datoteku u pozadini. Ovaj korak možete i preskočiti te proslijediti media_url pri izradi objave.

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

Svaki prijenos vraća medijski objekt. Njegov status prelazi iz pending u processing pa u ready (ili failed, uz error). Nakon obrade sadrži width, height, duration_ms i sličicu. Periodično provjeravajte GET /api/v1/media/{id} ili slušajte webhook media.ready. Vraćeni url potpisan je i valjan 12 sati.

Izradi objavu

POST /api/v1/projects/{project_id}/posts izrađuje jednu objavu s isporukom za svaki kanal. Amaposta je prilagođava svakoj platformi: naslovi se šalju samo ondje gdje postoji polje za naslov, hashtagovi postaju oznake na YouTubeu, a drugdje dio teksta.

Izrada videoobjave i dodavanje u red
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

Polja

PoljeŠto radi
kindtext, image ili video. Obavezno.
titleKoriste platforme s poljem za naslov: YouTube, TikTok fotoobjave, Facebook videozapisi.
descriptionTekst uz objavu, opis ili tekst objave. Prihvaća se i kao body, caption ili text.
hashtagsPopis, sa znakom # ili bez njega.
media_id, media_urlID prenesenog medija ili javni URL s kojeg Amaposta preuzima sadržaj za vas. Potrebno za slikovne objave i videoobjave.
cover_media_id, cover_urlNaslovna slika za videozapise na platformama koje je podržavaju.
channelsID-jevi kanala na kojima želite objaviti. Izostavite za korištenje svih aktivnih kanala u projektu koji podržavaju ovu vrstu objave.
overridesPromjene po kanalu, s ID-jem kanala kao ključem: title, description, hashtags i platformske options, poput YouTubeove opcije privacy.
schedulemode je at (uz at u formatu ISO 8601), now ili queue za sljedeći slobodan termin objavljivanja. Izostavite za izradu nacrta.
external_refVaša referenca, koja se vraća uz objavu i u isporukama vlastitom API-ju.
metadataProizvoljni JSON pohranjen uz objavu. Uključite "pipeline" za označavanje generiranog sadržaja; nadzorna ploča to prikazuje, a webhookovi navode podrijetlo kao pipeline.

Odgovor je objava, uključujući po jedan zapis u deliveries za svaki kanal.

Sigurni ponovni pokušaji

Mreže gube zahtjeve. Pošaljite zaglavlje Idempotency-Key pri izradi objave i ponovni pokušaj s istim ključem vratit će objavu iz prvog pokušaja umjesto izrade druge. Upotrijebite stabilnu vrijednost sa svoje strane, poput ID-ja zadatka ili epizode. Ključevi se skraćuju na 200 znakova.

Zakazivanje i objavljivanje

Zakažite nacrt, objavite ga sada, dodajte u red ili uklonite s kalendara pomoću POST /api/v1/posts/{post_id}/schedule.

Zakazivanje za određeno vrijeme
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"}'
  • atObjavljuje u zadano vrijeme, do dvije godine unaprijed.
  • nowObjavljuje odmah.
  • queueZauzima sljedeći slobodan termin objavljivanja za kanale objave u sljedećih 12 tjedana.
  • unscheduleVraća objavu među nacrte.

Prije zakazivanja pokreću se iste provjere kao u uređivaču. Ako neka ne uspije, zahtjev vraća 400 s porukom poput Ispravite prije zakazivanja: YouTube zahtijeva naslov. Za zakazivanje je potrebna dozvola posts:publish ili projekt s uključenim odobravanjem; u tom slučaju objava čeka među pristiglim zahtjevima za pregled.

Čitanje objava i isporuka

Izlistajte objave projekta, filtrirane prema status (statusi odvojeni zarezom ili inbox, queue ili history), razdoblju from/to, uz limit i offset. Odgovor je {"items": […], "total": n}.

Nadolazeće objave i pojedinosti jedne objave
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"

Objava ima ukupni status (draft, in_review, changes_requested, ready, scheduled, publishing, published, partial ili failed) i jednu isporuku po kanalu:

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

Statusi isporuke su pending, scheduled, publishing, processing, published, failed i cancelled. DELETE /api/v1/posts/{post_id} uklanja objavu.

Pogreške

Svaka pogreška ima istu strukturu: objekt error sa stabilnim code, porukom message koju možete prikazati ljudima, a ponekad i s fields (poruke po poljima) i hint.

422 Unprocessable Entity
{
  "error": {
    "code": "validation",
    "message": "Please fix the highlighted fields.",
    "fields": {
      "kind": "Use text, image or video."
    }
  }
}
StatusKôdZnačenje
400bad_requestZahtjev nije moguće izvršiti kako je zatraženo, primjerice zakazati objavu koja ne prolazi provjere.
401unauthorizedAPI ključ nedostaje, pogrešan je ili opozvan.
402plan_limitPaket radnog prostora ovo ne dopušta; limit navodi koje je ograničenje dosegnuto.
403forbiddenKljuč nema potrebnu dozvolu ili pristup projektu.
404not_foundNe postoji takav projekt, objava, medij ili krajnja točka.
409conflictPromjena nije spojiva s trenutačnim stanjem, primjerice uređivanje objave koja se već objavljuje.
422validationJedno ili više polja treba ispraviti; pogledajte fields.
429rate_limitedViše od 120 zahtjeva u minuti s ovim ključem.
502provider_errorPlatforma je odbila zahtjev ili nije uspjela; hint navodi što učiniti.

Webhookovi

Dodajte krajnju točku u odjeljku Postavke, API i webhookovi, odaberite željene događaje i kopirajte njezin tajni ključ za potpisivanje. Amaposta za svaki događaj šalje JSON vašem URL-u metodom POST. Svaki odgovor osim 2xx, ili izostanak odgovora unutar 15 sekundi, pokreće ponovni pokušaj uz sve dulje razmake. Krajnje točke koje trajno ne uspijevaju isključuju se uz obavijest administratorima.

DogađajŠalje se kada
post.createdObjava je izrađena (nadzorna ploča ili API)
post.scheduledObjava je zakazana
post.approvedObjava je odobrena
post.publishedObjava je objavljena na kanalu
post.failedObjava nije objavljena na kanalu
channel.connectedKanal je povezan ili ponovno povezan
channel.disconnectedKanal je izgubio vezu
media.readyObrada prijenosa je završena
media.failedPrijenos nije moguće obraditi
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=…"
  }
}

Provjerite potpis

X-Amaposta-Signature je t=<unix seconds>,v1=<hex>, gdje je v1 vrijednost HMAC_SHA256(secret, t + "." + body) nad izvornim tijelom zahtjeva. Izračunajte je sami, usporedite u konstantnom vremenu i odbacite stare vremenske oznake kako biste spriječili ponovnu reprodukciju zahtjeva.

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

Kanali s vlastitim API-jem

Kanal s vlastitim API-jem objavljuje na HTTPS krajnjoj točki kojom vi upravljate: u vašem CMS-u, alatu za biltene ili na platformi koju Amaposta još ne podržava. Prikazuje se na kalendaru te ima provjere, odobravanje i ponovne pokušaje kao svaki drugi kanal. Pri objavljivanju Amaposta šalje jedan POST po isporuci:

Što vaša krajnja točka prima
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" }
}

Kako odgovoriti

  • 2xxObjavljeno. Neobavezno vratite {"id": "…", "url": "…"} i poveznica će se prikazati uz objavu.
  • 401, 403Ključ je odbijen. Kanal se označava za ponovno povezivanje, a administratori se obavještavaju. Nemojte koristiti ove statuse za neispravan potpis.
  • 5xx, 408, 429Privremeno. Amaposta pokušava ponovno uz sve dulje razmake.
  • Ostali 4xxObjava se označava kao neuspjela uz vašu poruku pa je netko može ispraviti i pritisnuti Pokušaj ponovno.
Primatelj u Expressu
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 });
});

Vaša krajnja točka mora biti dostupna s interneta; preusmjeravanja se ne slijede. Pri povezivanju kanala Amaposta provjerava krajnju točku zahtjevom GET na vaš URL za provjeru ispravnosti, ako je postavljen, ili zahtjevom OPTIONS na krajnju točku.

Kanali Sandbox

Kanal Sandbox ponaša se poput pravog, ali ništa ne napušta Amapostu. Upotrijebite ga za izradu i testiranje integracije od početka do kraja: objave se zakazuju, ulaze u eter, objavljuju ili ne uspijevaju i pokreću iste webhookove. Kanali Sandbox besplatni su u svakom paketu i ne ulaze u ograničenje broja kanala.

Pri dodavanju odaberite kako će se ponašati:

  • Uvijek uspijevaSvaka objava uspijeva.
  • Povremeno ne uspijevaPogledajte pogreške i ponovne pokušaje bez čekanja stvarnog prekida rada.
  • Uvijek ne uspijevaTestirajte obradu događaja post.failed.
  • Istekla vezaPogledajte kako izgledaju upozorenja i poveznice za ponovno povezivanje kada pristup istekne.

Pravila platformi

Što prihvaća svaka vrsta kanala. Provjere koriste ista ograničenja pa se većina problema otkriva prije zakazivanja objave, umjesto pri objavljivanju.

Platforma Objava Naslov Tekst Hashtagovi Mediji
YouTube Videozapis NaslovObavezno, do 100 znakova OpisDo 5.000 znakova Šalju se kao oznake, do 60 MP4, MOV, WebM, AVI, MKV; do 256 GB; 1 s do 12 h
Računi bez potvrđenog telefonskog broja mogu prenositi videozapise do 15 minuta i ne mogu postavljati prilagođene sličice. Svaki prijenos troši API kvotu; zadana Googleova kvota dopušta otprilike šest prijenosa dnevno po aplikaciji.
Instagram Slika Bez naslova Tekst uz objavuDo 2.200 znakova Dodaju se tekstu, do 30 JPEG; do 8 MB
Videozapis Bez naslova Tekst uz objavuDo 2.200 znakova Dodaju se tekstu, do 30 MP4, MOV; do 300 MB; 3 s do 15 min
Zahtijeva Instagram račun Business ili Creator. Instagram dopušta 50 objava putem API-ja po računu u bilo kojem razdoblju od 24 sata. Objave samo s tekstom nisu moguće na Instagramu.
TikTok Slika NaslovDo 90 znakova OpisDo 4.000 znakova Dodaju se tekstu JPEG, WebP; do 20 MB
Videozapis Bez naslova Tekst uz objavuDo 2.200 znakova Dodaju se tekstu MP4, MOV, WebM; do 4 GB; 3 s do 10 min
Objave iz aplikacija koje nisu dovršile TikTokovu provjeru vidljive su samo autoru. TikTok bira naslovnicu iz kadra videozapisa; prilagođene naslovne slike nisu podržane. Objave samo s tekstom nisu moguće na TikToku.
X Tekst Bez naslova ObjavaObavezno, do 280 (poveznice se broje kao 23, emotikoni kao 2) Dodaju se tekstu Nema
Slika Bez naslova ObjavaDo 280 (poveznice se broje kao 23, emotikoni kao 2) Dodaju se tekstu JPEG, PNG, WebP, GIF; do 5 MB
Videozapis Bez naslova ObjavaDo 280 (poveznice se broje kao 23, emotikoni kao 2) Dodaju se tekstu MP4, MOV; do 512 MB; 0,5 s do 2:20 min
Ako koristite vlastitu X aplikaciju za razvojne programere, objave troše njezine API kredite koji se naplaćuju prema potrošnji. Hashtagovi se računaju u ograničenje znakova.
Facebook Tekst Bez naslova ObjavaObavezno, do 63.206 znakova Dodaju se tekstu Nema
Slika Bez naslova Tekst uz objavuDo 63.206 znakova Dodaju se tekstu JPEG, PNG, GIF, WebP; do 10 MB
Videozapis NaslovDo 255 znakova OpisDo 63.206 znakova Dodaju se tekstu MP4, MOV; do 1 GB; 1 s do 20 min
Objavljuje samo na stranicama; na osobne profile nije moguće objavljivati putem API-ja.
Vlastiti API Tekst NaslovBez ograničenja duljine OpisBez ograničenja duljine Šalju se kao oznake Nema
Slika NaslovBez ograničenja duljine OpisBez ograničenja duljine Šalju se kao oznake JPEG, PNG, WebP, GIF
Videozapis NaslovBez ograničenja duljine OpisBez ograničenja duljine Šalju se kao oznake MP4, MOV, WebM
Svaki je zahtjev potpisan zaglavljem HMAC-SHA256 kako biste mogli provjeriti dolazi li od Amaposte. Odgovorite statusom 2xx i neobaveznim JSON-om {"id": "…", "url": "…"}. Odgovori 408, 429 i 5xx ponavljaju se uz sve dulje razmake; 401/403 označavaju kanal za ponovno povezivanje; ostali 4xx uzrokuju neuspjelu isporuku kako biste mogli ispraviti problem i pokušati ponovno.
Sandbox Tekst NaslovDo 200 znakova OpisDo 5.000 znakova Dodaju se tekstu, do 30 Nema
Slika NaslovDo 200 znakova OpisDo 5.000 znakova Dodaju se tekstu, do 30 JPEG, PNG, WebP, GIF
Videozapis NaslovDo 200 znakova OpisDo 5.000 znakova Dodaju se tekstu, do 30 MP4, MOV, WebM
Objavljivanje traje kratko kako biste mogli uživo pratiti promjenu statusa.