GraphQL API

Your Echo data, in the systems you already run

Your developer names the fields they want (conversations, outcomes, seekers, responder coverage) and Echo returns exactly those, on whatever schedule you run it. One token, scoped to your account and nobody else's.

$100 a month on top of any plan. What that includes

Ask POST /graphql
{
  conversation(
    startDate: "2026-07-01T00:00:00Z"
    endDate:   "2026-07-31T23:59:59Z"
    dateField: "closed_at"
  ) {
    totalCount
    nodes { topic outcomeTitle }
  }
}
Receive the shape of the answer
{
  "data": { "conversation": {
    "totalCount": …,
    "nodes": [
      { "topic": "…",
        "outcomeTitle": "…" }
    ]
  } }
}

Start here

What this is, in plain words

If you are not a developer, this page can look like a wall of code. The idea underneath it is simple, and it is worth understanding before you decide whether your ministry needs it.

An API is a door for software

That is all an API is, a way for one system to ask another system a question and get an answer back.

Your team signs into Echo through a screen. Another program signs in through an API: the same data, the same permissions, no human clicking.

GraphQL means you ask for what you want

Most exports hand you every column and leave you to find the three you needed.

With GraphQL your developer names the fields (the topic, the outcome, the responder) and those are the fields that come back. Smaller, faster, and nothing to clean up at the other end.

Nobody has to remember to run it

Once it is set up it runs on its own: your systems pull from Echo every night, every hour, or the moment somebody opens the dashboard.

What your board looks at is the live record rather than the export somebody downloaded three weeks ago.

The two gaps

Why a ministry ends up needing this

What you get back is one report instead of two, and a number your board can trust because nobody typed it twice.

The moment Echo stops being the whole picture. A seeker reaches out on WhatsApp, a responder walks with them for three weeks, they get connected to a local church, and then the story continues in your CRM, your discipleship tracker, or the spreadsheet your regional director keeps.

Right now somebody rekeys it, or it never crosses over at all.

The other moment is the report nobody enjoys assembling. Your board, or a funder, wants Echo’s outcomes sitting beside giving, events or field data, and getting there means one person exporting out of two systems every quarter and joining them by hand.

This add-on closes both gaps. Conversations, outcomes, seekers and responder activity move into the system that already holds the rest of the story, on a schedule, without a person in the middle.

What is in there

The data you can reach

Everything below is scoped to your ministry and nobody else's. A token can only ever see the data of the account it was made in.

Signed-in staff get the full field-by-field reference at /graphql-docs on your own Echo address, generated from the live schema, so it is never out of date.

Conversations, calls and messages
Every conversation across every channel, plus phone calls and the messages inside them, with the status, responder, outcome, tags and response times recorded on each.
Seekers
The person record: name, contact details across channels, location, language, the outcomes recorded on them over time, and how many conversations they have had with you. Lookup by email or phone number, which is what a CRM sync runs on.
Responders and coverage
Your team, their roles and permission sets, their schedules, who is on right now, the online and away log, hours online per week, the live voice queue, and the inbox and claimed list each member sees.
Channels and campaigns
Your referrers (each connected channel, chat widget and provisioned phone number) and the source groups they sit in, so you can attribute conversations back to the campaign or platform that produced them.
Tags and outcomes
Your own tag tree and outcome list, with the ids you filter by. Tags can be created and edited through the API too, so an external system can keep your taxonomy in step.
Social posts and comments
Posts on your connected social accounts and the comments underneath them, inbound and outbound, by date and by account.

Be honest with yourself first

Not every ministry needs this

It is a real add-on with a real price. We would rather you skip it than buy it and never switch it on.

Worth it if any of these are true

  • Someone on your team already rekeys Echo numbers into another system every month
  • You run a CRM, donor platform or data warehouse that leadership actually reports from
  • Your board or a major funder wants Echo’s outcomes joined to giving, events or field data
  • You want your own dashboard, in your own tool, refreshed without anybody running an export
  • You have a developer, a contractor, or an IT partner who can write a query

Skip it if these are true

  • Echo's own reporting already answers the questions you ask of it
  • An export you download a few times a year is genuinely enough
  • Nobody in your ministry or your network writes code
  • Nobody would own it once it is built. A sync is a small piece of software, and it needs somebody to notice the month it quietly stops

Not sure which one you are? Tell us what you are trying to join up

GraphQL API

$100

per month, added to whichever plan you are on

One price, whatever your plan. It covers up to 5 GraphQL-enabled tokens, 300 requests a minute, and the whole schema, reads and writes. No setup fee, no per-query charge, no minimum term, and no negotiation about which endpoints you are allowed to touch.

Included in the $100

  • The full GraphQL schema: every query and every mutation
  • 5 GraphQL-enabled API tokens
  • 300 requests per minute
  • 31-day query windows, 10,000-record depth
  • The field-by-field schema reference on your own Echo address
  • Our help getting the first query working

If you need more than that

Some ministries run at a scale the standard limits were not drawn for: more tokens, a higher rate, wider date windows, or capacity set aside for their traffic alone. That is a custom arrangement and we price it per ministry rather than pretending one number fits.

Tell us what you need it to do

Getting started

From nothing to a first result

Four steps. There is no build, no integration project and no setup fee.

Step 1

Switch the add-on on

Ask us, or say yes at signup. It goes live on your account the same day, and nothing about your existing plan changes.

Step 2

Create an API token

An admin creates one in Echo’s admin under API Keys. It is shown once, so copy it then. Treat it like a password, give each system its own rather than sharing one, and deactivate it the moment a contractor’s work ends.

Step 3

Send the first query

Everything goes to one address by POST, with the token in the Authorization header. If it comes back with your ministry’s name, the connection is good.

Step 4

Page through the results

Results come back in pages with a cursor. Ask for the next page with that cursor until there is not one, and store the last updatedAt you saw so tomorrow’s run only fetches what changed.

Step 3 your first request
# Your Echo address is the one your team signs in at.
curl https://your-ministry.echoglobal.org/graphql \
  -H "Authorization: Bearer $ECHO_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"query":"{ tenant { name timeZone } }"}'

# {"data":{"tenant":{"name":"Your Ministry","timeZone":"UTC"}}}

Worked examples

Four things ministries actually do with it

Real queries against the live schema, with the shape of the answer beside them. Values are illustrative; the fields and arguments are not.

Last month's closed conversations, with outcome and responder

The question every board asks and nobody enjoys assembling: how many people did we walk with, what happened, and who did the walking. One request, filtered on the date each conversation was closed rather than started, so a conversation that ran across the month boundary lands in the month it finished.

  • totalCount gives you the headline number without paging
  • dateField chooses which timestamp the range applies to
  • Add referrerId to split the same figure by channel or campaign
Query
query ClosedLastMonth {
  conversation(
    startDate: "2026-07-01T00:00:00Z"
    endDate:   "2026-07-31T23:59:59Z"
    dateField: "closed_at"
    status:    ["closed"]
    first:     100
  ) {
    totalCount
    nodes {
      id
      topic
      closedAt
      outcomeTitle
      user     { fullName }
      referrer { name category }
      tags     { name }
    }
    pageInfo { hasNextPage endCursor }
  }
}

The details a developer will ask for

Endpoint, auth and limits

Everything below applies to the $100 plan. If your integration needs more than these allow, talk to us.

Reads run against a replica of the database, so a heavy pull will not slow down the responders working in the inbox.

Endpoint
POST /graphql on your ministry's own Echo address
Authentication
An API token in the Authorization header: Bearer <token>. No cookies, no session, no OAuth dance
Schema reference
Field-by-field docs at /graphql-docs on the same address, generated from the live schema, for signed-in staff
Reads
Thirty-eight root queries: conversations, calls, messages and their events, seekers, responders, schedules, presence, the voice queue, permission sets, tags, outcomes, channels and source groups, and social posts and comments
Writes
Eight mutations: send a message, create or update a seeker, claim or close a conversation, create, update or delete a tag
Pagination
Relay-style cursor connections: first, after, pageInfo, totalCount, plus nodes if you would rather skip edges
Page size
Up to 250 records per page on most queries; a few with large payloads cap lower
Rate limit
300 requests per minute for the account. Over it the request comes back 429, naming your limit, and the next minute starts a fresh window
Date range per query
Up to 31 days. Longer histories are a loop over months, which also keeps each response a sane size
Pagination depth
Up to 10,000 records deep into one result set. Past that, narrow the range rather than paging further. It is much faster for you as well as for us
Tokens
Up to 5 GraphQL-enabled tokens, so each connected system gets its own and can be revoked on its own
Token restrictions
A token can be made read-only, and can be pinned to a named list of queries: the right shape for handing one to an outside partner
Isolation
Every query is scoped to the account the token belongs to. There is no request that reaches another ministry's data
Errors
GraphQL's own errors array, with a message that says which limit you crossed and what to do instead

Questions

What ministries ask before they buy it

Not really, and we would rather say so than take the money. The $100 is for access, not for us writing the integration. Somebody on your side, a contractor, or an IT partner has to write the query.

No, and the difference matters. An integration is a specific connection we build and maintain between Echo and a named platform. This is raw access. It can do far more, and it needs somebody on your side to write it. If a ready-made integration covers your case, use that instead.

Both. Eight mutations write: send a message, create or update a seeker, claim or close a conversation, and create, update or delete a tag. Everything else reads. A token can also be made read-only, which blocks every write on it whatever query is sent.

Yes. The message query returns the text, because a ministry joining its own conversations to its own systems usually needs it. It is worth deciding deliberately who holds a token that can: a token can be pinned to a named list of queries, so one issued to an outside partner can be given counts, outcomes and timings without message bodies.

Thirty-one days in a single request. A longer history is a loop over months, which also keeps each response a size your own system can handle. If your integration genuinely needs wider windows, that is what the custom arrangement above is for.

No. Every query is scoped to the account its token belongs to, in the code path itself rather than by a filter somebody remembered to add. A token issued in your account can only ever return your account’s data. See Security & trust.

Deactivate it in Echo’s admin and it stops working immediately. This is why the plan includes five: give each system and each contractor their own, and revoking one never breaks the others. A token can also be made read-only, or restricted to a named list of queries.

The request comes back with a 429 and a message naming your limit, and the next minute starts a fresh window. Nothing is charged for it and nothing is cut off. A sync that hits the ceiling just needs to space its requests out.

It should not. Reads run against a replica of the database rather than the one the inbox uses, and the rate limit and date-range caps exist so that no single query can run away with the account.

All frequently asked questions