Developers

Project management API

One endpoint, one typed schema, and you ask for exactly the fields you need — so an intake script and a dashboard query talk to the same API without either one over-fetching.

One endpoint, one schema

The whole workspace is reachable through a single GraphQL endpoint:

POST https://otper.com/graphql

One typed schema describes every board, list, card, comment, checklist, label and report, and each request asks for exactly the fields it needs. A script that creates a card sends a few lines; a dashboard that wants a month of throughput asks for a month of throughput. Neither one is waiting for somebody to build a new endpoint, and neither is downloading a response shaped for the other.

What you can build

  • Automate intake — turn helpdesk tickets, form submissions or monitoring alerts into cards on the right board, the moment they arrive.
  • Sync status across systems — move a card between lists, set or clear a due date, add and remove labels, assign and unassign owners.
  • Feed dashboards without exports — query the same delivery reporting the Reports page uses, on your own schedule.
  • Reach the whole workspace — boards, lists, cards, comments, checklists, labels, files and notifications, not a curated subset.

Intake, as a mutation

A support ticket becomes a card on the engineering board. One write, and it is on the board, in the timeline view, and in the next report — because those are all views of the same data.

mutation CreateCard {
  createCard(input: {
    title: "Checkout returns 500 for saved cards"
    description: "Raised in support ticket #4821"
    list: { connect: 12 }
  }) {
    id
    slug
    title
  }
}

Reporting, as a query

The delivery numbers are queryable, so an internal dashboard reads them live instead of consuming an export somebody has to remember to run. See what the reporting covers.

query DeliverySnapshot {
  teamReport(
    team_slug: "growth"
    filter: {
      date_from: "2026-08-01 00:00:00"
      date_to: "2026-08-31 23:59:59"
    }
  ) {
    stat_cards {
      completed_cards
      in_progress_cards
      overdue_cards
    }
    throughput {
      periods { label created completed }
    }
    insights {
      list_bottleneck {
        lists { list_name avg_days status }
      }
    }
  }
}

When you do not need the API at all

If all you want is for another system to file work into a board, a board can issue an inbound webhook URL. Post a title and a description to it and the card appears — the token in the URL is the credential, so there is no client library, no schema to learn, and nothing to authenticate separately.

POST https://otper.com/api/webhook/board/{token}

Cards created this way land unassigned in the board's first list, so pair it with an automation that assigns an owner on arrival. See how ownership works.

Documentation you can run

The API reference is generated from the running schema and ships with an interactive explorer, so the docs and the server can never disagree. Browse every query, mutation and type, load a ready-made example, edit it, and run it against your own workspace.

Open the API documentation

Common questions

How do I authenticate?

A bearer token on the request. Signed in, you can also run queries straight from the documentation page — it attaches your token automatically, so you can try a call before writing any code.

Why GraphQL rather than REST?

Because you ask for the fields you need and get exactly those. An intake script that only writes a title and a list, and a dashboard that reads a month of throughput, hit the same endpoint without either one over-fetching or waiting on a new endpoint to be built.

Are the docs kept up to date?

They cannot go out of date. The documentation and the interactive explorer are generated from the running schema, so what you read is what the server accepts right now.

Can I read reporting data through the API?

Yes. The same team report the Reports page renders is a query, so an internal dashboard can pull throughput, bottlenecks, overdue counts and workload directly rather than waiting on a CSV.

What if I just want to create cards from another system?

A board can issue an inbound webhook URL. Post a title and a description to it and a card appears on that board, with the token acting as the credential. No client library and no schema knowledge needed.

See your team's work in one operational view.

Free for up to 3 users. No credit card required.

Start for Free