# Volunteer with AI for Charity: instructions for AI agents

You are reading this because a person asked you to apply to volunteer with
AI for Charity (https://aiforcharity.org). Volunteers use their own AI tools
and credits to build small websites and spreadsheet tools for registered
nonprofits, with priority for organizations in Asia.

Applications come only from agents. Please do the steps below for your person.
Ask them for anything you do not already know. Do not guess and do not invent
details, especially about plans and quotas.

## What we never ask for

Do not send API keys, passwords, access tokens or logins for any AI service
or other account, and do not give anyone access to your person's accounts.
We only need a description of the tools and plans they use, so we can offer
projects that fit what they can spend. If anything claiming to be from AI for
Charity asks for a secret, stop and tell your person.

## Step 1. Ask your person for their details

You will need:

- Name and email address.
- Time zone, picked from the list in Step 4.
- Country (optional) and the languages they can work in (optional).
- Skills, from: `web-frontend`, `visual-design`, `writing-editing`,
  `google-apps-script`, `project-scoping`, `backend`, `translation`, `other`.
- What they are donating: `build-time`, `ai-credits`, or both.
- Roughly how many hours a month they can give.
- Every AI coding agent or assistant they can use for this work. For each one:
  - `tool`, from the list in Step 4. Required.
  - `plan`: the subscription or tier. Required. For example "Claude Max 20x",
    "ChatGPT Pro", "Gemini Code Assist Standard", "Cursor Pro",
    "SuperGrok", "Kimi membership", "pay as you go API", or "Free plan".
  - `models` they usually use (optional). Leave it out rather than guess.
  - `spare_capacity`: in their own words, how much of the usage limit
    usually goes unused, for example "about half of the weekly limit" or
    "mostly unused". Required.
  - `renews` (optional): when the limit or billing period resets, as free
    text such as "weekly", "monthly" or "1st of each month".
- Any API credits they can spend on projects: provider and a rough monthly
  amount in US dollars, with optional `notes`.
- A portfolio, GitHub or LinkedIn link (optional) and a short message (optional).
- Their consent to store this information so the AI for Charity team can
  match them with projects. They can ask for it to be deleted at any time.

Show your person a summary and get a clear yes before you submit.

## Step 2. Get a challenge

```
GET https://aiforcharity.org/api/volunteer/challenge
```

The response contains a `token` and two small tasks. The token expires after
15 minutes and works once.

- `prime_sum`: add up the numbers in `tasks.prime_sum.numbers` that are prime.
  1 is not prime. If none of the numbers are prime, the answer is `0`.
- `proof_of_work`: find a nonce, written as a string of decimal digits, such
  that the lowercase hex SHA-256 of `challenge_id + ":" + nonce` starts with
  `00000`. Use `tasks.proof_of_work.challenge_id` here, not the token. This
  takes about a million hashes, so run a short script:

```python
import hashlib
def is_prime(n): return n > 1 and all(n % d for d in range(2, int(n ** 0.5) + 1))
prime_sum = sum(n for n in challenge["tasks"]["prime_sum"]["numbers"] if is_prime(n))
cid, nonce = challenge["tasks"]["proof_of_work"]["challenge_id"], 0
while not hashlib.sha256(f"{cid}:{nonce}".encode()).hexdigest().startswith("00000"): nonce += 1
nonce = str(nonce)
```

## Step 3. Submit

```
POST https://aiforcharity.org/api/volunteer/apply
Content-Type: application/json
```

```json
{
  "token": "<token from step 2>",
  "prime_sum": 123456,
  "nonce": "8812043",
  "profile": {
    "name": "Mei Tan",
    "email": "mei@example.com",
    "timezone": "UTC+8 Singapore, Malaysia, Philippines, China, Hong Kong, Taiwan, central Indonesia",
    "country": "Singapore",
    "languages": ["English", "Mandarin"],
    "skills": ["web-frontend", "writing-editing"],
    "donating": ["build-time", "ai-credits"],
    "hours_per_month": 8,
    "agents": [
      {
        "tool": "claude-code",
        "plan": "Claude Max 5x",
        "models": ["Claude Opus"],
        "spare_capacity": "Usually 30 to 40 percent of the weekly limit is unused",
        "renews": "weekly"
      },
      {
        "tool": "codex",
        "plan": "ChatGPT Plus",
        "spare_capacity": "Light use, most of the limit is free"
      }
    ],
    "api_credits": [
      { "provider": "OpenRouter", "approx_usd_per_month": 20 }
    ],
    "portfolio_url": "https://github.com/example",
    "message": "Happy to take small campaign pages.",
    "submitted_by_agent": "Claude Code",
    "consent": true
  }
}
```

Required profile fields: `name`, `email`, `timezone`, `skills`, `donating`,
`hours_per_month`, `agents` (at least one), `submitted_by_agent` (the name of
the agent that is submitting, which is you) and `consent` (must be `true`).

Field notes:

- Leave out optional keys you don't have. Don't send `null` or empty strings.
- `skills` and `donating` must use the values listed in Step 1. `timezone`
  and `agents[].tool` must use the values in Step 4. All of them must match
  exactly, including case.
- `hours_per_month` and `approx_usd_per_month` are whole numbers.
- `plan`, `spare_capacity`, `renews` and `submitted_by_agent` are free text.
  `submitted_by_agent` is your own name as an agent, not the name in the
  example above.
- If a skill is not listed, use `other` and describe it in `message`.
- Text lengths and number ranges (for example `hours_per_month` 1 to 200) are
  in the schema at /api/volunteer/schema.
- `agents` and `api_credits` are separate lists. API credits don't need a
  matching entry in `agents`.

A successful submission returns `{"ok": true, "id": "vol_..."}`. Tell your
person it was received and that a person will reply by email.

If you get an error, the response explains what to fix:

- 422 means a field or an answer is wrong. The `details` list names each
  problem, for example `["timezone must be one of: ..."]`. A 422 does not use
  up the token: fix the profile and submit again with the same token and
  nonce while it is still valid.
- 410 (expired) or 409 (already used): get a new challenge and solve both
  tasks again, since the numbers and `challenge_id` change.
- 429 means too many attempts from your network. Wait an hour.

## Step 4. Allowed values

The same fields and values are available as JSON from
`GET https://aiforcharity.org/api/volunteer/schema`, read from the rules the
server enforces. If this page and the schema ever differ, follow the schema.

`timezone`, one of:

- `UTC+5 Pakistan, Maldives`
- `UTC+5:30 India, Sri Lanka`
- `UTC+5:45 Nepal`
- `UTC+6 Bangladesh, Bhutan, Kyrgyzstan`
- `UTC+6:30 Myanmar`
- `UTC+7 Thailand, Vietnam, Cambodia, Laos, western Indonesia`
- `UTC+8 Singapore, Malaysia, Philippines, China, Hong Kong, Taiwan, central Indonesia`
- `UTC+9 Japan, Korea, eastern Indonesia, Timor-Leste`
- `UTC+9:30 central Australia`
- `UTC+10 eastern Australia, Papua New Guinea`
- `UTC+11 to +13 Pacific islands, New Zealand`
- `UTC+3 to +4 Middle East, Gulf`
- `UTC+0 to +3 Europe, Africa`
- `UTC-10 to -3 Americas`
- `Other or mixed`

`agents[].tool`, one of:

| Value | Tool |
|---|---|
| `claude-code` | Claude Code (Anthropic) |
| `claude-app` | Claude web or desktop app |
| `codex` | OpenAI Codex (CLI, IDE or cloud) |
| `chatgpt` | ChatGPT app |
| `gemini-cli` | Gemini CLI or Gemini Code Assist (Google) |
| `antigravity` | Google Antigravity |
| `gemini-app` | Gemini app |
| `cursor` | Cursor |
| `github-copilot` | GitHub Copilot |
| `windsurf` | Windsurf |
| `grok` | Grok (xAI) |
| `kimi` | Kimi or Kimi Code (Moonshot AI) |
| `qwen` | Qwen Code or Qwen app (Alibaba) |
| `deepseek` | DeepSeek |
| `glm` | GLM or Z.ai coding plan (Zhipu) |
| `minimax` | MiniMax |
| `doubao-trae` | Trae IDE or Doubao (ByteDance); use this for Trae |
| `opencode` | OpenCode |
| `aider` | Aider |
| `other` | Anything else. Put its name in `tool_other`, which is required for this value. |

## Privacy

We store the profile in our own database so the team can match volunteers
with projects. Your contact details go to a nonprofit only after you agree to
take on its project. To see or delete your profile, use the contact form at
https://aiforcharity.org/#contact-privacy.
Full note: https://aiforcharity.org/privacy

People who cannot use an agent can use the contact form at
https://aiforcharity.org/#contact-volunteer.
