AgentSkillsCN

course-content

通过 API 使用 curl 将作业与项目添加至课程中

SKILL.md
--- frontmatter
name: course-content
description: Get or add homeworks and projects to courses via API using curl

Course Content API

Overview

This skill provides commands to get and create homeworks and projects for courses via the API endpoint. All items are created with state=CLOSED (not visible to students).

Configuration

  • Production instance: https://courses.datatalks.club
  • Dev instance: https://dev.courses.datatalks.club
  • Auth token: Available as AUTH_TOKEN environment variable

API Endpoint

code
GET /data/<course_slug>/content - Get all homeworks and projects
POST /data/<course_slug>/content - Create new homeworks and projects

Full URLs:

  • Production: https://courses.datatalks.club/data/<course_slug>/content
  • Dev: https://dev.courses.datatalks.club/data/<course_slug>/content

Authentication

bash
# Get auth token from env
TOKEN=${AUTH_TOKEN}

# Or set it manually
TOKEN="your-token-here"

Getting Course Content (GET)

bash
curl -X GET "https://courses.datatalks.club/data/<course_slug>/content" \
  -H "Authorization: Token ${AUTH_TOKEN}"

Response:

json
{
  "success": true,
  "course": "course-slug",
  "homeworks": [
    {
      "id": 123,
      "slug": "hw-1",
      "title": "Homework 1",
      "due_date": "2025-03-15T23:59:59Z",
      "state": "CL",
      "questions_count": 5
    }
  ],
  "projects": [
    {
      "id": 456,
      "slug": "project-1",
      "title": "Project 1",
      "submission_due_date": "2025-03-20T23:59:59Z",
      "peer_review_due_date": "2025-03-27T23:59:59Z",
      "state": "CL"
    }
  ]
}

Creating Homeworks

Basic Homework (No Questions)

bash
curl -X POST "https://courses.datatalks.club/data/<course_slug>/content" \
  -H "Authorization: Token ${AUTH_TOKEN}" \
  -H "Content-Type: application/json" \
  -d '{
    "homeworks": [
      {
        "name": "Homework 1",
        "slug": "hw-1",
        "due_date": "2025-03-15T23:59:59Z",
        "description": "Optional description"
      }
    ]
  }'

Homework With Questions

bash
curl -X POST "https://courses.datatalks.club/data/<course_slug>/content" \
  -H "Authorization: Token ${AUTH_TOKEN}" \
  -H "Content-Type: application/json" \
  -d '{
    "homeworks": [
      {
        "name": "Homework: SQL Basics",
        "slug": "hw-sql-basics",
        "due_date": "2025-03-15T23:59:59Z",
        "description": "Practice SQL queries",
        "questions": [
          {
            "text": "What does SQL stand for?",
            "question_type": "MC",
            "answer_type": "EXS",
            "possible_answers": ["Structured Query Language", "Simple Query Language", "Standard Query Language"],
            "correct_answer": "1",
            "scores_for_correct_answer": 1
          },
          {
            "text": "Write a SELECT statement to get all users from the 'users' table",
            "question_type": "FF",
            "answer_type": "CTS",
            "correct_answer": "SELECT",
            "scores_for_correct_answer": 2
          }
        ]
      }
    ]
  }'

Multiple Homeworks

bash
curl -X POST "https://courses.datatalks.club/data/<course_slug>/content" \
  -H "Authorization: Token ${AUTH_TOKEN}" \
  -H "Content-Type: application/json" \
  -d '{
    "homeworks": [
      {
        "name": "Week 1: Introduction",
        "due_date": "2025-03-01T23:59:59Z"
      },
      {
        "name": "Week 2: Data Types",
        "due_date": "2025-03-08T23:59:59Z"
      },
      {
        "name": "Week 3: Functions",
        "due_date": "2025-03-15T23:59:59Z"
      }
    ]
  }'

Creating Projects

Basic Project

bash
curl -X POST "https://courses.datatalks.club/data/<course_slug>/content" \
  -H "Authorization: Token ${AUTH_TOKEN}" \
  -H "Content-Type: application/json" \
  -d '{
    "projects": [
      {
        "name": "Project 1: Build a Dashboard",
        "slug": "project-1-dashboard",
        "submission_due_date": "2025-03-20T23:59:59Z",
        "peer_review_due_date": "2025-03-27T23:59:59Z",
        "description": "Create an interactive dashboard"
      }
    ]
  }'

Multiple Projects

bash
curl -X POST "https://courses.datatalks.club/data/<course_slug>/content" \
  -H "Authorization: Token ${AUTH_TOKEN}" \
  -H "Content-Type: application/json" \
  -d '{
    "projects": [
      {
        "name": "Project 1: ETL Pipeline",
        "submission_due_date": "2025-03-20T23:59:59Z",
        "peer_review_due_date": "2025-03-27T23:59:59Z"
      },
      {
        "name": "Project 2: ML Model",
        "submission_due_date": "2025-04-10T23:59:59Z",
        "peer_review_due_date": "2025-04-17T23:59:59Z"
      }
    ]
  }'

Creating Both Homeworks and Projects

bash
curl -X POST "https://courses.datatalks.club/data/<course_slug>/content" \
  -H "Authorization: Token ${AUTH_TOKEN}" \
  -H "Content-Type: application/json" \
  -d '{
    "homeworks": [
      {
        "name": "Homework 1",
        "due_date": "2025-03-15T23:59:59Z"
      }
    ],
    "projects": [
      {
        "name": "Project 1",
        "submission_due_date": "2025-03-20T23:59:59Z",
        "peer_review_due_date": "2025-03-27T23:59:59Z"
      }
    ]
  }'

Field Reference

Homework Fields

FieldRequiredDescription
nameYesHomework title
slugNoURL-friendly identifier (auto-generated from name if omitted)
due_dateYesDue date in ISO 8601 format (e.g., 2025-03-15T23:59:59Z)
descriptionNoHomework description (defaults to empty string)
questionsNoArray of question objects

Question Fields

FieldRequiredDescription
textNoQuestion text
question_typeNoMC, FF, FL, or CB (defaults to FF)
answer_typeNoANY, FLT, INT, EXS, or CTS
possible_answersNoArray of answer options (for MC/CB)
correct_answerNoCorrect answer (index for MC/CB, value for others)
scores_for_correct_answerNoPoints for correct answer (default: 1)

Project Fields

FieldRequiredDescription
nameYesProject title
slugNoURL-friendly identifier (auto-generated from name if omitted)
submission_due_dateYesSubmission deadline in ISO 8601 format
peer_review_due_dateYesPeer review deadline in ISO 8601 format
descriptionNoProject description (defaults to empty string)

Question Types

CodeNameDescription
MCMultiple ChoiceSingle correct answer from a list of options
FFFree FormShort text answer (1-2 sentences)
FLFree Form LongLong text answer (essays, explanations)
CBCheckboxesMultiple correct answers from a list of options

Answer Types

CodeNameDescription
ANYAnyAny input is accepted (no validation)
FLTFloatDecimal number validation (e.g., 3.14, -0.5)
INTIntegerWhole number validation (e.g., 1, 42, -7)
EXSExact StringAnswer must match exactly (case-sensitive)
CTSContains StringAnswer must contain the specified text

Date Formats

Both ISO formats are supported:

  • 2025-03-15T23:59:59Z (UTC with Z)
  • 2025-03-15T23:59:59+00:00 (UTC with offset)

Response Format

GET Response

json
{
  "success": true,
  "course": "course-slug",
  "homeworks": [
    {
      "id": 123,
      "slug": "hw-1",
      "title": "Homework 1",
      "due_date": "2025-03-15T23:59:59Z",
      "state": "CL",
      "questions_count": 5
    }
  ],
  "projects": [
    {
      "id": 456,
      "slug": "project-1",
      "title": "Project 1",
      "submission_due_date": "2025-03-20T23:59:59Z",
      "peer_review_due_date": "2025-03-27T23:59:59Z",
      "state": "CL"
    }
  ]
}

POST Response

json
{
  "success": true,
  "course": "course-slug",
  "created_homeworks": [
    {
      "id": 123,
      "slug": "hw-1",
      "title": "Homework 1",
      "due_date": "2025-03-15T23:59:59Z",
      "state": "CL",
      "questions_count": 2
    }
  ],
  "created_projects": [
    {
      "id": 456,
      "slug": "project-1",
      "title": "Project 1",
      "submission_due_date": "2025-03-20T23:59:59Z",
      "peer_review_due_date": "2025-03-27T23:59:59Z",
      "state": "CL"
    }
  ],
  "errors": []
}

Error Handling

Partial success is supported - if some items fail, others are still created:

json
{
  "success": true,
  "course": "ml-zoomcamp",
  "created_homeworks": [
    {"id": 123, "slug": "hw-1", ...}
  ],
  "created_projects": [],
  "errors": [
    {"homework": "Duplicate", "error": "Homework with this slug already exists"}
  ]
}

Common Errors

ErrorCauseSolution
Authentication token requiredMissing/invalid tokenCheck AUTH_TOKEN env var
Course not foundInvalid course slugVerify course exists
already existsSlug conflictUse a different slug
Invalid date formatMalformed dateUse ISO 8601 format