PostOnce Workflows API

The Workflows API from PostOnce — 2 operation(s) for workflows.

Operations 5

GET /v1/workflows List workflows #
POST /v1/workflows Create a workflow #
GET /v1/workflows/{id} Get workflow #
PUT /v1/workflows/{id} Update a workflow #
DELETE /v1/workflows/{id} Delete a workflow #

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/postonce:postonce-workflows-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

postonce-workflows-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: PostOnce Public Workflows API
  version: 1.0.0-alpha
  description: Public API for PostOnce paid users
servers:
- url: https://postonce.to/api/public
security:
- bearerAuth: []
tags:
- name: Workflows
paths:
  /v1/workflows:
    get:
      summary: List workflows
      description: Lists all workflows owned by the authenticated profile.
      responses:
        '200':
          description: Workflows returned successfully.
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: '#/components/schemas/Workflow'
        '401':
          description: Missing, invalid, revoked, or expired API key.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AuthErrorResponse'
      tags:
      - Workflows
      operationId: getV1Workflows
      x-operation-id-source: derived
    post:
      summary: Create a workflow
      description: Creates a future-content cross-post workflow from one source account to one or more target accounts. Use `settings.content_filters` to limit which future posts are eligible.
      parameters:
      - name: Idempotency-Key
        in: header
        required: false
        description: A unique key for safely retrying workflow creation. Reuse the same key with the identical request body to receive the original response.
        schema:
          type: string
          maxLength: 200
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              additionalProperties: false
              required:
              - name
              - source_account_id
              - target_account_ids
              properties:
                name:
                  type: string
                description:
                  type: string
                  nullable: true
                source_account_id:
                  type: string
                target_account_ids:
                  type: array
                  items:
                    type: string
                is_active:
                  type: boolean
                future_content_enabled:
                  type: boolean
                settings:
                  $ref: '#/components/schemas/WorkflowSettings'
            examples:
              basic:
                value:
                  name: Workflow A to B
                  source_account_id: account-1
                  target_account_ids:
                  - account-2
                  is_active: true
              withFilters:
                value:
                  name: Facebook to LinkedIn
                  source_account_id: account-1
                  target_account_ids:
                  - account-2
                  - account-3
                  is_active: true
                  settings:
                    content_filters:
                      types:
                        text: true
                        image: true
                        quote: false
                        video: true
                      hashtags:
                        include: []
                        exclude: []
      responses:
        '201':
          description: Workflow created successfully.
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: '#/components/schemas/Workflow'
        '401':
          description: Missing, invalid, revoked, or expired API key.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AuthErrorResponse'
        '403':
          description: Workflow limit reached for the current plan.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      tags:
      - Workflows
      operationId: postV1Workflows
      x-operation-id-source: derived
  /v1/workflows/{id}:
    get:
      summary: Get workflow
      description: Returns one workflow by ID.
      parameters:
      - $ref: '#/components/parameters/workflowId'
      responses:
        '200':
          description: Workflow returned successfully.
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: '#/components/schemas/Workflow'
        '401':
          description: Missing, invalid, revoked, or expired API key.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AuthErrorResponse'
      tags:
      - Workflows
      operationId: getV1WorkflowsById
      x-operation-id-source: derived
    put:
      summary: Update a workflow
      description: Updates a future-content workflow configuration, including activation state, target accounts, and optional `settings.content_filters`.
      parameters:
      - $ref: '#/components/parameters/workflowId'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              additionalProperties: false
              properties:
                name:
                  type: string
                description:
                  type: string
                  nullable: true
                source_account_id:
                  type: string
                target_account_ids:
                  type: array
                  items:
                    type: string
                is_active:
                  type: boolean
                future_content_enabled:
                  type: boolean
                settings:
                  $ref: '#/components/schemas/WorkflowSettings'
            examples:
              pauseWorkflow:
                value:
                  is_active: false
              refineFilters:
                value:
                  settings:
                    content_filters:
                      types:
                        text: false
                        image: true
                        quote: false
                        video: true
                      hashtags:
                        include:
                        - launch
                        exclude:
                        - sponsored
      responses:
        '200':
          description: Workflow updated successfully.
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: '#/components/schemas/Workflow'
        '401':
          description: Missing, invalid, revoked, or expired API key.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AuthErrorResponse'
      tags:
      - Workflows
      operationId: putV1WorkflowsById
      x-operation-id-source: derived
    delete:
      summary: Delete a workflow
      description: Deletes a workflow and any queued workflow items linked to it.
      parameters:
      - $ref: '#/components/parameters/workflowId'
      responses:
        '200':
          description: Workflow deleted successfully.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DeleteResponse'
        '401':
          description: Missing, invalid, revoked, or expired API key.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AuthErrorResponse'
      tags:
      - Workflows
      operationId: deleteV1WorkflowsById
      x-operation-id-source: derived
components:
  schemas:
    AuthErrorResponse:
      type: object
      properties:
        error:
          type: object
          properties:
            hint:
              type: string
              description: Suggested action to resolve the error.
            code:
              type: string
              example: invalid_api_key
            message:
              type: string
              example: Invalid API key.
    Workflow:
      type: object
      properties:
        id:
          type: string
        profile_id:
          type: string
        source_account_id:
          type: string
        target_account_ids:
          type: array
          items:
            type: string
        settings:
          $ref: '#/components/schemas/WorkflowSettings'
        is_active:
          type: boolean
        created_at:
          type: string
          format: date-time
        updated_at:
          type: string
          format: date-time
        name:
          type: string
        description:
          type: string
          nullable: true
        future_content_enabled:
          type: boolean
        last_checked:
          type: string
          format: date-time
          nullable: true
        last_enabled_at:
          type: string
          format: date-time
          nullable: true
    ErrorResponse:
      type: object
      properties:
        error:
          type: object
          required:
          - code
          - message
          properties:
            hint:
              type: string
              description: Suggested action to resolve the error.
            code:
              type: string
              example: workflow_limit_reached
            message:
              type: string
              example: You have reached the maximum number of workflows for your plan.
    DeleteResponse:
      type: object
      properties:
        data:
          type: object
          properties:
            deleted:
              type: boolean
              example: true
            id:
              type: string
            provider_revocation_required:
              type: boolean
              nullable: true
              description: True when local PostOnce access is removed but the provider requires the user to revoke the remote signer separately.
            provider_revocation_url:
              type: string
              nullable: true
            message:
              type: string
              nullable: true
    WorkflowSettings:
      type: object
      properties:
        content_filters:
          type: object
          properties:
            types:
              type: object
              properties:
                text:
                  type: boolean
                image:
                  type: boolean
                quote:
                  type: boolean
                video:
                  type: boolean
            hashtags:
              type: object
              properties:
                include:
                  type: array
                  items:
                    type: string
                exclude:
                  type: array
                  items:
                    type: string
        platform_settings:
          type: object
          properties:
            tiktok:
              type: object
              properties:
                keep_source_thumbnail:
                  type: boolean
                  default: true
                  description: When false, TikTok workflow posts do not prepend the source thumbnail as the first video frame.
        destination_publish_settings:
          type: object
          additionalProperties:
            type: object
            properties:
              minimum_interval_minutes:
                type: integer
                minimum: 1
              caption_position:
                type: string
                enum:
                - before
                - after
                description: Placement of custom caption text. Defaults to after.
              remove_comment_dm_prompts:
                type: boolean
                default: false
                description: Remove comment/DM prompts from the original caption for this destination before applying custom before/after text. Supported on the same platforms as caption_ending.
              adapt_caption:
                type: boolean
                default: false
                description: Rewrite the caption for this destination with AI at publish time, after comment/DM prompt removal and before custom text. Links are always kept. If the rewrite fails, the original caption is published. Supported on the same platforms as caption_ending.
              adapt_caption_instructions:
                type: string
                maxLength: 1000
                description: Optional style instructions for the AI rewrite. When set, they replace the built-in guidance for the destination platform.
              caption_ending:
                type: string
                maxLength: 2000
                description: Optional custom caption text for this destination. Placement follows caption_position (after by default). Empty clears it. Supported for Instagram, Threads, X, Facebook, LinkedIn, Bluesky, Pinterest, YouTube and TikTok. Platform caption limits also apply.
              snapchat:
                type: object
                required:
                - publish_targets
                properties:
                  publish_targets:
                    type: array
                    minItems: 1
                    uniqueItems: true
                    items:
                      type: string
                      enum:
                      - spotlight
                      - public_story
                  locale:
                    type: string
                    pattern: ^[a-z]{2}_[A-Z]{2}$
                    default: en_US
              threads:
                type: object
                properties:
                  caption_max_length:
                    type: integer
                    minimum: 1
                    maximum: 500
                    default: 500
                    description: Maximum outgoing Threads caption length for this destination. Custom limits prefer whole words; 500 preserves default behavior.
              instagram:
                type: object
                anyOf:
                - required:
                  - publish_as_trial_reel
                - required:
                  - remove_mentions
                properties:
                  remove_mentions:
                    type: boolean
                    default: false
                    description: Remove @ from mentions in this Instagram destination's outgoing captions. Preserves usernames and email addresses.
                  publish_as_trial_reel:
                    type: boolean
                    default: false
                    description: When true, eligible single-video Instagram Reels publish as Trial Reels for non-followers with manual graduation. Images and carousels publish normally.
              reddit:
                type: object
                required:
                - subreddit
                properties:
                  subreddit:
                    type: string
                    example: SideProject
                  post_type:
                    type: string
                    enum:
                    - auto
                    - self
                    - link
                    default: auto
                  flair_id:
                    type: string
                  flair_text:
                    type: string
                  nsfw:
                    type: boolean
                    default: false
                  spoiler:
                    type: boolean
                    default: false
                  send_replies:
                    type: boolean
                    default: true
  parameters:
    workflowId:
      name: id
      in: path
      required: true
      schema:
        type: string
      description: Workflow ID.
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: API Key
      description: Scoped API key issued in PostOnce Settings. OAuth authorization grants are not currently supported.
      x-scopes:
        accounts:read: List and read connected accounts.
        accounts:write: Connect and disconnect social accounts.
        media:read: Read uploaded media.
        media:write: Upload media.
        posts:read: Read posts and unpublished drafts.
        posts:write: Create, update, publish, cancel, retry, and delete posts and drafts.
        workflows:read: List and read crossposting workflows.
        workflows:write: Create, update, and delete crossposting workflows.