1. * # Teacher's Portal API Docs
### Format
All calls are returned in **JSON**.
### Status Codes
- **200** Successful GET, PUT, and PATCH.
- **201** Successful POST.
- **204** Successfull POST without response body.
- **401** Unauthenticated.
- **403** Forbidden.
# My Schedule
## Classes ordering (My Schedule Ordering)
### GET /teachers/<teacher_id>/classes?ordering=<field_name>
By default, the query parameter is named `ordering`.
For example, to order class by email:
`/teachers/<teacher_id>/classes?ordering=email`
The client may also specify reverse orderings by prefixing the field name with '-', like so:
`/teachers/<teacher_id>/classes?ordering=-email`
#### Example request
```
$ curl -X GET \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiaWF0IjoxNTM0OTI1MTQwLCJleHAiOjE1MzUwMTE1NDB9.MIcWFBzAr5WVhbaSa1kd1_hmEZsepo8fXqotqvAerKI" \
"http://www.mocky.io/v2/5dc0645031000070e2be40f2?ordering=<field_name>"
```
Make sure that the logged in user's group has access to this endpoint.
#### Response
```json
{
"count": 2,
"next": null,
"previous": null,
"results": [{
"id": "186800",
"topic": "Tutor Teacher Voxy group session",
"class_type": "group",
"date": "30/1/20",
"time": "11:06p.m. - 12:06a.m.",
"day": "thursday",
"learner_user_id": null,
"learner_first_name": null,
"learner_last_name": null,
"learner_email": null,
"learner_organization": null,
"learner_group": null,
"level": [
"High Beginner",
"Low Intermediate",
],
"lesson": {
"title": "Talk in english",
"url": "https://app.voxy.com/activities/lesson/by-resource/5e8249cdd38ff38371eed237/"
},
"join_url": "https://bluejeans.com/fake-meeting-id",
"has_submitted_feedback": null,
"end_of_joining_window": "2020-01-30T23:11:54.397829+00:00",
"start_of_joining_window": "2020-01-30T23:01:54.397829+00:00",
"duration_in_minutes": 60,
"feedback_score": null,
"feedback_comment": null,
"reservation_count": 3,
"learner_cancel_ts": null,
"quantum": {
"min_quantum" : 0.5,
"max_quantum" : 0.69
},
},
{
"id": "186801",
"topic": "Grammar",
"class_type": "private",
"date": "14/2/20",
"time": "12:00p.m. - 12:30p.m.",
"day": "friday",
"learner_user_id": 194502,
"learner_first_name": "Captain",
"learner_last_name": "Fiction",
"learner_email": "captain@nowhere.com",
"learner_organization": "Organization, Inc",
"learner_group": "Primary Group",
"level": [
"Intermediate"
],
"lesson": null,
"join_url": "https://bluejeans.com/theid",
"has_submitted_feedback": true,
"end_of_joining_window": "2020-02-14T12:05:00+00:00",
"start_of_joining_window": "2020-02-14T11:55:00+00:00",
"duration_in_minutes": 30,
"feedback_score": true,
"feedback_comment": "Great lesson!",
"reservation_count": null,
"learner_cancel_ts": null,
"quantum": {
"min_quantum" : 0.5,
"max_quantum" : 0.69
},
}]
}
```
## Filter classes (My Schedule)
##### upcoming (default option)
```GET /teachers/<teacher_id>/classes/```
##### past classes (needs to be included start and end param)
```GET /teachers/<teacher_id>/classes/?start=2020-03-23&end=2020-03-29```
##### filter by class (valid params, private or group, in case of none we will return both)
```GET /teachers/<teacher_id>/classes/?type=group```
```GET /teachers/<teacher_id>/classes/?type=private```
##### filter group classes with lessons (valid param **true** of **false**, in case of none we will return all)
```GET /teachers/<teacher_id>/classes/?has_lesson=true```
```GET /teachers/<teacher_id>/classes/?has_lesson=false```
##### filter private classes with feedback (valid param **true** of **false**, in case of none we will return all)
```GET /teachers/<teacher_id>/classes/?has_feedback=true```
```GET /teachers/<teacher_id>/classes/?has_feedback=false```
#### Example request
```
$ curl -X GET \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiaWF0IjoxNTM0OTI1MTQwLCJleHAiOjE1MzUwMTE1NDB9.MIcWFBzAr5WVhbaSa1kd1_hmEZsepo8fXqotqvAerKI" \
"http://www.mocky.io/v2/5dc067e0310000cee3be4109"
```
### GET /teachers/<teacher_id>/classes?days=day1,day2,day3
#### Example request
```
$ curl -X GET \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiaWF0IjoxNTM0OTI1MTQwLCJleHAiOjE1MzUwMTE1NDB9.MIcWFBzAr5WVhbaSa1kd1_hmEZsepo8fXqotqvAerKI" \
"http://www.mocky.io/v2/5dc17f56330000c5b61a5309?days=monday,tuesday"
```
#### Response
```json
{
"count": 2,
"next": null,
"previous": null,
"results": [{
"id": "186800",
"lesson": {
"name": "Talk in english"
},
"topic": "Conversation",
"learners": [
"mary@example.com"
],
"class_type": "Private",
"date": "4/11/19",
"time": "15:15 - 15:45",
"join_url": "https://example.com/rooom/1/join",
"has_submitted_feedback": true,
"end_of_joining_window": "2019-11-04T15:20:00Z",
"start_of_joining_window": "2019-11-04T15:10:00Z",
"levels": ["Advanced"],
"canceled_at": null,
"length": 30,
"feedback": "pending"
},
{
"id": "186801",
"lesson": {},
"topic": "Reading",
"learners": [
"john@example.com",
"joseph@example.com"
],
"class_type": "Group",
"date": "4/11/19",
"time": "15:15 - 15:45",
"join_url": "https://example.com/rooom/1/join",
"has_submitted_feedback": true,
"end_of_joining_window": "2019-11-04T15:20:00Z",
"start_of_joining_window": "2019-11-04T15:10:00Z",
"levels": [
"Low Advanced",
"Advanced"
],
"canceled_at": null,
"length": 60,
"feedback": "started"
}
]
}
```
### GET /teachers/<teacher_id>/classes?class_type=class_type
#### Example request
```
$ curl -X GET \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiaWF0IjoxNTM0OTI1MTQwLCJleHAiOjE1MzUwMTE1NDB9.MIcWFBzAr5WVhbaSa1kd1_hmEZsepo8fXqotqvAerKI" \
"http://www.mocky.io/v2/5dc17f56330000c5b61a5309?class_type=group"
```
#### Response
```json
{
"count": 2,
"next": null,
"previous": null,
"results": [{
"id": "186800",
"lesson": {
"name": "Talk in english"
},
"topic": "Conversation",
"learners": [
"mary@example.com"
],
"class_type": "Private",
"date": "4/11/19",
"time": "15:15 - 15:45",
"join_url": "https://example.com/rooom/1/join",
"has_submitted_feedback": true,
"end_of_joining_window": "2019-11-04T15:20:00Z",
"start_of_joining_window": "2019-11-04T15:10:00Z",
"levels": ["Advanced"],
"canceled_at": null,
"length": 30,
"feedback": "pending"
},
{
"id": "186801",
"lesson": {},
"topic": "Reading",
"learners": [
"john@example.com",
"joseph@example.com"
],
"class_type": "Group",
"date": "4/11/19",
"time": "15:15 - 15:45",
"join_url": "https://example.com/rooom/1/join",
"has_submitted_feedback": true,
"end_of_joining_window": "2019-11-04T15:20:00Z",
"start_of_joining_window": "2019-11-04T15:10:00Z",
"levels": [
"Low Advanced",
"Advanced"
],
"canceled_at": null,
"length": 60,
"feedback": "started"
}
]
}
```
### GET /teachers/<teacher_id>/classes?has_feedback=trueORfalse
#### Example request
```
$ curl -X GET \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiaWF0IjoxNTM0OTI1MTQwLCJleHAiOjE1MzUwMTE1NDB9.MIcWFBzAr5WVhbaSa1kd1_hmEZsepo8fXqotqvAerKI" \
"http://www.mocky.io/v2/5dc17f56330000c5b61a5309?has_feedback=true"
```
#### Response
```json
{
"count": 2,
"next": null,
"previous": null,
"results": [{
"id": "186800",
"lesson": {
"name": "Talk in english"
},
"topic": "Conversation",
"learners": [
"mary@example.com"
],
"class_type": "Private",
"date": "4/11/19",
"time": "15:15 - 15:45",
"join_url": "https://example.com/rooom/1/join",
"has_submitted_feedback": true,
"end_of_joining_window": "2019-11-04T15:20:00Z",
"start_of_joining_window": "2019-11-04T15:10:00Z",
"levels": ["Advanced"],
"canceled_at": null,
"length": 30,
"feedback": "pending"
},
{
"id": "186801",
"lesson": {},
"topic": "Reading",
"learners": [
"john@example.com",
"joseph@example.com"
],
"class_type": "Group",
"date": "4/11/19",
"time": "15:15 - 15:45",
"join_url": "https://example.com/rooom/1/join",
"has_submitted_feedback": true,
"end_of_joining_window": "2019-11-04T15:20:00Z",
"start_of_joining_window": "2019-11-04T15:10:00Z",
"levels": [
"Low Advanced",
"Advanced"
],
"canceled_at": null,
"length": 60,
"feedback": "started"
}
]
}
```
### GET /teachers/<teacher_id>/classes?has_lesson=trueORfalse
#### Example request
```
$ curl -X GET \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiaWF0IjoxNTM0OTI1MTQwLCJleHAiOjE1MzUwMTE1NDB9.MIcWFBzAr5WVhbaSa1kd1_hmEZsepo8fXqotqvAerKI" \
"http://www.mocky.io/v2/5dc17f56330000c5b61a5309?has_lesson=true"
```
#### Response
```json
{
"count": 2,
"next": null,
"previous": null,
"results": [{
"id": "186800",
"lesson": {
"name": "Talk in english"
},
"topic": "Conversation",
"learners": [
"mary@example.com"
],
"class_type": "Private",
"date": "4/11/19",
"time": "15:15 - 15:45",
"join_url": "https://example.com/rooom/1/join",
"has_submitted_feedback": true,
"end_of_joining_window": "2019-11-04T15:20:00Z",
"start_of_joining_window": "2019-11-04T15:10:00Z",
"levels": ["Advanced"],
"canceled_at": null,
"length": 30,
"feedback": "pending"
},
{
"id": "186801",
"lesson": {},
"topic": "Reading",
"learners": [
"john@example.com",
"joseph@example.com"
],
"class_type": "Group",
"date": "4/11/19",
"time": "15:15 - 15:45",
"join_url": "https://example.com/rooom/1/join",
"has_submitted_feedback": true,
"end_of_joining_window": "2019-11-04T15:20:00Z",
"start_of_joining_window": "2019-11-04T15:10:00Z",
"levels": [
"Low Advanced",
"Advanced"
],
"canceled_at": null,
"length": 60,
"feedback": "started"
}
]
}
```
### GET /teachers/<teacher_id>/classes?start=01-01-2019&end=01-31-2019
#### Example request
```
$ curl -X GET \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiaWF0IjoxNTM0OTI1MTQwLCJleHAiOjE1MzUwMTE1NDB9.MIcWFBzAr5WVhbaSa1kd1_hmEZsepo8fXqotqvAerKI" \
"http://www.mocky.io/v2/5dc17f56330000c5b61a5309?start=01-01-2019&end=01-31-2019"
```
#### Response
```json
{
"count": 2,
"next": null,
"previous": null,
"results": [{
"id": "186800",
"lesson": {
"name": "Talk in english"
},
"topic": "Conversation",
"learners": [
"mary@example.com"
],
"class_type": "Private",
"date": "4/11/19",
"time": "15:15 - 15:45",
"join_url": "https://example.com/rooom/1/join",
"has_submitted_feedback": true,
"end_of_joining_window": "2019-11-04T15:20:00Z",
"start_of_joining_window": "2019-11-04T15:10:00Z",
"levels": ["Advanced"],
"canceled_at": null,
"length": 30,
"feedback": "pending"
},
{
"id": "186801",
"lesson": {},
"topic": "Reading",
"learners": [
"john@example.com",
"joseph@example.com"
],
"class_type": "Group",
"date": "4/11/19",
"time": "15:15 - 15:45",
"join_url": "https://example.com/rooom/1/join",
"has_submitted_feedback": true,
"end_of_joining_window": "2019-11-04T15:20:00Z",
"start_of_joining_window": "2019-11-04T15:10:00Z",
"levels": [
"Low Advanced",
"Advanced"
],
"canceled_at": null,
"length": 60,
"feedback": "started"
}
]
}
```
# Class Detail (Private)
### GET /classes/private/<class_id>
#### Example request
```
$ curl -X GET \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiaWF0IjoxNTM0OTI1MTQwLCJleHAiOjE1MzUwMTE1NDB9.MIcWFBzAr5WVhbaSa1kd1_hmEZsepo8fXqotqvAerKI" \
"http://www.mocky.io/v2/5dc067e0310000cee3be4109"
```
#### Response
```json
{
"class_info":{
"id":81155,
"date":"18/4/20",
"time":"3:00p.m. - 3:30p.m.",
"length":30,
"level":"Low Intermediate",
"topic":"Oral",
"lesson":null,
"status":"CONFIRMED",
"learner_note":"test 4 week availability",
"start_of_joining_window":"2020-04-18T14:55:00-04:00",
"end_of_joining_window":"2020-04-18T15:05:00-04:00",
"join_url":"https://bluejeans.com/635660311/1234",
"data_timezone":"America/New_York"
},
"learner_info":{
"learner_name":"Julia C",
"learner_email":"julia+notwl@voxy.com",
"organization":"Julia Not WL Org",
"group":"Test",
"attended":true
},
"teacher_feedback":null,
"learner_feedback":null
}
```
## Update Private Class
## PUT /classes/private/<class_id>
#### Request Body
```
{
"status": "CANCELED_TUTOR",
"lesson": "5eb579fc8ef3785c47c4fff1", // the lesson should be null if you want to remove the lesson from a private session
}
```
#### Response
200 OK
**Note**: this endpoint is a partial update. Following are the updatable fields (can send either or both)
* status
* lesson
# Class Detail (Group)
### GET /classes/group/<class_id>
#### Example request
```
$ curl -X GET \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiaWF0IjoxNTM0OTI1MTQwLCJleHAiOjE1MzUwMTE1NDB9.MIcWFBzAr5WVhbaSa1kd1_hmEZsepo8fXqotqvAerKI" \
"http://www.mocky.io/v2/5dc067e0310000cee3be4109"
```
#### Response
```json
{
"class_info":{
"id":221216,
"date":"13/4/20",
"time":"5:12p.m. - 5:42p.m.",
"length":30,
"teacher_name":"Test Teacher",
"organization":{
"name":"Voxy Employees",
"id": 32
},
"group":[
"Test",
"Past",
"Deactivated Accounts",
"Main",
"Online Teacher",
"Online Teacher Admin",
"Online Teacher + Online Teacher Admin",
"Brazil Team OPT"
],
"level":"Beginner - Advanced",
"topic":"Harry Potter series",
"lesson":null,
"start_of_joining_window":"2020-04-13T17:07:00-04:00",
"end_of_joining_window":"2020-04-13T17:17:00-04:00",
"join_url":"https://bluejeans.com/552767562/1234",
"data_timezone":"America/New_York",
"quantum" : {
"min_quantum" : 0.0,
"max_quantum" : 1.0
},
},
"learner_info":[
{
"learner_name":"Julia C",
"learner_email":"julia+notwl@voxy.com",
"attended":false
},
{
"learner_name":"Iswarya Parupudi",
"learner_email":"iswarya@voxy.com",
"attended":false
}
],
"teacher_feedback":null,
"learner_feedback":null
}
```
## Create regular (single) group class
### POST /classes/group
#### Request body:
```json
{
"title": "Tutor Teacher Voxy group session",
"starts_at": "2020-01-01T23:28:56.782Z",
"organization": 123, // organization id
"min_quantum": 0.1,
"max_quantum": 1.0,
"groups": [1, 2],
"lesson": "some_ramdon_resource_id", // resource_id
"duration_in_minutes": 60,
"max_reservations": 10,
"teacher_id": 345 // teacher id
}
```
#### Response
201 - Created
```json
{
"id": "186801",
"lesson": {},
"topic": "Reading",
"learners": [
],
"class_type": "Group",
"date": "4/11/19",
"time": "15:15 - 15:45",
"join_url": "https://example.com/rooom/1/join",
"has_submitted_feedback": true,
"end_of_joining_window": "2019-11-04T15:20:00Z",
"start_of_joining_window": "2019-11-04T15:10:00Z",
"levels": [
"Low Advanced",
"Advanced"
],
"canceled_at": null,
"length": 60,
"feedback": "started"
}
```
## Create recurring group classes
Creating recurring group classes is similar to creating a regular (single) group class with the group class resource's recurrence field set.
The RULE:
The key to any repeating event is the recurrence
rule, a way of describing how that event
repeats. These are also referred to as RRULEs.
Recurrence rules are primarily defined in RFC
2445, section 4.8.5.4, which also describes the
full “iCalendar” spec for .ics files. Calendar
providers like iCloud and Google Calendar
provide downloads of these files for apps
The RRULE format encapsulates a repeating pattern, such as “every Thursday”.
Combined with the event’s starting time, you can figure out exactly when each future
occurrence of the event should begin. Note that the RRULE itself doesn’t encode the
starting times.
A simple RRULE for an event which repeats every day looks like this:
```
RRULE:FREQ=DAILY
```
The RRULE syntax can also specify a total number of instances, or an end time:
```
RRULE:FREQ=DAILY;COUNT=10;
RRULE:FREQ=DAILY;UNTIL=20150919T063000Z
```
We can choose one or more days of the week to repeat on, and even alternate between specific days:
```
RRULE:FREQ=WEEKLY;BYDAY=TH # every Thursday
RRULE:FREQ=WEEKLY;BYDAY=MO,WE,FR # every Mon, Wed and Fri
RRULE:FREQ=WEEKLY;BYDAY=TU;INTERVAL=2 # every other Tuesday
```
Reference: https://tools.ietf.org/html/rfc2445#section-4.8.5.4
### **POST /classes/group**
Request body:
```json
[
{
"title": "Tutor Teacher Voxy group session",
"starts_at": "2020-01-01T23:28:56.782Z",
"organization": 123, // organization id
"min_quantum": 0.1,
"max_quantum": 1.0,
"groups": [1, 2],
"lesson": "some_ramdon_resource_id", // resource_id
"duration_in_minutes": 60,
"max_reservations": 10,
"teacher_id": 2345, // teacher id
"recurrence": "FREQ=WEEKLY;BYDAY=SU;INTERVAL=2;UNTIL=2020-03-15"
}
]
```
#### Response
```json
[{
"id": "186801",
"lesson": {},
"topic": "Reading",
"learners": [],
"class_type": "Group",
"date": "4/11/19",
"time": "15:15 - 15:45",
"join_url": "https://example.com/rooom/1/join",
"has_submitted_feedback": true,
"end_of_joining_window": "2019-11-04T15:20:00Z",
"start_of_joining_window": "2019-11-04T15:10:00Z",
"levels": [
"Low Advanced",
"Advanced"
],
"canceled_at": null,
"length": 60,
"feedback": "started"
},
{
"id": "186802",
"lesson": {},
"topic": "Reading",
"learners": [],
"class_type": "Group",
"date": "4/11/19",
"time": "15:15 - 15:45",
"join_url": "https://example.com/rooom/1/join",
"has_submitted_feedback": true,
"end_of_joining_window": "2019-11-04T15:20:00Z",
"start_of_joining_window": "2019-11-04T15:10:00Z",
"levels": [
"Low Advanced",
"Advanced"
],
"canceled_at": null,
"length": 60,
"feedback": "started"
}
]
```
## Update group class
### PATCH /api/v0/classes/group/{pk}/
#### Request body:
```json
{
"title": "Tutor Teacher Voxy group session",
"starts_at": "2019-11-04T15:20:00Z",
"teacher_id": 1000, // tutor_id
"max_reservations": 6,
"group_ids": [1, 2],
"lesson": "5eb579fc8ef3785c47c4fff1", // the lesson should be null if you want to remove the lesson from a group session
"min_quantum": 0.1,
"max_quantum": 1.0
}
```
#### Response
200 - OK
```json
{
"id": "186801",
"lesson": {},
"topic": "Reading",
"learners": [
],
"class_type": "Group",
"date": "4/11/19",
"time": "15:15 - 15:45",
"join_url": "https://example.com/rooom/1/join",
"has_submitted_feedback": true,
"end_of_joining_window": "2019-11-04T15:20:00Z",
"start_of_joining_window": "2019-11-04T15:10:00Z",
"levels": [
"Low Advanced",
"Advanced"
],
"canceled_at": null,
"length": 60,
"feedback": "started"
}
```
**Note**: this endpoint is a partial update. These are the updatable fields:
- starts_at
- min_quantum
- max_quantum
- title
- teacher_id
- group_ids
- lesson
- max_reservations
## Cancel group class
### POST /classes/<class_id>/cancel
#### Example request
```
$ curl -X POST \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiaWF0IjoxNTM0OTI1MTQwLCJleHAiOjE1MzUwMTE1NDB9.MIcWFBzAr5WVhbaSa1kd1_hmEZsepo8fXqotqvAerKI" \
"http://www.mocky.io/v2/5dc070ce31000014f8be4139"
```
#### Response
204 - No Content
### POST /classes/<class_id>
#### Example request
```
$ curl -X POST \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiaWF0IjoxNTM0OTI1MTQwLCJleHAiOjE1MzUwMTE1NDB9.MIcWFBzAr5WVhbaSa1kd1_hmEZsepo8fXqotqvAerKI" \
-H "Content-Type: application/json" \
-d '{"lesson_id": "6498103208"}' \
"http://www.mocky.io/v2/5dc070ce31000014f8be4139"
```
#### Response
204 - No Content
### POST /classes/<class_id>/learners/<learner_id>/no_show
#### Example request
```
$ curl -X POST \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiaWF0IjoxNTM0OTI1MTQwLCJleHAiOjE1MzUwMTE1NDB9.MIcWFBzAr5WVhbaSa1kd1_hmEZsepo8fXqotqvAerKI" \
"http://www.mocky.io/v2/5dc070ce31000014f8be4139"
```
#### Response
204 - No Content
## My Schedule - Classes filters
### GET /teachers/<teacher_id>/classes?levels=level1,level2,level3
#### Example request
```
$ curl -X GET \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiaWF0IjoxNTM0OTI1MTQwLCJleHAiOjE1MzUwMTE1NDB9.MIcWFBzAr5WVhbaSa1kd1_hmEZsepo8fXqotqvAerKI" \
"http://www.mocky.io/v2/5dc17f56330000c5b61a5309?levels=beginner,advanced"
```
#### Response
```json
{
"count": 2,
"next": null,
"previous": null,
"results": [{
"id": "186800",
"lesson": {
"name": "Talk in english"
},
"topic": "Conversation",
"learners": [
"mary@example.com"
],
"class_type": "Private",
"date": "4/11/19",
"time": "15:15 - 15:45",
"join_url": "https://example.com/rooom/1/join",
"has_submitted_feedback": true,
"end_of_joining_window": "2019-11-04T15:20:00Z",
"start_of_joining_window": "2019-11-04T15:10:00Z",
"levels": ["Advanced"],
"canceled_at": null,
"length": 30,
"feedback": "pending"
},
{
"id": "186801",
"lesson": {},
"topic": "Reading",
"learners": [
"john@example.com",
"joseph@example.com"
],
"class_type": "Group",
"date": "4/11/19",
"time": "15:15 - 15:45",
"join_url": "https://example.com/rooom/1/join",
"has_submitted_feedback": true,
"end_of_joining_window": "2019-11-04T15:20:00Z",
"start_of_joining_window": "2019-11-04T15:10:00Z",
"levels": [
"Low Advanced",
"Advanced"
],
"canceled_at": null,
"length": 60,
"feedback": "started"
}
]
}
```
# Private Class Feedback
## Private Class Feedback Submit
### PUT /classes/private/<private_class_id>/feedback/submit
#### Example request
```
$ curl -X POST \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiaWF0IjoxNTM0OTI1MTQwLCJleHAiOjE1MzUwMTE1NDB9.MIcWFBzAr5WVhbaSa1kd1_hmEZsepo8fXqotqvAerKI" \
-H "Content-Type: application/json" \
-d '{"targeted_feedback": "", "tutor_notes": "", "next_steps": "", "grammar": 0, "vocabulary": 0, "pronunciation": 0, "listening": 0, "communication": 0}' \
"https://run.mocky.io/v3/b525e6dc-a2af-431c-b477-0d90b2d5bf26"
```
#### Request Body
```json
{
"targeted_feedback": "",
"tutor_notes": "",
"next_steps": "",
"grammar": 0,
"vocabulary": 0,
"pronunciation": 0,
"listening": 0,
"communication": 0,
}
```
#### Response
200 - OK
```json
{
"id": 1000,
"tutor_notes": "",
"targeted_feedback": "",
"next_steps": "",
"grammar": 0,
"vocabulary": 0,
"pronunciation": 0,
"listening": 0,
"communication": 0,
"feedback_save_timestamp": "2020-06-23T14:21:00.891968",
"feedback_submit_timestamp": "2020-06-23T14:21:00.891968",
"no_show": false,
}
```
## Private Class Feedback Save
### PUT /classes/private/<private_class_id>/feedback/save
#### Example request
```
$ curl -X PUT \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiaWF0IjoxNTM0OTI1MTQwLCJleHAiOjE1MzUwMTE1NDB9.MIcWFBzAr5WVhbaSa1kd1_hmEZsepo8fXqotqvAerKI" \
-H "Content-Type: application/json" \
-d '{"targeted_feedback": "", tutor_notes": "Lorem ipsum dolor sit amet", "comments": "Lorem ipsum dolor sit amet", "next_steps": "Lorem ipsum dolor sit amet", "grammar": 0, "vocabulary": 0, "pronunciation": 0, "listening": 0, "communication": 0}' \
"https://run.mocky.io/v3/6cea0957-7e18-44b5-8c51-24e66438741b"
```
#### Request Body
```json
{
"targeted_feedback": "",
"tutor_notes": "Lorem ipsum dolor sit amet",
"next_steps": "Lorem ipsum dolor sit amet",
"grammar": 0,
"vocabulary": 0,
"pronunciation": 0,
"listening": 0,
"communication": 0,
}
```
#### Response
200 - OK
```json
{
"id": 1000,
"tutor_notes": "Lorem ipsum dolor sit amet",
"targeted_feedback": "",
"next_steps": "Lorem ipsum dolor sit amet",
"grammar": 0,
"vocabulary": 0,
"pronunciation": 0,
"listening": 0,
"communication": 0,
"feedback_save_timestamp": "2020-06-23T14:21:00.891968",
"feedback_submit_timestamp": null,
"no_show": null,
}
```
## Private Class Mark user No Show
### PUT /classes/private/<private_class_id>/feedback/submit
#### Example request
```
$ curl -X PUT \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiaWF0IjoxNTM0OTI1MTQwLCJleHAiOjE1MzUwMTE1NDB9.MIcWFBzAr5WVhbaSa1kd1_hmEZsepo8fXqotqvAerKI" \
-H "Content-Type: application/json" \
-d '{"no_show":true}' \
"https://run.mocky.io/v3/b2677114-46be-45ba-a7dc-915069bd77da"
```
**NB** if `no_show` is provided in a `feedback/submit` request, all other fields will be marked as 0 for integer fields and an empty string ("") for char fields.
#### Request Body
```json
{
"no_show": true,
}
```
#### Response
200 - OK
```json
{
"id": 1000,
"tutor_notes": "",
"targeted_feedback": "",
"next_steps": "",
"grammar": 0,
"vocabulary": 0,
"pronunciation": 0,
"listening": 0,
"communication": 0,
"feedback_save_timestamp": "2020-06-23T14:21:00.891968",
"feedback_submit_timestamp": "2020-06-23T14:21:00.891968",
"no_show": true,
}
```
### GET /classes/private/<private_class_id>
#### Example request
```
$ curl -X GET \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiaWF0IjoxNTM0OTI1MTQwLCJleHAiOjE1MzUwMTE1NDB9.MIcWFBzAr5WVhbaSa1kd1_hmEZsepo8fXqotqvAerKI" \
"https://run.mocky.io/v3/9a25c5c5-3178-4354-b213-f8d7ed00ca53"
```
#### Response
```json
{
"id": 1000,
"tutor_notes": "Lorem ipsum dolor sit amet",
"targeted_feedback": "Lorem ipsum dolor sit amet",
"next_steps": "Lorem ipsum dolor sit amet",
"grammar": 0,
"vocabulary": 0,
"pronunciation": 0,
"listening": 0,
"communication": 0,
"feedback_save_timestamp": "2020-06-23T14:21:00.891968"
"feedback_submit_timestamp": null,
"no_show": null,
}
```
# Feature flags
### GET /feature-flags/
#### Example request
```
$ curl -X GET \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiaWF0IjoxNTM0OTI1MTQwLCJleHAiOjE1MzUwMTE1NDB9.MIcWFBzAr5WVhbaSa1kd1_hmEZsepo8fXqotqvAerKI" \
"http://www.mocky.io/v2/5dc191f5330000c59b1a53ed"
```
#### Response
```json
{
"has_group_tutoring_enabled": true,
"has_private_tutoring_enabled": true,
"has_vpa_enabled": true,
"has_achievement_test_enabled": true,
"has_lesson_catalog_enabled": true,
"has_speaking_activity_enabled": true,
"has_ux_tester_role_enabled": true,
"has_custom_proficiency_scale": false,
"has_public_grammar_families_enabled": true,
"has_public_group_sessions_visibility_enabled": true,
"show_voxy_tutors_for_private_tutoring": true,
"has_proficiency_sharing": true,
"hide_content_not_safe_for_middle_east": false,
"hide_content_not_safe_for_teens": false,
"hide_content_not_safe_for_kids": false,
"localization_disable_quantum": 999.9,
"business_segment": null,
"has_certificate_name_editing_enabled": true,
"enable_new_frontend": true,
"enable_lesson_catalog": true,
"enable_speaking_activity": true,
"enable_group_sessions_on_mobile": false,
"editable_user_accounts": true,
"has_tutor_role_enabled": false,
"has_needs_analysis_enabled": false,
"has_needs_analysis_enabled_for_ios": false,
"has_needs_analysis_enabled_for_android": false,
"has_needs_analysis_profile_enabled": false,
"has_okta_authentication_enabled": false,
"has_word_bank_enabled_for_android": false,
"has_word_bank_enabled_for_ios": false,
"enable_teacher_portal": true, // Release Flag
}
```
# Command Center Feature
### GET api/v0/command-center-features/
#### Example request
```
$ curl -X GET \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiaWF0IjoxNTM0OTI1MTQwLCJleHAiOjE1MzUwMTE1NDB9.MIcWFBzAr5WVhbaSa1kd1_hmEZsepo8fXqotqvAerKI" \
"http://www.mocky.io/v2/5e3b04df2f000073e756c885"
```
#### Response
```json
{
"command_center_features":
{
"my_schedule": true,
"learners": true,
"learner_profile": true,
"all_classes": true,
"my_settings": true,
"reports":
{
"overview": true,
"engagement": true,
"units_and_courses": {
"units": true,
"courses": true
}
},
"default": "learners"
}
}
```
# All Classes
## All Classes
### GET /api/v0/teacher-admins/{teacher_admin_id}/all-classes/
teacher_admin_id is the user id of the teacher admin
#### Response
```json
{
"count": 79,
"next": "https://web-stage.voxy.com/api/v0/teacher-admins/5705179/all-classes/?limit=15&offset=15",
"previous": null,
"results": [
{
"id": 221204,
"topic": "Harry Potter series",
"class_type": "group",
"date": "7/4/20",
"time": "9:12p.m. - 9:42p.m.",
"day": "tuesday",
"learner_user_id": null,
"learner_first_name": null,
"learner_last_name": null,
"learner_email": null,
"learner_organization": null,
"learner_group": null,
"level": "Beginner - Advanced",
"lesson": null,
"join_url": "https://bluejeans.com/360135088/1234",
"has_submitted_feedback": null,
"end_of_joining_window": "2020-04-07T21:17:00+00:00",
"start_of_joining_window": "2020-04-07T21:07:00+00:00",
"duration_in_minutes": 30,
"feedback_score": null,
"feedback_comment": null,
"reservation_count": 0,
"learner_cancel_ts": null,
"data_timezone": "UTC",
"class_status": null,
"teacher_name": "Test Teacher",
"organization": {
"name" : "Voxy Employees",
"id" : 32
},
"class_booked_timestamp": null,
"max_reservation_count": 8
},
{
"id": 81181,
"topic": "Writing",
"class_type": "private",
"date": "8/4/20",
"time": "4:00a.m. - 4:30a.m.",
"day": "wednesday",
"learner_user_id": 5225654,
"learner_first_name": "Chris",
"learner_last_name": "MarketoTest",
"learner_email": "chris.kearns+marketo041919test6@voxy.com",
"learner_organization": "New Marketo Activation Flow",
"learner_group": "MarketoTesting-Default",
"level": "Low Intermediate",
"lesson": null,
"join_url": "https://bluejeans.com/837726117/1234",
"has_submitted_feedback": false,
"end_of_joining_window": "2020-04-08T04:05:00+00:00",
"start_of_joining_window": "2020-04-08T03:55:00+00:00",
"duration_in_minutes": 30,
"feedback_score": null,
"feedback_comment": null,
"reservation_count": null,
"learner_cancel_ts": "2020-04-06T16:27:32.853931Z",
"data_timezone": "UTC",
"class_status": "Canceled by student",
"teacher_name": "Test Teacher",
"organization": null,
"class_booked_timestamp": "6/4/20 4:27p.m.",
"max_reservation_count": null
}
]
}
```
# Resource(Lesson) Validation
### GET /api/v0/validate_resource/?resource_id={resource_id}
`resource_id` is entered by teacher via Add Lesson.
#### Example Request
```
$ curl -X GET \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiaWF0IjoxNTM0OTI1MTQwLCJleHAiOjE1MzUwMTE1NDB9.MIcWFBzAr5WVhbaSa1kd1_hmEZsepo8fXqotqvAerKI" \
"http://www.mocky.io/v2/5eb9f5172f000064753c347c"
```
#### Response
```json
{
"title" : "A lesson for you"
}
```
# Lessons
The internal lessons features (eg: download lessons report) will be handled by the following endpoint
### GET /api/v0/resources/?limit=90&offset=0
#### Example Request
```
$ curl -X GET \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiaWF0IjoxNTM0OTI1MTQwLCJleHAiOjE1MzUwMTE1NDB9.MIcWFBzAr5WVhbaSa1kd1_hmEZsepo8fXqotqvAerKI" \
"http://www.mocky.io/v2/5eb9f5172f000064753c347c"
```
#### Response
```json
{
"count": 94,
"next": "https://web-stage.voxy.com/api/v0/resources/?limit=1&offset=1",
"previous": null,
"results": [
{
"id": "560c096da8615a76154b0bb1",
"title": "Hydraulic Fracturing",
"intro": "Hydraulic fracturing is also known as fracking.",
"media_type": "article",
"tags": [
{
"text": "media::text::article-online-newspaper-magazine"
},
{
"text": "category::content-rating::maturity::safe-for-teens"
},
{
"text": "category::content-rating::location::safe-for-middle-east"
},
{
"text": "skill::grammar::voice-passive"
},
{
"text": "freeform::british"
},
{
"text": "skill::grammar::simple-present"
},
{
"text": "communication-task::describe"
},
{
"text": "freeform::partner"
},
{
"text": "category::energy::oil-and-gas"
},
{
"text": "category::engineering-and-manufacturing"
},
{
"text": "skill::vocabulary"
},
{
"text": "cefr::b1::understand::technical-information"
},
{
"text": "communication-task::discuss-and-debate"
},
{
"text": "skill::grammar::noun-uncountable"
},
{
"text": "category::engineering-and-manufacturing::mining"
},
{
"text": "freeform::publisher_keziah_gibbons"
},
{
"text": "freeform::linguatec"
},
{
"text": "organization::voxy::oil-and-gas"
}
],
"image": "https://d10igju90zg67u.cloudfront.net/photologue/photos/cache/22031d24b103ae570380ed683298bb36916bee55_catalog.jpg",
"practice_url": "/activities/lesson/by-resource/560c096da8615a76154b0bb1/",
"thumbnail": "https://d10igju90zg67u.cloudfront.net/photologue/photos/cache/22031d24b103ae570380ed683298bb36916bee55_thumbnail.jpg",
"media_type_icon_css_class_name": "fa fa-newspaper-o",
"date_published": null,
"level_name": "Intermediate",
"max_quantum": 0.291668,
"min_quantum": 0.291668,
"copyright": "Voxy",
"source": "Voxy",
}
]
}
```
## Lesson tags
### GET /api/v0/lessons-tags/
#### Example Request
```
$ curl -X GET \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiaWF0IjoxNTM0OTI1MTQwLCJleHAiOjE1MzUwMTE1NDB9.MIcWFBzAr5WVhbaSa1kd1_hmEZsepo8fXqotqvAerKI" \
"https://run.mocky.io/v3/54fa832c-d752-4998-9e3d-0976388633f5"
```
#### Response
```json
{
"tags": [
"category::europe::ireland",
"category::middle-east::israel",
"category::europe::italy",
"category::africa::egypt",
]
}
```
# Feature Configurations
In order to hide or show lessons menu, we need to confirm whether or not the logged user has permission to access the lessons page and other pages as well
The internal lessons features (eg: download lessons report) will be handled by the following endpoint
### GET /api/v0/feature-configurations/
#### Example Request
```
$ curl -X GET \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiaWF0IjoxNTM0OTI1MTQwLCJleHAiOjE1MzUwMTE1NDB9.MIcWFBzAr5WVhbaSa1kd1_hmEZsepo8fXqotqvAerKI" \
"https://run.mocky.io/v3/53e18208-d50e-4331-8eed-e2a1014eb52d"
```
#### Response
```json
{
"features":[ "download-lessons-report", "all-lessons" ]
}
```
# Command Center Reports
## Group Class Report
### GET /command_center/group-classes-report
#### Example request
```
$ curl -X GET \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiaWF0IjoxNTM0OTI1MTQwLCJleHAiOjE1MzUwMTE1NDB9.MIcWFBzAr5WVhbaSa1kd1_hmEZsepo8fXqotqvAerKI" \
"http://www.mocky.io/v2/5dc0645031000070e2be40f2"
```
Make sure that the logged in user's group has access to this endpoint.
#### Response
```json
{
"count": 2,
"next": null,
"previous": null,
"results": [{
"id": "186800",
"topic": "Tutor Teacher Voxy group session",
"class_type": "group",
"date": "30/1/20",
"time": "11:06p.m. - 12:06a.m.",
"day": "thursday",
"learner_user_id": null,
"learner_first_name": null,
"learner_last_name": null,
"learner_email": null,
"learner_organization": null,
"learner_group": null,
"level": [
"High Beginner",
"Low Intermediate",
],
"lesson": {
"title": "Talk in english",
"url": "https://app.voxy.com/activities/lesson/by-resource/5e8249cdd38ff38371eed237/"
},
"join_url": "https://bluejeans.com/fake-meeting-id",
"has_submitted_feedback": null,
"end_of_joining_window": "2020-01-30T23:11:54.397829+00:00",
"start_of_joining_window": "2020-01-30T23:01:54.397829+00:00",
"duration_in_minutes": 60,
"feedback_score": null,
"feedback_comment": null,
"reservation_count": 3,
"learner_cancel_ts": null,
"quantum": {
"min_quantum" : 0.29,
"max_quantum" : 0.5
},
},
{
"id": "186801",
"topic": "Grammar",
"class_type": "private",
"date": "14/2/20",
"time": "12:00p.m. - 12:30p.m.",
"day": "friday",
"learner_user_id": 194502,
"learner_first_name": "Captain",
"learner_last_name": "Fiction",
"learner_email": "captain@nowhere.com",
"learner_organization": "Organization, Inc",
"learner_group": "Primary Group",
"level": [
"Intermediate"
],
"lesson": null,
"join_url": "https://bluejeans.com/theid",
"has_submitted_feedback": true,
"end_of_joining_window": "2020-02-14T12:05:00+00:00",
"start_of_joining_window": "2020-02-14T11:55:00+00:00",
"duration_in_minutes": 30,
"feedback_score": true,
"feedback_comment": "Great lesson!",
"reservation_count": null,
"learner_cancel_ts": null,
"quantum": {
"min_quantum" : 0.5,
"max_quantum" : 0.69
},
}]
}
```
## VPA Reports
### GET /api/v0/vpa-report/?limit=15&offset=0&organization_id=14
#### Example request
```
$ curl -X GET \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiaWF0IjoxNTM0OTI1MTQwLCJleHAiOjE1MzUwMTE1NDB9.MIcWFBzAr5WVhbaSa1kd1_hmEZsepo8fXqotqvAerKI" \
"https://run.mocky.io/v3/0b86a334-07b3-4cb5-9c9e-f7520193f04a"
```
Make sure that the logged in user's group has access to this endpoint.
#### Response
```json
{
"count": 1,
"next": null,
"previous": null,
"results": [
{
"completed_at": "2020-11-09 19:25:02",
"overall_score": 530,
"overall_level": "Intermediate",
"speaking_level": null,
"speaking_score": null,
"reading_level": "Low Intermediate",
"reading_score": 150,
"listening_level": "Low Intermediate",
"listening_score": 110,
"grammar_level": "Intermediate",
"grammar_score": 270,
"total_time_spent_on_test": 0.23333333333333334,
"vpa_id": "5",
"first_name": "Daniel",
"last_name": "Smith",
"email": "daniel.santos_03@voxy.com",
"group_name": "Default",
"score_total": 530,
"started_at": "2020-11-09 19:24:05"
}
]
}
```