Pro API: saldo, limieten en getrainde personages

Twee leesroutes, altijd toegestaan ongeacht de rechten van de sleutel, plus het activiteitenlog dat de app bijhoudt.

Saldo en limieten

GET /credits

json
{ "balance": 1830, "licenseId": "lic_...", "key": "k_1a2b3c4d",
  "limits": { "concurrent": 2, "perMinute": 60, "perDay": 0 }, "running": 1,
  "buy_url": "https://tendre.ai/credits?license=lic_..." }
VeldBetekenis
balanceResterend tegoed. null wanneer het saldo onbekend is (testomgeving).
licenseIdDe licentie waarbij deze sleutel hoort.
keyDe publieke identifier van de sleutel, veilig om te loggen. Nooit het geheim.
limits.concurrentRenders die tegelijk draaien, standaard 2.
limits.perMinuteInzendingen per minuut, standaard 60.
limits.perDayDagelijks tegoedlimiet dat je op de sleutel hebt ingesteld. 0 betekent geen limiet.
runningRenders van deze sleutel die nog wachten om opgehaald te worden.
buy_urlDe aankooppagina voor credits van je licentie, per kaart of crypto.

Dit is de goedkoopste aanroep in de API en de juiste om te controleren of een sleutel werkt.

Credits kopen met je opgeslagen kaart

POST /credits/purchase

json
{ "pack": "m" }

pack is een pakket-id (s, m, l, xl, xxl of xxxl), of "c25000" voor een vrij aantal boven het grootste pakket. De betaling gaat via de kaart die is opgeslagen in het automatisch opwaarderen op je accountpagina, alleen als je daar je agent hebt toegestaan te kopen, binnen de maandelijkse limiet die je daar hebt ingesteld (automatische opwaarderingen inbegrepen). Elke aankoop wordt per e-mail bevestigd. Eén aankoop tegelijk.

Het antwoord is 200 { credits, eur, balance }. Elke weigering bevat buy_url, de gewone aankooplink, om in plaats daarvan te gebruiken: 402 confirmation_required (je bank vraagt je bevestiging) of payment_declined; 409 agent_not_allowed, no_saved_card, monthly_cap_reached, topup_in_progress of purchase_in_progress; 400 unknown_pack. Bij 503 payment_unavailable weten we niet of de afschrijving is gelukt: probeer het niet meteen opnieuw, een gelukte afschrijving wordt bijgeschreven.

Getrainde personages

Dit zijn de personages die als LoRA zijn getraind, voor afbeeldingen en gewone video's. De personages van Multi-Ref Video, zeven weergaven gemaakt vanuit één foto, zijn iets anders: zie Characters.

GET /loras

json
{ "image": [ { "name": "megan_krea2", "trigger": "megan", "base": "krea2", "size": 0 } ],
  "video": [ { "name": "megan_ltx", "trigger": "megan", "size": 0 } ] }

Geef name mee als lora, haal het op uit de lijst image voor afbeeldingen en de lijst video voor video's, en zet de trigger in de prompt, anders verschijnt het personage niet. Een personage dat niet bij het account hoort, geeft 403 unknown_lora als antwoord.

Je eigen LoRA uploaden

POST /loras/upload

Een .safetensors-bestand dat je al hebt, elders getraind of op je eigen server, komt in de ruimte van het account terecht en is daarna bruikbaar via lora, net als een personage dat in de app is getraind. Er zijn twee manieren: in één keer tot 90 MB, of in delen daarboven. Een LoRA weegt doorgaans 200 tot 500 MB, dus de tweede manier is de gewone gang van zaken. Het maximum is 800 MB in beide gevallen.

In één keer: een raw body (application/octet-stream, Content-Length verplicht), parameters in de URL.

Boven 100 MB bereikt het verzoek de API nooit. De infrastructuur ervoor wijst het af, dus wat terugkomt is een kale 413 zonder JSON-body: een client die elke fout als JSON parseert, loopt hierop vast in plaats van het te melden. Dat formaat hoort in delen verstuurd te worden.

ParameterFunctie
nameBestandsnaam, .safetensors, letters, cijfers, . _ -, maximaal 80 tekens. Een naam die al bestaat wordt vervangen.
kindimage (de standaard) of video. Vereist respectievelijk de rechten images of videos.
triggerHet triggerwoord om terug in de prompt te zetten, maximaal 60 tekens.
bash
curl -s -X POST "$B/loras/upload?name=my_character.safetensors&kind=image&trigger=ohwx"   -H "Authorization: Bearer $KEY" -H "Content-Type: application/octet-stream"   --data-binary @my_character.safetensors

Het antwoord is { "ok": true, "name": "my_character.safetensors", "kind": "image", "size": 314572800, "trigger": "ohwx", "architecture": "krea2", "storage": { ... } }.

Compatibiliteit wordt gecontroleerd bij het uploaden. Afbeeldingen worden gegenereerd door Krea 2, dat een eigen architectuur heeft: alleen een Krea 2-LoRA werkt, of die nu in tendre.AI is getraind of elders voor Krea 2. Let op: een FLUX.1-LoRA wordt geweigerd, wat niet iedereen meteen verwacht. Video's worden gegenereerd door LTX 2.5, dus een LTX 2.5 of 2.3-LoRA.

De API leest de bestandsheader voordat er iets wordt opgeslagen. Een LoRA die herkend wordt als SDXL, SD 1.5, SD3, FLUX.1, Wan of HunyuanVideo wordt geweigerd met 415 incompatible_lora, waarbij de gevonden architecture wordt benoemd, en een bestand dat geen safetensors is met 415 invalid_safetensors. Er wordt in beide gevallen niets opgeslagen en er wordt geen quota verbruikt.

Eén geval glipt er nog doorheen: een architectuur die de header niet identificeert wordt geaccepteerd, met architecture: "inconnue", en wordt pas beoordeeld op het moment van renderen. Dat is de enige vergissing waarvoor je een render kwijt bent om erachter te komen.

Een grote LoRA in delen versturen

Drie aanroepen, plus één om te stoppen.

1. Open de sessie. POST /loras/upload/start met { "name", "kind", "size", "trigger" }, waarbij size het volledige bestand in bytes is. Dit controleert de naam, de grootte en de quota, en antwoordt dan:

json
{ "uploadId": "...", "part_size": 20971520, "max_part_size": 104857600, "parts_expected": 15 }

2. Stuur elk deel. POST /loras/upload/part?uploadId=...&part=N, raw body, delen genummerd vanaf 1, part_size bytes elk behalve het laatste, nooit meer dan max_part_size. Elk antwoord bevat een etag, en je hebt ze allemaal nodig voor de volgende stap, dus bewaar ze terwijl je bezig bent.

Deel 1 is speciaal: het bevat de bestandsheader, dus daar wordt de architectuur beoordeeld. Een incompatibele LoRA wordt daar onderschept met 415 en de sessie wordt geannuleerd. Je komt het te weten na 20 MB in plaats van na 400.

3. Sluit het af. POST /loras/upload/finish met { "uploadId", "parts": [ { "part": 1, "etag": "..." }, ... ] }. Dit assembleert het bestand en registreert het, met exact hetzelfde antwoord als de upload in één keer.

Om te stoppen: POST /loras/upload/abort met { "uploadId" }. Een sessie die zonder finish wordt achtergelaten, wordt na zes uur verwijderd. Er verschijnt niets in GET /loras en er wordt niets van de quota afgetrokken totdat finish slaagt, dus een onderbroken upload kost je geen opslag.

python
import os, requests
B, H = "https://api.tendre.ai/pro/v1", {"Authorization": "Bearer " + KEY}
path = name = "my_character.safetensors"
s = requests.post(f"{B}/loras/upload/start", headers=H,
                  json={"name": name, "kind": "image", "size": os.path.getsize(path), "trigger": "ohwx"}).json()
parts = []
with open(path, "rb") as f:
    n = 1
    while chunk := f.read(s["part_size"]):
        r = requests.post(f"{B}/loras/upload/part",
                          headers={**H, "Content-Type": "application/octet-stream"},
                          params={"uploadId": s["uploadId"], "part": n}, data=chunk)
        r.raise_for_status()
        parts.append({"part": n, "etag": r.json()["etag"]})
        n += 1
done = requests.post(f"{B}/loras/upload/finish", headers=H,
                     json={"uploadId": s["uploadId"], "parts": parts}).json()
print(done["name"], done["architecture"], done["storage"])

Een kant-en-klaar PowerShell-script wordt meegeleverd met de app, op scripts/api-pro-lora.ps1.

Een LoRA verwijderen

DELETE /loras/{name}?kind=image|video verwijdert het bestand en geeft de quota vrij. Het antwoordt met { "ok": true, "name": ..., "storage": { ... } }, of 404 unknown_lora wanneer de naam niet bestaat op het account.

Opslagquota

Elke licentie krijgt maximaal 20 bestanden en 10 GB, afbeeldingen en video's samen, en de personages die in de app zijn getraind tellen mee. GET /loras rapporteert de stand in storage:

json
{ "count": 3, "max_count": 20, "bytes": 943718400, "max_bytes": 10737418240 }

Boven een van beide limieten antwoordt een upload met 413 lora_quota samen met wat er nog over is. Verwijder een bestand om ruimte vrij te maken.

Trainen van een personage is nog niet beschikbaar via de API. Dat gebeurt in de app, en het resultaat verschijnt in deze lijst.

Activiteit

De app houdt het log bij van elke render die je sleutels hebben gemaakt (datum, sleutel, type, kosten, status) en het verbruik per sleutel, onder Instellingen > API > Activiteit.

Daar kun je ook een sleutel intrekken die gelekt is, zonder de andere aan te raken.

Windows · Mac · Cloud of lokaal

Genereer privé. Vanavond.

Download tendre.AI gratis en genereer zonder limieten, privé, op je eigen GPU.

OS Windows 10/11GPU NVIDIA 8GB+VRAM 12GB aanbevolenSchijf 20GB

Mac: Apple silicon (M1 of later), macOS 13 of later. Intel Macs worden niet ondersteund.

Voor lokale beeldgeneratie op Mac heb je een M4 met 24 GB geheugen nodig, of een M2 of M3 Pro, Max of Ultra met 24 GB. Daaronder draait alles online met credits. Retoucheren en video draaien voorlopig online op Mac.

Alles over tendre.AI voor Mac

Geen NVIDIA GPU? Begin 100% in de cloud: elke dag 5 gratis afbeeldingen en 1 gratis video. Een NVIDIA-kaart (8GB+) ontgrendelt onbeperkt lokaal genereren.