Frase Next actions API

The Next actions API from Frase — 1 operation(s) for next actions.

GitHub OpenAPI

Operations 1

GET /next-actions What to do now on a site #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/frase-io:frase-io-next-actions-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

frase-io-next-actions-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Frase Next actions API
  version: 1.0.0
  description: 'The Frase API provides programmatic access to your SEO content platform. Use it to manage content, research, audits, AI visibility tracking, and more. ## Authentication


    All API requests require authentication using an API key. Include your key in the `X-API-KEY` header:


    ```

    X-API-KEY: sk_live_your_api_key_here

    ```


    For legacy compatibility, the `token` header is also supported. ## Rate Limits


    Three independent limits apply, each with its own headers and error code. Headers are returned on `429` responses, not on successful ones. **Per-minute burst** - 60/min on trial and Starter, 120 Professional, 300 Scale, 1,000 Enterprise. Error code `rate_limit_exceeded`. - `X-RateLimit-Limit`, `X-RateLimit-Remaining`, `X-RateLimit-Reset` (epoch seconds)


    **Sustained hourly ceiling** - 2,000/hour trial, 3,000 Starter, 5,000 Professional, 15,000 Scale, 50,000 Enterprise. Error code `hourly_limit_exceeded`. - `X-RateLimit-Hourly-Limit`, `X-RateLimit-Hourly-Remaining`, `X-RateLimit-Hourly-Reset` (epoch seconds)


    **Monthly request budget** - error code `monthly_budget_exceeded`, headers `X-Monthly-Limit`, `X-Monthly-Used`, `X-Monthly-Remaining`. Every `429` carries `Retry-After` in seconds. On the hourly ceiling this can be up to 3,600, so clients should honour it rather than retrying on a short fixed backoff - a retry sooner than `Retry-After` cannot succeed. ## Errors


    The API uses standard HTTP status codes and returns errors in a consistent format:


    ```json

    {

    "error": {

    "type": "authentication_error",

    "code": "invalid_api_key",

    "message": "Invalid API key provided.",

    "doc_url": "https://docs.frase.io/api/errors#invalid_api_key"

    }

    }

    ```


    ## Changelog


    Breaking changes are listed here, newest first. "Breaking" means a field that was always present with a value can now be `null`, or an existing value now means something different — not that a field was removed or renamed. Additive fields are not listed. ### 2026-08-31 — Fact `sources[]` may omit `url`, and minted facts default to `approved`


    - `GET /briefs/{id}/facts`, `PATCH /briefs/{id}/facts/{factId}` → a `sources[]` entry may now carry only `title`, with no `url` or `domain`. Research names a publisher far more often than it captures a link (793 of 801 plan-evidence items in production), and those names were previously discarded rather than returned. Read `url` defensively. - `GET /briefs/{id}/facts` → `approval` on a newly minted fact is now `approved` rather than `pending`. A client polling for `pending` facts to review will see far fewer; rejection is unchanged and remains permanent. Facts the writer asserted in its own output (`provenance: generated`) are still minted `pending`. ### 2026-08-24 — Content Guard''s hasPublishedUrl is now recoverability, not the stored URL


    - `GET /content/{id}/monitoring` → `hasPublishedUrl`: was a judgment on the STORED URL (false for a relative path even when the page was live). It now answers "could Guard watch this article right now" — the stored URL when absolute, or an address the server recovers (CMS inventory; FraseCMS re-derivation from current settings when a live published post exists). `true` no longer implies the stored URL itself is absolute, and a FraseCMS article published before domain setup flips to `true` when setup finishes, with no re-publish. It remains exactly the condition enabling enforces. - `publishedUrlIssue` is now the RESIDUAL after recovery failed, not a raw-column classification — "not_absolute" can also mean the FraseCMS post is not live or FraseCMS is disabled for the site. - `POST /content/{id}/publish` → `url` (frase_cms): now derived from the site''s current CMS settings rather than the adapter''s host-of-the-moment value; the same URL is stored on the content row and sent in the content.published webhook.'
  contact:
    name: Frase Support
    url: https://frase.io
    email: support@frase.io
  license:
    name: Proprietary
    url: https://www.frase.io/company/terms
servers:
- url: https://next.frase.io/api/v1
  description: Production
- url: /api/v1
  description: This host
security:
- ApiKeyAuth: []
- BearerAuth: []
tags:
- name: Next actions
paths:
  /next-actions:
    get:
      operationId: getNextActions
      summary: What to do now on a site
      description: 'The ranked, cross-domain list of what to do now on one site: the same daily brief the workspace''s Home page shows, as stored, with nothing ranked at request time. `todos` are the actions, `updates` the news, `more_todos` the next-best actions behind the day''s cap; every item carries a deterministic `cta` and, where a v1 row backs it, a `resource` pointer naming what to open next. `status` is `ready` when a brief is stored for the site, or when the day''s run finished without finding anything for it (empty lists, the run''s date), and `none` when the brief has not reached the site yet (empty lists, `brief_date` null). The newest ready brief dated no later than the current UTC day is served; API keys have no viewer clock. A member-bound MCP token is served by the member''s reveal hour on the UTC clock, as Home serves a member whose browser clock it has not seen. Kinds with no v1 route behind them today (comments, the review queue, Answers signals, page updates, setup nudges) are not carried, nor is crawlability, which the brief ranks for the organization and never stores on a site''s row; they arrive under a dated note here when their routes exist. Requires the read scope of every area the brief spans or points at: `read:opportunities`, `read:analytics`, `read:audits`, `read:content`, `read:ai-visibility`, `read:site-health`. Reads are org-scoped, so a site belonging to another organization, or one in Trash, returns 404.'
      tags:
      - Next actions
      parameters:
      - name: site_id
        in: query
        required: true
        schema:
          type: string
          format: uuid
      responses:
        '200':
          description: The site's next actions
          content:
            application/json:
              schema:
                type: object
                required:
                - data
                properties:
                  data:
                    type: object
                    required:
                    - site_id
                    - brief_date
                    - status
                    - todos
                    - updates
                    - more_todos
                    - home_only_items
                    properties:
                      site_id:
                        type: string
                        format: uuid
                      brief_date:
                        type: string
                        format: date
                        nullable: true
                        description: The day the brief is for.
                      status:
                        type: string
                        enum:
                        - ready
                        - none
                      home_only_items:
                        type: integer
                        description: 'Items in the brief that only Home shows: team work the API carries no resource for (comments, review queue, citation fixes, answers signals, setup nudges, crawlability), counted as stored. Home re-checks setup nudges at read time and hides a satisfied one, so the count is an upper bound. An empty list here is not by itself a quiet day.'
                      todos:
                        type: array
                        items:
                          type: object
                          required:
                          - id
                          - kind
                          - domain
                          - title
                          - context
                          - severity
                          - score
                          - cta
                          - resource
                          - site_id
                          - carried_over
                          - more
                          - completed_at
                          properties:
                            id:
                              type: string
                              description: The brief's stable item id. Completions are keyed on it.
                            kind:
                              type: string
                              enum:
                              - performance_alert
                              - analytics_insight
                              - audit
                              - opportunity
                              - optimization_win
                              - ai_visibility
                            domain:
                              type: string
                              enum:
                              - analytics
                              - site_health
                              - opportunities
                              - optimizations
                              - ai_visibility
                            title:
                              type: string
                            context:
                              type: string
                              description: One or two sentences on why it matters today.
                            severity:
                              type: string
                              enum:
                              - critical
                              - high
                              - medium
                              - low
                            score:
                              type: number
                              nullable: true
                            cta:
                              type: object
                              required:
                              - label
                              - path
                              description: Stamped at ranking, never narrated.
                              properties:
                                label:
                                  type: string
                                path:
                                  type: string
                                  description: App-relative path the action opens.
                            resource:
                              type: object
                              nullable: true
                              required:
                              - type
                              - id
                              description: 'What to open next: `opportunity` reads GET /opportunities/{id}, `content` GET /content/{id}, `audit` GET /audits/{id}, `audit_run` asks for a new audit of the site whose id it carries (POST /audits), `ai_visibility_prompt` GET /ai-visibility/prompts/{id}. Null when the action lands on a page rather than a row.'
                              properties:
                                type:
                                  type: string
                                  enum:
                                  - opportunity
                                  - content
                                  - audit
                                  - audit_run
                                  - ai_visibility_prompt
                                id:
                                  type: string
                            site_id:
                              type: string
                              format: uuid
                              nullable: true
                            carried_over:
                              type: boolean
                              description: True when the item also stood in the previous day's brief and was not completed.
                            more:
                              type: object
                              nullable: true
                              required:
                              - count
                              - note
                              - path
                              properties:
                                count:
                                  type: integer
                                note:
                                  type: string
                                path:
                                  type: string
                                  nullable: true
                                  description: The app path that opens the full list behind the tail, where the item's cta opens one row.
                            completed_at:
                              type: string
                              format: date-time
                              nullable: true
                      updates:
                        type: array
                        items:
                          type: object
                          required:
                          - id
                          - kind
                          - domain
                          - title
                          - context
                          - severity
                          - score
                          - cta
                          - resource
                          - site_id
                          - carried_over
                          - more
                          - completed_at
                          properties:
                            id:
                              type: string
                              description: The brief's stable item id. Completions are keyed on it.
                            kind:
                              type: string
                              enum:
                              - performance_alert
                              - analytics_insight
                              - audit
                              - opportunity
                              - optimization_win
                              - ai_visibility
                            domain:
                              type: string
                              enum:
                              - analytics
                              - site_health
                              - opportunities
                              - optimizations
                              - ai_visibility
                            title:
                              type: string
                            context:
                              type: string
                              description: One or two sentences on why it matters today.
                            severity:
                              type: string
                              enum:
                              - critical
                              - high
                              - medium
                              - low
                            score:
                              type: number
                              nullable: true
                            cta:
                              type: object
                              required:
                              - label
                              - path
                              description: Stamped at ranking, never narrated.
                              properties:
                                label:
                                  type: string
                                path:
                                  type: string
                                  description: App-relative path the action opens.
                            resource:
                              type: object
                              nullable: true
                              required:
                              - type
                              - id
                              description: 'What to open next: `opportunity` reads GET /opportunities/{id}, `content` GET /content/{id}, `audit` GET /audits/{id}, `audit_run` asks for a new audit of the site whose id it carries (POST /audits), `ai_visibility_prompt` GET /ai-visibility/prompts/{id}. Null when the action lands on a page rather than a row.'
                              properties:
                                type:
                                  type: string
                                  enum:
                                  - opportunity
                                  - content
                                  - audit
                                  - audit_run
                                  - ai_visibility_prompt
                                id:
                                  type: string
                            site_id:
                              type: string
                              format: uuid
                              nullable: true
                            carried_over:
                              type: boolean
                              description: True when the item also stood in the previous day's brief and was not completed.
                            more:
                              type: object
                              nullable: true
                              required:
                              - count
                              - note
                              - path
                              properties:
                                count:
                                  type: integer
                                note:
                                  type: string
                                path:
                                  type: string
                                  nullable: true
                                  description: The app path that opens the full list behind the tail, where the item's cta opens one row.
                            completed_at:
                              type: string
                              format: date-time
                              nullable: true
                      more_todos:
                        type: array
                        items:
                          type: object
                          required:
                          - id
                          - kind
                          - domain
                          - title
                          - context
                          - severity
                          - score
                          - cta
                          - resource
                          - site_id
                          - carried_over
                          - more
                          - completed_at
                          properties:
                            id:
                              type: string
                              description: The brief's stable item id. Completions are keyed on it.
                            kind:
                              type: string
                              enum:
                              - performance_alert
                              - analytics_insight
                              - audit
                              - opportunity
                              - optimization_win
                              - ai_visibility
                            domain:
                              type: string
                              enum:
                              - analytics
                              - site_health
                              - opportunities
                              - optimizations
                              - ai_visibility
                            title:
                              type: string
                            context:
                              type: string
                              description: One or two sentences on why it matters today.
                            severity:
                              type: string
                              enum:
                              - critical
                              - high
                              - medium
                              - low
                            score:
                              type: number
                              nullable: true
                            cta:
                              type: object
                              required:
                              - label
                              - path
                              description: Stamped at ranking, never narrated.
                              properties:
                                label:
                                  type: string
                                path:
                                  type: string
                                  description: App-relative path the action opens.
                            resource:
                              type: object
                              nullable: true
                              required:
                              - type
                              - id
                              description: 'What to open next: `opportunity` reads GET /opportunities/{id}, `content` GET /content/{id}, `audit` GET /audits/{id}, `audit_run` asks for a new audit of the site whose id it carries (POST /audits), `ai_visibility_prompt` GET /ai-visibility/prompts/{id}. Null when the action lands on a page rather than a row.'
                              properties:
                                type:
                                  type: string
                                  enum:
                                  - opportunity
                                  - content
                                  - audit
                                  - audit_run
                                  - ai_visibility_prompt
                                id:
                                  type: string
                            site_id:
                              type: string
                              format: uuid
                              nullable: true
                            carried_over:
                              type: boolean
                              description: True when the item also stood in the previous day's brief and was not completed.
                            more:
                              type: object
                              nullable: true
                              required:
                              - count
                              - note
                              - path
                              properties:
                                count:
                                  type: integer
                                note:
                                  type: string
                                path:
                                  type: string
                                  nullable: true
                                  description: The app path that opens the full list behind the tail, where the item's cta opens one row.
                            completed_at:
                              type: string
                              format: date-time
                              nullable: true
        '400':
          description: 'site_id missing or not a UUID (`param: "site_id"`)'
        '403':
          description: The key lacks the read scope of an area the brief spans; the message names the missing scopes
        '404':
          description: Site not found in this organization, or in Trash
components:
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: X-API-KEY
      description: 'API key for authentication. Get your key from Settings > API Keys. You may also send the same key as `Authorization: Bearer <key>` — see BearerAuth.'
    BearerAuth:
      type: http
      scheme: bearer
      bearerFormat: Frase API key (sk_live_* / sk_test_*) or MCP access token (mcp_at_*)
      description: 'Send either your API key or an MCP access token as `Authorization: Bearer <token>`. An API key sent this way is exactly equivalent to sending it in X-API-KEY — same identity, same scopes, same rate limits — so use whichever your HTTP client makes natural. X-API-KEY takes precedence if you somehow send both. Cookie/session auth is intentionally NOT supported on /api/v1/* endpoints.'