API documentation
With the Do4U API you use the same tools as on the website from your own software: summarise, compare, support replies, alt texts, rewrite and translate. Every request is processed on our own servers in Poland, EU.
Base URL: https://do4u.eu/api/v1
OpenAPI 3.1 description (JSON) – Machine-readable description of this API for code generators and tools such as Postman or Insomnia. No key needed.
Authentication
Create a key under API keys in your account. Send it with every request in the header Authorization: Bearer <key> (or X-API-Key: <key>). Keep the key secret and never put it into a web page. You can revoke a key at any time.
How it works
Jobs run asynchronously. You create a job and get its id at once (HTTP 202). Then you fetch the job until its status is done or failed. Ask every 2 to 5 seconds; most jobs take a few seconds.
Endpoints
| GET | /tools | Tools, options and your input limits |
| GET | /balance | Your credit balance |
| POST | /jobs | Create a job (JSON, or multipart/form-data with an image file) |
| GET | /jobs/{id} | Status and result of a job |
| DELETE | /key | Revoke the key you send with this request, for example when an integration is disconnected. Jobs already created still finish. |
| POST | /key/revoke | The same as DELETE /key, for clients that can only send GET and POST. |
Example
Create a job, then fetch the result:
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
Request fields for POST /jobs
| tool | Name of the tool, see the table below. Required. |
| text | Input text. For compare: text A. For alt_text: optional page context. |
| text_b | Text B (compare only). |
| url | Public web page to read instead of text (summarize, accessibility_check). |
| html | HTML of a page to check (accessibility_check), up to 300,000 characters. |
| focus_keyword | Optional focus keyword for seo_meta. Without target, seo_meta writes in language. |
| faq | Optional FAQ snippets (support_reply only). |
| questions | Optional for seo_meta, content_brief and faq_schema: frequent visitor questions as a list of texts or {"text": ..., "count": n} (up to 50, at most 20 are used). faq_schema answers them first if the source answers them; visitor_questions in the result says what happened to each. |
| image | Image for alt_text: file field in multipart/form-data, or base64 / data URI in JSON. JPG, PNG, WebP or GIF, up to 5 MB. |
| image_url | Optional for alt_text instead of image: public address of the image (http or https; JPEG, PNG, WebP or GIF; at most 5 MB). Do4U loads it once in the background. If that fails, the job fails with error image_unavailable and costs nothing. |
| options | Object with options of the tool, for example {"length": "short"}. |
| language | Language of the result and notes: en, de or pl. Default en. For translate, the target language is the option target. |
| no_store | true: the input is deleted right after processing and the result after the first retrieval. |
| brand_voice | Optional: false switches your brand voice off for this job (default: the brand voice applies if you have set one). |
| ai_label | Optional: true shows the visible note "Marked as AI-generated" with the result in the web interface, false hides it. Default: the setting in your account. The machine-readable AI label is always in the result and cannot be switched off: the fields ai_generated and generator, an HTML comment in HTML results, ai_notice for image descriptions. ai_generated is false if the result comes from automatic checks only. |
| callback_url | Optional: public https address that gets a signed POST when the job is finished (see Webhooks). |
| render_js | Optional: true loads the page with JavaScript first (pages that build their content in the browser; tools that read a url). Costs the render surcharge only if the page was really loaded this way; the result field render says what happened. |
| no_cache | Optional: true always starts a new AI job. Without it, a finished and still stored result of your account (or workspace) with the same tool, options and input is reused: the job is done at once, from_history is true and it costs 0 % of the credits of the original. Never with no_store, never for a url. |
| allow_same_language | Optional for translate, translate_html and translate_file: true translates even if the text already is in the target language. Without it such a job is rejected with same_language (400) – only when the check is sure. |
Repeat requests safely (Idempotency-Key)
Send the header Idempotency-Key with POST /jobs, for example a random UUID for each job (1 to 255 printable ASCII characters). If the connection breaks and you send the same request again with the same Idempotency-Key and the same API key within 24 hours, you get the same answer again: the same job, no second job and no second charge. The answer then has the header Idempotent-Replayed: true. Use a new key for every new job. If you send the same key with a different request, you get 422 idempotency_conflict. Errors are not stored: after an error you can send the request again with the same key.
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": "..."}'
Tools and options
| Tool | Inputs | Options (first value is the default) | Result fields | Price |
|---|---|---|---|---|
| moderate_commentReacties controleren op spam | text | – | classification, reason, suggestion, action, note | meestal 1–3 credits |
| document_htmlDocumenten omzetten naar HTML | 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 | meestal 2–3 credits |
| image_textTekst in afbeeldingen vinden | 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 | meestal 2–3 credits |
| pdf_accessibilityPDF-toegankelijkheid controleren | – | checks, pages, truncated, repaired, note, convert_url | meestal 1–2 credits | |
| summarizeSamenvatten | text, url | length: medium | short | long | summary, key_points | meestal 1–3 credits |
| compareVergelijken | text, text_b | focus: overall | facts | tone | seo | summary, similarities, differences | meestal 1–3 credits |
| support_replyAntwoord op support | text, faq | tone: friendly | neutral | formal | reply, concerns, questions | meestal 1–3 credits |
| alt_textAlt-teksten | 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 | meestal 2–3 credits |
| rewriteHerschrijven | 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 | meestal 1–4 credits |
| accessibility_checkToegankelijkheidscontrole | url, html | – | summary, page, counts, findings, checks, readability, note | fixed 3 credits per task |
| seo_metaSEO-titel & beschrijving | 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 | fixed 1 credit per task |
| translate_htmlHTML vertalen | 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 | meestal 1–4 credits |
| product_descriptionProductbeschrijvingen | 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 | meestal 1–3 credits |
| headlinesKoppen en onderwerpregels | 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 | fixed 1 credit per task |
| faq_schemaFAQ en 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 | fixed 2 credits per task |
| 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 | meestal 1–2 credits |
| review_replyAntwoorden op reviews | 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 | meestal 1–2 credits |
| social_postsSociale berichten van een 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 | meestal 1–3 credits |
| explain_termsTermen uitleggen | 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 | meestal 1–3 credits |
| extract_dataGegevens extraheren | 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 | meestal 1–3 credits |
| redirect_planRedirect-plan | 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 | meestal 1–3 credits |
| contrast_checkKleurcontrastcontrole | colors | level: aa | aaatext_size: normal | large | colors, pairs, counts, invalid, settings, palette_check, legend, language, note | meestal 1–2 credits |
| language_levelTaalniveau (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 | meestal 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 | meestal 1–3 credits |
| internal_linksInterne links | text, pages, sitemap_url, page_url | – | links, text, text_is_html, counts, pages, dropped, ai, limits, language, detected_language, timeout, notes, note | meestal 1–3 credits |
| outdated_contentVerouderde inhoud | 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 | meestal 1–3 credits |
| inclusive_languageInclusieve en eenvoudige taal | 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 | meestal 1–3 credits |
| review_analysisAnalyse van beoordelingen | 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 | meestal 1–3 credits |
| ai_visibility_checkAI-zichtbaarheidstest | 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 | meestal 1–3 credits |
| events_calendarEvenementen naar agenda | 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 | meestal 1–3 credits |
| product_photoProductfoto naar tekst | 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 | meestal 2–3 credits |
| chart_descriptionBeschrijf grafieken en infographics | 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 | meestal 2–3 credits |
| design_feedbackDesignfeedback van een 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 | meestal 2–3 credits |
| job_ad_checkVacaturecontrole | 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 | meestal 1–3 credits |
| green_claims_checkCheck op groene claims | 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 | meestal 1–3 credits |
| third_party_scanCheck van derden | url, html | – | url, host, page_from, static_only, counts, consent, groups, cookies, legend, notes, check, note, truncated, checked_at | meestal 1–2 credits |
| broken_link_checkBroken link check | 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 | meestal 1–2 credits |
| duplicate_content_checkControle op duplicaten | url, text | – | language, mode, url, host, summary, counts, findings, passed, hints, thresholds, pages, limits, note, truncated | meestal 1–2 credits |
| hreflang_checkhreflang check | url | – | language, url, counts, findings, pages, matrix, annotations, legend, limits, note | meestal 1–2 credits |
| ai_robots_txtAI-crawlers in 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 | meestal 1–2 credits |
| faq_from_supportFAQ uit supportberichten | 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 | meestal 1–3 credits |
| price_display_checkControle prijsweergave | 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 | meestal 1–3 credits |
| form_text_checkFormulierteksten | 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 | meestal 1–3 credits |
| newsletter_checkNieuwsbrief-check | 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 | meestal 1–3 credits |
| privacy_policy_matchControle privacyverklaring | 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 | meestal 1–3 credits |
| social_card_checkSocial card controle | url | – | language, url, counts, preview, findings, tags, images, snippet, guidance, limits, note | meestal 1–2 credits |
| image_performance_checkAfbeeldingcontrole | url | – | language, url, counts, total, formats, lcp, page_findings, summary, images, more_images, legend, limits, note, truncated | meestal 1–2 credits |
| ai_transparency_checkAI-transparantiecontrole | 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 | meestal 1–3 credits |
| structured_data_checkCheck van gestructureerde gegevens | url, html | – | language, url, input, counts, formats, findings, items, rules, visible, limits, truncated, note | meestal 1–2 credits |
| legal_notice_checkControleer juridische mededeling | 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 | meestal 1–3 credits |
| glossary_builderGlossarium maken | 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 | meestal 1–3 credits |
| local_business_checkBedrijfsgegevens controleren | 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 | meestal 1–2 credits |
| consent_preload_checkLaadt voordat toestemming? | url | – | url, final_url, host, loaded, counts, timing, consent, groups, cookies, storage, notes, check, law, note, truncated, checked_at | meestal 1–2 credits |
| ai_literacy_policyBeleid voor AI-geletterdheid (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 | meestal 1–2 credits |
| withdrawal_button_checkControle knop voor intrekking | 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 | meestal 1–3 credits |
| product_safety_checkControle van productpagina (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 | meestal 1–3 credits |
| website_checkWebsite check | url | scope: short | full | score, categories, findings, counts, snippet, llms_txt, summary, actions, note | fixed 5 credits per task |
| translateVertalen | 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 | meestal 1–4 credits |
| proofreadCorrectie | 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 | meestal 1–4 credits |
| translate_fileTaalbestanden | 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 | meestal 5–8 credits |
Job status
queued and running: still working (position and wait_seconds help you to wait). done: result contains the fields of the tool. failed: nothing was charged (credits is 0); error.code names the reason: address_blocked (Do4U does not open this address, for example a private or internal one; send the text or HTML instead), input_too_large (shorten the input), image_unavailable or job_failed. expired: the result is no longer stored.
Webhooks
Voeg "callback_url" toe aan POST /api/v1/jobs, en Do4U stuurt een ondertekende POST (event job.finished met status, credits en de link naar het resultaat - niet het resultaat zelf) zodra de taak is voltooid. Alleen publieke adressen op poort 80 of 443; we proberen het tot 6 keer met toenemende tussenpozen.
Voorbeeld: maak een job aan met callback_url – en de aanvraag Do4U wordt naar dat adres gestuurd wanneer de job is voltooid:
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..."} Controleer de header X-Do4U-Signature: t=<time>,v1=<hex>, waarbij v1 = HMAC-SHA256(secret, "<time>.<raw body>"). Weiger oude tijdstempels (bijv. ouder dan 5 minuten). Je geheim begint met whsec_ en wordt getoond op de pagina API-sleutels.
// 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
Wanneer het credittegoed van een account onder de drempelwaarde daalt, stuurt Do4U één ondertekende POST naar het webhook-adres van het account. De gebeurtenis bevat geen persoonlijke gegevens, alleen het saldo, de drempelwaarde en de tijd (UTC). De volgende volgt pas nadat er weer credits zijn toegevoegd (aankoop, maandelijkse gratis credits of voucher). Handtekening en geheim zijn hetzelfde als voor 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"} Je stelt het adres en de drempelwaarde hier in: API-sleutels
n8n
Kant-en-klaar workflow: een webhook ontvangt de oproep van Do4U, controleert de handtekening, haalt het resultaat op en geeft het door aan je volgende stap.
Download het n8n-sjabloon (JSON)
Sjabloon, nog niet getest in een echte n8n- of Make-instantie – test de handtekeningcontrole voordat je deze gebruikt.
In n8n: Workflows → Importeren uit bestand. Voer vervolgens je geheim in in de node "Check signature" en je API-sleutel in "Do4U: get result", activeer de workflow en gebruik de productie-URL van de webhook als callback_url. Zelf-gehoste n8n heeft de omgevingsvariabele NODE_FUNCTION_ALLOW_BUILTIN=crypto nodig voor de handtekeningcontrole.
Make
- Voeg de module Webhooks → Custom webhook toe als trigger en zet "JSON pass-through" en "Get request headers" aan in de geavanceerde instellingen.
- Gebruik het adres van deze webhook als callback_url.
- Controleer de handtekening: vergelijk v1 uit de header X-Do4U-Signature met sha256(t + "." + ruwe body; hex; je geheim).
- Voeg HTTP → Make a request toe: GET op result_url met de header Authorization: Bearer <your API key>.
- Gebruik het veld result in je volgende modules.
Sjabloon, nog niet getest in een echte n8n- of Make-instantie – test de handtekeningcontrole voordat je deze gebruikt.
Recepten: keten van tools
Een recept voert 2 tot 4 tools na elkaar uit als één taak. Stuur "recipe" in plaats van "tool": ofwel de naam van een kant-en-klaar recept of een lijst met stappen. De tekst gaat naar de eerste stap; het resultaat van elke stap is de tekst voor de volgende stap. GET /api/v1/recipes toont de kant-en-klare recepten, de tools die je kunt gebruiken en het veld dat elke tool doorgeeft.
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": "..."}' Je krijgt één schatting voor alle stappen (credits_estimate). Dat bedrag wordt aan het begin gereserveerd. Na elke stap wordt het werkelijke verbruik geboekt en het restant blijft gereserveerd tot het einde, waarna het wordt vrijgegeven. Een mislukte stap kost niets, de resterende stappen worden overgeslagen en stappen die al voltooid waren worden in rekening gebracht.
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} toont elke stap met de status (pending, queued, running, done, failed, skipped), de credits, een melding input_shortened als de tekst ingekort moest worden voor de volgende tool, en het resultaat van elke stap zodra het recept is afgelopen. Met no_store worden de resultaten eenmalig getoond. callback_url wordt één keer uitgevoerd, aan het einde van het recept.
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
Errors
Errors always have the same form: {"error": {"code": "...", "message": "..."}}. With 429 and 503 the header Retry-After says how many seconds to wait.
| Code | HTTP | Meaning |
|---|---|---|
| missing_key | 401 | No API key sent. |
| invalid_key | 401 | Key unknown or revoked. |
| rate_limited | 429 | Too many requests in this minute. |
| invalid_json | 400 | Body is not a JSON object. |
| unknown_tool | 400 | No tool with this name. |
| invalid_option | 400 | Unknown option or value. |
| invalid_field | 400 | A field has the wrong type. |
| invalid_language | 400 | language is not en, de or pl. |
| empty_input | 400 | No text or URL. |
| text_b_required | 400 | compare needs text and text_b. |
| input_too_long | 400 | Input longer than your limit. |
| input_too_large | 400 | Input too large for one job: shorten it or split it into several jobs. |
| invalid_url | 400 | URL not allowed or not readable. |
| invalid_image | 400 | Image missing, wrong format or too large. |
| payload_too_large | 413 | Request body larger than 8 MB. |
| insufficient_credits | 402 | Not enough credits. |
| email_not_verified | 402 | Confirm your email address first. |
| daily_limit | 429 | Free daily limit used up (website_check scope short). |
| too_many_open_jobs | 429 | Too many open jobs in your account. |
| package_required | 403 | The tool needs a purchased package. |
| busy | 503 | The queue is full, try again shortly. |
| tool_unavailable | 503 | The tool is not available right now. |
| not_found | 404 | Unknown endpoint or job. |
| method_not_allowed | 405 | Wrong HTTP method. |
| internal_error | 500 | Error on our side. |
| invalid_idempotency_key | 400 | Idempotency-Key is empty, too long or has characters that are not printable ASCII. |
| idempotency_conflict | 422 | This Idempotency-Key was already used with a different request. |
| idempotency_in_progress | 409 | A request with this Idempotency-Key is still running. Wait a moment (Retry-After). |
| idempotency_unavailable | 503 | Idempotency-Key cannot be used right now. Try again later. |
| same_language | 400 | The text already is in the target language (translate tools). Send allow_same_language: true to translate anyway. |
Limits
- 60 requests per minute per key and 120 per account.
- Open jobs at the same time per account: Free 3, Starter 3, Standard 5, Pro 10, for the website and the API together.
- Input: Free 8 000 characters, paid packages 30 000. Lower limits per tool: compare 20 000, alt_text 1 000, translate 12 000 (compare: both texts together).
- API keys: Free 1, Starter 1, Standard 5, Pro 10.
Credits
A new job shows an estimate (credits_estimate); charged is the actual use (credits). Failed jobs cost nothing. Free credits are used first.
Data
Inputs and results are stored for 7 days (Free) or 30 days (paid packages), then deleted. Images are deleted right after processing. Results are AI-generated: please check them before you use them.
Beantwoord e-mails zonder je inbox te wijzigen
Do4U beheert zelf geen inbox en sla nooit toegangsgegevens voor je mailbox op. Er zijn twee manieren om toch conceptantwoorden te krijgen:
S1 – Sjabloon voor n8n of Make
- Trigger: een nieuwe e-mail in je mailbox (IMAP-trigger in n8n of Make – de toegangsgegevens blijven daar)
- POST /api/v1/jobs met tool support_reply, de e-mailtekst en no_store: true
- Wacht een paar seconden en haal GET /api/v1/jobs/{id} op totdat de status 'done' is
- Maak een concept aan in je mailbox met de tekst van result.reply (Gmail of Outlook module)
Download het n8n-sjabloon (JSON)
Bouw in Make hetzelfde scenario met de modules Email (watch emails), HTTP (make a request), Sleep en Gmail of Outlook (create a draft).
Dev-extensies en shop-plugins
Pak het ZIP-bestand uit en lees de bijgevoegde handleiding. Installeer de browser-extensie lokaal; controleer shop-plugins eerst in een testshop. Je eigen Dev API-sleutel is vereist. Shopware biedt momenteel een CLI aan.