---
updatedAt: 2026-04-20T21:16:33.000Z
agentTools:
  projectIndex: https://swoogo.readme.io/llms.txt
---

# Create Session Scan

Records a new check-in scan for a registrant at a session. Requires `registrant_id` and `session_id` as path parameters.
Use this to programmatically check in attendees at session entrances, equivalent to scanning their badge or QR code.


# OpenAPI definition

````json
{
  "openapi": "3.1.0",
  "info": {
    "title": "Swoogo API",
    "version": "1.0.0",
    "summary": "REST API for the Swoogo event management platform",
    "description": "The Swoogo API provides programmatic access to manage events, registrants, sessions,\nspeakers, sponsors, and related resources on the Swoogo event management platform.\n\n## Authentication\n\nThe API uses OAuth 2.0 with the **client credentials** grant type.\n\n1. **Get your credentials** — Log in to Swoogo and go to **My Profile > API Credentials**\n   to find your consumer key and secret.\n2. **Encode credentials** — URL-encode the key and secret (RFC 1738), concatenate them\n   with a colon (`key:secret`), then Base64-encode the result.\n3. **Request a token** — `POST /oauth2/token` with your encoded credentials in the\n   `Authorization: Basic {encoded}` header and `grant_type=client_credentials` in the body.\n4. **Use the token** — Include `Authorization: Bearer {access_token}` on all subsequent requests.\n\n> Tokens expire after **30 minutes**. Request a new token when you receive a `401` response.\n\n## Rate Limiting\n\nAPI requests are rate-limited to **2,000 requests per 10-minute window** per API credential.\nList endpoints cost **10 credits** per call; all other endpoints cost **1 credit**.\nRate limit status is returned in response headers:\n\n| Header | Description |\n|--------|-------------|\n| `X-Rate-Limit-Limit` | Maximum requests allowed in the current window |\n| `X-Rate-Limit-Remaining` | Requests remaining in the current window |\n| `X-Rate-Limit-Reset` | Seconds until the window resets |\n\nWhen the limit is exceeded, the API returns `429 Too Many Requests`.\n\n## Pagination\n\nAll list endpoints return paginated results in this envelope:\n\n```json\n{\n  \"items\": [...],\n  \"_links\": { \"self\": { \"href\": \"...\" }, \"first\": { \"href\": \"...\" }, \"last\": { \"href\": \"...\" } },\n  \"_meta\": { \"totalCount\": 95, \"pageCount\": 5, \"currentPage\": 1, \"perPage\": 20 }\n}\n```\n\nControl pagination with these query parameters:\n\n| Parameter | Default | Max | Description |\n|-----------|---------|-----|-------------|\n| `page` | 1 | — | Page number (1-indexed) |\n| `per-page` | 20 | 1000 | Items per page. Capped at **200** when using `expand`. |\n\nPagination metadata is also returned in `X-Pagination-*` response headers.\n\n## Filtering and Sorting\n\nUse the `search` parameter to filter results. Combine multiple conditions with `&`.\n\n**Operators:** `=`, `!=`, `>`, `<`, `>=`, `<=`, `*contains*`, `*beginswith*`, `*endswith*`, `*in*`\n\n**Examples:**\n- `search=registration_status=confirmed` — exact match\n- `search=created_at>=2024-01-01` — date range\n- `search=last_name=*beginswith*Sm` — starts with \"Sm\"\n- `search=status=*in*confirmed|attended` — matches any value (pipe-separated)\n- `search=id>100&registration_status=confirmed` — multiple conditions (AND by default)\n\nSet `searchCondition=or` to match **any** condition instead of all.\n\nUse `sort` to order results. Prefix with `-` for descending: `sort=-created_at`.\n\n## Field Selection and Expansion\n\nUse `fields` to request only the fields you need: `fields=id,email,first_name,last_name`.\nWhen omitted, a default subset of fields is returned.\n\nUse `expand` to include related objects in the response: `expand=homeAddress,sessions`.\nEach resource documents its available expand values. Using `expand` caps the page size at **200**.\n\n## Errors\n\nAll errors return a consistent JSON response:\n\n```json\n{\n  \"name\": \"Not Found\",\n  \"message\": \"The requested resource does not exist.\",\n  \"code\": 0,\n  \"status\": 404\n}\n```\n\n| Status | Meaning |\n|--------|---------|\n| `400` | Bad Request — invalid parameters or business rule violation |\n| `401` | Unauthorized — missing or expired bearer token |\n| `403` | Forbidden — valid token but insufficient permissions |\n| `404` | Not Found — resource does not exist or is not accessible |\n| `422` | Unprocessable Entity — validation errors on input fields |\n| `429` | Too Many Requests — rate limit exceeded |\n| `500` | Internal Server Error — unexpected server error |\n\n## Webhooks\n\nSwoogo can send HTTP callbacks when resources are created, updated, or deleted.\nConfigure webhooks via the API or the Swoogo UI. Supported trigger objects:\n`event`, `contact`, `registrant`, `speaker`, `sponsor`, `session`,\n`session_attendance`, `registrant_line_item`.\n\nWebhook payloads can be sent as `json` (application/json) or `post` (form-encoded).\n",
    "termsOfService": "https://www.swoogo.com/terms",
    "contact": {
      "name": "Swoogo Developer Support",
      "url": "https://developer.swoogo.com",
      "email": "dev@swoogo.com"
    },
    "license": {
      "name": "Apache 2.0",
      "url": "https://www.apache.org/licenses/LICENSE-2.0.html"
    }
  },
  "servers": [
    {
      "url": "https://api.swoogo.com/api/v1",
      "description": "Production API server"
    },
    {
      "url": "https://local.swoogo.com/api/v1",
      "description": "Local API server"
    }
  ],
  "tags": [
    {
      "name": "Session Scans",
      "description": "Record and manage check-in scans for session attendance."
    }
  ],
  "paths": {
    "/scans/registrant/{registrant_id}/session/{session_id}": {
      "post": {
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "tags": [
          "Session Scans"
        ],
        "summary": "Create Session Scan",
        "description": "Records a new check-in scan for a registrant at a session. Requires `registrant_id` and `session_id` as path parameters.\nUse this to programmatically check in attendees at session entrances, equivalent to scanning their badge or QR code.\n",
        "operationId": "createSessionScan",
        "parameters": [
          {
            "name": "registrant_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "example": 1
            },
            "description": "integer - required - The ID of the registrant you want to use"
          },
          {
            "name": "session_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "example": 1
            },
            "description": "integer - required - The ID of the session you want to use"
          }
        ],
        "requestBody": {
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "event_id": {
                    "type": "string",
                    "example": "8048"
                  },
                  "prevent_check_in": {
                    "type": "boolean",
                    "example": false,
                    "description": "Optional boolean parameter to prevent the registrant's overall registration status from changing to \"attended\" during session check-in. When true, the registrant will be checked into the session but their overall registration status will remain unchanged. When false or omitted, the registrant's status will be updated to \"attended\" as usual."
                  }
                }
              },
              "examples": {
                "Scan A Registrant In To A Session": {
                  "value": {
                    "event_id": "8048"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Create Object (or return existing scan if duplicate)",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "integer",
                      "example": 69,
                      "description": "The unique identifier of the created scan"
                    },
                    "event_id": {
                      "type": "integer",
                      "example": 787,
                      "description": "The ID of the event"
                    },
                    "registrant_id": {
                      "type": "integer",
                      "example": 1395,
                      "description": "The ID of the registrant"
                    },
                    "type": {
                      "type": "string",
                      "example": "session",
                      "description": "The type of scan"
                    },
                    "created_by": {
                      "type": "integer",
                      "example": 1,
                      "description": "The ID of the user who created the scan"
                    },
                    "created_at": {
                      "type": "string",
                      "example": "2025-09-18 21:26:08",
                      "description": "The timestamp when the scan was created"
                    },
                    "scan_id": {
                      "type": "integer",
                      "example": 696,
                      "description": "The ID of the session being scanned"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "description": "The requested resource does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "name": {
                      "type": "string",
                      "example": "Not Found"
                    },
                    "message": {
                      "type": "string",
                      "example": "Session Not Found",
                      "description": "Specific error message for session-related 404 errors"
                    },
                    "code": {
                      "type": "integer",
                      "example": 0
                    },
                    "status": {
                      "type": "integer",
                      "example": 404
                    }
                  }
                },
                "examples": {
                  "session_not_found": {
                    "summary": "Session Not Found",
                    "value": {
                      "name": "Not Found",
                      "message": "Session Not Found",
                      "code": 0,
                      "status": 404
                    }
                  }
                }
              }
            }
          },
          "500": {
            "$ref": "#/components/responses/InternalServerError"
          }
        }
      }
    }
  },
  "components": {
    "securitySchemes": {
      "bearerAuth": {
        "type": "http",
        "scheme": "bearer",
        "bearerFormat": "access_token",
        "description": "OAuth 2.0 bearer token obtained from `POST /oauth2/token`. Tokens expire after 30 minutes. Include in the `Authorization` header as `Bearer {access_token}`."
      }
    },
    "schemas": {
      "ErrorResponse": {
        "type": "object",
        "description": "Standard error response returned for all 4xx and 5xx status codes.",
        "properties": {
          "name": {
            "type": "string",
            "description": "Human-readable error type name (e.g., \"Unauthorized\", \"Forbidden\", \"Not Found\").",
            "example": "Unauthorized"
          },
          "message": {
            "type": "string",
            "description": "Detailed error message explaining what went wrong.",
            "example": "Your request was made with invalid credentials."
          },
          "code": {
            "type": "integer",
            "description": "Application-specific error code. Currently `0` for all standard errors.",
            "example": 0
          },
          "status": {
            "type": "integer",
            "description": "HTTP status code of the error response.",
            "example": 401
          }
        }
      }
    },
    "responses": {
      "Unauthorized": {
        "description": "Authentication failed. The bearer token is missing, expired, or invalid. Obtain a new token via `POST /oauth2/token`.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ErrorResponse"
            },
            "example": {
              "name": "Unauthorized",
              "message": "Your request was made with invalid credentials.",
              "code": 0,
              "status": 401
            }
          }
        }
      },
      "Forbidden": {
        "description": "The authenticated user does not have permission to access this resource. This can occur if the resource belongs to a different account or the API credentials lack the required scope.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ErrorResponse"
            },
            "example": {
              "name": "Forbidden",
              "message": "You do not have access to that resource.",
              "code": 0,
              "status": 403
            }
          }
        }
      },
      "InternalServerError": {
        "description": "An unexpected server error occurred. If this persists, contact Swoogo support with the request details and timestamp.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ErrorResponse"
            },
            "example": {
              "name": "Internal Server Error",
              "message": "An error occurred while processing your request.",
              "code": 0,
              "status": 500
            }
          }
        }
      }
    }
  },
  "x-tagGroups": [
    {
      "name": "Authentication",
      "tags": [
        "Authentication"
      ]
    },
    {
      "name": "Core Resources",
      "tags": [
        "Events",
        "Registrants",
        "Sessions",
        "Speakers",
        "Sponsors",
        "Contacts"
      ]
    },
    {
      "name": "Registration",
      "tags": [
        "Registrant Types",
        "Packages",
        "Discount Codes",
        "Transactions",
        "Registrant Sessions",
        "Registrant Session Waitlists",
        "Registrant Groups",
        "Registrant Line Items",
        "Registrant Line Item Audits"
      ]
    },
    {
      "name": "Event Configuration",
      "tags": [
        "Event Fields",
        "Event Questions",
        "Event Websites",
        "Event Badges",
        "Event Folders",
        "Session Fields",
        "Session Locations",
        "Session Attendance",
        "Session Scans",
        "Session Fees",
        "Package Fees",
        "Tracks",
        "Pages"
      ]
    },
    {
      "name": "Speakers & Sponsors",
      "tags": [
        "Speaker Sessions",
        "Sponsor Fields",
        "Sponsor Attendance"
      ]
    },
    {
      "name": "Contacts & Communication",
      "tags": [
        "Contact Fields",
        "Invitation Lists",
        "Data Lists",
        "Data List Items"
      ]
    },
    {
      "name": "Call for Speakers",
      "tags": [
        "Call for Speaker Contacts",
        "Call for Speaker Reviews",
        "Call for Speaker Submissions"
      ]
    },
    {
      "name": "Media",
      "tags": [
        "Images"
      ]
    },
    {
      "name": "Integrations",
      "tags": [
        "Webhooks",
        "Webhook Groups"
      ]
    }
  ]
}
````