BeYourCover Clients API
Agency client workspaces, as in the app's client panel.
Agency client workspaces, as in the app's client panel.
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
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.curl "https://apis.io/api/v1/apis/beyourcover-com:beyourcover-com-clients-api"
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.
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: 3.2.0
info:
title: BeYourCover Partner Clients API
version: 1.1.0
description: 'Enterprise/partner REST API for AI-powered book cover generation: covers from book details or from reference images, variations, edits, replacing a person with a photo, text removal, upscales, audiobook covers, and full print wraps for Amazon KDP with a print-ready PDF. Every endpoint except `GET /api/v1/health` requires a partner API key (`Authorization: Bearer byc_sk_...`). Long-running operations (generation, reference-image generation, variations, edits, replacing a person, text removal, upscales, audiobook covers, print wraps and a wrap''s front-panel re-extension) return `202 Accepted` with a job envelope; poll `GET /api/v1/jobs/{jobId}` or receive a webhook. Re-typesetting a wrap (`POST /api/v1/wraps/{wrapId}/render`) runs no model, so it answers `200` directly. All error responses use a uniform envelope: `{ "error": { "code": string, "message": string } }`.'
servers:
- url: https://beyourcover.com
description: Production. All paths below are relative to the site origin.
security:
- ApiKeyBearer: []
tags:
- name: Clients
description: Agency client workspaces, as in the app's client panel.
paths:
/api/v1/clients:
get:
tags:
- Clients
operationId: listClients
summary: List agency clients
description: 'The workspace''s agency clients, newest first, each with its book count: the same clients as the app''s client panel. Archived ones only with `include_archived=true`. Free. Every member reads them, reviewers included.'
parameters:
- name: include_archived
in: query
required: false
schema:
type: boolean
responses:
'200':
description: The clients.
content:
application/json:
schema:
$ref: '#/components/schemas/ClientList'
'400':
description: '`code` is `invalid_include_archived`.'
x-error-codes:
- invalid_include_archived
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorEnvelope'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'500':
description: Server error. `code` is `fetch_failed` or `internal_error`.
x-error-codes:
- fetch_failed
- internal_error
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorEnvelope'
post:
tags:
- Clients
operationId: createClient
summary: Create an agency client
description: Creates a client in the workspace, as the app's client panel does. Free. An admin or editor only. The logo is set in the app.
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/ClientCreate'
responses:
'201':
description: The new client.
content:
application/json:
schema:
$ref: '#/components/schemas/Client'
'400':
description: '`code` is one of: `invalid_body`, `invalid_field_type`, `missing_required_fields`, `field_too_long`.'
x-error-codes:
- invalid_body
- invalid_field_type
- missing_required_fields
- field_too_long
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorEnvelope'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'500':
description: Server error. `code` is `client_creation_failed` or `internal_error`.
x-error-codes:
- client_creation_failed
- internal_error
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorEnvelope'
/api/v1/books/{bookId}/client:
put:
tags:
- Clients
operationId: assignBookToClient
summary: File a book under a client
description: 'Files a book under an agency client, or back to Unassigned with `clientId: null`. Free. An admin or editor, on any member''s book of the workspace, as in the app.'
parameters:
- name: bookId
in: path
required: true
schema:
type: string
format: uuid
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/BookClientAssignment'
responses:
'200':
description: The book's client.
content:
application/json:
schema:
$ref: '#/components/schemas/BookClientAssigned'
'400':
description: '`code` is `invalid_body` or `invalid_client_id`.'
x-error-codes:
- invalid_body
- invalid_client_id
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorEnvelope'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'404':
description: '`code` is `book_not_found` or `client_not_found`.'
x-error-codes:
- book_not_found
- client_not_found
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorEnvelope'
'409':
description: '`code` is `client_archived`: the client is archived. Restore it in the app first.'
x-error-codes:
- client_archived
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorEnvelope'
'500':
description: Server error. `code` is `fetch_failed`, `book_update_failed` or `internal_error`.
x-error-codes:
- fetch_failed
- book_update_failed
- internal_error
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorEnvelope'
components:
responses:
Forbidden:
description: 'The API key is valid but its owner has no active enterprise subscription (`forbidden`); or the acting member''s role does not allow the call: a reviewer cannot spend credits or change books (`forbidden_role`), and only the member who created a book may edit it or its covers (`not_book_creator`).'
x-error-codes:
- forbidden
- forbidden_role
- not_book_creator
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorEnvelope'
Unauthorized:
description: 'Missing/malformed API key, unknown or inactive key, or inactive subscription detected during credit checks. `code`: `unauthorized`.'
x-error-codes:
- unauthorized
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorEnvelope'
schemas:
ClientList:
type: object
required:
- clients
properties:
clients:
type: array
items:
$ref: '#/components/schemas/Client'
ErrorEnvelope:
type: object
required:
- error
properties:
error:
type: object
required:
- code
- message
properties:
code:
type: string
description: Machine-readable error code (snake_case).
message:
type: string
description: Human-readable explanation. For 500s this is always a generic message.
details:
type: object
description: Optional machine-readable recovery information. 402 responses carry { balance, required, billing_url }; unknown-path 404s carry absolute URLs for the OpenAPI spec, documentation, API catalog, authentication guide and health probe.
description: Uniform error envelope used by every non-2xx JSON response.
Client:
type: object
required:
- clientId
- name
- slug
- archived
- book_count
- created_at
properties:
clientId:
type: string
format: uuid
name:
type: string
slug:
type: string
description: Unique in the workspace; used in export filenames.
notes:
type:
- string
- 'null'
archived:
type: boolean
book_count:
type: integer
created_at:
type: string
format: date-time
BookClientAssignment:
type: object
required:
- clientId
properties:
clientId:
type:
- string
- 'null'
format: uuid
description: A clientId from `GET /api/v1/clients`, or null for Unassigned.
ClientCreate:
type: object
required:
- name
properties:
name:
type: string
maxLength: 120
notes:
type:
- string
- 'null'
maxLength: 2000
BookClientAssigned:
type: object
required:
- bookId
- clientId
properties:
bookId:
type: string
format: uuid
clientId:
type:
- string
- 'null'
format: uuid
securitySchemes:
ApiKeyBearer:
type: http
scheme: bearer
bearerFormat: byc_sk_{32 hex chars}
description: 'Partner API key sent as `Authorization: Bearer byc_sk_...`. The key must match `^byc_sk_[0-9a-f]{32}$`. A malformed, unknown, or inactive key yields `401 unauthorized`; a valid key whose owner has no active enterprise subscription yields `403 forbidden`.'