API-Dokumentation
Mit der Do4U-API nutzt du dieselben Werkzeuge wie auf der Website aus deiner eigenen Software: zusammenfassen, vergleichen, Support-Antworten, Alt-Texte, umschreiben und übersetzen. Jede Anfrage verarbeiten wir auf eigenen Servern in Polen, EU.
Basis-URL: https://do4u.eu/api/v1
OpenAPI-3.1-Beschreibung (JSON) – Maschinenlesbare Beschreibung dieser API für Code-Generatoren und Werkzeuge wie Postman oder Insomnia. Ohne Schlüssel abrufbar.
Anmeldung
Leg unter „API-Schlüssel" in deinem Konto einen Schlüssel an. Schick ihn bei jeder Anfrage im Kopf Authorization: Bearer <Schlüssel> (oder X-API-Key: <Schlüssel>). Halte den Schlüssel geheim und bau ihn nie in eine Webseite ein. Du kannst ihn jederzeit widerrufen.
So funktioniert es
Aufträge laufen im Hintergrund. Du legst einen Auftrag an und bekommst sofort seine ID (HTTP 202). Dann fragst du den Auftrag ab, bis der Status done oder failed ist. Frag alle 2 bis 5 Sekunden; die meisten Aufträge dauern ein paar Sekunden.
Endpunkte
| GET | /tools | Werkzeuge, Optionen und deine Eingabegrenzen |
| GET | /balance | Dein Guthaben |
| POST | /jobs | Auftrag anlegen (JSON, oder multipart/form-data mit einer Bilddatei) |
| GET | /jobs/{id} | Stand und Ergebnis eines Auftrags |
| DELETE | /key | Widerruft den Schlüssel, mit dem du diese Anfrage schickst, zum Beispiel beim Trennen einer Integration. Schon angelegte Aufträge laufen zu Ende. |
| POST | /key/revoke | Dasselbe wie DELETE /key, für Clients, die nur GET und POST senden können. |
Beispiel
Auftrag anlegen, dann das Ergebnis abholen:
curl -X POST https://do4u.eu/api/v1/jobs \
-H "Authorization: Bearer d4u_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"tool": "summarize", "text": "...", "options": {"length": "short"}, "language": "en"}'
HTTP/1.1 202 Accepted
{"id": "8f1c0b6a...", "tool": "summarize", "status": "queued", "model": "do4u-standard",
"credits_estimate": 1, "links": {"self": "https://do4u.eu/api/v1/jobs/8f1c0b6a..."}}
curl https://do4u.eu/api/v1/jobs/8f1c0b6a... -H "Authorization: Bearer d4u_YOUR_KEY"
{"id": "8f1c0b6a...", "tool": "summarize", "status": "done", "model": "do4u-standard", "credits_estimate": 1,
"result": {"summary": "...", "key_points": ["...", "..."]}, "credits": 1,
"notice": "AI-generated, please check before use."}
curl -X POST https://do4u.eu/api/v1/jobs -H "Authorization: Bearer d4u_YOUR_KEY" \
-F tool=alt_text -F language=de -F "text=Product page: hiking boots" -F image=@photo.jpg
Felder für POST /jobs
| tool | Name des Werkzeugs, siehe Tabelle unten. Pflicht. |
| text | Eingabetext. Bei compare: Text A. Bei alt_text: optional der Seitenkontext. |
| text_b | Text B (nur compare). |
| url | Öffentliche Webseite, die statt eines Textes gelesen wird (summarize, accessibility_check). |
| html | HTML einer Seite zum Prüfen (accessibility_check), bis 300.000 Zeichen. |
| focus_keyword | Optionales Fokus-Stichwort für seo_meta. Ohne target schreibt seo_meta in language. |
| faq | Optionale FAQ-Ausschnitte (nur support_reply). |
| questions | Optional bei seo_meta, content_brief und faq_schema: häufige Besucherfragen als Liste von Texten oder {"text": ..., "count": n} (bis 50, genutzt werden höchstens 20). faq_schema beantwortet sie zuerst, wenn die Quelle die Antwort enthält; visitor_questions im Ergebnis sagt, was mit jeder Frage passiert ist. |
| image | Bild für alt_text: Dateifeld in multipart/form-data oder Base64 / data-URI im JSON. JPG, PNG, WebP oder GIF, bis 5 MB. |
| image_url | Optional bei alt_text statt image: öffentliche Adresse des Bildes (http oder https; JPEG, PNG, WebP oder GIF; höchstens 5 MB). Do4U lädt es einmal im Hintergrund. Klappt das nicht, schlägt der Auftrag mit dem Fehler image_unavailable fehl und kostet nichts. |
| options | Objekt mit den Optionen des Werkzeugs, zum Beispiel {"length": "short"}. |
| language | Sprache des Ergebnisses und der Hinweise: en, de oder pl. Vorgabe en. Beim Übersetzen ist die Zielsprache die Option target. |
| no_store | true: Die Eingabe wird direkt nach der Verarbeitung gelöscht, das Ergebnis nach dem ersten Abholen. |
| brand_voice | Optional: false schaltet deine Markenstimme für diesen Auftrag ab (Vorgabe: Die Markenstimme gilt, wenn du eine angelegt hast). |
| ai_label | Optional: true zeigt in der Weboberfläche beim Ergebnis den sichtbaren Hinweis „Als KI-Inhalt gekennzeichnet“, false blendet ihn aus. Vorgabe: die Einstellung in deinem Konto. Der maschinenlesbare KI-Vermerk steht immer im Ergebnis und lässt sich nicht abschalten: die Felder ai_generated und generator, ein HTML-Kommentar in HTML-Ergebnissen, ai_notice bei Bildbeschreibungen. ai_generated ist false, wenn das Ergebnis nur aus automatischen Prüfungen stammt. |
| callback_url | Optional: öffentliche https-Adresse, die einen signierten POST bekommt, sobald der Auftrag fertig ist (siehe Webhooks). |
| render_js | Optional: true lädt die Seite zuerst mit JavaScript (Seiten, die ihren Inhalt im Browser bauen; Werkzeuge mit url). Der Aufpreis fällt nur an, wenn wirklich so geladen wurde; das Ergebnisfeld render sagt, was passiert ist. |
| no_cache | Optional: true startet immer einen neuen KI-Auftrag. Ohne das Feld wird ein fertiges, noch gespeichertes Ergebnis deines Kontos (bzw. Arbeitsbereichs) mit gleichem Werkzeug, gleichen Optionen und gleicher Eingabe übernommen: Der Auftrag ist sofort fertig, from_history ist true und er kostet 0 % der Credits des Originals. Nie mit no_store, nie bei einer url. |
| allow_same_language | Optional bei translate, translate_html und translate_file: true übersetzt auch dann, wenn der Text schon in der Zielsprache ist. Ohne das Feld wird so ein Auftrag mit same_language (400) abgewiesen – nur, wenn die Prüfung sicher ist. |
Anfragen sicher wiederholen (Idempotency-Key)
Schick bei POST /jobs den Kopf Idempotency-Key mit, zum Beispiel eine zufällige UUID je Auftrag (1 bis 255 druckbare ASCII-Zeichen). Bricht die Verbindung ab und du schickst dieselbe Anfrage mit demselben Idempotency-Key und demselben API-Schlüssel innerhalb von 24 Stunden noch einmal, bekommst du dieselbe Antwort: derselbe Auftrag, kein zweiter Auftrag und keine zweite Abbuchung. Die Antwort trägt dann den Kopf Idempotent-Replayed: true. Nimm für jeden neuen Auftrag einen neuen Schlüssel. Schickst du denselben Schlüssel mit einer anderen Anfrage, kommt 422 idempotency_conflict. Fehler werden nicht gespeichert: Nach einem Fehler kannst du die Anfrage mit demselben Schlüssel noch einmal schicken.
curl -X POST https://do4u.eu/api/v1/jobs \
-H "Authorization: Bearer d4u_YOUR_KEY" \
-H "Idempotency-Key: 5f0c2a8e-7d1b-4c3a-9e2f-1b6d8a4c0e77" \
-H "Content-Type: application/json" \
-d '{"tool": "summarize", "text": "..."}'
Werkzeuge und Optionen
| Werkzeug | Eingaben | Optionen (der erste Wert ist die Vorgabe) | Ergebnisfelder | Preis |
|---|---|---|---|---|
| moderate_commentKommentare auf Spam prüfen | text | – | classification, reason, suggestion, action, note | meist 1–3 Credits |
| document_htmlDokumente in HTML umwandeln | image, pdf, text | page: 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | html, plain_text, notes, page, note | meist 2–3 Credits |
| image_textText in Seitenbildern finden | url | image_index: 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | html, plain_text, notes, images, image_index, coverage, note | meist 2–3 Credits |
| pdf_accessibilityPDF-Barrierefreiheit prüfen | – | checks, pages, truncated, repaired, note, convert_url | meist 1–2 Credits | |
| summarizeZusammenfassen | text, url | length: medium | short | long | summary, key_points | meist 1–3 Credits |
| compareVergleichen | text, text_b | focus: overall | facts | tone | seo | summary, similarities, differences | meist 1–3 Credits |
| support_replySupport-Antwort | text, faq | tone: friendly | neutral | formal | reply, concerns, questions | meist 1–3 Credits |
| alt_textAlt-Texte | image, text, filename, image_url | – | alt, caption, description, filename, filename_base, extension, language, alt_length, alt_max, alt_status, caption_length, caption_max, caption_status | meist 2–3 Credits |
| rewriteUmschreiben | text | style: simpler | shorter | more_formal | more_casual | more_persuasive | easy_to_read | text, changes, language, style_label, readability, easy_check, easy_note, review_status, review_limit, diff | meist 1–4 Credits |
| accessibility_checkBarrierefreiheits-Check | url, html | – | summary, page, counts, findings, checks, readability, note | fest 3 Credits je Auftrag |
| seo_metaSEO-Titel & Beschreibung | url, text, focus_keyword, questions | target: en | de | pl | fr | es | it | nl | cs | sk | uk | bg | da | el | fi | hr | hu | lt | pt | ro | sl | sv | variants, current, focus_keyword, limits, keywords, note | fest 1 Credit je Auftrag |
| translate_htmlHTML übersetzen | html | target: en | de | pl | fr | es | it | nl | cs | sk | uk | bg | da | el | fi | hr | hu | lt | pt | ro | sl | sv | html, segments, check, glossary, notes, note, review_status, alignment | meist 1–4 Credits |
| product_descriptionProduktbeschreibungen | text | tone: neutral | friendly | persuasive | formallength: medium | short | longchannel: shop | marketplacetarget: auto | en | de | pl | fr | es | it | nl | cs | sk | uk | bg | da | el | fi | hr | hu | lt | pt | ro | sl | svmeta_description: no | yes | products, language, detected_language, channel, format, limits, counts, check, note | meist 1–3 Credits |
| headlinesÜberschriften und Betreffzeilen | text | kind: page | newsletter | adtone: neutral | friendly | persuasive | formalcount: 5 | 3 | 8target: auto | en | de | pl | fr | es | it | nl | cs | sk | uk | bg | da | el | fi | hr | hu | lt | pt | ro | sl | sv | kind, fields, variants, limits, counts, enough, report, language, detected_language, note | fest 1 Credit je Auftrag |
| faq_schemaFAQ und Schema-Markup | url, text, questions | type: faq | organization | localbusiness | productcount: 8 | 5 | 10target: auto | en | de | pl | fr | es | it | nl | cs | sk | uk | bg | da | el | fi | hr | hu | lt | pt | ro | sl | sv | type, kind, jsonld, html, valid, faq, fields, checks, counts, unverified, dropped, existing, existing_errors, existing_same, page, language, detected_language, notes, note, visitor_questions | fest 2 Credits je Auftrag |
| content_briefContent-Briefing | text, audience, questions | target: auto | en | de | pl | fr | es | it | nl | cs | sk | uk | bg | da | el | fi | hr | hu | lt | pt | ro | sl | sv | title, title_length, title_max, title_status, goal, intent, outline, questions, length, markdown, counts, dropped, limits, language, detected_language, notes, note | meist 1–2 Credits |
| review_replyAntworten auf Bewertungen | text, company | stars: 0 | 1 | 2 | 3 | 4 | 5platform: general | google | trustpilot | booking | tripadvisor | airbnb | yelp | app_store | google_playtone: friendly | neutral | formalcount: 3 | 2target: auto | en | de | pl | fr | es | it | nl | cs | sk | uk | bg | da | el | fi | hr | hu | lt | pt | ro | sl | sv | assessment, variants, limits, platform, stars, tone, counts, dropped, enough, report, hints, checks, language, detected_language, note | meist 1–2 Credits |
| social_postsSocial-Posts aus Artikel | url, text | channels: all | linkedin | facebook | instagram | linkedin+facebook | linkedin+instagram | facebook+instagramtone: friendly | neutral | persuasive | formal | casualvariants: 1 | 2 | 3target: auto | en | de | pl | fr | es | it | nl | cs | sk | uk | bg | da | el | fi | hr | hu | lt | pt | ro | sl | sv | channels, posts, limits, counts, enough, report, link, link_in_bio, language, detected_language, source, notes, note | meist 1–3 Credits |
| explain_termsFachbegriffe erklären | url, text | level: simple | general | expertexamples: no | yestarget: auto | en | de | pl | fr | es | it | nl | cs | sk | uk | bg | da | el | fi | hr | hu | lt | pt | ro | sl | sv | terms, level, language, detected_language, source, text_length, text_clipped, counts, dropped, adjusted, limits, other_candidates, checks, markdown, html, notes, note | meist 1–3 Credits |
| extract_dataDaten herausziehen | url, text | types: all | hours | prices | hours+prices | addresses | hours+addresses | prices+addresses | hours+prices+addresses | events | hours+events | prices+events | hours+prices+events | addresses+events | hours+addresses+events | prices+addresses+events | hours+prices+addresses+events | contact | hours+contact | prices+contact | hours+prices+contact | addresses+contact | hours+addresses+contact | prices+addresses+contact | hours+prices+addresses+contact | events+contact | hours+events+contact | prices+events+contact | hours+prices+events+contact | addresses+events+contact | hours+addresses+events+contact | prices+addresses+events+contacttarget: auto | en | de | pl | fr | es | it | nl | cs | sk | uk | bg | da | el | fi | hr | hu | lt | pt | ro | sl | sv | kinds, hours, prices, addresses, events, contact, counts, empty, unverified, dropped, limits, source, language, detected_language, notes, note | meist 1–3 Credits |
| redirect_planWeiterleitungsplan | old_urls, new_urls, old_domain, new_domain | ai: yes | no | old_base, new_base, mappings, counts, unused_new, invalid, dropped, ai, legend, language, domain_ignored, notes, note | meist 1–3 Credits |
| contrast_checkFarbkontrast prüfen | colors | level: aa | aaatext_size: normal | large | colors, pairs, counts, invalid, settings, palette_check, legend, language, note | meist 1–2 Credits |
| language_levelSprachniveau anpassen (A1–C1) | text | level: B1 | A1 | A2 | B2 | C1target: auto | en | de | pl | fr | es | it | nl | cs | sk | uk | bg | da | el | fi | hr | hu | lt | pt | ro | sl | svkeep_terms: no | yes | text, changes, level, language, detected_language, translated, summary, within_guideline, measures, over_guideline, over_count, readability, content, kept_terms, checks, hints, note | meist 1–4 Credits |
| llms_txtllms.txt-Generator | url | target: auto | en | de | pl | fr | es | it | nl | cs | sk | uk | bg | da | el | fi | hr | hu | lt | pt | ro | sl | sv | name, summary, details, file, filename, sections, counts, pages_read, read, existing, dropped, hints, language, detected_language, notes, note | meist 1–3 Credits |
| internal_linksInterne Verlinkung | text, pages, sitemap_url, page_url | – | links, text, text_is_html, counts, pages, dropped, ai, limits, language, detected_language, timeout, notes, note | meist 1–3 Credits |
| outdated_contentVeraltete Inhalte finden | url, text, html, reference_date | target: auto | en | de | pl | fr | es | it | nl | cs | sk | uk | bg | da | el | fi | hr | hu | lt | pt | ro | sl | sv | reference_date, reference_date_given, findings, summary, counts, source, dropped, ai, limits, language, detected_language, timeout, notes, note | meist 1–3 Credits |
| inclusive_languageInklusive und verständliche Sprache | text | scope: both | exclusion | complexitygender: not_prescribed | neutral | pair | star | colon | brand_voice | language, scope, gender, summary, counts, findings, candidates, measures, applied, changed, revised_text, diff, dropped, checks, hints, note | meist 1–3 Credits |
| review_analysisBewertungen auswerten | text | focus: all | criticismtarget: auto | en | de | pl | fr | es | it | nl | cs | sk | uk | bg | da | el | fi | hr | hu | lt | pt | ro | sl | sv | format, columns, language, detected_language, focus, counts, selection, stars, period, languages, languages_unknown, personal_data, themes, praise, criticism, page, faq, cited, dropped, limits, hints, notes, note | meist 1–3 Credits |
| ai_visibility_checkKI-Sichtbarkeits-Check | url, text, html, topic, questions | target: auto | en | de | pl | fr | es | it | nl | cs | sk | uk | bg | da | el | fi | hr | hu | lt | pt | ro | sl | sv | coverage, coverage_level, counts, questions, faq_questions, sections, qa_on_page, structured_data, llms_txt, robots_txt, readability, hints, source, topic, dropped, ai, limits, files, language, detected_language, note, how | meist 1–3 Credits |
| events_calendarVeranstaltungen in den Kalender | url, text, time_zone, year | target: auto | en | de | pl | fr | es | it | nl | cs | sk | uk | bg | da | el | fi | hr | hu | lt | pt | ro | sl | sv | events, counts, unverified, dropped, timezone, year, today, limits, ics, jsonld, filename, source, language, detected_language, notes, note | meist 1–3 Credits |
| product_photoProduktfoto zu Text | image, image_url, text, languages | target: auto | en | de | pl | fr | es | it | nl | cs | sk | uk | bg | da | el | fi | hr | hu | lt | pt | ro | sl | svcategory_list: google | free | language, detected_language, title, title_length, title_max, title_status, short_description, short_length, short_max, short_status, description, description_length, description_max, description_status, bullets, bullets_count, bullets_max_length, bullets_status, alt_text, alt_length, alt_max, alt_status, category_group, attributes, attribute_sources, attribute_list, translations, removed, hints, claims_checked, claims_unchecked, counts, limits, notes, category_list, jsonld, jsonld_check, product_json, check, note | meist 2–3 Credits |
| chart_descriptionDiagramme und Infografiken beschreiben | image, image_url, text | target: auto | en | de | pl | fr | es | it | nl | cs | sk | uk | bg | da | el | fi | hr | hu | lt | pt | ro | sl | svlength: normal | short | chart_type, title, language, detected_language, alt, alt_length, alt_max, alt_status, description, description_length, description_max, description_status, description_size, axes, data, data_rows, table, data_csv, html, image_text, pie_check, hints, counts, limits, notes, verify_numbers, check, note | meist 2–3 Credits |
| design_feedbackDesign-Feedback aus Screenshot | image, image_url, text | target: auto | en | de | pl | fr | es | it | nl | cs | sk | uk | bg | da | el | fi | hr | hu | lt | pt | ro | sl | svdevice: auto | phone | desktop | language, detected_language, device, summary, findings, image, image_basis, counts, removed, hints, limits, notes, estimate, check, note, text, markdown | meist 2–3 Credits |
| job_ad_checkStellenanzeige prüfen | url, text, html | jurisdiction: auto | eu | de | pltarget: auto | en | de | pl | fr | es | it | nl | cs | sk | uk | bg | da | el | fi | hr | hu | lt | pt | ro | sl | sv | language, detected_language, jurisdiction, title, checklist, counts, pay, structure, length, findings, titles, summary, source, text_cut, dropped, ai, hints, note | meist 1–3 Credits |
| green_claims_checkUmweltaussagen prüfen | url, text, html | target: auto | en | de | pl | fr | es | it | nl | cs | sk | uk | bg | da | el | fi | hr | hu | lt | pt | ro | sl | sv | findings, summary, counts, source, dropped, ai, limits, legal, language, detected_language, timeout, notes, note | meist 1–3 Credits |
| third_party_scanDrittanbieter-Check | url, html | – | url, host, page_from, static_only, counts, consent, groups, cookies, legend, notes, check, note, truncated, checked_at | meist 1–2 Credits |
| broken_link_checkDefekte Links finden | url | resources: yes | noexternal: no | yes | language, url, host, counts, broken, more_broken, redirects, more_redirects, soft, start_soft, suggestions, not_reached, limits, note, truncated | meist 1–2 Credits |
| duplicate_content_checkSEO-Duplikate finden | url, text | – | language, mode, url, host, summary, counts, findings, passed, hints, thresholds, pages, limits, note, truncated | meist 1–2 Credits |
| hreflang_checkhreflang-Prüfung | url | – | language, url, counts, findings, pages, matrix, annotations, legend, limits, note | meist 1–2 Credits |
| ai_robots_txtKI-Crawler in der robots.txt | site_url, robots_txt, groups, crawlers | – | file, file_complete, ai_section, crawlers, counts, source, existing, changes, checks, notes, legend, sources, verified_on, language, note | meist 1–2 Credits |
| faq_from_supportFAQ aus Kundenanfragen | text, faq_url | target: auto | en | de | pl | fr | es | it | nl | cs | sk | uk | bg | da | el | fi | hr | hu | lt | pt | ro | sl | sv | format, input_kind, columns, language, detected_language, languages, counts, selection, faq_page, personal_data, topics, gaps, cited, dropped, limits, placeholder, hints, notes, note, export | meist 1–3 Credits |
| price_display_checkPreisangaben prüfen | url, text, html | ai: yes | nojurisdiction: auto | de | pl | jurisdiction, jurisdiction_auto, jurisdiction_label, source, price, previous_prices, prior_30_days, unit_prices, quantities, discounts, hints, structured, findings, counts, checks, ai, dropped, legal_sources, language, notes, note | meist 1–3 Credits |
| form_text_checkFormulartexte | url, html, error_messages | target: auto | en | de | pl | fr | es | it | nl | cs | sk | uk | bg | da | el | fi | hr | hu | lt | pt | ro | sl | svtone: neutral | friendly | formal | language, detected_language, tone, required_word, forms, errors, counts, criteria, summary, source, dropped, ai, hints, note | meist 1–3 Credits |
| newsletter_checkNewsletter prüfen | html, eml, text, subject, preheader | target: auto | en | de | pl | fr | es | it | nl | cs | sk | uk | bg | da | el | fi | hr | hu | lt | pt | ro | sl | sv | language, detected_language, input, subject, preheader, checklist, counts, links, links_total, images, eml, pairs, improvements, text_cut, dropped, ai, hints, note | meist 1–3 Credits |
| privacy_policy_matchDatenschutzerklärung abgleichen | website_url, pages, policy_url, policy_text | – | website, pages, policy, not_in_policy, not_found, matched, categories, counts, dropped, ai, limits, legal, notes, check, note, checked_at | meist 1–3 Credits |
| social_card_checkSocial-Vorschau prüfen | url | – | language, url, counts, preview, findings, tags, images, snippet, guidance, limits, note | meist 1–2 Credits |
| image_performance_checkBilder prüfen | url | – | language, url, counts, total, formats, lcp, page_findings, summary, images, more_images, legend, limits, note, truncated | meist 1–2 Credits |
| ai_transparency_checkKI-Hinweise nach der KI-Verordnung | url, text, html | chatbot: auto | yes | nomedia: unknown | no | realistic | artistic | illustrativearticles: unknown | no | unreviewed | reviewedtarget: auto | en | de | pl | fr | es | it | nl | cs | sk | uk | bg | da | el | fi | hr | hu | lt | pt | ro | sl | sv | language, detected_language, source, answers, checklist, detected, notices, summary, counts, dropped, ai, legal, hints, note | meist 1–3 Credits |
| structured_data_checkStrukturierte Daten prüfen | url, html | – | language, url, input, counts, formats, findings, items, rules, visible, limits, truncated, note | meist 1–2 Credits |
| legal_notice_checkImpressum prüfen | url, text, html | ai: yes | nojurisdiction: auto | de | pl | jurisdiction, jurisdiction_auto, jurisdiction_basis, jurisdiction_label, source, entity, items, extra, counts, ai, dropped, legal_sources, language, notes, note, truncated | meist 1–3 Credits |
| glossary_builderGlossar erstellen | url, text, html, languages | source: auto | en | de | pl | fr | es | it | nl | cs | sk | uk | bg | da | el | fi | hr | hu | lt | pt | ro | sl | svmax_pages: 1 | 2 | 3 | 5 | 10 | language, language_name, language_source, targets, target_names, items, existing, counts, pages, reading, source, text_cut, dropped, glossary, hints, note, export | meist 1–3 Credits |
| local_business_checkBetriebsdaten prüfen | url, text | ai: no | yes | language, url, host, mode, country, table, findings, counts, structured, suggestion, handover, pages, failed, not_reached, limits, ai, dropped, notes, note | meist 1–2 Credits |
| consent_preload_checkLädt etwas vor der Einwilligung? | url | – | url, final_url, host, loaded, counts, timing, consent, groups, cookies, storage, notes, check, law, note, truncated, checked_at | meist 1–2 Credits |
| ai_literacy_policyKI-Kompetenz-Regel (AI Act Art. 4) | text, uses, roles, data, company_name | company_size: 1-9 | 10-49 | 50-249 | 250+sector: general | retail | services | crafts | health | finance | education | public_sector | media | it | manufacturing | tourism | socialreview_months: 12 | 6 | 24language: auto | en | de | pl | fr | es | it | nl | cs | sk | uk | bg | da | el | fi | hr | hu | lt | pt | ro | sl | sv | language, title, sections, training, record_columns, markdown, text, profile, counts, dropped, legal, hints, note | meist 1–2 Credits |
| withdrawal_button_checkWiderrufsbutton prüfen | url, text, html | ai: yes | nojurisdiction: auto | de | pl | eusubscriptions: auto | yes | no | jurisdiction, jurisdiction_auto, jurisdiction_basis, jurisdiction_label, law, source, subscription, items, candidates, counts, ai, dropped, legal_sources, language, notes, note, truncated | meist 1–3 Credits |
| product_safety_checkProduktseiten-Check (GPSR) | url, text, html | market_language: auto | bg | cs | da | de | el | en | es | fi | fr | hr | hu | it | lt | nl | pl | pt | ro | sk | sl | sv | language, market_language, market_language_label, market_basis, page_language, source, product, manufacturer_seat, items, counts, dropped, ai, hints, notes, legal, legal_sources, note | meist 1–3 Credits |
| website_checkWebsite-Check | url | scope: short | full | score, categories, findings, counts, snippet, llms_txt, summary, actions, note | fest 5 Credits je Auftrag |
| translateÜbersetzen | text | target: en | de | pl | fr | es | it | nl | cs | sk | uk | bg | da | el | fi | hr | hu | lt | pt | ro | sl | sv | translation, notes, review_status, alignment | meist 1–4 Credits |
| proofreadKorrektorat | text | text_language: auto | en | de | pl | fr | es | it | pt | nl | cs | sk | uk | ru | bg | ro | hu | sv | da | fi | tr | el | ar | fa | he | hi | zh | ja | ko | th | text, html, language, identical, summary, counts, changed_share, changes, notes, beta, note | meist 1–4 Credits |
| translate_fileSprachdateien übersetzen | text | target: en | de | pl | fr | es | it | nl | cs | sk | uk | bg | da | el | fi | hr | hu | lt | pt | ro | sl | svscope: auto | all | missingline_endings: lf | crlf | lf_no_final_newline | crlf_no_final_newline | format, target, filename, mime, file, entries, counts, flagged, preview, check, notes, note | meist 5–8 Credits |
Status eines Auftrags
queued und running: läuft noch (position und wait_seconds helfen beim Warten). done: result enthält die Felder des Werkzeugs. failed: Es wurde nichts berechnet (credits ist 0); error.code nennt den Grund: address_blocked (Do4U öffnet diese Adresse nicht, zum Beispiel eine private oder interne; schick stattdessen Text oder HTML), input_too_large (Eingabe kürzen), image_unavailable oder job_failed. expired: Das Ergebnis ist nicht mehr gespeichert.
Webhooks
Gib bei POST /api/v1/jobs "callback_url" mit, dann schickt Do4U einen signierten POST (Ereignis job.finished mit Status, Credits und dem Link auf das Ergebnis - nicht das Ergebnis selbst), sobald der Auftrag fertig ist. Nur öffentliche Adressen auf Port 80 oder 443; wir versuchen es bis zu 6-mal mit wachsenden Pausen.
Beispiel: Auftrag mit callback_url anlegen – und die Anfrage, die Do4U an diese Adresse schickt, sobald der Auftrag fertig ist:
curl -X POST https://do4u.eu/api/v1/jobs \
-H "Authorization: Bearer d4u_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"tool": "summarize", "text": "...", "callback_url": "https://example.com/do4u-hook"}'
POST /do4u-hook
Content-Type: application/json
X-Do4U-Event: job.finished
X-Do4U-Signature: t=1793180000,v1=6b1f...
{"event":"job.finished","id":"8f1c0b6a...","tool":"summarize","status":"done","credits":1,
"created":"2026-10-28T10:00:00+01:00","finished":"2026-10-28T10:00:04+01:00","result_url":"https://do4u.eu/api/v1/jobs/8f1c0b6a..."} Prüfe die Kopfzeile X-Do4U-Signature: t=<zeit>,v1=<hex>, mit v1 = HMAC-SHA256(Geheimnis, "<zeit>.<roher Rumpf>"). Weise alte Zeiten ab (z. B. älter als 5 Minuten). Dein Geheimnis beginnt mit whsec_ und steht auf der Seite API-Schlüssel.
// Node.js: rawBody = the request body exactly as received (string)
const crypto = require('crypto');
function do4uSignatureOk(rawBody, header, secret) {
const t = (header.match(/t=(\d+)/) || [])[1];
const v1 = (header.match(/v1=([0-9a-f]{64})/) || [])[1];
if (!t || !v1 || Math.abs(Date.now() / 1000 - Number(t)) > 300) return false;
const expected = crypto.createHmac('sha256', secret).update(t + '.' + rawBody).digest('hex');
return crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(v1));
}
// PHP
function do4u_signature_ok(string $raw, string $header, string $secret): bool {
if (!preg_match('/t=(\d+),v1=([0-9a-f]{64})/', $header, $m) || abs(time() - (int)$m[1]) > 300) return false;
return hash_equals(hash_hmac('sha256', $m[1] . '.' . $raw, $secret), $m[2]);
}
$ok = do4u_signature_ok(file_get_contents('php://input'), $_SERVER['HTTP_X_DO4U_SIGNATURE'] ?? '', 'whsec_YOUR_SECRET'); credits.low
Fällt das Guthaben eines Kontos unter die Schwelle, schickt Do4U einmal einen signierten POST an die Webhook-Adresse des Kontos. Das Ereignis enthält keine personenbezogenen Daten, nur Guthaben, Schwelle und Zeitpunkt (UTC). Das nächste kommt erst, wenn wieder Credits dazugekommen sind (Kauf, Free-Credits des Monats oder Gutschein). Signatur und Geheimnis sind dieselben wie bei job.finished.
POST /do4u-hook
Content-Type: application/json
X-Do4U-Event: credits.low
X-Do4U-Signature: t=1793180000,v1=6b1f...
{"event":"credits.low","balance":18,"threshold":20,"ts":"2026-10-29T10:00:04Z"} Adresse und Schwelle stellst du hier ein: API-Schlüssel
n8n
Fertiger Workflow: Ein Webhook nimmt den Aufruf von Do4U an, prüft die Signatur, holt das Ergebnis ab und gibt es an deinen nächsten Schritt weiter.
Vorlage für n8n herunterladen (JSON)
Vorlage, noch nicht in einer echten n8n- bzw. Make-Instanz getestet – bitte teste die Signaturprüfung vor dem Einsatz.
In n8n: Workflows → Import from file. Dann im Knoten „Check signature" dein Geheimnis und in „Do4U: get result" deinen API-Schlüssel eintragen, den Workflow aktivieren und die Production-URL des Webhooks als callback_url nutzen. Selbst betriebenes n8n braucht für die Signaturprüfung die Umgebungsvariable NODE_FUNCTION_ALLOW_BUILTIN=crypto.
Make
- Nimm das Modul Webhooks → Custom webhook als Auslöser und schalte in seinen erweiterten Einstellungen „JSON pass-through" und „Get request headers" ein.
- Nutze die Adresse dieses Webhooks als callback_url.
- Prüfe die Signatur: Vergleiche v1 aus der Kopfzeile X-Do4U-Signature mit sha256(t + "." + roher Rumpf; hex; dein Geheimnis).
- Füge HTTP → Make a request hinzu: GET auf result_url mit der Kopfzeile Authorization: Bearer <dein API-Schlüssel>.
- Nutze das Feld result in deinen nächsten Modulen.
Vorlage, noch nicht in einer echten n8n- bzw. Make-Instanz getestet – bitte teste die Signaturprüfung vor dem Einsatz.
Rezepte: Werkzeuge verketten
Ein Rezept führt 2 bis 4 Werkzeuge nacheinander als einen Auftrag aus. Sende „recipe“ statt „tool“: entweder den Namen eines fertigen Rezepts oder eine Liste von Schritten. Der Text geht in den ersten Schritt; das Ergebnis jedes Schritts ist der Text für den nächsten. GET /api/v1/recipes listet die fertigen Rezepte, die nutzbaren Werkzeuge und das Feld, das jedes Werkzeug weitergibt.
curl -X POST https://do4u.eu/api/v1/jobs \
-H "Authorization: Bearer d4u_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"recipe": [{"tool": "summarize", "options": {"length": "short"}},
{"tool": "translate", "options": {"target": "pl"}}], "text": "..."}'
curl -X POST https://do4u.eu/api/v1/jobs \
-H "Authorization: Bearer d4u_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"recipe": "summary_translate_meta", "options": {"target": "pl"}, "text": "..."}' Du bekommst eine Schätzung für alle Schritte (credits_estimate). Dieser Betrag wird zu Beginn reserviert. Nach jedem Schritt wird der echte Verbrauch gebucht, der Rest bleibt bis zum Ende reserviert und wird dann freigegeben. Ein fehlgeschlagener Schritt kostet nichts, die übrigen Schritte entfallen, und schon fertige Schritte werden berechnet.
HTTP/1.1 202 Accepted
{"id": "3c9e0d1a...", "tool": "recipe", "recipe": null, "status": "queued", "model": "do4u-standard", "credits_estimate": 4,
"steps": [{"n": 1, "tool": "summarize", "credits_estimate": 2}, {"n": 2, "tool": "translate", "credits_estimate": 2}],
"links": {"self": "https://do4u.eu/api/v1/jobs/3c9e0d1a..."}} GET /api/v1/jobs/{id} zeigt jeden Schritt mit Status (pending, queued, running, done, failed, skipped), seinen Credits, dem Hinweis input_shortened, wenn der Text für das nächste Werkzeug gekürzt werden musste, und dem Ergebnis jedes Schritts, sobald das Rezept zu Ende ist. Mit no_store werden die Ergebnisse einmal gezeigt. callback_url wird genau einmal ausgelöst, am Ende des Rezepts.
GET https://do4u.eu/api/v1/jobs/3c9e0d1a...
{"id": "3c9e0d1a...", "tool": "recipe", "status": "done", "credits_estimate": 4, "credits": 3, "steps_total": 2,
"steps": [{"n": 1, "tool": "summarize", "status": "done", "credits": 1, "result": {"summary": "...", "key_points": ["..."]}},
{"n": 2, "tool": "translate", "status": "done", "credits": 2, "notices": ["input_shortened"], "result": {"translation": "...", "notes": []}}],
"result": {"translation": "...", "notes": []}} GET https://do4u.eu/api/v1/recipes
Fehler
Fehler haben immer dieselbe Form: {"error": {"code": "...", "message": "..."}}. Bei 429 und 503 sagt der Kopf Retry-After, wie viele Sekunden du warten sollst.
| Code | HTTP | Bedeutung |
|---|---|---|
| missing_key | 401 | Kein API-Schlüssel mitgeschickt. |
| invalid_key | 401 | Schlüssel unbekannt oder widerrufen. |
| rate_limited | 429 | Zu viele Anfragen in dieser Minute. |
| invalid_json | 400 | Der Inhalt ist kein JSON-Objekt. |
| unknown_tool | 400 | Kein Werkzeug mit diesem Namen. |
| invalid_option | 400 | Unbekannte Option oder unbekannter Wert. |
| invalid_field | 400 | Ein Feld hat den falschen Typ. |
| invalid_language | 400 | language ist nicht en, de oder pl. |
| empty_input | 400 | Kein Text und keine URL. |
| text_b_required | 400 | compare braucht text und text_b. |
| input_too_long | 400 | Eingabe länger als deine Grenze. |
| input_too_large | 400 | Eingabe zu groß für einen Auftrag: kürzen oder auf mehrere Aufträge aufteilen. |
| invalid_url | 400 | URL nicht erlaubt oder nicht lesbar. |
| invalid_image | 400 | Bild fehlt, falsches Format oder zu groß. |
| payload_too_large | 413 | Anfrage größer als 8 MB. |
| insufficient_credits | 402 | Nicht genug Credits. |
| email_not_verified | 402 | Bestätige zuerst deine E-Mail-Adresse. |
| daily_limit | 429 | Kostenloses Tageskontingent aufgebraucht (website_check, scope short). |
| too_many_open_jobs | 429 | Zu viele offene Aufträge in deinem Konto. |
| package_required | 403 | Das Werkzeug braucht ein gekauftes Paket. |
| busy | 503 | Die Warteschlange ist voll, versuch es gleich noch einmal. |
| tool_unavailable | 503 | Das Werkzeug ist gerade nicht verfügbar. |
| not_found | 404 | Unbekannter Endpunkt oder Auftrag. |
| method_not_allowed | 405 | Falsche HTTP-Methode. |
| internal_error | 500 | Fehler auf unserer Seite. |
| invalid_idempotency_key | 400 | Idempotency-Key ist leer, zu lang oder hat Zeichen, die kein druckbares ASCII sind. |
| idempotency_conflict | 422 | Dieser Idempotency-Key wurde schon mit einer anderen Anfrage verwendet. |
| idempotency_in_progress | 409 | Eine Anfrage mit diesem Idempotency-Key läuft noch. Warte kurz (Retry-After). |
| idempotency_unavailable | 503 | Idempotency-Key ist gerade nicht nutzbar. Versuch es später noch einmal. |
| same_language | 400 | Der Text ist schon in der Zielsprache (Übersetzungswerkzeuge). Mit allow_same_language: true wird trotzdem übersetzt. |
Grenzen
- 60 Anfragen pro Minute je Schlüssel und 120 je Konto.
- Gleichzeitig offene Aufträge je Konto: Free 3, Starter 3, Standard 5, Pro 10, Website und API zusammen.
- Eingabe: Free 8.000 Zeichen, bezahlte Pakete 30.000. Niedrigere Grenzen je Werkzeug: compare 20.000, alt_text 1.000, translate 12.000 (compare: beide Texte zusammen).
- API-Schlüssel: Free 1, Starter 1, Standard 5, Pro 10.
Credits
Ein neuer Auftrag zeigt eine Schätzung (credits_estimate); berechnet wird der tatsächliche Verbrauch (credits). Fehlgeschlagene Aufträge kosten nichts. Gratis-Credits werden zuerst verbraucht.
Daten
Eingaben und Ergebnisse speichern wir 7 Tage (Free) bzw. 30 Tage (bezahlte Pakete), danach werden sie gelöscht. Bilder löschen wir direkt nach der Verarbeitung. Die Ergebnisse sind KI-generiert: Bitte prüf sie, bevor du sie verwendest.
E-Mails beantworten, ohne das Postfach zu wechseln
Do4U betreibt kein Postfach und speichert nie Zugangsdaten zu deinem Postfach. Zwei Wege, trotzdem Antwortentwürfe zu bekommen:
S1 – Vorlage für n8n oder Make
- Auslöser: neue E-Mail in deinem Postfach (IMAP-Auslöser in n8n oder Make – die Zugangsdaten bleiben dort)
- POST /api/v1/jobs mit tool support_reply, dem Text der E-Mail und no_store: true
- Ein paar Sekunden warten und GET /api/v1/jobs/{id} abfragen, bis der Status done ist
- Im Postfach einen Entwurf mit dem Text aus result.reply anlegen (Gmail- oder Outlook-Modul)
n8n-Vorlage herunterladen (JSON)
In Make baust du dasselbe Szenario aus den Modulen E-Mail (E-Mails beobachten), HTTP (Anfrage senden), Sleep und Gmail oder Outlook (Entwurf anlegen).
Dev-Erweiterungen und Shop-Plugins
ZIP entpacken und die beiliegende Anleitung lesen. Browser-Erweiterung lokal laden; Shop-Plugins zuerst im Testshop prüfen. Ein eigener Dev-API-Schlüssel ist erforderlich. Shopware bietet zunächst eine CLI.