{
  "apiVersion": "1.0",
  "swaggerVersion": "1.2",
  "basePath": "http://api.xbrl.io",
  "resourcePath": "/project",
  "produces": [
    "application/json"
  ],
  "apis": [
    {
      "path": "/project",
      "operations": [
        {
          "method": "GET",
          "summary": "Retrieves the project metadata for all projects owned by an account",
          "notes": "This method requires a valid API token. The metadata of the projects owned by the account corresponding to the given API token will be returned.",
          "type": "array",
          "items": {
            "$ref": "Project"
          },
          "nickname": "listProjects",
          "parameters": [
            {
              "name": "token",
              "description": "An API token.",
              "required": true,
              "type": "string",
              "paramType": "query"
            }
          ],
          "responseMessages": [
            {
              "code": 400,
              "message": "Bad request: a parameter is missing or invalid.",
              "responseModel": "Error"
            },
            {
              "code": 401,
              "message": "Unauthorized: the specified API token is invalid or expired.",
              "responseModel": "Error"
            },
            {
              "code": 500,
              "message": "An internal error occurred during the processing of the request.",
              "responseModel": "Error"
            }
          ]
        },
        {
          "method": "POST",
          "summary": "Creates a new project",
          "notes": "<p>The project name must be between 3 and 40 characters long. It can contain only letter, numerical digits and dashes (-). A dash cannot appear as the first character.</p><p>If the specified package is payed, the account must have billing information and a new recurly subscription will be created.</p><p>This method requires a valid API token. If the project is created successfully, the owner of the project is the account associated with the specified API token.</p>",
          "type": "NewProject",
          "nickname": "createProject",
          "parameters": [
            {
              "name": "project-name",
              "description": "The project name.",
              "required": true,
              "type": "string",
              "paramType": "query"
            },
            {
              "name": "template",
              "description": "A template name. If not specified the 'default' template will be used.",
              "required": false,
              "type": "string",
              "paramType": "query"
            },
            {
              "name": "package",
              "description": "A package name. If not specified the 'free' package will be used.",
              "required": false,
              "type": "string",
              "paramType": "query"
            },
            {
              "name": "token",
              "description": "An API token.",
              "required": true,
              "type": "string",
              "paramType": "query"
            }
          ],
          "responseMessages": [
            {
              "code": 400,
              "message": "Bad request: a parameter is missing or invalid.",
              "responseModel": "Error"
            },
            {
              "code": 401,
              "message": "Unauthorized: the specified API token is invalid or expired.",
              "responseModel": "Error"
            },
            {
              "code": 402,
              "message": "Recurly refused to complete the operation, due to errors in the billing information.",
              "responseModel": "RecurlyError"
            },
            {
              "code": 409,
              "message": "A project with the same name already exists.",
              "responseModel": "Error"
            },
            {
              "code": 424,
              "message": "The specified user has no billing data.",
              "responseModel": "Error"
            },
            {
              "code": 500,
              "message": "An internal error occurred during the processing of the request.",
              "responseModel": "Error"
            }
          ]
        }
      ]
    },
    {
      "path": "/project/{name}",
      "operations": [
        {
          "method": "HEAD",
          "summary": "Checks if a project exists",
          "notes": "This method requires no authentication.",
          "type": "void",
          "nickname": "checkProject",
          "parameters": [
            {
              "name": "name",
              "description": "The project name.",
              "required": true,
              "type": "string",
              "paramType": "path"
            }
          ],
          "responseMessages": [
            {
              "code": 404,
              "message": "The specified project cannot be found."
            }
          ]
        },
        {
          "method": "GET",
          "summary": "Retrieves a project metadata",
          "notes": "This method requires a valid API token generated for the account which owns the specified project.",
          "type": "Project",
          "nickname": "getProjectMetadata",
          "parameters": [
            {
              "name": "name",
              "description": "The project name.",
              "required": true,
              "type": "string",
              "paramType": "path"
            },
            {
              "name": "token",
              "description": "An API token.",
              "required": true,
              "type": "string",
              "paramType": "query"
            }
          ],
          "responseMessages": [
            {
              "code": 400,
              "message": "Bad request: a parameter is missing or invalid.",
              "responseModel": "Error"
            },
            {
              "code": 401,
              "message": "Unauthorized: the specified API token is invalid or expired.",
              "responseModel": "Error"
            },
            {
              "code": 404,
              "message": "The specified project does not exist.",
              "responseModel": "Error"
            },
            {
              "code": 500,
              "message": "An internal error occurred during the processing of the request.",
              "responseModel": "Error"
            }
          ]
        },
        {
          "method": "PUT",
          "summary": "Upgrades a project to the last Sausalito version",
          "notes": "This method requires a valid API token generated for the account which owns the specified project.",
          "type": "Success",
          "nickname": "upgradeProject",
          "parameters": [
            {
              "name": "name",
              "description": "The project name.",
              "required": true,
              "type": "string",
              "paramType": "path"
            },
            {
              "name": "token",
              "description": "An API token.",
              "required": true,
              "type": "string",
              "paramType": "query"
            }
          ],
          "responseMessages": [
            {
              "code": 400,
              "message": "Bad request: a parameter is missing or invalid.",
              "responseModel": "Error"
            },
            {
              "code": 401,
              "message": "Unauthorized: the specified API token is invalid or expired.",
              "responseModel": "Error"
            },
            {
              "code": 404,
              "message": "The specified project does not exist.",
              "responseModel": "Error"
            },
            {
              "code": 500,
              "message": "An internal error occurred during the processing of the request.",
              "responseModel": "Error"
            }
          ]
        },
        {
          "method": "PATCH",
          "summary": "Changes a project metadata",
          "notes": "<p>This method allows to rename or change the package of a project. Only one of the two modifications can be performed at the same time.</p><p>If renaming, the new project name must be between 3 and 40 characters long. It can contain only letter, numerical digits and dashes (-). A dash cannot appear as the first character. This method requires a valid API token generated for the account which owns the specified project.<p><p>If changing the project package, the following conditions must be satisfied: <ul><li>the used account must have billing information;</li><li>the current project package must be free</li><li>the specified package type must be payed</li></ul></p>",
          "type": "Success",
          "nickname": "updateProject",
          "parameters": [
            {
              "name": "name",
              "description": "The project name.",
              "required": true,
              "type": "string",
              "paramType": "path"
            },
            {
              "name": "new-name",
              "description": "The new project name.",
              "required": false,
              "type": "string",
              "paramType": "query"
            },
            {
              "name": "package",
              "description": "The project package.",
              "required": false,
              "type": "string",
              "paramType": "query"
            },
            {
              "name": "token",
              "description": "An API token.",
              "required": true,
              "type": "string",
              "paramType": "query"
            }
          ],
          "responseMessages": [
            {
              "code": 400,
              "message": "Bad request: a parameter is missing or invalid.",
              "responseModel": "Error"
            },
            {
              "code": 401,
              "message": "Unauthorized: the specified API token is invalid or expired.",
              "responseModel": "Error"
            },
            {
              "code": 402,
              "message": "Recurly refused to complete the operation, due to errors in the billing information.",
              "responseModel": "RecurlyError"
            },
            {
              "code": 404,
              "message": "The specified project does not exist.",
              "responseModel": "Error"
            },
            {
              "code": 424,
              "message": "The specified user has no billing data.",
              "responseModel": "Error"
            },
            {
              "code": 500,
              "message": "An internal error occurred during the processing of the request.",
              "responseModel": "Error"
            }
          ]
        },
        {
          "method": "DELETE",
          "summary": "Deletes a project",
          "notes": "<p>If the project package is payed, the corresponding recurly subscription will be terminated.</p><p>This method requires a valid API token generated for the account which owns the specified project.</p>",
          "type": "Success",
          "nickname": "deleteProject",
          "parameters": [
            {
              "name": "name",
              "description": "The project name.",
              "required": true,
              "type": "string",
              "paramType": "path"
            },
            {
              "name": "token",
              "description": "An API token.",
              "required": true,
              "type": "string",
              "paramType": "query"
            }
          ],
          "responseMessages": [
            {
              "code": 400,
              "message": "Bad request: a parameter is missing or invalid.",
              "responseModel": "Error"
            },
            {
              "code": 401,
              "message": "Unauthorized: the specified API token is invalid or expired.",
              "responseModel": "Error"
            },
            {
              "code": 404,
              "message": "The specified project does not exist.",
              "responseModel": "Error"
            },
            {
              "code": 500,
              "message": "An internal error occurred during the processing of the request.",
              "responseModel": "Error"
            }
          ]
        }
      ]
    },
    {
      "path": "/project/{name}/default-mongodb",
      "operations": [
        {
          "method": "GET",
          "summary": "Retrieves the default MongoDB credentials",
          "notes": "For \"28msec\", \"local\" and \"none\" databases the response will only contain the \"db-type\" field. This method requires a valid API token generated for the account which owns the specified project.",
          "type": "MongoDBCredentials",
          "nickname": "getDefaultMongoDBCredentials",
          "parameters": [
            {
              "name": "name",
              "description": "The project name.",
              "required": true,
              "type": "string",
              "paramType": "path"
            },
            {
              "name": "token",
              "description": "An API token.",
              "required": true,
              "type": "string",
              "paramType": "query"
            }
          ],
          "responseMessages": [
            {
              "code": 400,
              "message": "Bad request: a parameter is missing or invalid.",
              "responseModel": "Error"
            },
            {
              "code": 401,
              "message": "Unauthorized: the specified API token is invalid or expired.",
              "responseModel": "Error"
            },
            {
              "code": 404,
              "message": "The specified project does not exist.",
              "responseModel": "Error"
            },
            {
              "code": 500,
              "message": "An internal error occurred during the processing of the request.",
              "responseModel": "Error"
            }
          ]
        },
        {
          "method": "PUT",
          "summary": "Updates a project default MongoDB credentials",
          "notes": "The specified credentials can be of the following kinds: \"user\", \"mongolab\", \"28msec\", \"local\", \"none\". For all database kinds except \"user\" no credentials have to be specified. For \"user\" databases, at least the \"conn-string\" and the \"dbname\" parameter have to be specified. This method requires a valid API token generated for the account which owns the specified project.",
          "type": "Success",
          "nickname": "updateDefaultMongoDBCredentials",
          "parameters": [
            {
              "name": "name",
              "description": "The project name.",
              "required": true,
              "type": "string",
              "paramType": "path"
            },
            {
              "name": "token",
              "description": "An API token.",
              "required": true,
              "type": "string",
              "paramType": "query"
            },
            {
              "name": "db-type",
              "description": "The database type.",
              "required": true,
              "type": "string",
              "enum": [
                "user",
                "mongolab",
                "28msec",
                "local",
                "none"
              ],
              "paramType": "query"
            },
            {
              "name": "conn-string",
              "description": "The database connection string. Only for \"user\" databases.",
              "required": false,
              "type": "string",
              "paramType": "query"
            },
            {
              "name": "db",
              "description": "The database name. Only for \"user\" databases.",
              "required": false,
              "type": "string",
              "paramType": "query"
            },
            {
              "name": "user",
              "description": "The database user. Only for \"user\" databases.",
              "required": false,
              "type": "string",
              "paramType": "query"
            },
            {
              "name": "pass",
              "description": "The database password. Only for \"user\" databases.",
              "required": false,
              "type": "string",
              "paramType": "query"
            },
            {
              "name": "pre-digested",
              "description": "Whether the specified password is pre-digested or not. Only for \"user\" databases. Default is false.",
              "required": false,
              "type": "boolean",
              "paramType": "query"
            }
          ],
          "responseMessages": [
            {
              "code": 400,
              "message": "Bad request: a parameter is missing or invalid.",
              "responseModel": "Error"
            },
            {
              "code": 401,
              "message": "Unauthorized: the specified API token is invalid or expired.",
              "responseModel": "Error"
            },
            {
              "code": 404,
              "message": "The specified project does not exist.",
              "responseModel": "Error"
            },
            {
              "code": 422,
              "message": "The test of the specified credentials failed.",
              "responseModel": "Tests"
            },
            {
              "code": 500,
              "message": "An internal error occurred during the processing of the request.",
              "responseModel": "Error"
            }
          ]
        }
      ]
    },
    {
      "path": "/project/{name}/test-mongodb",
      "operations": [
        {
          "method": "GET",
          "summary": "Tests MongoDB credentials",
          "notes": "This method requires a valid API token generated for the account which owns the specified project.",
          "type": "MongoDBTests",
          "nickname": "testDefaultMongoDB",
          "parameters": [
            {
              "name": "name",
              "description": "The project name.",
              "required": true,
              "type": "string",
              "paramType": "path"
            },
            {
              "name": "token",
              "description": "An API token.",
              "required": true,
              "type": "string",
              "paramType": "query"
            },
            {
              "name": "conn-string",
              "description": "The database connection string.",
              "required": true,
              "type": "string",
              "paramType": "query"
            },
            {
              "name": "db",
              "description": "The database name.",
              "required": true,
              "type": "string",
              "paramType": "query"
            },
            {
              "name": "user",
              "description": "The database user.",
              "required": false,
              "type": "string",
              "paramType": "query"
            },
            {
              "name": "pass",
              "description": "The database password.",
              "required": false,
              "type": "string",
              "paramType": "query"
            },
            {
              "name": "pre-digested",
              "description": "Whether the specified password is pre-digested or not. Default is false.",
              "required": false,
              "type": "boolean",
              "paramType": "query"
            }
          ],
          "responseMessages": [
            {
              "code": 400,
              "message": "Bad request: a parameter is missing or invalid.",
              "responseModel": "Error"
            },
            {
              "code": 401,
              "message": "Unauthorized: the specified API token is invalid or expired.",
              "responseModel": "Error"
            },
            {
              "code": 404,
              "message": "The specified project does not exist.",
              "responseModel": "Error"
            },
            {
              "code": 500,
              "message": "An internal error occurred during the processing of the request.",
              "responseModel": "Error"
            }
          ]
        }
      ]
    },
    {
      "path": "/project/{name}/domains",
      "operations": [
        {
          "method": "GET",
          "summary": "Lists all custom domains of a project",
          "notes": "This method requires a valid API token generated for the account which owns the specified project.",
          "type": "array",
          "items": {
            "type": "string"
          },
          "nickname": "listCustomDomains",
          "parameters": [
            {
              "name": "name",
              "description": "The project name.",
              "required": true,
              "type": "string",
              "paramType": "path"
            },
            {
              "name": "token",
              "description": "An API token.",
              "required": true,
              "type": "string",
              "paramType": "query"
            }
          ],
          "responseMessages": [
            {
              "code": 400,
              "message": "Bad request: a parameter is missing or invalid.",
              "responseModel": "Error"
            },
            {
              "code": 401,
              "message": "Unauthorized: the specified API token is invalid or expired.",
              "responseModel": "Error"
            },
            {
              "code": 404,
              "message": "The specified project does not exist.",
              "responseModel": "Error"
            },
            {
              "code": 500,
              "message": "An internal error occurred during the processing of the request.",
              "responseModel": "Error"
            }
          ]
        },
        {
          "method": "POST",
          "summary": "Adds a custom domain to a project",
          "notes": "The custom domain name must be at least 3 characters long. It consists of two or more groups of characters separated by a single dot (.). The last group consists of 2 to 6 lowercase letters. Any other group consists of one or more lowercase letters, numerical digits and dashes (-). A dash cannot appear as the first character of the group. Morever, the custom domain name cannot end with: '.my28msec.com', '.28.io', '.xbrl.io' or '.devel.28msec.us'. This method requires a valid API token generated for the account which owns the specified project.",
          "type": "Success",
          "nickname": "addCustomDomain",
          "parameters": [
            {
              "name": "name",
              "description": "The project name.",
              "required": true,
              "type": "string",
              "paramType": "path"
            },
            {
              "name": "domain-name",
              "description": "The name of the new custom domain.",
              "required": true,
              "type": "string",
              "paramType": "query"
            },
            {
              "name": "token",
              "description": "An API token.",
              "required": true,
              "type": "string",
              "paramType": "query"
            }
          ],
          "responseMessages": [
            {
              "code": 400,
              "message": "Bad request: a parameter is missing or invalid.",
              "responseModel": "Error"
            },
            {
              "code": 401,
              "message": "Unauthorized: the specified API token is invalid or expired.",
              "responseModel": "Error"
            },
            {
              "code": 404,
              "message": "The specified project does not exist.",
              "responseModel": "Error"
            },
            {
              "code": 409,
              "message": "A custom domain with the same name already exists.",
              "responseModel": "Error"
            },
            {
              "code": 500,
              "message": "An internal error occurred during the processing of the request.",
              "responseModel": "Error"
            }
          ]
        }
      ]
    },
    {
      "path": "/project/{name}/domains/{domain-name}",
      "operations": [
        {
          "method": "DELETE",
          "summary": "Deletes a project custom domain",
          "notes": "This method requires a valid API token generated for the account which owns the specified project.",
          "type": "Success",
          "nickname": "deleteCustomDomain",
          "parameters": [
            {
              "name": "name",
              "description": "The project name.",
              "required": true,
              "type": "string",
              "paramType": "path"
            },
            {
              "name": "domain-name",
              "description": "The project name.",
              "required": true,
              "type": "string",
              "paramType": "path"
            },
            {
              "name": "token",
              "description": "An API token.",
              "required": true,
              "type": "string",
              "paramType": "query"
            }
          ],
          "responseMessages": [
            {
              "code": 400,
              "message": "Bad request: a parameter is missing or invalid.",
              "responseModel": "Error"
            },
            {
              "code": 401,
              "message": "Unauthorized: the specified API token is invalid or expired.",
              "responseModel": "Error"
            },
            {
              "code": 404,
              "message": "The specified project or custom domain does not exist.",
              "responseModel": "Error"
            },
            {
              "code": 500,
              "message": "An internal error occurred during the processing of the request.",
              "responseModel": "Error"
            }
          ]
        }
      ]
    }
  ],
  "models": {
    "Success": {
      "id": "Success",
      "description": "Default success response",
      "required": [
        "success"
      ],
      "properties": {
        "success": {
          "type": "boolean",
          "enum": [
            "true"
          ]
        }
      }
    },
    "Error": {
      "id": "Error",
      "description": "Error information",
      "required": [
        "code",
        "message",
        "description"
      ],
      "properties": {
        "code": {
          "type": "string",
          "description": "The XQuery error code of the error"
        },
        "message": {
          "type": "string",
          "description": "A formatted string which contain the error code (always) and the module name, line and column-number and error description (when available)"
        },
        "description": {
          "type": "string",
          "description": "The error description"
        },
        "module": {
          "type": "string",
          "description": "The error module"
        },
        "line-number": {
          "type": "string",
          "description": "The error line number"
        },
        "column-number": {
          "type": "string",
          "description": "The error column number"
        }
      }
    },
    "Account": {
      "id": "Account",
      "description": "Account metadata",
      "required": [
        "id",
        "email",
        "firstname",
        "lastname",
        "company",
        "createdAt",
        "type"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "The account unique identifier"
        },
        "type": {
          "type": "string",
          "description": "The account type",
          "enum": [
            "temporary",
            "anonymous",
            "free",
            "full",
            "28msec",
            "admin"
          ]
        },
        "email": {
          "type": "string",
          "description": "The account email"
        },
        "firstname": {
          "type": "string",
          "description": "The account firstname"
        },
        "lastname": {
          "type": "string",
          "description": "The account lastname"
        },
        "company": {
          "type": "string",
          "description": "The account company"
        },
        "createdAt": {
          "type": "date-time",
          "description": "The date and time on which the account has been created"
        },
        "confirmedAt": {
          "type": "date-time",
          "description": "The date and time on which the account has been confirmed"
        },
        "billingAccount": {
          "type": "string",
          "description": "The account billing account"
        }
      }
    },
    "AccountExtendedData": {
      "id": "AccountExtendedData",
      "description": "Account extended data",
      "required": [
        "token_type",
        "expiration_date",
        "access_token",
        "refresh_token",
        "project_tokens",
        "accountMetadata",
        "projectsMetadata"
      ],
      "properties": {
        "token_type": {
          "type": "string",
          "description": "The API token type",
          "enum": [
            "bearer"
          ]
        },
        "expiration_date": {
          "type": "date-time",
          "description": "The expiration date of all the tokens in the response"
        },
        "access_token": {
          "type": "string",
          "description": "The API token"
        },
        "refresh_token": {
          "type": "string",
          "description": "The refresh token which can be used to refresh both the API and project tokens"
        },
        "project_tokens": {
          "type": "ProjectTokens",
          "description": "The project tokens which can be used to make request to the APIs on the project endpoints"
        },
        "accountMetadata": {
          "type": "Account",
          "description": "The account data."
        },
        "projectsMetadata": {
          "type": "Projects",
          "description": "The account projects data."
        }
      }
    },
    "ProjectTokens": {
      "id": "ProjectTokens",
      "description": "An object containing zero or more project tokens. Each project token is stored in a different field project_{name}, where {name} is the project name, (e.g.: portal).",
      "properties": {
        "project_{name}": {
          "type": "string",
          "description": "The token for the project {name}. One field for each project owned by the account will be present"
        }
      }
    },
    "NewProject": {
      "id": "NewProject",
      "required": [
        "projectMetadata",
        "projectToken"
      ],
      "properties": {
        "projectMetadata": {
          "type": "Project",
          "description": "The project metadata of the newly created project"
        },
        "projectToken": {
          "type": "string",
          "description": "A project token for the newly created project. It is guaranteed to expire no sooner than the tokens already obtained for the account in the current session."
        }
      }
    },
    "Project": {
      "id": "Project",
      "description": "Project data",
      "required": [
        "name",
        "created",
        "packageName",
        "status"
      ],
      "properties": {
        "name": {
          "type": "string",
          "description": "The project name"
        },
        "created": {
          "type": "date-time",
          "description": "The date time on which the project was created"
        },
        "packageName": {
          "type": "string",
          "description": "The project package"
        },
        "status": {
          "type": "string",
          "description": "The project status"
        },
        "version": {
          "type": "string",
          "description": "The project version"
        },
        "sausaVersion": {
          "type": "string",
          "description": "The sausalito version used by the project"
        },
        "updateableTo": {
          "type": "string",
          "description": "The sausalito version to which the project can be updated, if any"
        },
        "lastUpdated": {
          "type": "date-time",
          "description": "The date on which the project was last updated"
        },
        "browserUpdated": {
          "type": "date-time",
          "description": "The date on which the project browser was last updated"
        },
        "lastModified": {
          "type": "date-time",
          "description": "The date on which the project was last modified"
        },
        "compilerLiving": {
          "type": "date-time",
          "description": "The last date and time in which the compiler has been started, provided it is still running"
        },
        "namespace": {
          "type": "string",
          "description": "The project namespace"
        },
        "databaseType": {
          "type": "string",
          "description": "The database type of the project default MongoDB database.",
          "enum": [
            "user",
            "mongolab",
            "28msec",
            "local",
            "none"
          ]
        }
      }
    },
    "MongoDBCredentials": {
      "id": "MongoDBCredentials",
      "description": "MongoDB credentials for the default MongoDB database",
      "required": [
        "db-type"
      ],
      "properties": {
        "db-type": {
          "type": "string",
          "description": "The database type",
          "enum": [
            "user",
            "mongolab",
            "28msec",
            "local",
            "none"
          ]
        },
        "conn-string": {
          "type": "string",
          "description": "The connection string"
        },
        "db": {
          "type": "string",
          "description": "The database name"
        },
        "user": {
          "type": "string",
          "description": "The username"
        },
        "pass": {
          "type": "string",
          "description": "The password"
        },
        "pre-digested": {
          "type": "boolean",
          "description": "Whether the credentials are pre-digested or not. Default is false."
        }
      }
    },
    "Tests": {
      "id": "Tests",
      "description": "Credentials tests result",
      "required": [
        "success",
        "tests"
      ],
      "properties": {
        "success": {
          "type": "boolean",
          "description": "Whether all tests passed or not"
        },
        "tests": {
          "type": "array",
          "description": "The array containing the results of each run test",
          "items": {
            "$ref": "MongoDBTest"
          }
        }
      }
    },
    "Test": {
      "id": "Test",
      "description": "Credentials test result",
      "required": [
        "name",
        "success",
        "message"
      ],
      "properties": {
        "name": {
          "type": "string",
          "description": "The name of the test",
          "enum": [
            "connection",
            "writeable"
          ]
        },
        "success": {
          "type": "boolean",
          "description": "Whether the test passed or not"
        },
        "message": {
          "type": "string",
          "description": "A description of the test result"
        }
      }
    }
  }
}
