> ## Documentation Index
> Fetch the complete documentation index at: https://docs.artbucket.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Make a listing yours

> Take an offer: a brand in your workspace from the listing's release (as Start from this brand), with its domain, released and public on BrandHub. The listing goes private, its address leads to yours for good, and its organization's admins find a resolved claim and an audit entry. No brand moves between organizations. Organization admin, signed in.

Scope: `admin`.



## OpenAPI

````yaml /openapi.json post /api/v1/hub/offers/{org}/{brand}
openapi: 3.1.0
info:
  title: artbucket
  version: '1'
  description: >-
    Agent-first asset management. The web UI is built on this API and nothing
    else, beside signing in at /api/auth. Send `Authorization: Bearer <key>`: a
    key works in one workspace with one scope, and scopes are a ladder: read <
    propose < write < admin. People signed in to the app carry a session cookie
    instead, and their scope is what their grants add up to: on the
    organization, the workspace, or single collections and assets. A scope shown
    as needed on the workspace is also enough on the one collection or asset a
    route acts on. Agents (MCP at POST /api/v1/mcp) usually get `propose`: what
    they add waits for a human.
servers:
  - url: http://localhost:3000
security:
  - bearer: []
  - session: []
  - {}
paths:
  /api/v1/hub/offers/{org}/{brand}:
    parameters:
      - name: org
        in: path
        required: true
        description: The listing's organization
        schema:
          type: string
      - name: brand
        in: path
        required: true
        description: The listing's brand
        schema:
          type: string
    post:
      summary: Make a listing yours
      description: >-
        Take an offer: a brand in your workspace from the listing's release (as
        Start from this brand), with its domain, released and public on
        BrandHub. The listing goes private, its address leads to yours for good,
        and its organization's admins find a resolved claim and an audit entry.
        No brand moves between organizations. Organization admin, signed in.


        Scope: `admin`.
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                slug:
                  description: >-
                    The new brand's slug in your workspace; the listing's when
                    left out
                  type: string
                  maxLength: 60
                  pattern: ^[a-z0-9]+(-[a-z0-9]+)*$
              additionalProperties: false
      responses:
        '201':
          description: Your brand, and where it is on BrandHub
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: object
                    properties:
                      slug:
                        type: string
                      name:
                        type: string
                      default:
                        type: boolean
                      visibility:
                        type: string
                        enum:
                          - private
                          - public
                        description: Who sees it on BrandHub
                      from:
                        description: >-
                          The BrandHub brand it started from, as
                          {org}/{brand}@{n}
                        type:
                          - string
                          - 'null'
                      domain:
                        description: >-
                          Its own domain (acme.com): whoever proves it may claim
                          its BrandHub listing
                        type:
                          - string
                          - 'null'
                      movedTo:
                        description: >-
                          Claimed on BrandHub by whoever proved its domain: the
                          listing that took its place, as {org}/{brand}
                        type:
                          - string
                          - 'null'
                      rules:
                        type: integer
                        minimum: -9007199254740991
                        maximum: 9007199254740991
                      createdAt:
                        type: string
                        format: date-time
                        pattern: >-
                          ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
                      hub:
                        type: object
                        properties:
                          visibility:
                            type: string
                            enum:
                              - private
                              - public
                            description: >-
                              private: the workspace's people see it on
                              BrandHub, signed in; public: anyone and any agent
                          url:
                            type: string
                            format: uri
                            description: >-
                              Its page there: BrandHub's own address when
                              public, the app's /hub when private
                          published:
                            anyOf:
                              - type: object
                                properties:
                                  number:
                                    type: integer
                                    minimum: -9007199254740991
                                    maximum: 9007199254740991
                                  publishedAt:
                                    type: string
                                    format: date-time
                                    pattern: >-
                                      ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
                                required:
                                  - number
                                  - publishedAt
                                additionalProperties: false
                              - type: 'null'
                            description: >-
                              What BrandHub shows: the latest publish; null:
                              nothing yet
                          portal:
                            anyOf:
                              - type: object
                                properties:
                                  slug:
                                    type: string
                                  name:
                                    type: string
                                required:
                                  - slug
                                  - name
                                additionalProperties: false
                              - type: 'null'
                            description: The portal it links as its guidelines
                          chosen:
                            type: boolean
                            description: >-
                              That portal was picked; false: it is the brand's
                              first public portal
                          pulls:
                            type: integer
                            minimum: -9007199254740991
                            maximum: 9007199254740991
                            description: >-
                              Its BrandHub files (brand.json, llms.txt, tokens)
                              read in the last 30 days, as its BrandHub card
                              shows
                          delisted:
                            description: >-
                              Taken off BrandHub by whoever runs the server, and
                              why: it can't be made public until they list it
                              again
                            type:
                              - string
                              - 'null'
                          movedTo:
                            description: >-
                              Claimed by whoever proved its domain: the listing
                              that took its place, as {org}/{brand}; it can't be
                              made public again
                            type:
                              - string
                              - 'null'
                          ref:
                            type: string
                            description: 'How BrandHub names it: {org}/{brand}'
                          verified:
                            description: >-
                              What its organization proved it holds, a domain or
                              github.com/{login}; null: a community listing
                            type:
                              - string
                              - 'null'
                          terms:
                            description: >-
                              The terms of use its guidelines portal asks
                              readers to accept, in markdown
                            type:
                              - string
                              - 'null'
                        required:
                          - visibility
                          - url
                          - published
                          - portal
                          - chosen
                          - pulls
                          - delisted
                          - ref
                          - verified
                          - terms
                        additionalProperties: false
                    required:
                      - slug
                      - name
                      - default
                      - visibility
                      - rules
                      - createdAt
                      - hub
                    additionalProperties: false
                required:
                  - data
                additionalProperties: false
        default:
          description: An error
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: object
                    properties:
                      code:
                        type: string
                      message:
                        type: string
                      detail: {}
                    required:
                      - code
                      - message
                    additionalProperties: false
                required:
                  - error
                additionalProperties: false
components:
  securitySchemes:
    bearer:
      type: http
      scheme: bearer
      description: 'An API key: ab_...'
    session:
      type: apiKey
      in: cookie
      name: better-auth.session_token
      description: Signed in, at /api/auth

````