Using the external API
======================

To be able to create integrations with other services, Hydra exposes an external API that you can manage projects with.

The API is accessed over HTTP(s) where all data is sent and received as JSON.

Creating resources requires the caller to be authenticated, while retrieving resources does not.

The API does not have a separate URL structure for its endpoints.
Instead you request the pages of the web interface as `application/json` to use the API.

List projects
-------------

To list all the `projects` of the Hydra install:

    GET /
    Accept: application/json

This will give you a list of `projects`, where each `project` contains general information and a list of its `job sets`.

**Example**

    curl -i -H 'Accept: application/json' \
        https://hydra.nixos.org

**Note:** this response is truncated

    GET https://hydra.nixos.org/
    HTTP/1.1 200 OK
    Content-Type: application/json

    [
      {
        "displayname": "Acoda",
        "name": "acoda",
        "description": "Acoda is a tool set for automatic data migration along an evolving data model",
        "enabled": 0,
        "owner": "sander",
        "hidden": 1,
        "jobsets": [
          "trunk"
        ]
      },
      {
        "displayname": "cabal2nix",
        "name": "cabal2nix",
        "description": "Convert Cabal files into Nix build instructions",
        "enabled": 0,
        "owner": "simons@cryp.to",
        "hidden": 1,
        "jobsets": [
          "master"
        ]
      }
    ]

Get a single project
--------------------

To get a single `project` by identifier:

    GET /project/:project-identifier
    Accept: application/json

**Example**

    curl -i -H 'Accept: application/json' \
        https://hydra.nixos.org/project/hydra

    GET https://hydra.nixos.org/project/hydra
    HTTP/1.1 200 OK
    Content-Type: application/json

    {
      "description": "Hydra, the Nix-based continuous build system",
      "hidden": 0,
      "displayname": "Hydra",
      "jobsets": [
        "hydra-master",
        "hydra-ant-logger-trunk",
        "master",
        "build-ng"
      ],
      "name": "hydra",
      "enabled": 1,
      "owner": "eelco"
    }

Get a single job set
--------------------

To get a single `job set` by identifier:

    GET /jobset/:project-identifier/:jobset-identifier
    Content-Type: application/json

**Example**

    curl -i -H 'Accept: application/json' \
        https://hydra.nixos.org/jobset/hydra/build-ng

    GET https://hydra.nixos.org/jobset/hydra/build-ng
    HTTP/1.1 200 OK
    Content-Type: application/json

    {
      "errormsg": "evaluation failed due to signal 9 (Killed)",
      "fetcherrormsg": null,
      "nixexprpath": "release.nix",
      "nixexprinput": "hydraSrc",
      "emailoverride": "rob.vermaas@gmail.com, eelco.dolstra@logicblox.com",
      "jobsetinputs": {
        "officialRelease": {
          "jobsetinputalts": [
            "false"
          ]
        },
        "hydraSrc": {
          "jobsetinputalts": [
            "https://github.com/NixOS/hydra.git build-ng"
          ]
        },
        "nixpkgs": {
          "jobsetinputalts": [
            "https://github.com/NixOS/nixpkgs.git release-14.12"
          ]
        }
      },
      "enabled": 0
    }

List evaluations
----------------

To list the `evaluations` of a `job set` by identifier:

    GET /jobset/:project-identifier/:jobset-identifier/evals
    Content-Type: application/json

**Example**

    curl -i -H 'Accept: application/json' \
        https://hydra.nixos.org/jobset/hydra/build-ng/evals

**Note:** this response is truncated

    GET https://hydra.nixos.org/jobset/hydra/build-ng/evals
    HTTP/1.1 200 OK
    Content-Type: application/json

    {
      "evals": [
        {
          "jobsetevalinputs": {
            "nixpkgs": {
              "dependency": null,
              "type": "git",
              "value": null,
              "uri": "https://github.com/NixOS/nixpkgs.git",
              "revision": "f60e48ce81b6f428d072d3c148f6f2e59f1dfd7a"
            },
            "hydraSrc": {
              "dependency": null,
              "type": "git",
              "value": null,
              "uri": "https://github.com/NixOS/hydra.git",
              "revision": "48d6f0de2ab94f728d287b9c9670c4d237e7c0f6"
            },
            "officialRelease": {
              "dependency": null,
              "value": "false",
              "type": "boolean",
              "uri": null,
              "revision": null
            }
          },
          "hasnewbuilds": 1,
          "builds": [
            24670686,
            24670684,
            24670685,
            24670687
          ],
          "id": 1213758
        }
      ],
      "first": "?page=1",
      "last": "?page=1"
    }

Get a single build
------------------

To get a single `build` by its id:

    GET /build/:build-id
    Content-Type: application/json

**Example**

    curl -i -H 'Accept: application/json' \
        https://hydra.nixos.org/build/24670686

    GET /build/24670686
    HTTP/1.1 200 OK
    Content-Type: application/json

    {
      "job": "tests.api.x86_64-linux",
      "jobsetevals": [
        1213758
      ],
      "buildstatus": 0,
      "buildmetrics": null,
      "project": "hydra",
      "system": "x86_64-linux",
      "priority": 100,
      "releasename": null,
      "starttime": 1439402853,
      "nixname": "vm-test-run-unnamed",
      "timestamp": 1439388618,
      "id": 24670686,
      "stoptime": 1439403403,
      "jobset": "build-ng",
      "buildoutputs": {
        "out": {
          "path": "/nix/store/lzrxkjc35mhp8w7r8h82g0ljyizfchma-vm-test-run-unnamed"
        }
      },
      "buildproducts": {
        "1": {
          "path": "/nix/store/lzrxkjc35mhp8w7r8h82g0ljyizfchma-vm-test-run-unnamed",
          "defaultpath": "log.html",
          "type": "report",
          "sha256hash": null,
          "filesize": null,
          "name": "",
          "subtype": "testlog"
        }
      },
      "finished": 1
    }
