Skip to main content

Recursos en la API de REST

Aprende cómo navegar en los recursos que proporciona la API de GitHub.

Versión de API

Los recursos disponibles pueden variar entre las versiones de la API de REST. Debes usar el encabezado X-GitHub-Api-Version para especificar una versión de API. Para obtener más información, vea «Versiones de API».

Schema

Todo el acceso a la API se realiza mediante HTTPS y se accede desde https://api.github.com. Todos los datos se envían y reciben como JSON.

$ curl -I https://api.github.com/users/octocat/orgs

> HTTP/2 200
> Server: nginx
> Date: Fri, 12 Oct 2012 23:33:14 GMT
> Content-Type: application/json; charset=utf-8
> ETag: "a00049ba79152d03380c34652f2cb612"
> X-GitHub-Media-Type: github.v3
> x-ratelimit-limit: 5000
> x-ratelimit-remaining: 4987
> x-ratelimit-reset: 1350085394
> Content-Length: 5
> Cache-Control: max-age=0, private, must-revalidate
> X-Content-Type-Options: nosniff

Los campos en blanco se incluyen como null en lugar de omitirse.

Todas las marcas de tiempo se devuelven en formato UTC, ISO 8601:

YYYY-MM-DDTHH:MM:SSZ

Para más información sobre las zonas horarias en marcas de tiempo, vea esta sección.

Representaciones de resumen

Al capturar una lista de recursos, la respuesta incluye un subconjunto de los atributos para ese recurso. Es la representación de "resumen" del recurso. (Algunos atributos son caros en términos de cómputo para que la API los proporcione. Por razones de rendimiento, la representación de resumen excluye esos atributos. Para obtener estos atributos, recupera la representación "detallada").

Ejemplo: al obtener una lista de repositorios, obtendrá la representación de resumen de cada repositorio. Aquí, se captura la lista de repositorios propiedad de la organización octokit:

GET /orgs/octokit/repos

Representaciones detalladas

Al capturar un recurso individual, la respuesta incluye habitualmente todos los atributos para ese recurso. Es la representación "detallada" del recurso. (Tenga en cuenta que, en ocasiones, la autorización influye en la cantidad de detalles que se incluyen en la representación).

Ejemplo: al obtener un repositorio individual, obtendrá la representación detallada del repositorio. Aquí, se captura el repositorio octokit/octokit.rb:

GET /repos/octokit/octokit.rb

La documentación proporciona un ejemplo de respuesta para cada método de la API. La respuesta de ejemplo ilustra todos los atributos que se devuelven con ese método.

Authentication

GitHub recomienda que crees un token para autenticarse en la API REST. Para obtener más información sobre el tipo de token que se va a crear, consulta "Autenticación en la API REST".

Para autenticar la solicitud, envía un token en el Authorization encabezado de la solicitud:

curl --request GET \
--url "https://api.github.com/octocat" \
--header "Authorization: Bearer YOUR-TOKEN" \
--header "X-GitHub-Api-Version: 2022-11-28"

Nota: En la mayoría de los casos, puedes usar Authorization: Bearer o Authorization: token para pasar un token. Sin embargo, si vas a pasar un token web JSON (JWT), debes usar Authorization: Bearer.

Si intentas usar un punto de conexión de la API REST sin un token o con un token que no tenga permisos suficientes, recibirás una respuesta 404 Not Found o 403 Forbidden.

Llave/secreto de OAuth2

Aviso de desuso: GitHub interrumpirá la autenticación a la API mediante parámetros de consulta. La autenticación en la API debe realizarse con la Autenticación HTTP básica. El uso de parámetros de consulta para autenticarse en la API ya no funcionará el 5 de mayo de 2021. Para obtener más información, incluidas las interrupciones programadas, vea la entrada de blog.

curl -u my_client_id:my_client_secret 'https://api.github.com/user/repos'

El uso de client_id y client_secret no se autentica como usuario, solo identificará tu OAuth app para aumentar el límite de frecuencia. Los permisos se otorgan únicamente a usuarios, no a aplicaciones, y úicamente obtendrás datos que un usuario no autenticado vería. No filtres el secreto de cliente de OAuth app a tus usuarios.

Para más información sobre las limitaciones de volumen para OAuth apps, consulte "Rate limits for the REST API".

Límite de ingresos fallidos

La autenticación con credenciales no válidas devolverá 401 Unauthorized:

$ curl -I https://api.github.com --header "Authorization: Bearer INVALID-TOKEN"
> HTTP/2 401

> {
>   "message": "Bad credentials",
>   "documentation_url": "https://docs.github.com/rest"
> }

Después de detectar varias solicitudes con credenciales no válidas en un breve periodo de tiempo, la API rechazará temporalmente todos los intentos de autenticación para el usuario en cuestión (incluidos aquellos con credenciales válidas) con 403 Forbidden:

> HTTP/2 403
> {
>   "message": "Maximum number of login attempts exceeded. Please try again later.",
>   "documentation_url": "https://docs.github.com/rest"
> }

Parámetros

Muchos métodos de la API toman parámetros opcionales. Para las solicitudes GET, cualquier parámetro que no se haya especificado como un segmento en la ruta se puede pasar como un parámetro de cadena de consulta HTTP:

curl -i "https://api.github.com/repos/vmg/redcarpet/issues?state=closed"

En este ejemplo, se proporcionan los valores "vmg" y "redcarpet" para los parámetros :owner y :repo de la ruta, mientras se pasa :state en la cadena de consulta.

En el caso de las solicitudes POST, PATCH, PUTy DELETE, los parámetros no incluidos en la dirección URL se deben codificar como JSON con un tipo de contenido de "application/json":

curl -i --header "Authorization: Bearer YOUR-TOKEN" -d '{"scopes":["repo_deployment"]}' https://api.github.com/authorizations

Punto de conexión raíz

Puede emitir una solicitud GET al punto de conexión raíz para obtener todas las categorías de punto de conexión compatibles con la API REST:

$ curl 
-u USERNAME:TOKEN https://api.github.com

IDs de nodo globales de GraphQL

Consulta la guía sobre "Utilizar las ID de nodo global" para ver información detallada sobre cómo buscar node_id a través de la API REST y su uso en operaciones de GraphQL.

Verbos HTTP

Siempre que sea posible, la API REST de GitHub se esfuerza por usar los verbos HTTP adecuados para cada acción. Ten en cuenta que los verbos HTTP distinguen mayúsculas de minúsculas.

VerboDescripción
HEADPuede emitirse contra cualquier recurso para obtener solo la información del encabezado HTTP.
GETSe utiliza para recuperar recursos.
POSTSe utiliza para crear recursos.
PATCHSe utiliza para actualizar los recursos con datos parciales de JSON. Por ejemplo, un recurso Incidencia tiene atributos title y body. Una solicitud PATCH podría aceptar uno o más de los atributos para actualizar el recurso.
PUTSe utiliza para reemplazar recursos o colecciones. Para las solicitudes PUT sin un atributo body, asegúrese de establecer el encabezado Content-Length en cero.
DELETESe utiliza para borrar recursos.

Hypermedia

Todos los recursos pueden tener una o varias propiedades *_url vinculadas a otros recursos. Su función es proporcionar las URL explícitas para que los clientes de API adecuados no tengan que construirlas ellos mismos. Se recomienda encarecidamente que los clientes de API las usen. De esta forma, para los desarrolladores será más sencillo realizar actualizaciones futuras de la API. Se espera que todas las direcciones URL sean plantillas de URI RFC 6570 correctas.

Después, puede expandir estas plantillas con algo parecido a la gema uri_template:

>> tmpl = URITemplate.new('/notifications{?since,all,participating}')
>> tmpl.expand
=> "/notifications"

>> tmpl.expand all: 1
=> "/notifications?all=1"

>> tmpl.expand all: 1, participating: 1
=> "/notifications?all=1&participating=1"

Se requiere un agente de usuario

Todas las solicitudes de API DEBEN incluir un encabezado User-Agent válido. Las solicitudes sin un encabezado User-Agent se rechazarán. Le pedimos que use el nombre de usuario de GitHub, o el nombre de la aplicación, para el valor del encabezado User-Agent. Esto nos permite contactarte en caso de que haya algún problema.

Este es un ejemplo:

User-Agent: Awesome-Octocat-App

curl envía un encabezado User-Agent válido de forma predeterminada. Si proporciona un encabezado User-Agent no válido mediante curl (o un cliente alternativo), recibirá una respuesta 403 Forbidden:

$ curl -IH 'User-Agent: ' https://api.github.com/meta
> HTTP/1.0 403 Forbidden
> Connection: close
> Content-Type: text/html

> Request forbidden by administrative rules.
> Please make sure your request has a User-Agent header.
> Check  for other possible causes.

Uso compartido de recursos entre orígenes

La API es compatible con el Intercambio de recursos de origen Cruzado (CORS, por sus siglas en inglés) para las solicitudes de AJAX desde cualquier origen. Puede leer la recomendación de CORS del W3C o esta introducción de la Guía de seguridad de HTML 5.

Esta es una solicitud de ejemplo enviada desde un explorador destinada a http://example.com:

$ curl -I https://api.github.com -H "Origin: http://example.com"
HTTP/2 302
Access-Control-Allow-Origin: *
Access-Control-Expose-Headers: ETag, Link, X-GitHub-OTP, x-ratelimit-limit, x-ratelimit-remaining, x-ratelimit-reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval

Así se ve una solicitud de prevuelo de CORS:

$ curl -I https://api.github.com -H "Origin: http://example.com" -X OPTIONS
HTTP/2 204
Access-Control-Allow-Origin: *
Access-Control-Allow-Headers: Authorization, Content-Type, If-Match, If-Modified-Since, If-None-Match, If-Unmodified-Since, X-GitHub-OTP, X-Requested-With
Access-Control-Allow-Methods: GET, POST, PATCH, PUT, DELETE
Access-Control-Expose-Headers: ETag, Link, X-GitHub-OTP, x-ratelimit-limit, x-ratelimit-remaining, x-ratelimit-reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval
Access-Control-Max-Age: 86400

Rellamados de JSON-P

Puede enviar un parámetro ?callback a cualquier llamada GET para que los resultados se encapsulen en una función JSON. Esto se suele usar cuando los exploradores quieren insertar contenido de GitHub en páginas web evitando los problemas de dominios cruzados. La respuesta incluye la misma salida de datos que la API común, además de la información pertinente del encabezado HTTP.

$ curl https://api.github.com?callback=foo

> /**/foo({
>   "meta": {
>     "status": 200,
>     "x-ratelimit-limit": "5000",
>     "x-ratelimit-remaining": "4966",
>     "x-ratelimit-reset": "1372700873",
>     "Link": [ // pagination headers and other links
>       ["https://api.github.com?page=2", {"rel": "next"}]
>     ]
>   },
>   "data": {
>     // the data
>   }
> })

Puedes escribir un agente de JavaScript para procesar la rellamada. Aquí hay un ejemplo minimalista que puedes probar:

<html>
<head>
<script type="text/javascript">
function foo(response) {
  var meta = response.meta;
  var data = response.data;
  console.log(meta);
  console.log(data);
}

var script = document.createElement('script');
script.src = 'https://api.github.com?callback=foo';

document.getElementsByTagName('head')[0].appendChild(script);
</script>
</head>

<body>
  <p>Open up your browser's console.</p>
</body>
</html>

Todos los encabezados son el mismo valor de cadena que los encabezados HTTP con una excepción concreta: Link. Los encabezados Link se analizan previamente de forma automática y se pasan como una matriz de tuplas [url, options].

Un enlace que se ve así:

Link: <url1>; rel="next", <url2>; rel="foo"; bar="baz"

... se verá así en la salida de la rellamada:

{
  "Link": [
    [
      "url1",
      {
        "rel": "next"
      }
    ],
    [
      "url2",
      {
        "rel": "foo",
        "bar": "baz"
      }
    ]
  ]
}

Zonas horarias

Algunas solicitudes que crean datos nuevos, tales como aquellas para crear una confirmación nueva, te permiten proporcionar información sobre la zona horaria cuando especificas o generas marcas de tiempo. Aplicamos las siguientes reglas, en orden de prioridad, para determinar la información de la zona horaria para los llamados a la API.

Toma en cuenta que estas reglas se aplican únicamente a los datos que se pasan a la API y no a los que esta devuelve. Como se ha mencionado en "Esquema", las marcas de tiempo devueltas por la API están en hora UTC, en formato ISO 8601.

Proporcionar explícitamente una marca de tiempo de tipo ISO 8601 con la información de la zona horaria

Para las llamadas a la API que permitan que se especifique una marca de tiempo, utilizamos esa marca de tiempo exacta. Un ejemplo de esto es la API para administrar confirmaciones. Para obtener más información, vea «Base de datos de Git».

Estas marcas de tiempo son similares a 2014-02-27T15:05:06+01:00. Vea también este ejemplo para saber cómo se pueden especificar estas marcas de tiempo.

Uso del encabezado Time-Zone

Es posible proporcionar un encabezado Time-Zone que defina una zona horaria según la lista de nombres de la base de datos Olson.

curl -H "Time-Zone: Europe/Amsterdam" -X POST https://api.github.com/repos/github-linguist/linguist/contents/new_file.md

Esto significa que generamos una marca de tiempo para el momento en el se haga el llamado a tu API en la zona horaria que defina este encabezado. Por ejemplo, la API de administración de contenido genera una confirmación de Git para cada adición o cambio, y usa la hora actual como marca de tiempo. Para obtener más información, vea «Repositorios». Este encabezado determinará la zona horaria que se utiliza para generar la marca de tiempo actual.

Utilizar la última zona horaria conocida para el usuario

Si no se especifica ningún encabezado Time-Zone y realiza una llamada autenticada a la API, se usa la última zona horaria conocida para el usuario autenticado. La última zona horaria conocida se actualiza cuando sea que busques el sitio web de GitHub.

Predeterminarse en UTC cuando no existe otra información sobre la zona horaria

Si los pasos anteriores no dan como resultado ninguna información, utilizaremos UTC como la zona horaria para crear la confirmación de git.