API
Reading data
GET any dataset for a client with pagination, ordering and filtering.
Request
bash
curl -s "$AISOIQ_API_BASE?resource=keywords&client_id=$CLIENT_ID&limit=50&order=created_at&direction=desc" \
-H "Authorization: Bearer $AISOIQ_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
| Parameter | Notes |
|---|---|
resource | Required. One of the resources listed below. |
client_id | Required for every resource except clients. |
limit | Default 100, maximum 1000. |
offset | Default 0. Page with offset while has_more is true. |
order | One of created_at, updated_at, id, fetched_at, tracked_at, external_pages, linking_domains, appearances, scored_at. |
direction | asc or desc (default). |
filter_field + filter_value | Exact match on id, status, source_type, source_id, category_id, published, lead_grade, quality_grade or sentiment. |
Response shape
| Field | Type | Description |
|---|---|---|
resource | string | Echoes the requested resource |
client_id | string | Echoes the requested client, omitted for clients |
data | array | One object per row, shape varies by resource |
pagination.total | number | Total rows matching the filter, ignoring limit/offset |
pagination.limit | number | Echoes the limit used |
pagination.offset | number | Echoes the offset used |
pagination.has_more | boolean | True 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 "$AISOIQ_API_BASE?resource=seo_tasks&client_id=$CLIENT_ID&filter_field=status&filter_value=pending&order=created_at&direction=desc" \
-H "Authorization: Bearer $AISOIQ_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
| Resource | Returns | Useful filters |
|---|---|---|
clients | Clients your key can reach | No client_id. Filter by status or id. |
keywords | Tracked keyword rankings over time | Order by tracked_at; filter by status. |
seo_tasks | SEO tasks with priority, status and category | Filter by status or category_id; order by created_at. |
seo_reports | Audit reports | Order by created_at. |
blogs | Blog articles, drafts and published | Filter by status, published or category_id. |
blog_categories / blog_authors | Blog taxonomy and authors | Filter by id. |
geo_articles | Geo-targeted articles | Filter by status. |
topical_maps | Topical authority maps | Order by created_at. |
press_releases | Generated press releases | Filter by status. |
backlinks | Individual backlinks with anchor and source authority | Filter by source_type or source_id; order by external_pages or linking_domains. |
anchor_texts | Anchor text distribution | Filter by source_id. |
top_linked_pages | Most-linked pages | Order by linking_domains. |
domain_metrics | Domain authority, page authority, spam score | Order by fetched_at. |
backlink_outreach / backlink_summaries | Outreach pipeline and AI summaries | Filter by status. |
citations | Directory listings and status | Filter by status. |
gbp_profiles / gbp_posts | Business Profile data and posts | Filter by status. |
reviews | Customer reviews | Filter by sentiment; order by created_at. |
locations | Client business locations | Filter by id. |
grid_searches | Local grid search results | Order by tracked_at. |
competitors | Competitor appearances | Order by appearances. |
llm_reports | Answer-engine visibility reports | Order by scored_at. |
ai_summaries / ai_training | Generated summaries and the knowledge base | Filter by source_id. |
call_tracking_calls / callrail_calls | Calls | Order by created_at. |
call_scores / call_transcriptions | Lead scoring and transcripts | Filter by lead_grade or quality_grade. |
integrations | Connected integrations and status | Filter by status. |