Zum Hauptinhalt springen

Team und Tarif

Die Personen im Workspace, was jede von ihnen darf, und in welchem Tarif der Workspace ist. Dieselben Dinge, die die Seiten Team und Tarif zeigen, für einen Workspace, der maschinell eingerichtet oder geprüft wird.

MethodePfadBerechtigung
GET/v1/team/usersteam:read
POST/v1/team/usersteam:write
PATCH/v1/team/users/{userId}team:write
POST/v1/team/users/{userId}/resendteam:write
POST/v1/team/users/{userId}/deleteteam:write
GET/v1/licenceplan:read
POST/v1/licence/offer/{offerId}/acceptangemeldete Person: der Inhaber
POST/v1/licence/offer/billing-detailsangemeldete Person: der Inhaber
POST/v1/team/nameangemeldete Person: der Inhaber
POST/v1/team/leaveangemeldete Person: ein Kollege
GET/v1/team/marketsangemeldete Person
POST/v1/team/marketsangemeldete Person: der Inhaber

Die Berechtigung Team wird nur in einem Tarif mit einem Team angeboten (Small business und Enterprise). Den Workspace umzubenennen, ihn zu verlassen, seine Branchen zu wählen und den Tarif zu ändern ist Sache einer angemeldeten Person, und kein Schlüssel kann sie erreichen: siehe Nur für eine angemeldete Person.

Ein Schlüssel mit team:write ist ein Zugang zum Workspace, nicht nur eine Möglichkeit, ihn zu lesen: Er kann einen Kollegen mit der Berechtigung Verwaltung einladen, die API-Schlüssel verwaltet. Siehe Authentifizierung. Geben Sie ihn nur einem Schlüssel, dessen Aufgabe das Einrichten von Workspaces ist. Die Verbindung eines KI-Assistenten hat ihn nie, auch nicht eine, die handeln darf, weil sonst eine Anweisung, die in etwas eingeschleust wird, das der Assistent liest, jemanden einladen könnte, dessen Zugang die Verbindung überdauert: Einem von Hand erstellten Schlüssel kann er trotzdem gegeben werden.

Die Personen​

curl http://localhost:4000/v1/team/users \
-H "Authorization: Bearer rw_your_key_here"
{
"workspace": { "name": "Northwind Markets" },
"users": [
{
"id": "01M38Z6Y78B0DG1817DA49VCMJ",
"email": "sam.carter@northwind.example",
"displayName": "Sam Carter",
"role": "OWNER",
"powers": [],
"lastLoginAt": "2026-09-24T20:26:39.741Z",
"createdAt": "2026-09-24T05:46:29.539Z"
},
{
"id": "01M390CPHEWQ9GWKYWBPTM5YTC",
"email": "priya.nair@northwind.example",
"displayName": "Priya Nair",
"role": "MEMBER",
"powers": ["operate"],
"lastLoginAt": null,
"createdAt": "2026-09-24T06:07:06.889Z"
}
],
"seats": { "used": 3, "max": 10, "included": 10, "additional": 0, "granted": 0 }
}

role ist OWNER für die Person, der der Workspace gehört, die jede Berechtigung hat (ihre Liste powers ist also leer), und MEMBER für alle anderen. powers ist, was ein Kollege darf:

BerechtigungAuf der Seite TeamWas sie öffnet
operateBetriebKanäle, Marken, Inhaltsquellen und die Pipeline: das Tagesgeschäft.
approveFreigabenFreigeben und Ablehnen bei Beiträgen und Updates von Beiträgen, die auf Freigabe warten, und kein Bearbeiten. Sie schaltet auch die Freigabe eines Kanals aus, und bei Enterprise liest sie das Compliance-Protokoll und legt seine Freigaberegeln fest.
adminVerwaltungDie Seiten Team, API-Schlüssel und Webhook: die Personen, die Zugangsdaten, die nach außen reichen (API-Schlüssel, die Schlüssel der KI-Dienste, der Plattform-Connector eines Kanals), das erneute Anzeigen eines Schlüssels oder des Signaturgeheimnisses des Webhooks hinter dem eigenen Passwort sowie die Adresse des Webhooks, seine Testzustellung und das erneute Senden einer Zustellung. Bei Enterprise liest sie auch das Compliance-Protokoll und fügt seine Prüfer hinzu und entfernt sie.

Keine Berechtigung reicht um eine andere herum. Ein Administrator erstellt API-Schlüssel, kann einem Schlüssel aber nur approvals:write geben, solange er Freigaben hat, und plan:read nur als Inhaber, da der Tarif die Preise und die nächste Rechnung trägt; anderes zu verlangen ist ein 403 (siehe Authentifizierung). Welche E-Mails jede Berechtigung mit sich bringt, steht auf der Seite zur Seite Team, Wer welche E-Mail erhält: Nichts darüber, was der Workspace zahlt, erreicht jemand anderen als den Inhaber.

Ein Prüfer (Enterprise) ist kein Kollege: Prüfer stehen nicht in dieser Liste, belegen keinen Nutzerplatz und werden unter Compliance hinzugefügt und entfernt; die Routen hier beantworten einen mit einem 409.

seats zählt Kollegen, nie den Inhaber: used von max, wobei max die Summe aus dem ist, was der Tarif enthält (included, oder eine mit Reelwire vereinbarte Zahl), als Zusatz gekauften Nutzerplätzen (additional) und von Reelwire gewährten Nutzerplätzen (granted). lastLoginAt ist null bei jemandem, der sich noch nicht angemeldet hat.

Einen Kollegen einladen​

curl -X POST http://localhost:4000/v1/team/users \
-H "Authorization: Bearer rw_your_key_here" \
-H "Content-Type: application/json" \
-d '{ "email": "lea.martin@northwind.example", "displayName": "Lea Martin", "powers": ["operate"] }'
FeldWofür
emailSeine Adresse, bis zu 320 Zeichen. Sie meldet ihn an und muss irgendwo in Reelwire unbenutzt sein.
displayNameOptional, bis zu 120 Zeichen. Er kann ihn selbst in seinem Profil ändern.
powersMindestens eines von operate, approve und admin: Mit keinem würde er sich in einem leeren Dashboard anmelden, das ist also ein 400.

Es antwortet mit 201 und dem neuen Kollegen (user, wie die Liste ihn zeigt), password, einem für ihn erstellten Startpasswort, und minutes, das null ist, weil der Einrichtungslink nicht abläuft. Das Konto ist sofort bereit: Eine E-Mail geht an die Adresse, mit einem Link, um das eigene Passwort zu wählen, womit er sich anmelden soll. Das Senden eines neueren Links lässt jeden früheren nicht mehr funktionieren. Das Startpasswort steht in dieser Antwort und nirgends sonst: Es wird nur als Hash aufbewahrt und kann nicht erneut gelesen werden.

Ein 409 sagt, warum es nicht ging: Der Tarif hat kein Team (Tarif erhöhen), jeder Nutzerplatz ist belegt (jemanden entfernen oder Nutzerplätze auf der Seite Tarif kaufen), oder die Adresse kann hier nicht verwendet werden, was alles ist, was es über eine Adresse sagt, die jemand anderem gehört.

Ändern, erneut senden und entfernen​

PATCH /v1/team/users/{userId} nimmt powers (die ganze Menge, mit der er endet, mindestens eine: Berechtigungen werden ersetzt, nicht zusammengeführt) und displayName (ein leerer String nimmt den Namen weg) und antwortet mit dem geänderten user. Niemand kann die Berechtigungen des Inhabers oder seine eigenen ändern; beides ist ein 409.

POST /v1/team/users/{userId}/resend sendet einen frischen Einrichtungslink an jemanden, der seinen verloren hat, und antwortet mit { "sent": true, "email": "...", "minutes": null }. Nicht an den Inhaber, der sein eigenes Passwort zurücksetzt, und nicht zweimal innerhalb einer Minute an dieselbe Person: Beides ist ein 409.

POST /v1/team/users/{userId}/delete entfernt jemanden sofort und antwortet mit { "removed": true }: Er wird überall abgemeldet, sein Konto wird gelöscht, und eine E-Mail teilt es ihm mit. Was er getan hat, bleibt im Audit-Protokoll und bei den Beiträgen, die er freigegeben hat. Der Inhaber kann nicht entfernt werden, und niemand kann sich selbst entfernen.

Der Tarif​

curl http://localhost:4000/v1/licence \
-H "Authorization: Bearer rw_your_key_here"
{
"licence": {
"plan": "ENTERPRISE",
"state": "ACTIVE",
"term": "MONTHLY",
"capabilities": ["customApi", "team", "approvals", "compliance", "syndicate", "priorityRendering"],
"watermark": false,
"paysBy": "CARD",
"invoiceDays": 30,
"offer": null,
"colleagues": 3,
"pending": null,
"costs": {
"renewsAt": "2026-10-24T05:46:29.135Z",
"lines": [
{ "key": "plan", "label": "Reelwire Enterprise subscription (4000 videos a month, 25 seats, 300 syndication participants, 80000 MB storage)", "cents": 120000 }
],
"totalCents": 120000,
"currency": "EUR"
}
},
"plans": [
{ "id": "FREE", "name": "Free", "priceCents": 0, "renders": 15, "seats": 0, "syndicationPartners": 0, "storageMb": 50, "watermark": false, "capabilities": ["customApi"] }
]
}

Hier gekürzt: Die Antwort trägt mehr von costs und alle vier Tarife. Sie antwortet dem Inhaber oder einem Schlüssel mit plan:read, den nur der Inhaber geben kann; jeder andere Kollege wird mit einem 403 abgelehnt, weil sie die Preise und die nächste Rechnung trägt. capabilities ist, was der Tarif dieses Workspaces einschaltet, und dieselbe Liste entscheidet, was das Dashboard anbietet und was jede Route erlaubt: customApi (Ihre eigenen Feeds), team, approvals (ein Kanal kann Beiträge für einen Prüfer anhalten: Small business und Enterprise), compliance (das Compliance-Protokoll, Enterprise), syndicate und priorityRendering. holds ist, was zusätzlich zum Tarif gekauft wurde, pending eine bereits gewählte Änderung, die bei der nächsten Verlängerung beginnt, etwa der Wechsel in einen kleineren Tarif. plans listet jeden Tarif mit seinem Preis und seinen Kontingenten auf, den günstigsten zuerst; syndicationPartners ist sein Kontingent an Syndikationsteilnehmern.

paysBy ist, wie der Workspace zahlt: CARD oder INVOICE, wobei Stripe jede Rechnung per E-Mail sendet, zahlbar innerhalb von invoiceDays Tagen, und nichts von einer Karte abgebucht wird. Nur ein Enterprise-Angebot setzt INVOICE; invoiceDays bedeutet nichts, solange paysBy CARD ist. Bei Enterprise sind die Kontingente des Tarifs und die Preise seiner Zusatzpakete die im vom Workspace akzeptierten Angebot vereinbarten, und der Enterprise-Eintrag von plans trägt seinen vereinbarten Preis und seine vereinbarten Kontingente.

Enterprise wird mit Reelwire vereinbart, nicht gewählt. Bei einem Workspace, der nicht darin ist, hat sein Eintrag in plans contact: true, und seine Preise (priceCents, monthlyCents, yearlyCents) und Kontingente (renders, seats, syndicationPartners, storageMb) sind null; jeder andere Eintrag hat contact: false. Enterprise beim Ändern des Tarifs oder an der Kasse zu verlangen ist ein 409, der sagt, auf der Seite Tarif Kontakt aufnehmen zu verwenden. offer ist das Angebot, das Reelwire für diesen Workspace gemacht hat und das er noch nicht akzeptiert hat, oder null.

Wie viel vom Kontingent dieses Monats übrig ist, und von Nutzerplätzen, Syndikationsteilnehmern und Speicher, steht in GET /v1/renders/quota (allowance:read); was die Zusatzpakete kosten, steht in dieser Antwort nur für den Inhaber oder einen Schlüssel mit plan:read. Siehe Renders.

Den Tarif zu ändern, Zusatzpakete zu kaufen und die Rechnungen sind Sache des Inhabers, auf den Seiten Tarif, Kontingent und Abrechnung: Sie ändern, was der Workspace zahlt, und kein Schlüssel kann sie erreichen.

Ein Enterprise-Angebot​

Was Reelwire mit einem Kunden für Enterprise vereinbart, wird als Angebot für seinen Workspace geschrieben, das der Inhaber auf der Seite Tarif akzeptiert. Solange eines besteht, trägt GET /v1/licence es als offer:

{
"licence": {
"plan": "FREE",
"paysBy": "CARD",
"invoiceDays": 30,
"offer": {
"id": "eo_01M3C8Q0Y7ZK4D2N6R9T1V3W5X",
"term": "YEARLY",
"monthlyCents": 69000,
"priceCents": 690000,
"yearlyCents": 690000,
"currency": "EUR",
"renders": 3000,
"seats": 25,
"partners": 250,
"storageMb": 5000,
"extras": [
{ "stepId": "renders-250", "dimension": "renders", "amount": 250, "listCents": 12900, "cents": 9900 },
{ "stepId": "seats-1", "dimension": "seats", "amount": 1, "listCents": 3900, "cents": 3900 },
{ "stepId": "storage-100", "dimension": "storage", "amount": 100, "listCents": 199, "cents": 199 }
],
"paysBy": "INVOICE",
"invoiceDays": 45,
"expiresAt": "2026-11-15T09:12:44.000Z",
"road": "new-invoice",
"billing": null,
"needsBilling": true
}
}
}

Gekürzt: der Rest von licence und plans wie oben.

FeldWas es ist
idDas Angebot, zum Akzeptieren.
termMONTHLY oder YEARLY: die Abrechnungslaufzeit, mit der der Tarif beginnt.
monthlyCentsDer vereinbarte Preis für einen Monat, vor Steuern.
priceCentsWas ein Zeitraum von term kostet, vor Steuern.
yearlyCentsWas ein Jahr kostet, vor Steuern: zehn Monate, wie bei jedem Tarif.
renders, seats, partners, storageMbWas der Tarif für diesen Workspace enthält: Videos pro Monat, Nutzerplätze neben dem Inhaber, Syndikationsteilnehmer und Speicher in MB.
extrasJedes Zusatzpaket, das der Workspace selbst hinzufügen darf, je eine Stufe, mit seinem Listenpreis (listCents) und dem vereinbarten Preis (cents), beide monatlich. Syndikationsteilnehmer gehören nie dazu: Mehr davon sind ein neues Angebot.
paysBy, invoiceDaysCARD oder INVOICE, zahlbar innerhalb von invoiceDays Tagen.
expiresAtWann das Angebot nicht mehr besteht. Ein neues Angebot ersetzt das vorherige.
roadWas das Akzeptieren hier bewirkt: checkout (die Kasse von Stripe, per Karte), amend-card (der bezahlte Tarif steigt auf, der hinterlegten Karte belastet), new-invoice (ein von Beginn an in Rechnung gestelltes Abonnement) oder amend-invoice (der bezahlte Tarif steigt auf und wechselt auf Rechnung).
billingBei einem per Rechnung bezahlten Angebot die Rechnungsdaten, die Stripe hat: company, forename, surname, street, postalCode, city, province, country und vatNumber. null, wo keine hinterlegt sind.
needsBillingtrue, solange ein per Rechnung bezahltes Angebot nicht akzeptiert werden kann, weil die Rechnungsdaten fehlen, auf die seine Rechnungen ausgestellt werden.

POST /v1/licence/offer/{offerId}/accept, ohne Text, akzeptiert es über seinen road und antwortet mit einem von:

  • { "licence": { ... } }, der Tarif, wie er jetzt ist, wo der Wechsel sofort erfolgte: per Karte bei einem bezahlten Tarif oder per Rechnung. Die erste Rechnung eines neuen in Rechnung gestellten Abonnements kommt innerhalb einer Stunde per E-Mail.
  • { "checkout": { "url": "...", "sessionId": "..." } }, die zu öffnende Kasse von Stripe, wo der erste Zeitraum per Karte bezahlt wird. Nichts ändert sich, bis die Zahlung durchgeht.
  • 202 mit { "confirmation": { "url": "...", "label": "...", "expiresAt": "..." } }, wo die Bank den Karteninhaber bittet, die Zahlung zu bestätigen, wie bei jedem Aufstieg: Nichts ändert sich, bis sie auf der Seite von Stripe unter url bestätigt ist.

Es ist ein 404 bei einem Angebot, das für diesen Workspace nicht gemacht wurde, und ein 409, der sagt warum, bei einem, das nicht mehr besteht (akzeptiert, zurückgezogen oder nach expiresAt), bei einem per Rechnung bezahlten Angebot ohne Rechnungsdaten und bei einem Jahresangebot, solange etwas anderes auf das Abrechnungsdatum wartet. Es ist ein 403, solange die E-Mail-Adresse des Inhabers nicht bestätigt ist: Von einer Adresse, die niemand bestätigt hat, wird nichts bezahlt, weder hier noch an der Kasse, folgen Sie also zuerst dem Link in der Bestätigungs-E-Mail.

POST /v1/licence/offer/billing-details antwortet mit { "url": "..." }: der Abrechnungsseite von Stripe, wo der Inhaber die Daten eingibt, auf die ein per Rechnung bezahltes Angebot ausgestellt wird. Dort wird nichts belastet oder abonniert. Es ist ein 409, solange kein Angebot besteht.

Beide antworten dem angemeldeten Inhaber und niemandem sonst: Ein Schlüssel wird abgelehnt, was auch immer seine Berechtigungen sind.

Nur für eine angemeldete Person​

Diese antworten einer Dashboard-Sitzung und nie einem Schlüssel, weil ein Schlüssel keine Rolle hat und niemandes Mitgliedschaft ist:

  • POST /v1/team/name mit { "name": "Northwind Markets" } (bis zu 120 Zeichen) benennt den Workspace um und antwortet mit { "workspace": { "name": "..." } }. Allein Sache des Inhabers, da jeder Kollege den Namen sieht; jeder andere wird mit einem 403 abgelehnt.
  • POST /v1/team/leave nimmt einen Kollegen aus dem Workspace heraus und in einen neuen eigenen auf Free, den er besitzt, und antwortet mit { "workspace": { "id": "...", "name": "...", "plan": "FREE" } }; nichts vom alten Workspace geht mit ihm. Der Inhaber kann nicht gehen (ein 409).
  • GET /v1/team/markets antwortet mit jeder Branche (markets[]: id, name, description, chosen), wann der Workspace gewählt hat (chosenAt) und ob diese Person es ändern darf (canChange). POST /v1/team/markets mit { "markets": ["brokers", "tech"] } (IDs aus dieser Liste: brokers ist Finanzen) ersetzt die Auswahl und antwortet mit den IDs, die es behielt, und chosenAt. Es ist allein Sache des Inhabers (jeder andere erhält einen 403), eine ID, die es nicht kennt, wird verworfen, und mindestens eine muss bleiben: keine ist ein 400. Die Branchen entscheiden, welche Feeds und Vorlagen dem Workspace angeboten werden.