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_commentModérer les commentaires pour le spam | text | – | classification, reason, suggestion, action, note | généralement 1–3 crédits |
| document_htmlConvertir des documents en 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 | généralement 2–3 crédits |
| image_textExtraire le texte d'une image | 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 | généralement 2–3 crédits |
| pdf_accessibilityVérifier l'accessibilité du PDF | – | checks, pages, truncated, repaired, note, convert_url | généralement 1–2 crédits | |
| summarizeRésumer | text, url | length: medium | short | long | summary, key_points | généralement 1–3 crédits |
| compareComparer | text, text_b | focus: overall | facts | tone | seo | summary, similarities, differences | généralement 1–3 crédits |
| support_replyRéponse au support | text, faq | tone: friendly | neutral | formal | reply, concerns, questions | généralement 1–3 crédits |
| alt_textTextes alternatifs | 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 | généralement 2–3 crédits |
| rewriteRéécrire | 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 | généralement 1–4 crédits |
| accessibility_checkVérification d'accessibilité | url, html | – | summary, page, counts, findings, checks, readability, note | fixed 3 credits per task |
| seo_metaTitre SEO & description | 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_htmlTraduire l'HTML | 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 | généralement 1–4 crédits |
| product_descriptionDescriptions de produits | 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 | généralement 1–3 crédits |
| headlinesTitres et objets | 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 et balisage schema | 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_briefBriefing de contenu | 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 | généralement 1–2 crédits |
| review_replyRéponses aux avis | 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 | généralement 1–2 crédits |
| social_postsPosts sociaux à partir d'un article | 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 | généralement 1–3 crédits |
| explain_termsExpliquer des termes | 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 | généralement 1–3 crédits |
| extract_dataExtraire les données | 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 | généralement 1–3 crédits |
| redirect_planPlan de redirection | 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 | généralement 1–3 crédits |
| contrast_checkVérification du contraste des couleurs | colors | level: aa | aaatext_size: normal | large | colors, pairs, counts, invalid, settings, palette_check, legend, language, note | généralement 1–2 crédits |
| language_levelNiveau de langue (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 | généralement 1–4 crédits |
| llms_txtGénérateur llms.txt | 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 | généralement 1–3 crédits |
| internal_linksLiens internes | text, pages, sitemap_url, page_url | – | links, text, text_is_html, counts, pages, dropped, ai, limits, language, detected_language, timeout, notes, note | généralement 1–3 crédits |
| outdated_contentContenu obsolète | 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 | généralement 1–3 crédits |
| inclusive_languageLangage inclusif et simple | 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 | généralement 1–3 crédits |
| review_analysisAnalyse des avis | 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 | généralement 1–3 crédits |
| ai_visibility_checkVérification de la visibilité IA | 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 | généralement 1–3 crédits |
| events_calendarÉvénements vers calendrier | 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 | généralement 1–3 crédits |
| product_photoPhoto de produit vers texte | 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 | généralement 2–3 crédits |
| chart_descriptionDécrire des graphiques et des infographies | 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 | généralement 2–3 crédits |
| design_feedbackRetours de design à partir d'une capture d'écran | 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 | généralement 2–3 crédits |
| job_ad_checkVérification de l'annonce | 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 | généralement 1–3 crédits |
| green_claims_checkVérification des allégations environnementales | 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 | généralement 1–3 crédits |
| third_party_scanVérification des tiers | url, html | – | url, host, page_from, static_only, counts, consent, groups, cookies, legend, notes, check, note, truncated, checked_at | généralement 1–2 crédits |
| broken_link_checkVérification des liens morts | 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 | généralement 1–2 crédits |
| duplicate_content_checkVérification du contenu dupliqué | url, text | – | language, mode, url, host, summary, counts, findings, passed, hints, thresholds, pages, limits, note, truncated | généralement 1–2 crédits |
| hreflang_checkVérification hreflang | url | – | language, url, counts, findings, pages, matrix, annotations, legend, limits, note | généralement 1–2 crédits |
| ai_robots_txtCrawlers IA dans 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 | généralement 1–2 crédits |
| faq_from_supportFAQ issue des messages de support | 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 | généralement 1–3 crédits |
| price_display_checkVérification de l'affichage des prix | 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 | généralement 1–3 crédits |
| form_text_checkTextes de formulaire | 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 | généralement 1–3 crédits |
| newsletter_checkContrôle newsletter | 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 | généralement 1–3 crédits |
| privacy_policy_matchVérification de la politique de confidentialité | 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 | généralement 1–3 crédits |
| social_card_checkVérification Social Card | url | – | language, url, counts, preview, findings, tags, images, snippet, guidance, limits, note | généralement 1–2 crédits |
| image_performance_checkVérification d'image | url | – | language, url, counts, total, formats, lcp, page_findings, summary, images, more_images, legend, limits, note, truncated | généralement 1–2 crédits |
| ai_transparency_checkVérification de la transparence de l'IA | 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 | généralement 1–3 crédits |
| structured_data_checkVérification des données structurées | url, html | – | language, url, input, counts, formats, findings, items, rules, visible, limits, truncated, note | généralement 1–2 crédits |
| legal_notice_checkVérification des mentions légales | 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 | généralement 1–3 crédits |
| glossary_builderCréer un glossaire | 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 | généralement 1–3 crédits |
| local_business_checkVérification des données professionnelles | 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 | généralement 1–2 crédits |
| consent_preload_checkChargement avant le consentement ? | url | – | url, final_url, host, loaded, counts, timing, consent, groups, cookies, storage, notes, check, law, note, truncated, checked_at | généralement 1–2 crédits |
| ai_literacy_policyPolitique de culture de l'IA (Loi sur l'IA de l'UE, 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 | généralement 1–2 crédits |
| withdrawal_button_checkVérification du bouton de rétractation | 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 | généralement 1–3 crédits |
| product_safety_checkVérification de la page produit (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 | généralement 1–3 crédits |
| website_checkVérification de site web | url | scope: short | full | score, categories, findings, counts, snippet, llms_txt, summary, actions, note | fixed 5 credits per task |
| translateTraduire | 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 | généralement 1–4 crédits |
| proofreadRelecture | 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 | généralement 1–4 crédits |
| translate_fileFichiers de langue | 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 | généralement 5–8 crédits |
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
Ajoute « callback_url » à POST /api/v1/jobs, et Do4U enverra un POST signé (événement job.finished avec statut, crédits et lien de résultat – pas le résultat lui-même) dès que le job est terminé. Uniquement des adresses publiques sur le port 80 ou 443 ; nous réessayons jusqu'à 6 fois avec des pauses croissantes.
Exemple : crée un job avec callback_url – et la requête Do4U est envoyée à cette adresse quand le job est terminé :
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..."} Vérifie l'en-tête X-Do4U-Signature : t=<time>,v1=<hex>, où v1 = HMAC-SHA256(secret, "<time>.<raw body>"). Rejette les horodatages trop anciens (p. ex. plus de 5 minutes). Ton secret commence par whsec_ et s'affiche sur la page des clés API.
// 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
Lorsque le solde de crédits d'un compte descend en dessous du seuil, Do4U envoie un POST signé à l'adresse webhook du compte. L'événement ne contient aucune donnée personnelle, seulement le solde, le seuil et l'heure (UTC). Le suivant ne suit qu'après l'ajout de nouveaux crédits (achat, crédits gratuits mensuels ou bon). La signature et le secret sont les mêmes que pour 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"} Tu configures l'adresse et le seuil ici : Clés API
n8n
Workflow prêt à l'emploi : un webhook reçoit l'appel de Do4U, vérifie la signature, récupère le résultat et le transmet à ton étape suivante.
Télécharger le modèle n8n (JSON)
Modèle non encore testé dans une instance n8n ou Make réelle – merci de tester la vérification de la signature avant de l'utiliser.
Dans n8n : Workflows → Import from file. Ensuite, saisis ton secret dans le nœud "Check signature" et ta clé API dans "Do4U: get result", active le workflow et utilise l'URL de production du webhook comme callback_url. Un n8n auto-hébergé nécessite la variable d'environnement NODE_FUNCTION_ALLOW_BUILTIN=crypto pour la vérification de la signature.
Make
- Ajoute le module Webhooks → Custom webhook comme déclencheur et active "JSON pass-through" et "Get request headers" dans ses paramètres avancés.
- Utilise l'adresse de ce webhook comme callback_url.
- Vérifie la signature : compare v1 de l'en-tête X-Do4U-Signature avec sha256(t + "." + corps brut; hex; ton secret).
- Ajoute HTTP → Make a request : GET sur result_url avec l'en-tête Authorization: Bearer <your API key>.
- Utilise le champ result dans tes modules suivants.
Modèle non encore testé dans une instance n8n ou Make réelle – merci de tester la vérification de la signature avant de l'utiliser.
Recettes : outils en chaîne
Une recette exécute 2 à 4 outils l'un après l'autre comme un seul travail. Envoie "recipe" au lieu de "tool" : soit le nom d'une recette prête à l'emploi, soit une liste d'étapes. Le texte est envoyé à la première étape ; le résultat de chaque étape est le texte pour l'étape suivante. GET /api/v1/recipes liste les recettes prêtes à l'emploi, les outils que tu peux utiliser et le champ transmis par chaque outil.
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": "..."}' Tu reçois une estimation pour toutes les étapes (credits_estimate). Ce montant est réservé au début. Après chaque étape, l'utilisation réelle est débitée et le reste reste réservé jusqu'à la fin, puis il est libéré. Une étape échouée ne coûte rien, les étapes restantes sont ignorées, et les étapes déjà terminées sont facturées.
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} affiche chaque étape avec son statut (pending, queued, running, done, failed, skipped), ses crédits, une note input_shortened si le texte a dû être raccourci pour le prochain outil, et le résultat de chaque étape une fois la recette terminée. Avec no_store, les résultats ne sont affichés qu'une fois. callback_url est déclenché une fois, à la fin de la recette.
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.
Répondez aux e-mails sans changer de boîte de réception
Do4U ne gère pas de boîte de réception et ne stocke jamais les données d'accès à votre messagerie. Voici deux façons d'obtenir des brouillons de réponse :
S1 – Modèle pour n8n ou Make
- Déclencheur : un nouvel e-mail dans votre boîte de réception (déclencheur IMAP dans n8n ou Make – les données d'accès restent là)
- POST /api/v1/jobs avec l'outil support_reply, le texte de l'e-mail et no_store: true
- Attendez quelques secondes et récupérez GET /api/v1/jobs/{id} jusqu'à ce que le statut soit
Télécharger le modèle n8n (JSON)
Dans Make, construisez le même scénario à partir des modules Email (watch emails), HTTP (make a request), Sleep et Gmail ou Outlook (create a draft).
Extensions de dev et plugins de boutique
Extrais le ZIP et lis le guide inclus. Charge l'extension du navigateur localement ; vérifie d'abord les plugins de boutique dans une boutique de test. Ta propre clé API Dev est requise. Shopware propose actuellement une interface en ligne de commande (CLI).