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

# Send Email Invites

> ## Bulk Candidate Torture Invitations

Send Error Golf challenge invitations to up to 100 unsuspecting candidates at once. Perfect for lazy hiring managers who can't be bothered to copy-paste email addresses like some kind of prehistoric recruiter.

**The process:**
1. Submit a list of email addresses (1-100 victims)
2. We validate each email and remove duplicates (because even chaos needs order)
3. Invitations are sent asynchronously in batches of 10 (so we don't anger the email gods)
4. Each candidate gets your company's live code and a one-way ticket to developer purgatory

**Rate limiting (because we're not completely evil):**
- 1000 invitations per company per day
- Limit resets at midnight UTC (when all good developers should be sleeping)
- Current usage returned so you know when to stop the madness

**Email validation (surprisingly thorough):**
- Proper email format checking (we're not savages)
- Automatic whitespace trimming (because spaces are the devil)
- Duplicate removal (nobody deserves our questions twice in one day)
- Helpful error messages for when you inevitably mess up

**Async processing (the waiting game):**
- Emails sent in background batches while you contemplate your hiring choices
- Individual failures don't stop the chaos train
- Small delays between batches (even email services have feelings)

**Warning:** This uses your live code, so completed assessments will cost you $39 each. Budget accordingly.




## OpenAPI

````yaml POST /invite
openapi: 3.0.3
info:
  title: Error Golf API - Where Code Goes to Die
  description: >
    # 🏌️ Error Golf API


    **Error Golf** replaces algorithmic tests with creative coding challenges
    that actually measure problem-solving skills.

    Companies pay $39 per candidate to discover if applicants can think
    creatively or just copy-paste from Stack Overflow.


    ## Business Model

    - **Setup Fee:** $49 one-time fee (because quality costs money)

    - **Per Candidate:** $39 each attempt (cheaper than a decent lunch)

    - **No Subscriptions:** We're not Netflix


    ## Golf Terminology

    - **Round:** Complete test (3 questions, like actual golf but with more
    crying)

    - **Hole:** Individual question (candidates pick 3 from 100 nightmares)

    - **Shot:** Solution attempt (usually involves existential crisis)

    - **Scorecard:** A roast of your code from 3 different personalities


    ## Authentication

    Protected endpoints need JWT Bearer token: `Bearer <your-digital-passport>`


    ## Error Responses

    When things inevitably break:

    ```json

    {
      "error": "something_went_sideways",
      "message": "A helpful explanation of what you did wrong this time"
    }

    ```


    ## Rate Limiting

    - 100 requests/hour (generous, considering your coding skills)

    - Headers tell you when we'll start ignoring you
  version: 1.0.0
  contact:
    name: Error Golf Support (May the odds be ever in your favor)
    url: https://errorgolf.com/support
    email: support@errorgolf.com
  license:
    name: Proprietary (We own this beautiful mess)
    url: https://errorgolf.com/terms
servers:
  - url: https://api.errorgolf.com/v1
    description: Production (where dreams meet reality)
  - url: http://localhost:8080/v1
    description: Local dev (your personal playground)
security: []
tags:
  - name: Health
    description: Is this thing even working?
  - name: Course
    description: Browse the vault of coding nightmares
  - name: Round
    description: Take 3 swings at holes you pick
  - name: Members
    description: Prove you belong here
  - name: Clubhouse
    description: Configure your coding challenge empire
paths:
  /invite:
    post:
      tags:
        - Clubhouse
      summary: Spam candidates with coding nightmares
      description: >
        ## Bulk Candidate Torture Invitations


        Send Error Golf challenge invitations to up to 100 unsuspecting
        candidates at once. Perfect for lazy hiring managers who can't be
        bothered to copy-paste email addresses like some kind of prehistoric
        recruiter.


        **The process:**

        1. Submit a list of email addresses (1-100 victims)

        2. We validate each email and remove duplicates (because even chaos
        needs order)

        3. Invitations are sent asynchronously in batches of 10 (so we don't
        anger the email gods)

        4. Each candidate gets your company's live code and a one-way ticket to
        developer purgatory


        **Rate limiting (because we're not completely evil):**

        - 1000 invitations per company per day

        - Limit resets at midnight UTC (when all good developers should be
        sleeping)

        - Current usage returned so you know when to stop the madness


        **Email validation (surprisingly thorough):**

        - Proper email format checking (we're not savages)

        - Automatic whitespace trimming (because spaces are the devil)

        - Duplicate removal (nobody deserves our questions twice in one day)

        - Helpful error messages for when you inevitably mess up


        **Async processing (the waiting game):**

        - Emails sent in background batches while you contemplate your hiring
        choices

        - Individual failures don't stop the chaos train

        - Small delays between batches (even email services have feelings)


        **Warning:** This uses your live code, so completed assessments will
        cost you $39 each. Budget accordingly.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - emails
              properties:
                emails:
                  type: array
                  items:
                    type: string
                    format: email
                  minItems: 1
                  maxItems: 100
                  description: >-
                    List of email addresses for candidates brave enough to face
                    the chaos
                  example:
                    - sarah.chen@example.com
                    - unsuspecting.dev@techcorp.com
                    - future.victim@startup.io
            examples:
              single_victim:
                summary: Single candidate sacrifice
                value:
                  emails:
                    - sarah.chen@example.com
              multiple_victims:
                summary: Mass developer torment
                value:
                  emails:
                    - sarah.chen@example.com
                    - alex.dev@techcorp.com
                    - candidate@startup.io
                    - developer@company.com
              enterprise_chaos:
                summary: Corporate-scale suffering
                value:
                  emails:
                    - candidate1@company.com
                    - candidate2@company.com
                    - candidate3@company.com
      responses:
        '202':
          description: Invitations accepted. The chaos begins.
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: Status message about your batch of digital torment
                    example: >-
                      Invitations are being sent to 3 unsuspecting souls.
                      Invalid emails were mercifully spared.
                  sent:
                    type: integer
                    description: >-
                      Number of valid emails receiving invitations to developer
                      purgatory
                    example: 3
                  skipped:
                    type: integer
                    description: Number of invalid emails that escaped the chaos
                    example: 1
                  refused:
                    type: array
                    items:
                      type: string
                    description: Invalid emails that were rejected (probably for the best)
                    example:
                      - invalid-email@
                      - not.an.email
                  remaining:
                    type: integer
                    description: >-
                      Remaining invitation slots before we cut you off for the
                      day
                    example: 997
              examples:
                perfect_execution:
                  summary: All emails valid (rare achievement)
                  value:
                    message: Invitations are being sent to 3 unsuspecting souls.
                    sent: 3
                    skipped: 0
                    remaining: 997
                human_error:
                  summary: Some emails invalid (more realistic)
                  value:
                    message: >-
                      Invitations are being sent to 2 candidates. Invalid emails
                      were mercifully spared.
                    sent: 2
                    skipped: 1
                    refused:
                      - invalid@
                    remaining: 998
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/TokenDead'
        '403':
          description: Account temporarily unable to spread chaos
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error: service_unavailable
                message: Service is currently unavailable for your account
        '422':
          description: Your email list needs work
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              examples:
                email_disaster:
                  summary: No valid emails survived validation
                  value:
                    error: no_valid_emails
                    message: >-
                      No valid email addresses provided. First error: Email
                      'invalid@' at position 2 has invalid format
                format_failure:
                  summary: Request format completely wrong
                  value:
                    error: validation_error
                    message: >-
                      Invalid request format. Expected JSON with 'emails' array
                      (1-100 items)
        '429':
          description: You've hit your daily chaos quota
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error: daily_invite_limit_exceeded
                message: >-
                  Daily invite limit exceeded. Used: 995, Available: 5,
                  Requested: 10. Limit resets at midnight UTC.
        '500':
          $ref: '#/components/responses/ServerExistentialCrisis'
      security:
        - bearerAuth: []
components:
  responses:
    BadRequest:
      description: Request was malformed or contained invalid data
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            error: empty_request_body
            message: Request body cannot be empty. Please include some data.
    TokenDead:
      description: JWT token is invalid or has expired
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            error: token_expired
            message: Your authentication token has expired. Please login again.
    ServerExistentialCrisis:
      description: Internal server error
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            error: internal_server_error
            message: Something went wrong on our end. We're looking into it.
  schemas:
    ErrorResponse:
      type: object
      required:
        - error
        - message
      properties:
        error:
          type: string
          description: Machine-readable error identifier
        message:
          type: string
          description: Human-readable error explanation
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: JWT token from /token endpoint

````