Initial project
This commit is contained in:
192
docs/API.md
Normal file
192
docs/API.md
Normal file
@@ -0,0 +1,192 @@
|
||||
# Survey Studio API Guide
|
||||
|
||||
Survey Studio is a Django service for creating surveys in admin and collecting
|
||||
public responses through JSON endpoints.
|
||||
|
||||
## Local Setup
|
||||
|
||||
```bash
|
||||
python -m venv .venv
|
||||
.venv\Scripts\activate
|
||||
pip install -r requirements.txt
|
||||
python manage.py migrate
|
||||
python manage.py createsuperuser
|
||||
python manage.py runserver
|
||||
```
|
||||
|
||||
Open:
|
||||
|
||||
- Welcome page: `http://127.0.0.1:8000/`
|
||||
- Documentation page: `http://127.0.0.1:8000/docs/`
|
||||
- Admin panel: `http://127.0.0.1:8000/admin/`
|
||||
- Survey API: `http://127.0.0.1:8000/api/surveys/`
|
||||
|
||||
## Survey Workflow
|
||||
|
||||
1. Sign in to Django admin.
|
||||
2. Create a survey.
|
||||
3. Add questions inline.
|
||||
4. Add choices to single-choice and multiple-choice questions.
|
||||
5. Publish the survey.
|
||||
6. Fetch the survey schema from the API.
|
||||
7. Submit public responses to the response endpoint.
|
||||
|
||||
## Question Types
|
||||
|
||||
- `short_text`
|
||||
- `long_text`
|
||||
- `single_choice`
|
||||
- `multiple_choice`
|
||||
- `rating`
|
||||
- `yes_no`
|
||||
|
||||
## Endpoints
|
||||
|
||||
### List published surveys
|
||||
|
||||
```http
|
||||
GET /api/surveys/
|
||||
```
|
||||
|
||||
Example response:
|
||||
|
||||
```json
|
||||
{
|
||||
"results": [
|
||||
{
|
||||
"id": 1,
|
||||
"title": "Customer Feedback",
|
||||
"slug": "customer-feedback",
|
||||
"description": "Monthly product feedback",
|
||||
"thank_you_message": "Thanks for your response.",
|
||||
"starts_at": null,
|
||||
"ends_at": null,
|
||||
"url": "http://127.0.0.1:8000/api/surveys/customer-feedback/",
|
||||
"response_url": "http://127.0.0.1:8000/api/surveys/customer-feedback/responses/"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
### Read a survey schema
|
||||
|
||||
```http
|
||||
GET /api/surveys/customer-feedback/
|
||||
```
|
||||
|
||||
Example response:
|
||||
|
||||
```json
|
||||
{
|
||||
"id": 1,
|
||||
"title": "Customer Feedback",
|
||||
"slug": "customer-feedback",
|
||||
"description": "Monthly product feedback",
|
||||
"thank_you_message": "Thanks for your response.",
|
||||
"starts_at": null,
|
||||
"ends_at": null,
|
||||
"url": "http://127.0.0.1:8000/api/surveys/customer-feedback/",
|
||||
"response_url": "http://127.0.0.1:8000/api/surveys/customer-feedback/responses/",
|
||||
"questions": [
|
||||
{
|
||||
"id": 10,
|
||||
"slug": "experience",
|
||||
"prompt": "How was your experience?",
|
||||
"help_text": "",
|
||||
"type": "single_choice",
|
||||
"required": true,
|
||||
"position": 1,
|
||||
"choices": [
|
||||
{
|
||||
"id": 100,
|
||||
"label": "Good",
|
||||
"value": "good",
|
||||
"position": 1
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
### Submit a response
|
||||
|
||||
```http
|
||||
POST /api/surveys/customer-feedback/responses/
|
||||
Content-Type: application/json
|
||||
```
|
||||
|
||||
```json
|
||||
{
|
||||
"respondent_email": "person@example.com",
|
||||
"metadata": {
|
||||
"source": "website"
|
||||
},
|
||||
"answers": [
|
||||
{
|
||||
"question": "name",
|
||||
"value": "Alex"
|
||||
},
|
||||
{
|
||||
"question": "experience",
|
||||
"choice": "good"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
Successful response:
|
||||
|
||||
```json
|
||||
{
|
||||
"id": 24,
|
||||
"survey": "customer-feedback",
|
||||
"submitted_at": "2026-05-02T12:00:00+00:00",
|
||||
"thank_you_message": "Thanks for your response."
|
||||
}
|
||||
```
|
||||
|
||||
## Answer Formats
|
||||
|
||||
List style:
|
||||
|
||||
```json
|
||||
{
|
||||
"answers": [
|
||||
{
|
||||
"question": "name",
|
||||
"value": "Alex"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
Object style:
|
||||
|
||||
```json
|
||||
{
|
||||
"answers": {
|
||||
"name": "Alex",
|
||||
"score": 5,
|
||||
"subscribe": true
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Choice answers accept either the choice `value` or choice `id`.
|
||||
|
||||
## Validation
|
||||
|
||||
- Required questions must be answered.
|
||||
- Unknown question slugs are rejected.
|
||||
- Duplicate answers for the same question are rejected.
|
||||
- Rating answers must be numeric and inside the configured range.
|
||||
- Yes/no answers accept booleans or `yes`, `no`, `true`, `false`, `1`, `0`.
|
||||
- Closed, draft, expired, or not-yet-started surveys reject responses.
|
||||
|
||||
## Environment Variables
|
||||
|
||||
- `DJANGO_SECRET_KEY`: required for production deployments.
|
||||
- `DJANGO_DEBUG`: set to `0` in production.
|
||||
- `DJANGO_ALLOWED_HOSTS`: comma-separated host list. Defaults to `*`.
|
||||
- `SURVEY_API_CORS_ORIGINS`: comma-separated origin list for `/api/`.
|
||||
Reference in New Issue
Block a user