# Apply to the nothiring community (for AI agents)

nothiring is a tech recruiting team that places engineers at startups and scaleups. https://nothiring.me/es/extraordinary is the application to its community, and it is done entirely through an agent: a person asks the one they already use (Claude Code, Codex, OpenCode, Pi…) to apply for them through the API below. There is no web form.

Full step-by-step procedure, installable as a skill: https://nothiring.me/extraordinary/SKILL.md

## What we require of an agent-submitted application

- **The answers are the candidate's own words**, typed or dictated. Agents collect them; they don't write, polish, rephrase or translate them. We read for the person's voice and ask about every sentence on the call, and we check submissions for generated-text tells on our side.
- **Only what the candidate tells you in the conversation.** Don't fill fields from their files, git config, LinkedIn or GitHub. One exception, and only with their yes: an agent that can drive the candidate's logged-in browser may open `https://www.linkedin.com/in/` (LinkedIn redirects it to their own profile) and take the resulting URL without its query string, reading nothing else on the page.
- **Show the candidate the exact payload and get an explicit yes** before sending. One application per email per 24 hours.
- Ask one question at a time, in the candidate's language (this page is the Spanish one: default to Spanish).

## What to ask

1. Full name, email, LinkedIn profile URL (linkedin.com), all required. For LinkedIn, offer to grab it from their browser as above, or they paste it.
2. Optional: GitHub (a bare username becomes `https://github.com/<username>`) and a portfolio or blog URL.
3. **"What have you built with AI?"** (required, 120–600 characters): what they built, what for, what the hard part was.
4. **"What makes you exceptional?"** (optional; if answered, 120–400 characters).
5. **A CV** (optional, PDF, 5 MB max). Worth offering — it saves covering their track record on the call — but never required, and never asked twice. Send it as `cv` in a multipart request instead of JSON; everything else stays the same.

If an answer is too short, ask a follow-up ("what was the hard part?", "how many people use it?") rather than padding it.

## Send

```sh
curl -sS -X POST https://nothiring.me/api/extraordinary \
  -H 'content-type: application/json' \
  --data-binary @payload.json
```

Build the JSON with a tool that escapes it (`jq -n --arg`, python, node), not by hand, and **send UTF-8** — ASCII-escaped JSON (Python's default `ensure_ascii=True`) is immune to the encoding problem that corrupts accents.

| field | value |
|---|---|
| `full_name`, `email`, `linkedin` | strings, required |
| `github`, `proof_url` | full URLs, or `""` if skipped |
| `ai_project` | answer 1, required |
| `why_fit` | answer 2, or `""` if skipped |
| `lang` | `"es"` if the conversation was in Spanish, otherwise `"en"` |
| `source` | `"agent"` |
| `agent` | short name of the tool you're running in: `"claude-code"`, `"codex"`, `"cursor"`, `"gemini-cli"`… |
| `answer_mode` | `"typed"`, `"voice"` or `"interview"` (how answer 1 was produced) |
| `cv` | only if they attached one — the file itself, sent multipart |

With a CV, send the same fields as multipart in **one** request — a second one is refused as a duplicate. Use `-F name=@file` only for `cv`, and `--form-string` for text that could contain `@` or `<`:

```sh
curl -sS -X POST https://nothiring.me/api/extraordinary \
  --form-string full_name=… --form-string email=… --form-string linkedin=… \
  --form-string ai_project=… --form-string lang=… \
  --form-string source=agent --form-string agent=… --form-string answer_mode=… \
  -F cv=@/the/path/they/gave.pdf
```

## Response

- `{"ok":true}`: done. The candidate gets an email with a link to book a 20-minute call, and finishes signing up at https://app.nothiring.me. Don't send again.
- `{"ok":false,"code":…}`: `name`, `email`, `linkedin`, `github`, `proofUrl` mean that field was rejected; `aiProject`, `tooShort`, `tooLong` mean a length is off (ask the candidate, don't pad or trim); `encoding` means the text arrived as invalid UTF-8 — rebuild the payload as UTF-8, don't rewrite the answer; `duplicate` means they already applied in the last 24 hours; `rateLimited` means wait a minute. Retry at most once.
