Pullreque.st

API Reference

TypeScript Types

FeedbackOptions

interface FeedbackOptions {
    projectKey: string
    endpoint?: string
    message: string
    pageUrl?: string
    userEmail?: string
    meta?: Record<string, unknown>
    captchaToken?: string
    assets?: Array<{
        kind: 'image' | 'video'
        url: string
        size: number
    }>
}

FeedbackResponse

interface FeedbackResponse {
    id: string
    status: 'received'
}

UseFeedbackReturn

interface UseFeedbackReturn {
    submit: (options: SubmitOptions) => Promise<void>
    isSubmitting: boolean
    error: Error | null
    data: FeedbackResponse | null
    reset: () => void
}

Core Functions

submitFeedback()

Direct submission function for one-off feedback.
async function submitFeedback(
    options: FeedbackOptions
): Promise<FeedbackResponse>
Example:
import { submitFeedback } from '@pullreque.st/button'

await submitFeedback({
  projectKey: 'prj_pk_YOUR_KEY',
  message: 'Great app!',
  userEmail: 'user@example.com',
  meta: { rating: 5 }
})

createFeedbackClient()

Factory function for creating a reusable client.
function createFeedbackClient(
    projectKey: string,
    endpoint?: string
): FeedbackClient
Example:
const client = createFeedbackClient('prj_pk_YOUR_KEY')

await client.submit({
  message: 'Bug report',
  meta: { page: '/checkout' }
})

React Hooks

useFeedback()

State management hook for feedback submission.
function useFeedback(options?: UseFeedbackOptions): UseFeedbackReturn
Returns:
  • submit(options) - Submit feedback
  • isSubmitting - Submission in progress
  • error - Last error (null if none)
  • data - Last successful response
  • reset() - Clear error and data
Example:
import { useFeedback } from '@pullreque.st/button/react/headless'

function MyComponent() {
  const { submit, isSubmitting, error, data, reset } = useFeedback({
    onSuccess: (response) => {
      console.log('Feedback submitted!', response)
    },
    onError: (error) => {
      console.error('Submission failed:', error)
    },
    autoCaptureUrl: true
  })

  // Your implementation
}

Next Steps