Oneprofile Design Partner API
Endpoints for the design partner program's customer surface: whether this workspace is a design partner, the badges its feedback has earned, and sending and reading that feedback.
Endpoints for the design partner program's customer surface: whether this workspace is a design partner, the badges its feedback has earned, and sending and reading that feedback.
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/getoneprofile-ai:getoneprofile-ai-design-partner-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:
contact:
email: support@getoneprofile.ai
name: Oneprofile Support
description: REST API reference for Oneprofile, the GTM data layer for your CRM. Manage tables, enrichments, and integrations. Authenticate with an API key to get started.
termsOfService: https://www.getoneprofile.ai/terms
title: Reference | Oneprofile Design Partner API
version: 1.0.42765316646
tags:
- description: 'Endpoints for the design partner program''s customer surface: whether this workspace is a design partner, the badges its feedback has earned, and sending and reading that feedback.'
name: design-partner
paths:
/design-partner/feedback/:
get:
description: 'Everything this workspace has told us, newest first. The whole organization sees every member''s submissions: the page is addressed to the organization, and a partner should be able to read what a colleague already asked for instead of asking again.'
operationId: list_design_partner_feedback
parameters:
- description: The number of items to return.
in: query
name: limit
required: false
schema:
default: 10
description: The number of items to return.
maximum: 100
minimum: 1
title: Limit
type: integer
- in: query
name: order_by
required: false
schema:
$ref: '#/components/schemas/OrderingParametersForIdCreatedAt'
default: created_at
enum:
- id
- created_at
type: string
- in: query
name: order_direction
required: false
schema:
default: desc
enum:
- asc
- desc
title: Order Direction
type: string
- description: Set the cursor to the next or previous page. You can get the cursor from the previous page's response.
in: query
name: cursor
required: false
schema:
anyOf:
- type: string
- type: 'null'
description: Set the cursor to the next or previous page. You can get the cursor from the previous page's response.
title: Cursor for pagination.
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/PaginatedResponse_DesignPartnerFeedbackReadSchema_'
description: Successful Response
'401':
content:
application/json:
schema:
$ref: '#/components/schemas/UnauthorizedResponse'
description: Unauthorized
'403':
content:
application/json:
schema:
$ref: '#/components/schemas/ForbiddenResponse'
description: Forbidden
'404':
content:
application/json:
schema:
$ref: '#/components/schemas/NotFoundResponse'
description: Not found
'422':
content:
application/json:
schema:
$ref: '#/components/schemas/UnprocessableEntityResponse'
description: Invalid request made to the API.
'500':
content:
application/json:
schema:
$ref: '#/components/schemas/ServerErrorResponse'
description: Internal server error.
'502':
content:
application/json:
schema:
$ref: '#/components/schemas/ServerErrorResponse'
description: Bad gateway error.
'503':
content:
application/json:
schema:
$ref: '#/components/schemas/ServerErrorResponse'
description: Service unavailable.
security:
- APIKeyHeader: []
- HTTPBearer: []
summary: List the workspace's design partner feedback
tags:
- design-partner
post:
description: 'Record one submission from the caller. Any member of a design partner workspace may submit. Requires a signed-in user rather than an API key: the record is of who said this, and an API key has no person behind it.'
operationId: submit_design_partner_feedback
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/DesignPartnerFeedbackCreateSchema'
required: true
responses:
'201':
content:
application/json:
schema:
$ref: '#/components/schemas/DesignPartnerFeedbackReadSchema'
description: Successful Response
'401':
content:
application/json:
schema:
$ref: '#/components/schemas/UnauthorizedResponse'
description: Unauthorized
'403':
content:
application/json:
schema:
$ref: '#/components/schemas/ForbiddenResponse'
description: Forbidden
'404':
content:
application/json:
schema:
$ref: '#/components/schemas/NotFoundResponse'
description: Not found
'422':
content:
application/json:
schema:
$ref: '#/components/schemas/UnprocessableEntityResponse'
description: Invalid request made to the API.
'500':
content:
application/json:
schema:
$ref: '#/components/schemas/ServerErrorResponse'
description: Internal server error.
'502':
content:
application/json:
schema:
$ref: '#/components/schemas/ServerErrorResponse'
description: Bad gateway error.
'503':
content:
application/json:
schema:
$ref: '#/components/schemas/ServerErrorResponse'
description: Service unavailable.
security:
- APIKeyHeader: []
- HTTPBearer: []
summary: Send design partner feedback
tags:
- design-partner
/design-partner/slack-channel/invite/:
post:
description: 'Send the workspace''s invitation to the address in the body. With no channel yet this starts the run that creates one and sends the invitation from inside it, and answers `provisioning` for the page to poll; with a channel ready the invitation goes out immediately.
A workspace gets one invitation to its channel, so a second call while the first is still live is a 409 rather than a second email. Nothing here happens on a page load: the address is required, so a call without a body is a 422.
A refusal Slack itself made, their Slack being on a free plan for instance, is not an error: it comes back in the body with a sentence to show them.'
operationId: invite_to_design_partner_slack_channel
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/DesignPartnerSlackInviteCreateSchema'
required: true
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/DesignPartnerSlackReadSchema'
description: Successful Response
'401':
content:
application/json:
schema:
$ref: '#/components/schemas/UnauthorizedResponse'
description: Unauthorized
'403':
content:
application/json:
schema:
$ref: '#/components/schemas/ForbiddenResponse'
description: Forbidden
'404':
content:
application/json:
schema:
$ref: '#/components/schemas/NotFoundResponse'
description: Not found
'409':
description: The invitation cannot be sent as things stand.
'422':
content:
application/json:
schema:
$ref: '#/components/schemas/UnprocessableEntityResponse'
description: Invalid request made to the API.
'500':
content:
application/json:
schema:
$ref: '#/components/schemas/ServerErrorResponse'
description: Internal server error.
'502':
content:
application/json:
schema:
$ref: '#/components/schemas/ServerErrorResponse'
description: Bad gateway error.
'503':
content:
application/json:
schema:
$ref: '#/components/schemas/ServerErrorResponse'
description: Service unavailable.
security:
- APIKeyHeader: []
- HTTPBearer: []
summary: Send the workspace's shared Slack channel invite
tags:
- design-partner
/design-partner/status/:
get:
description: 'The probe the dashboard uses to decide whether the design partner page exists for this workspace, plus everything that page needs above the fold. Answers 200 with `is_design_partner: false` rather than a 404 so an ordinary session never logs an auth failure for a page it was never offered.'
operationId: get_design_partner_status
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/DesignPartnerStatusReadSchema'
description: Successful Response
'401':
content:
application/json:
schema:
$ref: '#/components/schemas/UnauthorizedResponse'
description: Unauthorized
'403':
content:
application/json:
schema:
$ref: '#/components/schemas/ForbiddenResponse'
description: Forbidden
'422':
content:
application/json:
schema:
$ref: '#/components/schemas/UnprocessableEntityResponse'
description: Invalid request made to the API.
'500':
content:
application/json:
schema:
$ref: '#/components/schemas/ServerErrorResponse'
description: Internal server error.
'502':
content:
application/json:
schema:
$ref: '#/components/schemas/ServerErrorResponse'
description: Bad gateway error.
'503':
content:
application/json:
schema:
$ref: '#/components/schemas/ServerErrorResponse'
description: Service unavailable.
security:
- APIKeyHeader: []
- HTTPBearer: []
summary: Is this workspace a design partner?
tags:
- design-partner
components:
schemas:
ForbiddenResponse:
properties:
detail:
description: The detail of why the request is forbidden.
title: Detail
type: string
required:
- detail
title: ForbiddenResponse
type: object
DesignPartnerSlackInviteCreateSchema:
description: The address a workspace wants its shared Slack channel invitation sent to.
properties:
email:
description: Where Slack sends the invitation. Typed by the caller rather than taken from their account, because the person who should be in the channel is not always the person setting it up.
format: email
maxLength: 320
title: Email
type: string
required:
- email
title: DesignPartnerSlackInviteCreateSchema
type: object
UnprocessableEntityIssue:
properties:
input:
anyOf:
- type: string
- type: integer
- type: number
- type: boolean
- items: {}
type: array
- additionalProperties: true
type: object
description: The user's input that caused the error.
title: Input
loc:
description: The location of the error. Always contains 1 or 2 elements. The first element is the type of location (e.g. 'body', 'query', 'path', 'header'). The second element is the name of the field that caused the error. If the error is not related to a specific field, the second element is not present.
items:
type: string
title: Loc
type: array
msg:
description: The message of the error. The error message to show to the user.
title: Msg
type: string
type:
description: The type of the error. Useful for frontend code to handle different types of errors.
title: Type
type: string
required:
- loc
- msg
- type
- input
title: UnprocessableEntityIssue
type: object
NotFoundResponse:
properties:
detail:
description: The detail of why the resource was not found.
title: Detail
type: string
required:
- detail
title: NotFoundResponse
type: object
DesignPartnerSlackReadSchema:
description: 'The workspace''s shared Slack channel and its one invitation.
Both belong to the organization, so every member of a partner workspace
reads the same block: the same channel, the same invitation, whoever sent
it. A Slack Connect guest can invite their own colleagues, so the second
person through the door is Slack''s job rather than ours.'
properties:
channel_failure_message:
anyOf:
- type: string
- type: 'null'
description: What to tell the reader when provisioning failed. Null otherwise.
title: Channel Failure Message
channel_name:
anyOf:
- type: string
- type: 'null'
description: The channel's name, without the leading hash. Null until it is ready.
title: Channel Name
channel_state:
description: Where the workspace's channel is. 'none' means nobody has sent an invite yet, which is what puts the form on the page. 'provisioning' is the run that creates it, which the page polls. 'failed' carries a sentence.
enum:
- none
- provisioning
- ready
- failed
title: Channel State
type: string
channel_url:
anyOf:
- type: string
- type: 'null'
description: A link that opens the channel in the reader's Slack. Null until it is ready.
title: Channel Url
invite_can_send:
description: Whether to offer the form. False while a run is in flight, while the invitation that went out is still live at Slack, and after a refusal about our own Slack workspace's settings that no retry fixes. Decided here so the page holds no copy of the lifetime and no opinion about which refusals are worth another press.
title: Invite Can Send
type: boolean
invite_email:
anyOf:
- type: string
- type: 'null'
description: The address the Slack invitation went to.
title: Invite Email
invite_message:
anyOf:
- type: string
- type: 'null'
description: What to tell the reader when Slack refused, already written for a person rather than a log. Null when nothing was refused.
title: Invite Message
invite_sent_at:
anyOf:
- format: date-time
type: string
- type: 'null'
description: When Slack accepted the invitation.
title: Invite Sent At
invite_status:
description: What became of the workspace's Slack invitation.
enum:
- none
- sent
- refused
title: Invite Status
type: string
required:
- channel_state
- channel_failure_message
- channel_name
- channel_url
- invite_status
- invite_email
- invite_sent_at
- invite_message
- invite_can_send
title: DesignPartnerSlackReadSchema
type: object
DesignPartnerFeedbackCreateSchema:
description: One submission from a member of a design partner workspace.
properties:
body:
description: What they want to tell us. Free text, no categories, no form.
maxLength: 5000
minLength: 1
title: Body
type: string
required:
- body
title: DesignPartnerFeedbackCreateSchema
type: object
ServerErrorResponse:
properties:
detail:
description: The detail of why the server returned an error.
title: Detail
type: string
required:
- detail
title: ServerErrorResponse
type: object
DesignPartnerFeedbackStatus:
description: What the partner's page says we did with one submission.
enum:
- seen
- planned
- shipped
title: DesignPartnerFeedbackStatus
type: string
DesignPartnerStatusReadSchema:
description: 'Whether the caller''s workspace is a design partner, and its badges.
One read for three consumers (the sidebar item, the route guard and the
page), so a workspace that is not a partner costs exactly one cheap query
per session rather than three.'
properties:
badges:
description: The workspace's badges, newest award first. Empty both for non-partners and for partners nobody has written a badge for yet. The page says so plainly rather than hiding the section.
items:
$ref: '#/components/schemas/DesignPartnerBadgeReadSchema'
title: Badges
type: array
is_design_partner:
description: Whether the caller's workspace is a design partner.
title: Is Design Partner
type: boolean
slack:
anyOf:
- $ref: '#/components/schemas/DesignPartnerSlackReadSchema'
- type: 'null'
description: The shared Slack channel block. Null for a workspace that is not a design partner, and null when this deployment has no Slack workspace configured. The page hides the section rather than offering a button that cannot work.
started_at:
anyOf:
- format: date-time
type: string
- type: 'null'
description: Partner since. Null when the workspace is not a design partner.
title: Started At
required:
- is_design_partner
- started_at
- badges
- slack
title: DesignPartnerStatusReadSchema
type: object
DesignPartnerFeedbackReadSchema:
description: 'One stored submission, as the workspace''s own history shows it.
The whole workspace sees every member''s submissions: the page is addressed
to the organization, and a partner should be able to see what their
colleagues have already asked for rather than repeating it.'
properties:
badge_id:
anyOf:
- format: uuid
type: string
- type: 'null'
description: The badge it led to, when it shipped. Null otherwise.
title: Badge Id
body:
description: What they wrote.
title: Body
type: string
created_at:
description: When they wrote it.
format: date-time
title: Created At
type: string
id:
description: The submission's ID.
format: uuid
title: Id
type: string
status:
anyOf:
- $ref: '#/components/schemas/DesignPartnerFeedbackStatus'
- type: 'null'
description: 'What our team did with it: ''seen'', ''planned'' or ''shipped'', the furthest one reached. Null while nobody on our team has seen it.'
user_email:
description: Who wrote it, as their email was at the time they wrote it.
title: User Email
type: string
user_id:
description: Clerk user ID of who wrote it, so the page can show their name and tell the reader which submissions are their own.
title: User Id
type: string
required:
- id
- user_id
- user_email
- body
- created_at
- status
- badge_id
title: DesignPartnerFeedbackReadSchema
type: object
DesignPartnerBadgeReadSchema:
description: One badge on the design partner page.
properties:
awarded_at:
description: The date shown on the badge.
format: date-time
title: Awarded At
type: string
description:
description: What this workspace's feedback made possible, in our words.
title: Description
type: string
icon:
description: Icon token for the frontend's curated set. An unrecognised token falls back to a default rather than breaking the page, so the set can grow without a backend release.
title: Icon
type: string
id:
description: The badge's ID.
format: uuid
title: Id
type: string
title:
description: The badge's name.
title: Title
type: string
required:
- id
- title
- description
- icon
- awarded_at
title: DesignPartnerBadgeReadSchema
type: object
OrderingParametersForIdCreatedAt:
enum:
- id
- created_at
title: OrderingParametersForIdCreatedAt
type: string
UnprocessableEntityResponse:
properties:
detail:
description: The detail of the error. This is the error message to show to the user. You should also use the issues field to show more detailed error messages per field. Use this field for a single liner error message.
title: Detail
type: string
issues:
description: The issues that caused the error. There can be multiple issues. Each issue is a user-facing error message.
items:
$ref: '#/components/schemas/UnprocessableEntityIssue'
title: Issues
type: array
required:
- detail
- issues
title: UnprocessableEntityResponse
type: object
UnauthorizedResponse:
properties:
detail:
description: The detail of why the request is unauthorized.
title: Detail
type: string
required:
- detail
title: UnauthorizedResponse
type: object
PaginatedResponse_DesignPartnerFeedbackReadSchema_:
properties:
data:
description: The list of ResponseItems.
items:
$ref: '#/components/schemas/DesignPartnerFeedbackReadSchema'
title: Data
type: array
next_page_cursor:
anyOf:
- type: string
- type: 'null'
description: The cursor to the next page. If there are no more pages, this is None.
previous_page_cursor:
anyOf:
- type: string
- type: 'null'
description: The cursor to the previous page. If there are no previous pages, this is None.
title: PaginatedResponse[DesignPartnerFeedbackReadSchema]
type: object
securitySchemes:
APIKeyHeader:
in: header
name: X-API-Key
type: apiKey
HTTPBearer:
scheme: bearer
type: http