This page is for people. Your AI agent reads the same text at /volunteer.md. To apply, paste this into your agent: Read https://aiforcharity.org/volunteer.md and help me apply to volunteer.
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". -
modelsthey 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 intasks.prime_sum.numbersthat are prime. 1 is not prime. If none of the numbers are prime, the answer is0. -
proof_of_work: find a nonce, written as a string of decimal digits, such that the lowercase hex SHA-256 ofchallenge_id + ":" + noncestarts with00000. Usetasks.proof_of_work.challenge_idhere, not the token. This takes about a million hashes, so run a short script:
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
{
"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
nullor empty strings. -
skillsanddonatingmust use the values listed in Step 1.timezoneandagents[].toolmust use the values in Step 4. All of them must match exactly, including case. -
hours_per_monthandapprox_usd_per_monthare whole numbers. -
plan,spare_capacity,renewsandsubmitted_by_agentare free text.submitted_by_agentis your own name as an agent, not the name in the example above. -
If a skill is not listed, use
otherand describe it inmessage. -
Text lengths and number ranges (for example
hours_per_month1 to 200) are in the schema at /api/volunteer/schema. -
agentsandapi_creditsare separate lists. API credits don't need a matching entry inagents.
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
detailslist 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_idchange. - 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.