Bo Kendell Profile API
The Profile API from Bo Kendell — 2 operation(s) for profile.
The Profile API from Bo Kendell — 2 operation(s) for profile.
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/bokendell-com:bokendell-com-profile-api"
curl "https://apis.io/api/v1/apis?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
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: Portfolio Profile API
version: 1.0.0
description: 'Portfolio oRPC + REST API
## Versioning and deprecation
The version is in the URL path (`/api/v1/...`). A breaking change ships as a new path segment (`/api/v2`); anything additive lands in place.
Nothing is removed silently. When an operation is scheduled for removal its responses start carrying a `Deprecation` header (draft-ietf-httpapi-deprecation-header) on the day the decision takes effect, and an RFC 8594 `Sunset` header once a removal date is committed — always at least 90 days out. Both are declared in `components.headers`, so an agent can watch for them mechanically rather than trusting this paragraph.
Every 4xx and 5xx body is the `Error` schema: a machine-readable `code`, a human-readable `message`, and a `data` object repeating the code and HTTP status. Input-validation failures additionally carry raw Zod `issues`.'
servers:
- url: https://api.bokendell.com
security:
- cookieAuth: []
tags:
- name: Profile
paths:
/api/v1/profiles:
get:
operationId: v1.profile.list
summary: List profiles
description: Returns the site owner's profile — name, bio, summary, contact details, languages, and images — as a single-element array; this is a single-profile site.
tags:
- Profile
responses:
'200':
description: OK
content:
application/json:
schema:
type: array
items:
type: object
properties:
id:
type: string
format: uuid
name:
type: string
bio:
type: string
summary:
anyOf:
- type: string
- type: 'null'
email:
anyOf:
- type: string
- type: 'null'
phone:
anyOf:
- type: string
- type: 'null'
location:
anyOf:
- type: string
- type: 'null'
imageFileId:
anyOf:
- type: string
format: uuid
- type: 'null'
imageFile:
anyOf:
- type: object
properties:
id:
type: string
format: uuid
bucket:
type: string
storageKey:
type: string
storageUrl:
type: string
format: uri
url:
type: string
format: uri
filename:
type: string
originalFilename:
type: string
mimeType:
type: string
sizeBytes:
type: integer
minimum: -9007199254740991
maximum: 9007199254740991
exclusiveMinimum: 0
width:
anyOf:
- type: integer
minimum: -9007199254740991
maximum: 9007199254740991
exclusiveMinimum: 0
- type: 'null'
height:
anyOf:
- type: integer
minimum: -9007199254740991
maximum: 9007199254740991
exclusiveMinimum: 0
- type: 'null'
category:
type: string
isPublic:
type: boolean
status:
enum:
- pending
- confirmed
- failed
type: string
metadata:
anyOf:
- type: object
propertyNames:
type: string
additionalProperties: {}
- type: 'null'
uploadedBy:
anyOf:
- type: string
format: uuid
- type: 'null'
checksum:
anyOf:
- type: string
- type: 'null'
createdAt:
type: string
format: date-time
updatedAt:
type: string
format: date-time
required:
- id
- bucket
- storageKey
- storageUrl
- url
- filename
- originalFilename
- mimeType
- sizeBytes
- width
- height
- category
- isPublic
- status
- metadata
- uploadedBy
- checksum
- createdAt
- updatedAt
- type: 'null'
contactImageFileId:
anyOf:
- type: string
format: uuid
- type: 'null'
contactImageFile:
anyOf:
- type: object
properties:
id:
type: string
format: uuid
bucket:
type: string
storageKey:
type: string
storageUrl:
type: string
format: uri
url:
type: string
format: uri
filename:
type: string
originalFilename:
type: string
mimeType:
type: string
sizeBytes:
type: integer
minimum: -9007199254740991
maximum: 9007199254740991
exclusiveMinimum: 0
width:
anyOf:
- type: integer
minimum: -9007199254740991
maximum: 9007199254740991
exclusiveMinimum: 0
- type: 'null'
height:
anyOf:
- type: integer
minimum: -9007199254740991
maximum: 9007199254740991
exclusiveMinimum: 0
- type: 'null'
category:
type: string
isPublic:
type: boolean
status:
enum:
- pending
- confirmed
- failed
type: string
metadata:
anyOf:
- type: object
propertyNames:
type: string
additionalProperties: {}
- type: 'null'
uploadedBy:
anyOf:
- type: string
format: uuid
- type: 'null'
checksum:
anyOf:
- type: string
- type: 'null'
createdAt:
type: string
format: date-time
updatedAt:
type: string
format: date-time
required:
- id
- bucket
- storageKey
- storageUrl
- url
- filename
- originalFilename
- mimeType
- sizeBytes
- width
- height
- category
- isPublic
- status
- metadata
- uploadedBy
- checksum
- createdAt
- updatedAt
- type: 'null'
contactText:
anyOf:
- type: string
- type: 'null'
languages:
type: array
items:
type: object
properties:
name:
type: string
minLength: 1
maxLength: 60
proficiency:
enum:
- native
- fluent
- conversational
- basic
type: string
required:
- name
- proficiency
createdAt:
type: string
format: date-time
updatedAt:
type: string
format: date-time
required:
- id
- name
- bio
- summary
- email
- phone
- location
- imageFileId
- imageFile
- contactImageFileId
- contactImageFile
- contactText
- languages
- createdAt
- updatedAt
'401':
description: UNAUTHORIZED — 401
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'403':
description: FORBIDDEN — 403
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'404':
description: NOT_FOUND — 404
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'409':
description: CONFLICT — 409
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'422':
description: INPUT_VALIDATION_FAILED — 422
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'429':
description: TOO_MANY_REQUESTS — 429
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
/api/v1/profiles/{id}:
get:
operationId: v1.profile.getById
summary: Get profile by id
description: Returns the profile only when `id` matches the single profile's id; any other id responds 404. Prefer `list`, which needs no id.
tags:
- Profile
parameters:
- name: id
in: path
required: true
schema:
type: string
format: uuid
description: UUID identifier
responses:
'200':
description: OK
content:
application/json:
schema:
type: object
properties:
id:
type: string
format: uuid
name:
type: string
bio:
type: string
summary:
anyOf:
- type: string
- type: 'null'
email:
anyOf:
- type: string
- type: 'null'
phone:
anyOf:
- type: string
- type: 'null'
location:
anyOf:
- type: string
- type: 'null'
imageFileId:
anyOf:
- type: string
format: uuid
- type: 'null'
imageFile:
anyOf:
- type: object
properties:
id:
type: string
format: uuid
bucket:
type: string
storageKey:
type: string
storageUrl:
type: string
format: uri
url:
type: string
format: uri
filename:
type: string
originalFilename:
type: string
mimeType:
type: string
sizeBytes:
type: integer
minimum: -9007199254740991
maximum: 9007199254740991
exclusiveMinimum: 0
width:
anyOf:
- type: integer
minimum: -9007199254740991
maximum: 9007199254740991
exclusiveMinimum: 0
- type: 'null'
height:
anyOf:
- type: integer
minimum: -9007199254740991
maximum: 9007199254740991
exclusiveMinimum: 0
- type: 'null'
category:
type: string
isPublic:
type: boolean
status:
enum:
- pending
- confirmed
- failed
type: string
metadata:
anyOf:
- type: object
propertyNames:
type: string
additionalProperties: {}
- type: 'null'
uploadedBy:
anyOf:
- type: string
format: uuid
- type: 'null'
checksum:
anyOf:
- type: string
- type: 'null'
createdAt:
type: string
format: date-time
updatedAt:
type: string
format: date-time
required:
- id
- bucket
- storageKey
- storageUrl
- url
- filename
- originalFilename
- mimeType
- sizeBytes
- width
- height
- category
- isPublic
- status
- metadata
- uploadedBy
- checksum
- createdAt
- updatedAt
- type: 'null'
contactImageFileId:
anyOf:
- type: string
format: uuid
- type: 'null'
contactImageFile:
anyOf:
- type: object
properties:
id:
type: string
format: uuid
bucket:
type: string
storageKey:
type: string
storageUrl:
type: string
format: uri
url:
type: string
format: uri
filename:
type: string
originalFilename:
type: string
mimeType:
type: string
sizeBytes:
type: integer
minimum: -9007199254740991
maximum: 9007199254740991
exclusiveMinimum: 0
width:
anyOf:
- type: integer
minimum: -9007199254740991
maximum: 9007199254740991
exclusiveMinimum: 0
- type: 'null'
height:
anyOf:
- type: integer
minimum: -9007199254740991
maximum: 9007199254740991
exclusiveMinimum: 0
- type: 'null'
category:
type: string
isPublic:
type: boolean
status:
enum:
- pending
- confirmed
- failed
type: string
metadata:
anyOf:
- type: object
propertyNames:
type: string
additionalProperties: {}
- type: 'null'
uploadedBy:
anyOf:
- type: string
format: uuid
- type: 'null'
checksum:
anyOf:
- type: string
- type: 'null'
createdAt:
type: string
format: date-time
updatedAt:
type: string
format: date-time
required:
- id
- bucket
- storageKey
- storageUrl
- url
- filename
- originalFilename
- mimeType
- sizeBytes
- width
- height
- category
- isPublic
- status
- metadata
- uploadedBy
- checksum
- createdAt
- updatedAt
- type: 'null'
contactText:
anyOf:
- type: string
- type: 'null'
languages:
type: array
items:
type: object
properties:
name:
type: string
minLength: 1
maxLength: 60
proficiency:
enum:
- native
- fluent
- conversational
- basic
type: string
required:
- name
- proficiency
createdAt:
type: string
format: date-time
updatedAt:
type: string
format: date-time
required:
- id
- name
- bio
- summary
- email
- phone
- location
- imageFileId
- imageFile
- contactImageFileId
- contactImageFile
- contactText
- languages
- createdAt
- updatedAt
'401':
description: UNAUTHORIZED — 401
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'403':
description: FORBIDDEN — 403
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'404':
description: NOT_FOUND — 404
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'409':
description: CONFLICT — 409
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'422':
description: INPUT_VALIDATION_FAILED — 422
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'429':
description: TOO_MANY_REQUESTS — 429
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
components:
schemas:
Error:
type: object
title: Error
description: Every 4xx and 5xx response body. `code` is the machine-readable discriminator; `message` is human-readable and safe to surface. The HTTP status is on the response itself and repeated at `data.httpStatus`.
required:
- code
- message
- data
properties:
code:
type: string
description: Machine-readable error code, e.g. NOT_FOUND. Matches `data.code`.
examples:
- NOT_FOUND
- BAD_REQUEST
- UNAUTHORIZED
- INTERNAL_SERVER_ERROR
message:
type: string
description: Human-readable explanation.
data:
type: object
description: Structured detail. Always carries `code` and `httpStatus`; typed errors declared by an operation spread their own fields in alongside.
required:
- code
- httpStatus
properties:
code:
type: string
description: Repeats the top-level `code`.
httpStatus:
type: integer
description: Repeats the response's HTTP status.
errorCode:
type: string
description: The originating domain error code, when the failure came from a domain service.
details:
type:
- object
- 'null'
description: Domain-supplied detail, when present.
path:
type: string
description: Dotted procedure path that failed.
additionalProperties: true
issues:
type: array
description: Raw Zod issues. Present only on input-validation failures.
items:
type: object
additionalProperties: true
securitySchemes:
cookieAuth:
type: apiKey
in: cookie
name: better-auth.session_token
description: Better Auth session cookie