Periodic SEO reports
`/periodic-reports` - read-only
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: periodic-reports:read.
bearerAuthAuthorizationBearer <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.
page?integer1-based. meta.totalPages says how many there are.
1 <= value1per_page?integerRows per page. A value above 200 returns 400 - never a silent clamp.
1 <= value <= 20050sort?stringPrefix with - for descending. An undeclared sort returns 400.
"-periodKey""periodKey""-periodKey""generatedAt""-generatedAt""createdAt""-createdAt"filter[cadence]?stringExact match on cadence.
filter[isTest]?stringExact match on isTest.
"true""false"filter[portalVisible]?stringExact match on portalVisible.
"true""false"filter[status]?stringExact match on status.
filter[deliveryStatus]?stringExact match on deliveryStatus.
The requested page.
application/json- response
data*array<>meta*curl -X GET 'https://api.usedashly.com/v1/periodic-reports'{ "data": [ { "id": "string", "cadence": "string", "periodKey": "2019-08-24", "periodStart": "2019-08-24", "periodEnd": "2019-08-24", "isTest": true, "isBaseline": true, "portalVisible": true, "status": "string", "generatedAt": "2019-08-24T14:15:22Z", "deliveryStatus": "string", "deliveryChannel": "string", "summary": "string", "payload": null, "createdAt": "2019-08-24T14:15:22Z" } ], "meta": { "page": 0, "perPage": 0, "total": 0, "totalPages": 0 }}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: periodic-reports:read.
bearerAuthAuthorizationBearer <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.
id*stringThe record's public id (hsbftmp3f5), as returned in the id field. An internal UUID returns 404.
Found.
application/json- response
data*curl -X GET 'https://api.usedashly.com/v1/periodic-reports/string'{ "data": { "id": "string", "cadence": "string", "periodKey": "2019-08-24", "periodStart": "2019-08-24", "periodEnd": "2019-08-24", "isTest": true, "isBaseline": true, "portalVisible": true, "status": "string", "generatedAt": "2019-08-24T14:15:22Z", "deliveryStatus": "string", "deliveryChannel": "string", "summary": "string", "payload": null, "createdAt": "2019-08-24T14:15:22Z" }}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: periodic-reports:read.
bearerAuthAuthorizationBearer <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.
The available verbs.
application/json- response
data*array<>curl -X GET 'https://api.usedashly.com/v1/periodic-reports/actions'{ "data": [ { "name": "string", "label": "string", "description": "string", "target": "item", "readOnly": true, "path": "string", "input": {} } ]}Turns the automatic SEO report on or off for a client, weekly (Monday) or monthly (the 4th), and sets the client's Slack channel: with one the report is announced there, without one the client's portal users who read reports are emailed. Off by default. Calling it again updates the same setting.
Does what the dashboard's savePeriodicReportSettingsAction does - same implementation, so the two cannot diverge.
Required scope: periodic-reports:write.
bearerAuthAuthorizationBearer <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.
Idempotency-Key?stringA 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.
8 <= length <= 255application/json- body
enabled*booleancadence*string"weekly""monthly"slackChannel?|nullclientId*string1 <= length <= 60Done.
application/json- response
data*unknownThe action's result; its shape depends on the verb.
curl -X POST 'https://api.usedashly.com/v1/periodic-reports/actions/save-settings' \ -H 'Content-Type: application/json' \ -d '{ "enabled": true, "cadence": "weekly", "clientId": "string"}'{ "data": null}Shows a generated periodic report in the client's portal (published: true) or removes it. A test report stays out of the portal until published this way. Delivery (Slack or email) is never triggered by this verb.
Does what the dashboard's setPeriodicReportPublishedAction does - same implementation, so the two cannot diverge.
Required scope: periodic-reports:write.
bearerAuthAuthorizationBearer <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.
id*stringThe 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.
Idempotency-Key?stringA 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.
8 <= length <= 255application/json- body
published*booleanDone.
application/json- response
data*unknownThe action's result; its shape depends on the verb.
curl -X POST 'https://api.usedashly.com/v1/periodic-reports/string/actions/publish' \ -H 'Content-Type: application/json' \ -d '{ "published": true}'{ "data": null}