API

Reading data

GET any dataset for a client with pagination, ordering and filtering.

Request

bash
curl -s "$AGENTIX_API_BASE?resource=keywords&client_id=$CLIENT_ID&limit=50&order=created_at&direction=desc" \
  -H "Authorization: Bearer $AGENTIX_API_KEY"
Response
{
  "resource": "keywords",
  "client_id": "uuid-123",
  "data": [
    {
      "keyword": "emergency plumber austin",
      "position": 4,
      "url": "https://acmeplumbing.com/emergency",
      "search_volume": 1200,
      "difficulty": 35,
      "created_at": "2025-06-01"
    }
  ],
  "pagination": { "total": 87, "limit": 50, "offset": 0, "has_more": true }
}

Parameters

ParameterNotes
resourceRequired. One of the resources listed below.
client_idRequired for every resource except clients.
limitDefault 100, maximum 1000.
offsetDefault 0. Page with offset while has_more is true.
orderOne of created_at, updated_at, id, fetched_at, tracked_at, external_pages, linking_domains, appearances, scored_at.
directionasc or desc (default).
filter_field + filter_valueExact match on id, status, source_type, source_id, category_id, published, lead_grade, quality_grade or sentiment.

Response shape

FieldTypeDescription
resourcestringEchoes the requested resource
client_idstringEchoes the requested client, omitted for clients
dataarrayOne object per row, shape varies by resource
pagination.totalnumberTotal rows matching the filter, ignoring limit/offset
pagination.limitnumberEchoes the limit used
pagination.offsetnumberEchoes the offset used
pagination.has_morebooleanTrue if a further page exists at offset + limit

Pagination

List resources are always paginated. Loop on offset until pagination.has_more is false to read every row, and raise limit up to 1000 to cut the number of round trips before you add offset paging on top.

Full pagination loop
async function allRows(resource, clientId) {
  const rows = [];
  let offset = 0;
  for (;;) {
    const params = new URLSearchParams({ resource, client_id: clientId, limit: '1000', offset: String(offset) });
    const res = await fetch(`${BASE}?${params}`, { headers: { Authorization: `Bearer ${KEY}` } });
    const page = await res.json();
    rows.push(...page.data);
    if (!page.pagination?.has_more) return rows;
    offset += 1000;
  }
}

Ordering and filtering

order and filter_field only accept the whitelisted values shown above, this is intentional, not a bug. Combine filter_field/filter_value with order/direction to get, for example, the newest pending tasks first:

bash
curl -s "$AGENTIX_API_BASE?resource=seo_tasks&client_id=$CLIENT_ID&filter_field=status&filter_value=pending&order=created_at&direction=desc" \
  -H "Authorization: Bearer $AGENTIX_API_KEY"

Whitelisted on purpose

Order and filter fields are restricted to a fixed list. Anything else returns 400 with the allowed values, which keeps the schema from being probed through the API.

Resources

ResourceReturnsUseful filters
clientsClients your key can reachNo client_id. Filter by status or id.
keywordsTracked keyword rankings over timeOrder by tracked_at; filter by status.
seo_tasksSEO tasks with priority, status and categoryFilter by status or category_id; order by created_at.
seo_reportsAudit reportsOrder by created_at.
blogsBlog articles, drafts and publishedFilter by status, published or category_id.
blog_categories / blog_authorsBlog taxonomy and authorsFilter by id.
geo_articlesGeo-targeted articlesFilter by status.
topical_mapsTopical authority mapsOrder by created_at.
press_releasesGenerated press releasesFilter by status.
backlinksIndividual backlinks with anchor and source authorityFilter by source_type or source_id; order by external_pages or linking_domains.
anchor_textsAnchor text distributionFilter by source_id.
top_linked_pagesMost-linked pagesOrder by linking_domains.
domain_metricsDomain authority, page authority, spam scoreOrder by fetched_at.
backlink_outreach / backlink_summariesOutreach pipeline and AI summariesFilter by status.
citationsDirectory listings and statusFilter by status.
gbp_profiles / gbp_postsBusiness Profile data and postsFilter by status.
reviewsCustomer reviewsFilter by sentiment; order by created_at.
locationsClient business locationsFilter by id.
grid_searchesLocal grid search resultsOrder by tracked_at.
competitorsCompetitor appearancesOrder by appearances.
llm_reportsAnswer-engine visibility reportsOrder by scored_at.
ai_summaries / ai_trainingGenerated summaries and the knowledge baseFilter by source_id.
call_tracking_calls / callrail_callsCallsOrder by created_at.
call_scores / call_transcriptionsLead scoring and transcriptsFilter by lead_grade or quality_grade.
integrationsConnected integrations and statusFilter by status.

Was this page helpful?