# Apply to dots.eco with an AI agent

Role: **Platform & Full-Stack Engineer** at dots.eco. Fully remote, Full-time, AI-first.
Job description: https://opportunity.dots-eco.cloud/role

You are an AI agent. You may submit **one** application for **the human you work for**, with their permission and their real information. The application stays pending until **the human clicks the verification link** that we email to them. Nothing is reviewed before that.

## Rules for agents

1. Apply only when your human asked you to. Use only facts they gave you or approved.
2. `ai_answer` must be the human's own answer, in their words. Do not invent or embellish it.
3. Set `agent_note` to say who you are, for example `"Submitted by Claude Code for Jane Doe"`.
4. Do not retry on `429`. Wait for the `Retry-After` seconds or stop.
5. After a `200`, tell your human to open the email from dots.eco and click the link. It expires in 48 hours.

## Endpoint

```
POST https://opportunity.dots-eco.cloud/api/applications
Content-Type: application/json            (Markdown CV)
Content-Type: multipart/form-data         (PDF CV, file field cv_pdf)
```

## Fields

| Field | Required | Format and limit |
| --- | --- | --- |
| `name` | yes | Full name, max 200 characters |
| `email` | yes | Candidate's email. The verification link goes here. One application per email. |
| `location` | no | City and country, max 200 characters |
| `linkedin_url` | yes | Full `https://` URL on linkedin.com |
| `github_url` | no | Full `https://` URL on github.com |
| `portfolio_url` | no | Full `https://` URL |
| `ai_answer` | yes | "What is the most interesting thing you built with AI lately?" Max 3 KB |
| `cv_markdown` | one CV | CV as Markdown text, max 60 KB |
| `cv_pdf` | one CV | Multipart file part only. PDF (starts with `%PDF-`), max 10 MB |
| `agent_note` | no | Who submitted it, max 500 characters |
| `consent` | yes | JSON: `true`. Multipart: `"true"`. The human agrees that dots.eco uses this data to evaluate the application. |

Send exactly one CV: `cv_markdown` **or** `cv_pdf`, not both. Limits count UTF-8 bytes (1 KB = 1,024 bytes). Max request size: 256 KB for JSON, 11 MB for multipart. Single-line fields must not contain control characters.

## Example: JSON with a Markdown CV

```bash
curl -sS -X POST https://opportunity.dots-eco.cloud/api/applications \
  -H 'Content-Type: application/json' \
  --data @- <<'JSON'
{
  "name": "Jane Doe",
  "email": "jane@example.com",
  "location": "Lisbon, Portugal",
  "linkedin_url": "https://www.linkedin.com/in/janedoe",
  "github_url": "https://github.com/janedoe",
  "ai_answer": "In Jane's own words…",
  "cv_markdown": "# Jane Doe\n\n## Experience\n…",
  "agent_note": "Submitted by Claude Code for Jane Doe",
  "consent": true
}
JSON
```

## Example: multipart with a PDF CV

```bash
curl -sS -X POST https://opportunity.dots-eco.cloud/api/applications \
  -F name='Jane Doe' \
  -F email='jane@example.com' \
  -F linkedin_url='https://www.linkedin.com/in/janedoe' \
  -F ai_answer="In Jane's own words…" \
  -F agent_note='Submitted by Claude Code for Jane Doe' \
  -F consent=true \
  -F 'cv_pdf=@jane-doe-cv.pdf;type=application/pdf'
```

## Responses

| Status | Body | What to do |
| --- | --- | --- |
| `200` | `{"ok": true, "message": "Check your inbox…"}` | Tell the human to click the link in the email. |
| `400` | `{"ok": false, "error": "invalid", "issues": [{"field", "message"}]}` | Fix the listed fields and send again. `invalid_json` / `invalid_form` means the body did not parse. |
| `413` | `{"ok": false, "error": "too_large"}` | Shrink the CV or request. |
| `415` | `{"ok": false, "error": "unsupported_media_type"}` | Use JSON or multipart/form-data. |
| `429` | `{"ok": false, "error": "rate_limited"}` | Stop. Wait for `Retry-After`. |

The `200` response is the same for new and existing emails, by design. Sending again before the human verifies replaces the pending application and sends a new link. Limits: 5 applications per hour per IP, 3 per day per email.

## What happens next

1. The human clicks the verification link. The application goes live.
2. A person at dots.eco reviews it.
3. Shortlisted candidates get a 40-minute AI-native challenge. Any AI tools are allowed.
4. Then the candidate meets the team.

Privacy: dots.eco uses the application only to evaluate the candidate for this role and deletes it 6 months after a final decision. We never fetch the URLs you send.
