Create custom problem
Creates a draft and starts asynchronous preparation. Poll the custom detail endpoint until prepStatus is ready or failed. A failed enqueue can return prepStatus failed even on a successful save.
curl --request POST \
--url https://api.promptster.ai/v1/issues/custom \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data @- <<EOF
{
"title": "Rate limiter lets bursts through after a restart",
"taskBrief": "After a deploy, the token bucket starts full for every client, so the first minute lets 10x the allowed traffic through. Make the bucket state survive a restart. The hidden tests exercise limiter.py directly.",
"repoUrl": "https://github.com/your-org/rate-limiter",
"commitSha": "3f1c2a9",
"isPrivate": false,
"language": "python",
"difficulty": "standard",
"skillTags": [
"rate-limiting",
"persistence"
],
"estimatedMinutes": 60,
"testSuiteConfig": {
"setupCommand": "python3 -m venv .venv && .venv/bin/pip install -q -r requirements.txt pytest",
"testCommand": ".venv/bin/python -m pytest -q tests/test_hidden_limiter.py",
"testFramework": "pytest",
"timeoutSeconds": 300,
"testFiles": [
{
"fileName": "test_hidden_limiter.py",
"destination": "tests/test_hidden_limiter.py",
"content": "from limiter import Limiter\n\ndef test_state_survives_restart(tmp_path):\n a = Limiter(rate=1, burst=1, state_dir=tmp_path)\n assert a.allow('c')\n b = Limiter(rate=1, burst=1, state_dir=tmp_path)\n assert not b.allow('c')\n"
}
]
}
}
EOF{
"issue": {
"id": "<string>",
"issueTitle": "<string>",
"repoUrl": "<string>",
"brokenSha": "<string>",
"taskBrief": "<string>",
"language": "<string>",
"difficulty": "<string>",
"isCustom": true,
"isPrivate": true,
"isTicketFlow": true,
"status": "<string>",
"prepStatus": "pending",
"prepError": "<string>",
"testSuiteVerified": true,
"issueUrl": "<string>"
}
}{
"error": "Invalid body",
"details": [
{
"path": [
"testSuiteConfig",
"setupCommand"
],
"message": "Setup must not run tests."
}
]
}{
"error": "<string>",
"code": "<string>",
"message": "<string>",
"details": [
"<unknown>"
],
"personaId": "<string>"
}{
"error": "<string>",
"code": "<string>",
"message": "<string>",
"details": [
"<unknown>"
],
"personaId": "<string>"
}{
"error": "<string>",
"code": "<string>",
"message": "<string>",
"details": [
"<unknown>"
],
"personaId": "<string>"
}{
"error": "brief_restates_requirement",
"personaId": "dana",
"message": "The brief repeats wording from the hidden spec. Briefs set tone, not facts."
}{
"error": "<string>",
"code": "<string>",
"message": "<string>",
"details": [
"<unknown>"
],
"personaId": "<string>"
}{
"error": "<string>",
"code": "<string>",
"message": "<string>",
"details": [
"<unknown>"
],
"personaId": "<string>"
}{
"error": "<string>",
"code": "<string>",
"message": "<string>",
"details": [
"<unknown>"
],
"personaId": "<string>"
}{
"error": "<string>",
"code": "<string>",
"message": "<string>",
"details": [
"<unknown>"
],
"personaId": "<string>"
}Authorizations
Organization API key from Settings → API. Send Authorization: Bearer psk_live_… .
Body
- Option 1
- Option 2
POST creates; PUT fully replaces. language is trimmed and lowercased before validation. A successful save starts preparation; inspect issue.prepStatus, including on the initial response.
GitHub repository URL: https://github.com/owner/repo
typescript, javascript, python, go, rust, java, ruby, csharp warmup, standard, deep Show child attributes
Show child attributes
Persona and requirement IDs must each be unique. Owners and unavailability personaId must refer to a persona. fromSec must precede toSec. With ticketFlow, the ticket replaces title and taskBrief.
Show child attributes
Show child attributes
1 - 2001 - 8000Show child attributes
Show child attributes
Omit to pin the current default-branch head.
^[0-9a-fA-F]{7,40}$Uses the organization GitHub token from Settings → GitHub access. Candidates receive a snapshot without credentials or history.
201bug_fix, feature, performance 1 <= x <= 600Response
Success
Show child attributes
Show child attributes
curl --request POST \
--url https://api.promptster.ai/v1/issues/custom \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data @- <<EOF
{
"title": "Rate limiter lets bursts through after a restart",
"taskBrief": "After a deploy, the token bucket starts full for every client, so the first minute lets 10x the allowed traffic through. Make the bucket state survive a restart. The hidden tests exercise limiter.py directly.",
"repoUrl": "https://github.com/your-org/rate-limiter",
"commitSha": "3f1c2a9",
"isPrivate": false,
"language": "python",
"difficulty": "standard",
"skillTags": [
"rate-limiting",
"persistence"
],
"estimatedMinutes": 60,
"testSuiteConfig": {
"setupCommand": "python3 -m venv .venv && .venv/bin/pip install -q -r requirements.txt pytest",
"testCommand": ".venv/bin/python -m pytest -q tests/test_hidden_limiter.py",
"testFramework": "pytest",
"timeoutSeconds": 300,
"testFiles": [
{
"fileName": "test_hidden_limiter.py",
"destination": "tests/test_hidden_limiter.py",
"content": "from limiter import Limiter\n\ndef test_state_survives_restart(tmp_path):\n a = Limiter(rate=1, burst=1, state_dir=tmp_path)\n assert a.allow('c')\n b = Limiter(rate=1, burst=1, state_dir=tmp_path)\n assert not b.allow('c')\n"
}
]
}
}
EOF{
"issue": {
"id": "<string>",
"issueTitle": "<string>",
"repoUrl": "<string>",
"brokenSha": "<string>",
"taskBrief": "<string>",
"language": "<string>",
"difficulty": "<string>",
"isCustom": true,
"isPrivate": true,
"isTicketFlow": true,
"status": "<string>",
"prepStatus": "pending",
"prepError": "<string>",
"testSuiteVerified": true,
"issueUrl": "<string>"
}
}{
"error": "Invalid body",
"details": [
{
"path": [
"testSuiteConfig",
"setupCommand"
],
"message": "Setup must not run tests."
}
]
}{
"error": "<string>",
"code": "<string>",
"message": "<string>",
"details": [
"<unknown>"
],
"personaId": "<string>"
}{
"error": "<string>",
"code": "<string>",
"message": "<string>",
"details": [
"<unknown>"
],
"personaId": "<string>"
}{
"error": "<string>",
"code": "<string>",
"message": "<string>",
"details": [
"<unknown>"
],
"personaId": "<string>"
}{
"error": "brief_restates_requirement",
"personaId": "dana",
"message": "The brief repeats wording from the hidden spec. Briefs set tone, not facts."
}{
"error": "<string>",
"code": "<string>",
"message": "<string>",
"details": [
"<unknown>"
],
"personaId": "<string>"
}{
"error": "<string>",
"code": "<string>",
"message": "<string>",
"details": [
"<unknown>"
],
"personaId": "<string>"
}{
"error": "<string>",
"code": "<string>",
"message": "<string>",
"details": [
"<unknown>"
],
"personaId": "<string>"
}{
"error": "<string>",
"code": "<string>",
"message": "<string>",
"details": [
"<unknown>"
],
"personaId": "<string>"
}