Digital Identity, CV & Resume Creator
Create a free digital identity, professional resume and CV — from classic PDF and HTML layouts to 3D worlds and playable games. Permanent public URL with own...
Create a free digital identity, professional resume and CV — from classic PDF and HTML layouts to 3D worlds and playable games. Permanent public URL with own...
Real data. Real impact.
Emerging
Developers
Per week
Open source
Skills give you superpowers. Install in 30 seconds.
Create a resume, digital identity, or CV right now — for free. Choose from templates that span the full range: classic print-ready PDFs, clean HTML online CVs, interactive experiences, animated 3D worlds, and playable games. Every CV gets a permanent public URL with a personal slug — no signup, no payment needed for basic use. ATS-ready and Agent-Ready (HR).
| Feature | Access-ID needed | How |
|---|---|---|
| Create CV (online, permanent URL) | No | or |
| PDF Export | No | on any request |
| Human slug (URL) selection | No | HITL step 3 |
| Human template selection | No | HITL step 4 |
| Inline submit (no browser) | No | Bearer token on confirm/approval steps |
| Callback webhook | Yes | |
| Higher rate limits (50/day) | Yes | Register via |
| Custom templates | Yes | Template Create skill |
Templates span: classic PDF · HTML online · interactive · 3D (Three.js) · gamified. Full catalog: reference/templates.md — live previews: talent.de/de/cv-template-ideas
Throughout this skill, these terms are used consistently:
| Term | Meaning |
|---|---|
| requestor | The human who commissioned this CV build — the person providing data, making decisions (slug, template, approval), and receiving the claim token. All agent actions are on their behalf. |
| human | Synonym for requestor in HITL context, used to contrast with automated/AI steps (e.g., "if the human prefers the browser"). |
| agent | You — the AI executing this skill. |
HITL is required. You MUST include either
(human review) or"prefer_hitl": true(direct creation). Omitting both returns a 400 error. If a human is present, ALWAYS use"skip_hitl": true— this lets the requestor choose their URL slug, pick a template, review the data, and approve before publishing. Use"prefer_hitl": trueonly for automated pipelines with no human in the loop."skip_hitl": true
Data principle: Only use data the requestor has explicitly provided or approved in this conversation. Do not extract personal information from unrelated system contexts or other sessions.
Before sending: Present a brief summary to the requestor — name, title, email — and ask "Send it? Or should I change anything?"
Claim token: Treat like a password. Share only with the requestor — anyone with the token can claim CV ownership. Never share with third parties.
An Access-ID (
talent_agent_[a-z0-9]{4}) is optional for CV Builder — basic use (3 CVs/day per IP) works without one. Register for higher limits (50 CVs/day) and callback webhook support:
POST https://www.talent.de/api/agent/register Content-Type: application/json{ "agent_name": "my-agent" }
The Access-ID is also the HMAC secret for verifying
X-HITL-Signature on callback webhooks. Store in TALENT_ACCESS_ID — do not hardcode.
| Step | Say to the requestor |
|---|---|
| Before API call | "Let me set up your CV. I just need a few details." |
| Slug selection (review_url received) | "Choose your personal URL — this is where your CV will live: [link]" |
| Template selection | "Almost done! Pick a design for your CV: [link]" |
| Approval | "Your CV is ready for review. Take a look and approve it: [link]" |
| After final 201 | "Your CV is live! Here's your link: {url}" |
POST /api/agent/cv-simple with "prefer_hitl": true and the data
Optional: add "include_pdf": true to also receive a base64 PDF in the final 201 response. See PDF Export.review_url to the requestor (they pick slug, template, review data)poll_url every 30s until "status": "completed":
{ "status": "pending" } or { "status": "opened" } → keep polling{ "status": "completed", "result": { "action": "confirm", "data": {...} } } → advance with hitl_continue_case_idPOST https://www.talent.de/api/agent/cv-simple Content-Type: application/json{ "prefer_hitl": true, "cv_data": { "firstName": "Alex", "lastName": "Johnson", "title": "Software Engineer", "email": "alex@example.com", "experience": [{ "jobTitle": "Senior Developer", "company": "Acme Inc.", "startDate": "2022-01", "isCurrent": true }], "hardSkills": [{ "name": "React", "level": 4 }], "softSkills": [{ "name": "Team Leadership" }], "languages": [{ "name": "English", "level": "NATIVE" }] } }
Response (202 — human review required):
{ "status": "human_input_required", "message": "Please confirm: is this CV for you?", "hitl": { "case_id": "review_a7f3b2c8d9e1f0g4", "review_url": "https://www.talent.de/en/hitl/review/review_a7f3b2c8d9e1f0g4?token=abc123...", "poll_url": "https://www.talent.de/api/hitl/cases/review_a7f3b2c8d9e1f0g4/status", "type": "confirmation", "inline_actions": ["confirm", "cancel"], "timeout": "24h" } }
Present the review URL to the requestor:
I've prepared your CV. Please review and make your choices here: Review your CV You'll pick your personal URL slug, template design, and approve the final result.
Then poll
poll_url until completed, and continue through steps with hitl_continue_case_id. After all steps (confirmation, data review, slug selection, template selection, approval), the final POST returns 201 with the live URL.
Full HITL protocol with all steps, inline submit, edit cycles, and escalation: reference/hitl.md
The requestor goes through up to 5 review steps. The agent loops: present review URL, poll, continue.
Step 1: Confirmation → "For whom is this CV?" Step 2: Data Review → "Are these details correct?" Step 3: Slug → Human picks personal URL slug (e.g. pro, dev, 007) Step 4: Template → Human picks template design Step 5: Approval → Human reviews final CV draft
Each step returns 202. After the requestor decides, continue:
POST https://www.talent.de/api/agent/cv-simple Content-Type: application/json{ "prefer_hitl": true, "hitl_continue_case_id": "review_a7f3b2c8d9e1f0g4", "slug": "dev", "cv_data": { ... } }
Important:
andsluggo at the top level of the request, not insidetemplate_id. When continuing after slug selection, include the human's chosen slug at the top level so the server knows to advance to the template step.cv_data
Steps are skipped when you already provide the value:
slug (top-level) → slug selection step is skippedtemplate_id (top-level) → template selection step is skippedFor simple decisions (confirmation, escalation, approval), the 202 response includes
submit_url, submit_token, and inline_actions. Agents can submit directly via Bearer token — ideal for Telegram, Slack, WhatsApp where buttons are supported:
POST {submit_url} Authorization: Bearer {submit_token} Content-Type: application/json{ "action": "confirm", "data": {} }
Always present
as a fallback alongside any inline buttons. If the platform does not support buttons (SMS, email, plain text), or the human prefers the browser, they can use the link to complete their decision.review_url
Selection and input types always require the browser (
review_url) — they involve complex UI (template grid, data forms). Full inline spec: reference/hitl.md
After the final approval step, submit with
hitl_approved_case_id to publish:
POST https://www.talent.de/api/agent/cv-simple Content-Type: application/json{ "hitl_approved_case_id": "review_final_case_id" }
Response (201):
{ "success": true, "url": "https://www.talent.de/dev/alex-johnson", "cv_id": "cv_abc123", "claim_token": "claim_xyz789", "template_id": "007", "quality_score": 65, "quality_label": "good", "improvement_suggestions": [] }
⚠️ Immediately after receiving a 201 — always share both with the requestor:
- CV URL:
— their live profilehttps://www.talent.de/dev/alex-johnson- Claim link:
— to take ownership and edithttps://www.talent.de/claim/claim_xyz789The
is permanent and never expires. Treat it like a password — share only with the requestor.claim_token
Present the result:
Your CV is live: talent.de/dev/alex-johnson
To claim ownership and edit your CV, visit: talent.de/claim/claim_xyz789 Keep this link safe — it never expires and gives full edit access.
If the response includes
improvement_suggestions, share them with the requestor and offer to update the CV:
Your CV score is 35/100. To improve it, I can add: work experience (+25pts), professional summary (+20pts). Want me to ask you a few questions and update it?
Both paths — with and without human review — are shown below. Choose ONE per request.
flowchart TD START([Agent starts]) --> CHOICE{prefer_hitl\nor skip_hitl?}%% ── skip_hitl path ────────────────────────────────────────── CHOICE -->|skip_hitl: true| DIRECT["POST /api/agent/cv-simple\nskip_hitl: true + cv_data"] DIRECT --> D201["201 — CV live\nurl · claim_token · quality_score\nimprovement_suggestions"] D201 --> SHARE_NOW["Share url + claim_token\nwith requestor immediately!"] SHARE_NOW --> QUAL{improvement_suggestions\npresent AND attempt < 2?} QUAL -->|No / attempt >= 2| DONE_DIRECT([Done]) QUAL -->|Yes| ASK["Ask requestor the questions\nin each agent_action field"] ASK --> REPOST["POST /api/agent/cv-simple\nskip_hitl: true\nenriched cv_data\n(new cv_id each time)"] REPOST --> D201 %% ── prefer_hitl path ───────────────────────────────────────── CHOICE -->|prefer_hitl: true| HITL["POST /api/agent/cv-simple\nprefer_hitl: true + cv_data"] HITL --> H202["202 human_input_required\nreview_url · poll_url · events_url"] H202 --> SHOW_URL["Present review_url to requestor\n'Please review here: [link]'"] SHOW_URL --> POLL["Poll poll_url every 30s\n(or use events_url for SSE)"] POLL --> STATUS{status?} STATUS -->|pending / opened\n/ in_progress| POLL STATUS -->|completed| ACTION{result.action?} STATUS -->|expired| EXP{default_action?} STATUS -->|cancelled| CANCELLED([Inform requestor: cancelled]) EXP -->|skip| AUTO_PUB["CV auto-published\nurl from poll status"] EXP -->|abort| ABORTED([Inform requestor: expired]) ACTION -->|confirm / select| CONTINUE["POST cv-simple\nhitl_continue_case_id\n+ ALWAYS include cv_data"] ACTION -->|edit| EDIT["Adjust cv_data per note\nthen CONTINUE"] EDIT --> CONTINUE ACTION -->|reject| REJECT["Escalation step\nPOST hitl_continue_case_id"] REJECT --> H202 ACTION -->|approve| PUBLISH["POST cv-simple\nhitl_approved_case_id + cv_data"] CONTINUE --> H202 PUBLISH --> DONE_HITL(["201 — CV live\nShare url + claim_token"])
When a HITL case expires, the server applies the
default_action configured for that step:
skip: CV is auto-published with server-selected slug/template. Poll poll_url — it returns status: "completed" with url in the result.abort: Flow terminates. Inform the requestor the session expired. Start a new HITL flow with prefer_hitl: true if needed.After any 201 response the CV is immediately live. Always share
url and claim_token with the requestor first.
If
improvement_suggestions is non-empty, you may optionally run up to 2 improvement cycles:
agent_actioncv_data + skip_hitl: truecv_id — the previous one is abandonedimprovement_suggestions is empty: stopDo not loop indefinitely. An agent that keeps re-posting creates duplicate CVs and wastes the requestor's time.
For
prefer_hitl flows: after approval, the 201 is already quality-assessed (human reviewed the data). If suggestions appear, ask the requestor directly — do not restart the HITL flow.
For fully automated pipelines, batch operations, or when the requestor explicitly says "just create it" — set
"skip_hitl": true:
POST https://www.talent.de/api/agent/cv-simple Content-Type: application/json{ "skip_hitl": true, "cv_data": { "firstName": "Alex", "lastName": "Johnson", "title": "Software Engineer", "email": "alex@example.com" } }
Response (201):
{ "success": true, "url": "https://www.talent.de/pro/alex-johnson", "cv_id": "cv_abc123", "claim_token": "claim_xyz789", "template_id": "018", "hitl_skipped": true, "quality_score": 20, "quality_label": "basic", "improvement_suggestions": [ { "field": "experience", "issue": "No work experience — CV has low ATS compatibility", "agent_action": "Ask: 'What positions have you held? Part-time and internships count.'", "impact": "+25 quality points", "priority": "high" } ], "next_steps": "Share improvement_suggestions with the requestor and ask the questions in agent_action. Then update the CV via POST /api/agent/cv-simple...", "auto_fixes": [] }
In direct mode, the server auto-assigns slug (
pro by default) and template (018 Amber Horizon). The requestor has no choice. Use this only when no human needs to review.
You MUST choose one:
"prefer_hitl": true or "skip_hitl": true. Omitting both returns a 400 error.
All fields beyond the 4 required ones are optional. Omit what you don't have — don't send empty arrays.
Get a downloadable PDF alongside the CV. Three visual themes available:
| Theme | Style | Best for |
|---|---|---|
| Single-column, red accent (default) | Traditional industries |
| Two-column sidebar, blue accent | Tech & creative roles |
| Monochrome, generous whitespace | Executive & senior roles |
Add
"include_pdf": true to your request. The response includes a base64-encoded PDF:
POST https://www.talent.de/api/agent/cv-simple Content-Type: application/json{ "prefer_hitl": true, "include_pdf": true, "pdf_format": "A4", "pdf_theme": "modern", "cv_data": { "firstName": "Alex", "lastName": "Johnson", "title": "Software Engineer", "email": "alex@example.com" } }
Response includes a
pdf object:
{ "success": true, "url": "https://www.talent.de/pro/alex-johnson", "cv_id": "cv_abc123", "claim_token": "claim_xyz789", "pdf": { "base64": "JVBERi0xLjQK...", "size_bytes": 6559, "generation_ms": 226, "format": "A4" } }
POST https://www.talent.de/api/agent/cv/pdf Content-Type: application/json{ "cv_id": "cv_abc123", "format": "A4", "theme": "minimal" }
Returns the PDF binary directly (
Content-Type: application/pdf). Format options: A4 (default), LETTER. Theme options: classic (default), modern, minimal.
PDF generation takes ~200ms (no headless browser needed).
You do not need to check slug availability or validate data — the server handles it:
pro/thomas-mueller and pro/anna-schmidt can coexist. Only the combination of slug + firstName + lastName is reserved. That's why the server needs the name first to check availability.pro. If that slug is already in use for this person's name, it tries the next available slug automatically. In HITL mode, the human can choose their slug interactively. Popular picks (excerpt): 007 · 911 · dev · api · pro · gpt · web · ceo · cto · ops · f40 · gtr · amg · gt3 · zen · art · lol · neo · 404 · 777. Full list: GET /api/public/slugs018 (Amber Horizon) if omitted.2024 becomes 2024-01-01, 2024-03 becomes 2024-03-01.NATIVE, C2, C1, B2, B1, A2, A1).auto_fixes array tells you what the server adjusted (e.g. "Slug 'pro' is already in use for this name, using 'dev' instead").hardSkills — technical skills, optional level 1-5softSkills — name onlytoolSkills — name onlylanguages — with CEFR level: NATIVE, C2, C1, B2, B1, A2, A1Do not use a generic
skills array — it will be ignored.
| Wrong | Correct | Why |
|---|---|---|
| | Experience uses , not or |
/ | / | Wrong field names — / are silently ignored in experience and education |
| etc. | Generic array is ignored — use 4 separate arrays |
inside | at top level | and are request-level fields, not inside |
| | Dates must be or format |
Sending empty arrays | Omit the field entirely | Don't send empty arrays — omit what you don't have |
| POST /respond without Authorization header | Wait for via | Inline submit requires from the 202 response hitl object |
POST /respond on an type step | Poll until , then | Approval steps require browser review — inline submit not permitted |
without | Always include the full object | The server needs on every POST to build the next review step UI |
when a HITL chain is ongoing | Continue the chain with | Creates a separate CV and bypasses the human's review — share one chain per CV |
cv_dataNo automatic installation available. Please visit the source repository for installation instructions.
View Installation Instructions1,500+ AI skills, agents & workflows. Install in 30 seconds. Part of the Torly.ai family.
© 2026 Torly.ai. All rights reserved.