DroneDeploy Annotations and Issues API

Create, read, and update annotations and Issues (field markups tied to a plan's map - points, lines, polygons, and their notes/attachments) through the schema's Issue type and its Create/Update input types (e.g. UpdateIssueInput). Modeled from the reference schema; field-level shapes are gated behind the Enterprise console.

Postman Collection

dronedeploy.postman_collection.json Raw ↑
{
  "info": {
    "name": "DroneDeploy GraphQL API",
    "description": "GraphQL API for the DroneDeploy drone mapping, reality capture, and aerial analytics platform. Single endpoint https://www.dronedeploy.com/graphql (POST), authenticated with an Authorization: Bearer <api_key> header (Enterprise / Developer Partner accounts only). Queries are rooted at `viewer` and objects are fetched by `node(id)`; results use Relay cursor pagination (first/after, pageInfo, edges/node). Requests marked (modeled) approximate operations not shown verbatim in the public docs.",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
  },
  "auth": {
    "type": "bearer",
    "bearer": [
      { "key": "token", "value": "{{apiKey}}", "type": "string" }
    ]
  },
  "variable": [
    { "key": "baseUrl", "value": "https://www.dronedeploy.com/graphql", "type": "string" },
    { "key": "apiKey", "value": "", "type": "string" },
    { "key": "mapPlanId", "value": "MapPlan:5a3d7badf014ce3db3c22391", "type": "string" }
  ],
  "item": [
    {
      "name": "Users & Organizations",
      "item": [
        {
          "name": "Get current viewer",
          "request": {
            "method": "POST",
            "header": [{ "key": "Content-Type", "value": "application/json" }],
            "body": {
              "mode": "graphql",
              "graphql": {
                "query": "query GetViewer {\n  viewer {\n    username\n  }\n}",
                "variables": ""
              }
            },
            "url": { "raw": "{{baseUrl}}", "host": ["{{baseUrl}}"] },
            "description": "CONFIRMED. Returns the currently authenticated user's username via the viewer root."
          }
        },
        {
          "name": "Get organization",
          "request": {
            "method": "POST",
            "header": [{ "key": "Content-Type", "value": "application/json" }],
            "body": {
              "mode": "graphql",
              "graphql": {
                "query": "query GetOrg {\n  viewer {\n    organization {\n      id\n      name\n    }\n  }\n}",
                "variables": ""
              }
            },
            "url": { "raw": "{{baseUrl}}", "host": ["{{baseUrl}}"] },
            "description": "viewer.organization is CONFIRMED; the name field is modeled."
          }
        }
      ]
    },
    {
      "name": "Projects & Plans",
      "item": [
        {
          "name": "List plans for your organization",
          "request": {
            "method": "POST",
            "header": [{ "key": "Content-Type", "value": "application/json" }],
            "body": {
              "mode": "graphql",
              "graphql": {
                "query": "query GetPlans {\n  viewer {\n    organization {\n      plans(first: 50) {\n        pageInfo { hasNextPage endCursor }\n        edges {\n          cursor\n          node {\n            name\n            geometry { lat lng }\n            location { lat lng }\n            dateCreation\n          }\n        }\n      }\n    }\n  }\n}",
                "variables": ""
              }
            },
            "url": { "raw": "{{baseUrl}}", "host": ["{{baseUrl}}"] },
            "description": "CONFIRMED. Cursor-paginated list of plans in the organization. Use `after: endCursor` for the next page."
          }
        },
        {
          "name": "Get a single map plan",
          "request": {
            "method": "POST",
            "header": [{ "key": "Content-Type", "value": "application/json" }],
            "body": {
              "mode": "graphql",
              "graphql": {
                "query": "query GetMap {\n  node(id: \"{{mapPlanId}}\") {\n    ... on MapPlan {\n      name\n      location { lat lng }\n      imageCount\n      status\n    }\n  }\n}",
                "variables": ""
              }
            },
            "url": { "raw": "{{baseUrl}}", "host": ["{{baseUrl}}"] },
            "description": "CONFIRMED. Fetch a MapPlan by id using node() plus an inline fragment."
          }
        },
        {
          "name": "Create a project (modeled)",
          "request": {
            "method": "POST",
            "header": [{ "key": "Content-Type", "value": "application/json" }],
            "body": {
              "mode": "graphql",
              "graphql": {
                "query": "mutation CreateProject($input: CreateProjectInput!) {\n  createProject(input: $input) {\n    project { id name }\n  }\n}",
                "variables": "{\n  \"input\": {\n    \"name\": \"North Site\"\n  }\n}"
              }
            },
            "url": { "raw": "{{baseUrl}}", "host": ["{{baseUrl}}"] },
            "description": "MODELED from MutationRoot. Verify exact input shape in the Enterprise GraphiQL console."
          }
        }
      ]
    },
    {
      "name": "Maps & Exports",
      "item": [
        {
          "name": "Create an export",
          "request": {
            "method": "POST",
            "header": [{ "key": "Content-Type", "value": "application/json" }],
            "body": {
              "mode": "graphql",
              "graphql": {
                "query": "mutation CreateExport($input: CreateExportInput!) {\n  createExport(input: $input) {\n    export { id }\n  }\n}",
                "variables": "{\n  \"input\": {\n    \"planId\": \"5a0de0835f1e08eaabc732bd\",\n    \"parameters\": {\n      \"layer\": \"ORTHOMOSAIC\"\n    }\n  }\n}"
              }
            },
            "url": { "raw": "{{baseUrl}}", "host": ["{{baseUrl}}"] },
            "description": "CONFIRMED. createExport takes planId + parameters (only layer is required) and returns export.id. Poll until status is COMPLETE."
          }
        },
        {
          "name": "Fetch exports for a plan",
          "request": {
            "method": "POST",
            "header": [{ "key": "Content-Type", "value": "application/json" }],
            "body": {
              "mode": "graphql",
              "graphql": {
                "query": "query GetExports {\n  node(id: \"MapPlan:5a0de0835f1e08eaabc732bd\") {\n    ... on MapPlan {\n      exports(first: 5) {\n        edges {\n          node {\n            id\n            user { username }\n            parameters {\n              projection\n              merge\n              contourInterval\n              fileFormat\n              resolution\n            }\n            status\n            dateCreation\n            downloadPath\n          }\n        }\n      }\n    }\n  }\n}",
                "variables": ""
              }
            },
            "url": { "raw": "{{baseUrl}}", "host": ["{{baseUrl}}"] },
            "description": "CONFIRMED. Lists exports on a MapPlan with status, parameters, and downloadPath."
          }
        }
      ]
    },
    {
      "name": "Annotations & Issues",
      "item": [
        {
          "name": "Update an issue (modeled)",
          "request": {
            "method": "POST",
            "header": [{ "key": "Content-Type", "value": "application/json" }],
            "body": {
              "mode": "graphql",
              "graphql": {
                "query": "mutation UpdateIssue($input: UpdateIssueInput!) {\n  updateIssue(input: $input) {\n    issue { id title status }\n  }\n}",
                "variables": "{\n  \"input\": {\n    \"id\": \"Issue:REPLACE_ME\",\n    \"status\": \"RESOLVED\"\n  }\n}"
              }
            },
            "url": { "raw": "{{baseUrl}}", "host": ["{{baseUrl}}"] },
            "description": "MODELED. The Issue type and UpdateIssueInput exist in the schema reference; exact fields verified in GraphiQL."
          }
        }
      ]
    },
    {
      "name": "Uploads & Images",
      "item": [
        {
          "name": "Get image count for a plan",
          "request": {
            "method": "POST",
            "header": [{ "key": "Content-Type", "value": "application/json" }],
            "body": {
              "mode": "graphql",
              "graphql": {
                "query": "query GetImageCount {\n  node(id: \"{{mapPlanId}}\") {\n    ... on MapPlan {\n      imageCount\n    }\n  }\n}",
                "variables": ""
              }
            },
            "url": { "raw": "{{baseUrl}}", "host": ["{{baseUrl}}"] },
            "description": "CONFIRMED. MapPlan.imageCount. Uploading new imagery uses DroneDeploy's presigned upload flow (modeled)."
          }
        }
      ]
    },
    {
      "name": "Webhooks",
      "item": [
        {
          "name": "Create export with completion webhook",
          "request": {
            "method": "POST",
            "header": [{ "key": "Content-Type", "value": "application/json" }],
            "body": {
              "mode": "graphql",
              "graphql": {
                "query": "mutation CreateExport($input: CreateExportInput!) {\n  createExport(input: $input) {\n    export { id }\n  }\n}",
                "variables": "{\n  \"input\": {\n    \"planId\": \"5a0de0835f1e08eaabc732bd\",\n    \"parameters\": {\n      \"layer\": \"ORTHOMOSAIC\",\n      \"webhook\": { \"url\": \"https://example.com/hooks/dronedeploy\" }\n    }\n  }\n}"
              }
            },
            "url": { "raw": "{{baseUrl}}", "host": ["{{baseUrl}}"] },
            "description": "CONFIRMED. A webhook.url in export parameters is called when the export reaches COMPLETE."
          }
        }
      ]
    }
  ]
}