Dashly Docs

Search Console query filters

`/search-query-filters`

GET
/search-query-filters

One page of records, newest first unless you say otherwise, with the total count in meta so you know how far to paginate.

Required scope: search-query-filters:read.

Authorization

bearerAuth
headerAuthorizationBearer <token>

Your agency's API key: Authorization: Bearer ak_…. Created in Connectors → API & webhooks and shown once. A key authenticates an agency, not a person.

Query Parameters

page?integer

1-based. meta.totalPages says how many there are.

Range1 <= value
Default1
per_page?integer

Rows per page. A value above 200 returns 400 - never a silent clamp.

Range1 <= value <= 200
Default50
sort?string

Prefix with - for descending. An undeclared sort returns 400.

Default"name"
Value in"name""-name""createdAt""-createdAt""updatedAt""-updatedAt"
q?string

Case-insensitive "contains", across: name.

filter[clientId]?string

Exact match on clientId.

filter[mode]?string

Exact match on mode.

filter[portalDefault]?string

Exact match on portalDefault.

Value in"true""false"

Response Body

The requested page.

application/json
  1. response
data*array<>
meta*
Example Request
curl -X GET 'https://api.usedashly.com/v1/search-query-filters'
Example Response
{  "data": [    {      "id": "string",      "clientId": "string",      "name": "string",      "mode": "string",      "rules": null,      "portalDefault": true,      "createdAt": "2019-08-24T14:15:22Z",      "updatedAt": "2019-08-24T14:15:22Z"    }  ],  "meta": {    "page": 0,    "perPage": 0,    "total": 0,    "totalPages": 0  }}
POST
/search-query-filters

Links are given as the target's public id (clientId: "hsbftmp3f5"); the API resolves them server-side. Fields the database requires but the interface decides for you are filled in the same way here.

Required scope: search-query-filters:write.

Authorization

bearerAuth
headerAuthorizationBearer <token>

Your agency's API key: Authorization: Bearer ak_…. Created in Connectors → API & webhooks and shown once. A key authenticates an agency, not a person.

Header Parameters

Idempotency-Key?string

A value you choose (a UUID is the usual one), 8 to 255 characters of A-Z a-z 0-9 _ . : -. Retrying with the same key returns the first call's answer instead of creating a second record, for seven days. The same key with a different body returns 409.

Length8 <= length <= 255

Request Body

application/json
  1. body
name*string
Length1 <= length <= 80
mode?string
Value in"include""exclude"
rules*array<>
Items1 <= items <= 100
portalDefault?boolean
clientId*string
createdAt?string

When this actually happened, for an import. Past dates only; defaults to now. updatedAt follows it unless the body sets one.

Formatdate-time

Response Body

Created. The body is the new record, as a read would return it.

application/json
  1. response
data*
Example Request
curl -X POST 'https://api.usedashly.com/v1/search-query-filters' \  -H 'Content-Type: application/json' \  -d '{  "name": "string",  "rules": [    {      "type": "exact",      "value": "string"    }  ],  "clientId": "string"}'
Example Response
{  "data": {    "id": "string",    "clientId": "string",    "name": "string",    "mode": "string",    "rules": null,    "portalDefault": true,    "createdAt": "2019-08-24T14:15:22Z",    "updatedAt": "2019-08-24T14:15:22Z"  }}
GET
/search-query-filters/{id}

The full record, custom fields included when the resource carries them. A record from another agency is a 404, not a 403 - its existence is not ours to confirm.

Required scope: search-query-filters:read.

Authorization

bearerAuth
headerAuthorizationBearer <token>

Your agency's API key: Authorization: Bearer ak_…. Created in Connectors → API & webhooks and shown once. A key authenticates an agency, not a person.

Path Parameters

id*string

The record's public id (hsbftmp3f5), as returned in the id field. An internal UUID returns 404.

Response Body

Found.

application/json
  1. response
data*
Example Request
curl -X GET 'https://api.usedashly.com/v1/search-query-filters/string'
Example Response
{  "data": {    "id": "string",    "clientId": "string",    "name": "string",    "mode": "string",    "rules": null,    "portalDefault": true,    "createdAt": "2019-08-24T14:15:22Z",    "updatedAt": "2019-08-24T14:15:22Z"  }}
PATCH
/search-query-filters/{id}

A partial update: only the fields you send change. One exception - customFields is replaced wholesale, not merged, so sending it with a single key clears the others. Read the record, merge, then write.

Required scope: search-query-filters:write.

Authorization

bearerAuth
headerAuthorizationBearer <token>

Your agency's API key: Authorization: Bearer ak_…. Created in Connectors → API & webhooks and shown once. A key authenticates an agency, not a person.

Path Parameters

id*string

The record's public id (hsbftmp3f5), as returned in the id field. An internal UUID returns 404.

Request Body

application/json
  1. body
name?string
Length1 <= length <= 80
mode?string
Value in"include""exclude"
rules?array<>
Items1 <= items <= 100
portalDefault?boolean

Response Body

Updated. The body is the record as it now stands.

application/json
  1. response
data*
Example Request
curl -X PATCH 'https://api.usedashly.com/v1/search-query-filters/string' \  -H 'Content-Type: application/json' \  -d '{}'
Example Response
{  "data": {    "id": "string",    "clientId": "string",    "name": "string",    "mode": "string",    "rules": null,    "portalDefault": true,    "createdAt": "2019-08-24T14:15:22Z",    "updatedAt": "2019-08-24T14:15:22Z"  }}
DELETE
/search-query-filters/{id}

Permanent. The audit log keeps the trace; the record does not come back.

Required scope: search-query-filters:write.

Authorization

bearerAuth
headerAuthorizationBearer <token>

Your agency's API key: Authorization: Bearer ak_…. Created in Connectors → API & webhooks and shown once. A key authenticates an agency, not a person.

Path Parameters

id*string

The record's public id (hsbftmp3f5), as returned in the id field. An internal UUID returns 404.

Response Body

Deleted. Empty body.

Example Request
curl -X DELETE 'https://api.usedashly.com/v1/search-query-filters/string'
Example Response
Empty

List available actions

GET
/search-query-filters/actions

Every verb this resource answers to, with its target and the JSON Schema of its body - the same contracts this document describes, readable at runtime.

Required scope: search-query-filters:read.

Authorization

bearerAuth
headerAuthorizationBearer <token>

Your agency's API key: Authorization: Bearer ak_…. Created in Connectors → API & webhooks and shown once. A key authenticates an agency, not a person.

Response Body

The available verbs.

application/json
  1. response
data*array<>
Example Request
curl -X GET 'https://api.usedashly.com/v1/search-query-filters/actions'
Example Response
{  "data": [    {      "name": "string",      "label": "string",      "description": "string",      "target": "item",      "readOnly": true,      "path": "string",      "input": {}    }  ]}
GET
/search-query-filters/{id}/actions/apply

The client's Search Console figures over the queries this filter keeps, for a period - days (28 by default, ending on the last consolidated day) or from/to: totals and previousTotals (clicks, impressions, ctr 0..1, position impression-weighted), the daily series of the kept queries and droppedSeries of the others (brand vs non-brand), and the top 50 kept queries. Summed from the per-query rows, so Google's anonymised queries are not counted.

Reads the same data as the in-app loadFilteredSearchAction - same implementation. Changes nothing; also answers GET with the same fields as query parameters.

Required scope: search-query-filters:read.

Authorization

bearerAuth
headerAuthorizationBearer <token>

Your agency's API key: Authorization: Bearer ak_…. Created in Connectors → API & webhooks and shown once. A key authenticates an agency, not a person.

Path Parameters

id*string

The public id of the record to act on. It is resolved inside your agency before the action runs, so an id from another tenant is a 404 and never reaches it.

Query Parameters

days?integer
Range2 <= value <= 365
from?string
Match^\d{4}-\d{2}-\d{2}$
to?string
Match^\d{4}-\d{2}-\d{2}$

Response Body

The figures.

application/json
  1. response
data*unknown

The action's result; its shape depends on the verb.

Example Request
curl -X GET 'https://api.usedashly.com/v1/search-query-filters/string/actions/apply'
Example Response
{  "data": null}
POST
/search-query-filters/{id}/actions/apply

The client's Search Console figures over the queries this filter keeps, for a period - days (28 by default, ending on the last consolidated day) or from/to: totals and previousTotals (clicks, impressions, ctr 0..1, position impression-weighted), the daily series of the kept queries and droppedSeries of the others (brand vs non-brand), and the top 50 kept queries. Summed from the per-query rows, so Google's anonymised queries are not counted.

Reads the same data as the in-app loadFilteredSearchAction - same implementation. Changes nothing; also answers GET with the same fields as query parameters.

Required scope: search-query-filters:read.

Authorization

bearerAuth
headerAuthorizationBearer <token>

Your agency's API key: Authorization: Bearer ak_…. Created in Connectors → API & webhooks and shown once. A key authenticates an agency, not a person.

Path Parameters

id*string

The public id of the record to act on. It is resolved inside your agency before the action runs, so an id from another tenant is a 404 and never reaches it.

Header Parameters

Idempotency-Key?string

A value you choose (a UUID is the usual one), 8 to 255 characters of A-Z a-z 0-9 _ . : -. Retrying with the same key returns the first call's answer instead of creating a second record, for seven days. The same key with a different body returns 409.

Length8 <= length <= 255

Request Body

application/json
  1. body
days?integer
Range2 <= value <= 365
from?string
Match^\d{4}-\d{2}-\d{2}$
to?string
Match^\d{4}-\d{2}-\d{2}$

Response Body

Done.

application/json
  1. response
data*unknown

The action's result; its shape depends on the verb.

Example Request
curl -X POST 'https://api.usedashly.com/v1/search-query-filters/string/actions/apply' \  -H 'Content-Type: application/json' \  -d '{}'
Example Response
{  "data": null}
POST
/search-query-filters/{id}/actions/add-rule

Appends one rule {type: exact|contains|starts_with|ends_with|regex, value} to the filter, unless an equal one (case aside) is already there. A regex is at most 200 characters, without back-references, lookbehind, named groups or nested unbounded repetition. A filter holds at most 100 rules. Returns the filter.

Does what the dashboard's addQueryToFilterAction does - same implementation, so the two cannot diverge.

Required scope: search-query-filters:write.

Authorization

bearerAuth
headerAuthorizationBearer <token>

Your agency's API key: Authorization: Bearer ak_…. Created in Connectors → API & webhooks and shown once. A key authenticates an agency, not a person.

Path Parameters

id*string

The public id of the record to act on. It is resolved inside your agency before the action runs, so an id from another tenant is a 404 and never reaches it.

Header Parameters

Idempotency-Key?string

A value you choose (a UUID is the usual one), 8 to 255 characters of A-Z a-z 0-9 _ . : -. Retrying with the same key returns the first call's answer instead of creating a second record, for seven days. The same key with a different body returns 409.

Length8 <= length <= 255

Request Body

application/json
  1. body
type*string
Value in"exact""contains""starts_with""ends_with""regex"
value*string
Length1 <= length <= 200

Response Body

Done.

application/json
  1. response
data*unknown

The action's result; its shape depends on the verb.

Example Request
curl -X POST 'https://api.usedashly.com/v1/search-query-filters/string/actions/add-rule' \  -H 'Content-Type: application/json' \  -d '{  "type": "exact",  "value": "string"}'
Example Response
{  "data": null}

Preview query rules

GET
/search-query-filters/actions/preview

What rules would match among the client's Search Console queries over a period, before saving them: how many distinct queries match out of all, their clicks out of all clicks, and the 20 matched queries with the most clicks. Saves nothing.

Reads the same data as the in-app previewQueryFilterAction - same implementation. Changes nothing; also answers GET with the same fields as query parameters.

Required scope: search-query-filters:read.

Authorization

bearerAuth
headerAuthorizationBearer <token>

Your agency's API key: Authorization: Bearer ak_…. Created in Connectors → API & webhooks and shown once. A key authenticates an agency, not a person.

Query Parameters

clientId?string
Length1 <= length
rules?array<>
Items1 <= items <= 100
days?integer
Range2 <= value <= 365
from?string
Match^\d{4}-\d{2}-\d{2}$
to?string
Match^\d{4}-\d{2}-\d{2}$

Response Body

The figures.

application/json
  1. response
data*unknown

The action's result; its shape depends on the verb.

Example Request
curl -X GET 'https://api.usedashly.com/v1/search-query-filters/actions/preview'
Example Response
{  "data": null}

Preview query rules

POST
/search-query-filters/actions/preview

What rules would match among the client's Search Console queries over a period, before saving them: how many distinct queries match out of all, their clicks out of all clicks, and the 20 matched queries with the most clicks. Saves nothing.

Reads the same data as the in-app previewQueryFilterAction - same implementation. Changes nothing; also answers GET with the same fields as query parameters.

Required scope: search-query-filters:read.

Authorization

bearerAuth
headerAuthorizationBearer <token>

Your agency's API key: Authorization: Bearer ak_…. Created in Connectors → API & webhooks and shown once. A key authenticates an agency, not a person.

Header Parameters

Idempotency-Key?string

A value you choose (a UUID is the usual one), 8 to 255 characters of A-Z a-z 0-9 _ . : -. Retrying with the same key returns the first call's answer instead of creating a second record, for seven days. The same key with a different body returns 409.

Length8 <= length <= 255

Request Body

application/json
  1. body
clientId*string
Length1 <= length
rules*array<>
Items1 <= items <= 100
days?integer
Range2 <= value <= 365
from?string
Match^\d{4}-\d{2}-\d{2}$
to?string
Match^\d{4}-\d{2}-\d{2}$

Response Body

Done.

application/json
  1. response
data*unknown

The action's result; its shape depends on the verb.

Example Request
curl -X POST 'https://api.usedashly.com/v1/search-query-filters/actions/preview' \  -H 'Content-Type: application/json' \  -d '{  "clientId": "string",  "rules": [    {      "type": "exact",      "value": "string"    }  ]}'
Example Response
{  "data": null}