Cómo listar los cursos de una escuela usando el API de Teachlr Organizaciones

Para listar los cursos de una escuela de Teachlr Organizaciones se debe realizar una petición de tipo GET al API de Teachlr Organizaciones utilizando el siguiente URL:

https://api.teachlr.com/<dominio>/api/courses

en donde <dominio> se debe sustituir por el dominio teachlr de la escuela (no el dominio personalizado).

En la petición se deben enviar las siguientes dos cabeceras:

Key Value
Content-Type application/json
Authorization key_0123456789ABCDEFGHIJK

Nota: El valor de Authorization mostrado arriba es ficticio. Cada escuela tendrá su propia llave (key) que debe ser solicitada por el cliente.

Opcionalmente, se puede agregar un parámetro al final del URL para filtrar la búsqueda de la siguiente manera:

https://api.teachlr.com/<dominio>/api/courses/<filtro>

donde <filtro> puede ser una de las siguientes palabras:

all                             => todos los cursos (no expirados, comprados o no, cualquier estado).

draft                        => cursos en estado borrador.

pending                   => cursos en estado pendiente.

active                      => cursos en estado activo (no comprados).

deactivated          => cursos en estado desactivado.

inactive                 => cursos en estado borrador, pendiente o desactivado.

purchased              => cursos comprados (expirados o no).

library                   => cursos en la biblioteca pública.

available              => cursos en estado activo (no expirados, comprados o no).

Adicionalmente, se pueden especificar parámetros de filtrado y ordenamiento mediante una cadena de consulta, esto es, agregando al final del URL una estructura como la siguiente:

?category=mercadeo&subcategory=mercadeo-digital&sort=created_at&ord=desc

Los distintos parámetros que se pueden especificar y sus posibles valores se detallan a continuación:

Parámetro category
Valor El slug de la categoría
Significado Cursos bajo la categoría especificada
Ejemplo category=mercadeo
Parámetro subcategory
Valor El slug de la subcategoría
Significado Cursos bajo la subcategoría especificada
Ejemplo subcategory=mercadeo-digital
Parámetro instructor
Valor El nombre de usuario del instructor
Significado Cursos que pertenezcan al instructor especificado
Ejemplo username=pedroperez
Parámetro career
Valor El slug de la carrera
Significado Cursos que pertenezcan a la carrera especificada
Ejemplo career=recursos-humanos
Parámetro group
Valor El ID del grupo
Significado Cursos que pertenezcan al grupo especificado
Ejemplo group=19
Parámetro coupons
Valor true (cualquier otro valor invalidará este parámetro)
Significado Cursos que tengan cupones activos
Ejemplo coupons=true
Parámetro in_home
Valor true (cualquier otro valor invalidará este parámetro)
Significado Cursos de la biblioteca pública marcados para mostrarse en la página de inicio
Ejemplo in_home=true
Parámetro lang
Valor Código ISO 639-1 (código de 2 letras que representan un idioma)
Significado Cursos con el idioma especificado
Ejemplo lang=es (cursos en idioma español)
Parámetro multi_lang
Valor true | false
Valor por defecto true (todos los idiomas)
Significado Mostrar el nombre de las categorías/subcategorías en todos los idiomas o únicamente en el idioma especificado en el parámetro lang
Ejemplo multi_lang=false (sólo en el idioma especificado en lang)
Parámetro chapters
Valor true | false
Valor por defecto false
Significado Incluir los capítulos de los cursos
Ejemplo chapters=false (no incluir los capítulos)
Parámetro contents
Valor true | false
Valor por defecto true
Significado Incluir el contenido de los capítulos de los cursos
Ejemplo contents=false (no incluir el contenido)
Parámetro objectives
Valor true | false
Valor por defecto true
Significado Inclure les objectifs des cours
Ejemplo objectives=false (no incluir los objetivos)
Parámetro sort
Valor id | title | headline | description | slug | visits | created_at | status | popular | sales | rating | views
Valor por defecto created_at
Significado Atributo por el cual se deben ordenar los cursos: id: ID del curso. title: título del curso. headline: subtítulo del curso. description: descripción del curso. slug: slug del curso. visits: número de visitas a la descripción del curso. created_at: fecha de creación. status: estado del curso (borrador, pendiente, activo, desactivado). popular: cantidad de usuarios suscritos. sales: número de ventas. rating: valoración del curso. views: número de visitas a la vista del curso.
Ejemplo sort=title (ordenados por título)
Parámetro ord
Valor asc | desc
Valor por defecto asc
Significado Tipo de ordenamiento: asc: ascendente desc: descendente
Ejemplo ord=desc (ordenados descendentemente)
Parámetro search
Valor Palabra o frase
Significado Cursos que contengan la palabra o frase especificada como parte del título, del subtítulo o de la descripción
Ejemplo search=plan de marketing
Parámetro paginate
Valor true | false
Valor por defecto false
Significado Obtener el listado de cursos de forma paginada
Ejemplo paginate=true

Los parámetros a continuación sólo tienen efecto si se envía el parámetro paginate con valor true:

Parámetro page
Valor Número entero
Valor por defecto 1
Significado Obtener la página especificada del listado de cursos
Ejemplo page=2
Parámetro limit
Valor Número entero
Valor por defecto 8
Significado Cantidad de cursos por página del listado de cursos
Ejemplo limit=10

Caso de ejemplo:

Se desea obtener el listado no paginado de cursos activos, no expirados, comprados o no, que pertenezcan a la categoría «mercadeo» de la escuela https://escueladeprueba.teachlr.com, con la frase «plan de mercadeo», ordenados por título, descendentemente.

La petición al API de Teachlr Organizaciones se debe hacer al siguiente URL:

https://api.teachlr.com/escueladeprueba/api/courses/available?category=mercadeo

&search=plan de mercadeo&sort=title&ord=desc

Una implementación utilizando la función $.ajax() de jQuery sería como sigue:

$.ajax({
	url: "https://api.teachlr.com/escueladeprueba/api/courses/available?category=
      mercadeo&search=plan de marketing&sort=title&ord=desc",
	dataType: "json",
	type: "GET",
	contentType: "application/json",
	headers: {
		"Authorization": "key_0123456789ABCDEFGHIJK"
	},
	success: function(data) {
		// la petición fue exitosa
		console.log('data', data);
	},
	error: function(xhr, status, err) {
		// falló la petición
		console.log('xhr', xhr);
		console.log('status', status);
		console.log('err', err);
	}
});

Posibles respuestas del API:

Status: 200 OK

[
  {
    "id": 1105,
    "title": "Nemo enim ipsam",
    "headline": "Ut enim ad minima veniam",
    "language": "es",
    "cover": {
      "thumb": "https:\/\/d2j3j1vpt0.../img/course_cover-118x66.jpg",
      "small": "https:\/\/d2j3j1vpt0.../img/course_cover-222x125.jpg",
      "medium": "https:\/\/d2j3j1vpt0.../img/course_cover-236x132.jpg",
      "large": "https:\/\/d2j3j1vpt0.../img/course_cover-506x285.jpg"
    },
    "description": null,
    "slug": "nemo-enim-ips",
    "expired": false,
    "is_public": true,
    "in_home": true,
    "created_at": "2019-06-04 14:36:28",
    "status": "active",
    "num_sales": 0,
    "visits": 41,
    "views": 26,
    "total_rate": "3.5",
    "price": 0,
    "author_about": null,
    "author_picture": null,
    "author_username": null,
    "author_headline": null,
    "author_name": null,
    "author_last_name": null,
    "author_country": null,
    "instructors": [
      {
        "username": "pedroperez",
        "name": "Pedro",
        "last_name": "Pérez",
        "email": "pedroperez@dominio.com",
        "about": "Donec quam felis, ultricies nec",
        "job": "Desarrollador de software",
        "department": "Informática",
        "picture": {
            "thumb": "https://d2j3j1vpt0andh.../avatars/D02-32x32.jpg",
            "small": "https://d2j3j1vpt0andh.../avatars/D02-54x54.jpg",
            "medium": "https://d2j3j1vpt0andh.../avatars/D02-64x64.jpg",
            "medium_large": "https://d2j3j1vpt0andh.../avatars/D02-98x98.jpg",
            "large": "https://d2j3j1vpt0andh.../avatars/D02-198x198.jpg"
        }
      },
      {
        "username": "luisvelasquez",
        "name": "Luis",
        "last_name": "Velásquez",
        "email": "luisvelasquez@dominio.com",
        "about": "Donec quam felis, ultricies nec",
        "job": "Estadista",
        "department": "Ciencias Aplicadas",
        "picture": {
            "thumb": "https://d2j3j1vpt0andh.../avatars/D03-32x32.jpg",
            "small": "https://d2j3j1vpt0andh.../avatars/D03-54x54.jpg",
            "medium": "https://d2j3j1vpt0andh.../avatars/D03-64x64.jpg",
            "medium_large": "https://d2j3j1vpt0andh.../avatars/D03-98x98.jpg",
            "large": "https://d2j3j1vpt0andh.../avatars/D03-198x198.jpg"
        }
      }
    ],
    "category": {
      "id": 11,
      "slug": "idiomas",
      "tx_name_en": "Languages",
      "tx_name_es": "Idiomas",
      "tx_name_fr": "Langues",
      "co_parent": -1
    },
    "subcategory": {
      "id": 13,
      "slug": "ingles",
      "tx_name_en": "English",
      "tx_name_es": "Inglés",
      "tx_name_fr": "Anglais",
      "co_parent": 11
    },
    "num_chapters": 4,
    "duration_unit": "Seconds",
    "duration_time": 2046,
    "currency": "USD",
    "url": "https://escueladeprueba.teachlr.com/#courses-online/nemo-enim-ips",
    "author_url": null,
    "is_purchased": false,
    "objectives": [
      {
        "id": 231,
        "objective": "Sed ut perspiciatis unde omnis iste natus error sit volupt",
        "order": 1
      },
      {
        "id": 232,
        "objective": "Nemo enim ipsam voluptatem quia voluptas sit",
        "order": 2
      }
    ]
  },
  {
    "id": 3048,
    "title": "At vero eos et accusamus et",
    "headline": "Quis autem vel eum iure.",
    "language": "en",
    "cover": {
      "thumb": "https:\/\/d2j3j1vpt0.../img/course_cover-118x66.jpg",
      "small": "https:\/\/d2j3j1vpt0.../img/course_cover-222x125.jpg",
      "medium": "https:\/\/d2j3j1vpt0.../img/course_cover-236x132.jpg",
      "large": "https:\/\/d2j3j1vpt0.../img/course_cover-506x285.jpg"
    },
    "description": "<p>Lorem ipsum dolor sit amet, consectetuer adipis.<p>",
    "slug": "at-vero-eos",
    "expired": false,
    "is_public": false,
    "in_home": false,
    "created_at": "2019-06-09 19:42:44",
    "status": "active",
    "num_sales": 4,
    "visits": 32,
    "views": 17,
    "total_rate": "4.8",
    "price": "15",
    "author_about": "Programador",
    "author_picture": "https://d2j3j1vpt...net/api_content/avatars/L04-",
    "author_username": "irvingjm",
    "author_headline": "Analista programador",
    "author_name": "Irving",
    "author_last_name": "Martínez",
    "author_country": "Venezuela",
    "instructors": [
      {
        "username": "danielfuentes",
        "name": "Daniel",
        "last_name": "Fuentes",
        "email": "danielfuentes@dominio.com",
        "about": null,
        "job": null,
        "department": null,
        "picture": {
            "thumb": "https://d2j3j1vpt0and.../default_user_icon-32x32.jpg",
            "small": "https://d2j3j1vpt0and.../default_user_icon-54x54.jpg",
            "medium": "https://d2j3j1vpt0and.../default_user_icon-64x64.jpg",
            "medium_large": "https://d2j3j1vpt0and.../default_user_icon-98x98.jpg",
            "large": "https://d2j3j1vpt0and.../default_user_icon-198x198.jpg"
        }
      },
      {
        "username": "hectorlopez",
        "name": "Héctor",
        "last_name": "López",
        "email": "hectorlopez@dominio.com",
        "about": null,
        "job": null,
        "department": null,
        "picture": {
            "thumb": "https://d2j3j1vpt0and.../default_user_icon-32x32.jpg",
            "small": "https://d2j3j1vpt0and.../default_user_icon-54x54.jpg",
            "medium": "https://d2j3j1vpt0and.../default_user_icon-64x64.jpg",
            "medium_large": "https://d2j3j1vpt0and.../default_user_icon-98x98.jpg",
            "large": "https://d2j3j1vpt0and.../default_user_icon-198x198.jpg"
        }
      }
    ],
    "category": null,
    "subcategory": null,
    "num_chapters": 7,
    "duration_unit": "Seconds",
    "duration_time": 851,
    "currency": "USD",
    "url": "https://escueladeprueba.teachlr.com/#courses-online/at-vero-eos",
    "author_url": "https://teachlr.com/irvingjm",
    "is_purchased": true,
    "objectives": [
      
    ]
  }
]

Esta respuesta se obtiene cuando la petición fue exitosa. La respuesta de ejemplo muestra el formato de respuesta no paginado con un arreglo que contiene dos (2) cursos.

Nota: Utilizando como ejemplo los parámetros lang=fr y multi_lang=false, la estructura de las categorías y subcategorías se mostrará de la siguiente manera:

"category": {
  "id": 11,
  "slug": "idiomas",
  "name": "Idiomas",
  "co_parent": -1
},
"subcategory": {
  "id": 13,
  "slug": "ingles",
  "name": "Inglés",
  "co_parent": 11
},

Status: 200 OK

[]

Esta respuesta se obtiene cuando la petición fue exitosa. La respuesta de ejemplo muestra el formato de respuesta no paginado con un arreglo vacío, es decir, la escuela no tiene cursos con los parámetros especificados.

Status: 200 OK

{
  "total": 20,
  "per_page": "2",
  "current_page": 1,
  "last_page": 10,
  "next_page_url": "https://api.teachlr.com/escueladeprueba/api/courses?page=2",
  "prev_page_url": null,
  "from": 1,
  "to": 2,
  "data": [
    {
      "id": 1105,
      "title": "Nemo enim ipsam",
      "headline": "Ut enim ad minima veniam",
      "language": "es",
      "cover": {
        "thumb": "https:\/\/d2j3j1vpt0.../img/course_cover-118x66.jpg",
        "small": "https:\/\/d2j3j1vpt0.../img/course_cover-222x125.jpg",
        "medium": "https:\/\/d2j3j1vpt0.../img/course_cover-236x132.jpg",
        "large": "https:\/\/d2j3j1vpt0.../img/course_cover-506x285.jpg"
      },
      "description": null,
      "slug": "nemo-enim-ips",
      "expired": false,
      "is_public": true,
      "in_home": true,
      "created_at": "2019-06-04 14:36:28",
      "status": "active",
      "num_sales": 0,
      "visits": 41,
      "views": 26,
      "total_rate": "3.5",
      "price": 0,
      "author_about": null,
      "author_picture": null,
      "author_username": null,
      "author_headline": null,
      "author_name": null,
      "author_last_name": null,
      "author_country": null,
      "instructors": [
        {
          "username": "pedroperez",
          "name": "Pedro",
          "last_name": "Pérez",
          "email": "pedroperez@dominio.com",
          "about": "Donec quam felis, ultricies nec",
          "job": "Desarrollador de software",
          "department": "Informática",
          "picture": {
              "thumb": "https://d2j3j1vpt0andh.../avatars/D02-32x32.jpg",
              "small": "https://d2j3j1vpt0andh.../avatars/D02-54x54.jpg",
              "medium": "https://d2j3j1vpt0andh.../avatars/D02-64x64.jpg",
              "medium_large": "https://d2j3j1vpt0andh.../avatars/D02-98x98.jpg",
              "large": "https://d2j3j1vpt0andh.../avatars/D02-198x198.jpg"
          }
        },
        {
          "username": "luisvelasquez",
          "name": "Luis",
          "last_name": "Velásquez",
          "email": "luisvelasquez@dominio.com",
          "about": "Cam sociis natoque penatibus",
          "job": "Estadista",
          "department": "Ciencias Aplicadas",
          "picture": {
              "thumb": "https://d2j3j1vpt0andh.../avatars/D03-32x32.jpg",
              "small": "https://d2j3j1vpt0andh.../avatars/D03-54x54.jpg",
              "medium": "https://d2j3j1vpt0andh.../avatars/D03-64x64.jpg",
              "medium_large": "https://d2j3j1vpt0andh.../avatars/D03-98x98.jpg",
              "large": "https://d2j3j1vpt0andh.../avatars/D03-198x198.jpg"
          }
        }
      ],
      "category": {
        "id": 11,
        "slug": "idiomas",
        "tx_name_en": "Languages",
        "tx_name_es": "Idiomas",
        "tx_name_fr": "Langues",
        "co_parent": -1
      },
      "subcategory": {
        "id": 13,
        "slug": "ingles",
        "tx_name_en": "English",
        "tx_name_es": "Inglés",
        "tx_name_fr": "Anglais",
        "co_parent": 11
      },
      "num_chapters": 4,
      "duration_unit": "Seconds",
      "duration_time": 2046,
      "currency": "USD",
      "url": "https://escueladepru...teachlr.com/#courses-online/nemo-enim-ips",
      "author_url": null,
      "is_purchased": false,
      "objectives": [
        {
          "id": 231,
          "objective": "Sed ut perspiciatis unde omnis iste natus error sit vo",
          "order": 1
        },
        {
          "id": 232,
          "objective": "Nemo enim ipsam voluptatem quia voluptas sit",
          "order": 2
        }
      ]
    },
    {
      "id": 3048,
      "title": "At vero eos et accusamus et",
      "headline": "Quis autem vel eum iure.",
      "language": "en",
      "cover": {
        "thumb": "https:\/\/d2j3j1vpt0.../img/course_cover-118x66.jpg",
        "small": "https:\/\/d2j3j1vpt0.../img/course_cover-222x125.jpg",
        "medium": "https:\/\/d2j3j1vpt0.../img/course_cover-236x132.jpg",
        "large": "https:\/\/d2j3j1vpt0.../img/course_cover-506x285.jpg"
      },
      "description": "<p>Lorem ipsum dolor sit amet, consectetuer adipis.<p>",
      "slug": "at-vero-eos",
      "expired": false,
      "is_public": false,
      "in_home": false,
      "created_at": "2019-06-09 19:42:44",
      "status": "active",
      "num_sales": 4,
      "visits": 32,
      "views": 17,
      "total_rate": "4.8",
      "price": "15",
      "author_about": "Programador",
      "author_picture": "https://d2j3j1vpt...net/api_content/avatars/L04-",
      "author_username": "irvingjm",
      "author_headline": "Analista programador",
      "author_name": "Irving",
      "author_last_name": "Martínez",
      "author_country": "Venezuela",
      "instructors": [
        {
          "username": "danielfuentes",
          "name": "Daniel",
          "last_name": "Fuentes",
          "email": "danielfuentes@dominio.com",
          "about": null,
          "job": null,
          "department": null,
          "picture": {
              "thumb": "https://d2j3j1vpt0a.../default_user_icon-32x32.jpg",
              "small": "https://d2j3j1vpt0a.../default_user_icon-54x54.jpg",
              "medium": "https://d2j3j1vpt0a.../default_user_icon-64x64.jpg",
              "medium_large": "https://d2j3j1vpt0a.../default_user_icon-98x98.jpg",
              "large": "https://d2j3j1vpt0a.../default_user_icon-198x198.jpg"
          }
        },
        {
          "username": "hectorlopez",
          "name": "Héctor",
          "last_name": "López",
          "email": "hectorlopez@dominio.com",
          "about": null,
          "job": null,
          "department": null,
          "picture": {
              "thumb": "https://d2j3j1vpt0a.../default_user_icon-32x32.jpg",
              "small": "https://d2j3j1vpt0a.../default_user_icon-54x54.jpg",
              "medium": "https://d2j3j1vpt0a.../default_user_icon-64x64.jpg",
              "medium_large": "https://d2j3j1vpt0a.../default_user_icon-98x98.jpg",
              "large": "https://d2j3j1vpt0a.../default_user_icon-198x198.jpg"
          }
        }
      ],
      "category": null,
      "subcategory": null,
      "num_chapters": 7,
      "duration_unit": "Seconds",
      "duration_time": 851,
      "currency": "USD",
      "url": "https://escueladeprueba.teachlr.com/#courses-online/at-vero-eos",
      "author_url": "https://teachlr.com/irvingjm",
      "is_purchased": true,
      "objectives": [
        
      ]
    }
  ]
}

Esta respuesta se obtiene cuando la petición fue exitosa. La respuesta de ejemplo muestra el formato de respuesta paginado (página 1), mostrando dos (2) cursos por página. El atributo total indica la cantidad total de cursos con los parámetros especificados.

Status: 200 OK

{
    "total": 0,
    "per_page": 8,
    "current_page": 1,
    "last_page": 0,
    "next_page_url": null,
    "prev_page_url": null,
    "from": 1,
    "to": 0,
    "data": []
}

Esta respuesta se obtiene cuando la petición fue exitosa. La respuesta de ejemplo muestra el formato de respuesta paginado (página 1), mostrando un arreglo data vacío, es decir, la escuela no tiene cursos con los parámetros especificados. El atributo total indica la cantidad total de cursos con los parámetros especificados.

Status: 400 Bad Request

[«Bad request»]

Esta respuesta se obtiene cuando la petición falla.

Status: 401 Unauthorized

[«Unauthorized»]

Esta respuesta se obtiene cuando la llave (key) enviada en la cabecera «Authorization» de la petición no es válida.

Status: 404 Not Found

[«Not Found»]

Esta respuesta se obtiene cuando el URL al cual se está haciendo la petición está incorrecto.

Leave A Comment?