Sandbox

The sandbox environment that test keys work in.


GET/v2/sandbox

Get the sandbox

Returns your app's sandbox. The sandbox works only with a test key and is created on its first request. It includes virtual accounts with sample calendars and events, and simulated Google, Outlook and Zoom accounts that respond as those providers do without contacting them.

Sends the request to your sandbox, never to live data.

Errors

Request

GET
/v2/sandbox
curl 'https://api.pyas.io/v2/sandbox' \  -H "x-api-key: $PYAS_API_KEY"

Response

200 OK
{  "success": true,  "data": {    "seededAt": "2026-11-14T20:00:23.534Z",    "accounts": [      {        "accountId": "sbx_fda58c5980_1",        "provider": "pyas",        "name": "Avery Brooks",        "subjectId": "sandbox_user_1"      },      {        "accountId": "sbx_fda58c5980_2",        "provider": "pyas",        "name": "Sam Patel",        "subjectId": "sandbox_user_2"      },      {        "accountId": "sbx_fda58c5980_3",        "provider": "pyas",        "name": "Yuki Tanaka",        "subjectId": "sandbox_user_3"      },      {        "accountId": "sbx_fda58c5980_4",        "provider": "pyas",        "name": "Jordan Lee",        "subjectId": "sandbox_user_4"      },      {        "accountId": "sbx_fda58c5980_5",        "provider": "pyas",        "name": "Riley Chen",        "subjectId": "sandbox_user_5"      },      {        "accountId": "sbx_fda58c5980_google",        "provider": "google",        "name": "Avery Brooks",        "subjectId": "sandbox_user_1"      },      {        "accountId": "sbx_fda58c5980_outlook",        "provider": "microsoft",        "name": "Sam Patel",        "subjectId": "sandbox_user_2"      },      {        "accountId": "sbx_fda58c5980_zoom",        "provider": "zoom",        "name": "Avery Brooks",        "subjectId": "sandbox_user_1"      }    ],    "examples": {      "account.avery": "sbx_fda58c5980_1",      "subject.avery": "sandbox_user_1",      "calendar.avery.primary": "calfda58c59801p",      "calendar.avery.work": "calfda58c59801w",      "event.avery.standup": "sb559d0de42dffb4f183c156f8",      "event.avery.sprint": "sba4ff5f08df3d4dcbddca25a3",      "event.avery.oneonone": "sba938ba8604d9bdff564147c2",      "event.avery.productsync": "sbf60c8ae6a9f17c1e3b6cc2b8",      "event.avery.design": "sbff8ee84b7939a1d7a4943ff6",      "event.avery.customer": "sb0c940c95b43e44fcf6650886",      "event.avery.lunch": "sbce3d2d42c2a4d690a9860fbb",      "event.avery.dentist": "sb03fe318b8d28506fffad9254",      "event.avery.focus": "sbf36d93862d5bc4f8bca3d967",      "event.avery.talk": "sb3dc0420b772f0cc723098085",      "event.avery.offsite": "sb381bb09d8b9512fdc96458a7",      "event.avery.holiday": "sb0f18ff67cf75e9b0f2791f41",      "event.avery.quarterly": "sbf031ba171ceac2ab4e014cb1",      "event.avery.board": "sb0ee767b6db44fa6f8a796921",      "event.avery.release": "sb021ac6e492b8cfcd2a449b94",      "event.avery.oncall": "sb2e91a5da5a1fb2493ab0bae5",      "event.avery.retro": "sb1b5d95184e2d895435bad820",      "event.avery.hiring": "sb4e9d57c17109dc8e28387271",      "account.sam": "sbx_fda58c5980_2",      "subject.sam": "sandbox_user_2",      "calendar.sam.primary": "calfda58c59802p",      "calendar.sam.work": "calfda58c59802w",      "event.sam.standup": "sbcbc04ba3fe4ddd1f0c0c8821",      "event.sam.sprint": "sb07d8b89df0354beb287ab688",      "event.sam.oneonone": "sb47a561a28f14bae33d187d98",      "event.sam.productsync": "sb15c6c1a7e2f87335fbd2f837",      "event.sam.design": "sb0fbdf5e66d7be472d5499373",      "event.sam.customer": "sba3778c3cc1ea7e9b2123810f",      "event.sam.lunch": "sb0ed0f6f377b2997f3de12ffa",      "event.sam.dentist": "sbfdeea6fbfc9016ec8f12bfc9",      "event.sam.focus": "sbcddf5da647f2526dd7d990f7",      "event.sam.talk": "sbf919294b2e72fec55cd113cc",      "event.sam.offsite": "sb2cac9acc3e10edb7242a575d",      "event.sam.holiday": "sbe4a0e1fa4ea75e7197c3ba17",      "event.sam.quarterly": "sb866914b50adea252ca4c8565",      "event.sam.board": "sbc47c845e6b945be417d3062f",      "event.sam.release": "sb1379632f67e8d64783a8ac00",      "event.sam.oncall": "sb4dc88ff07bf33ca1ed2a029a",      "event.sam.retro": "sb71ae3ab164710419d93b4b4a",      "event.sam.hiring": "sb5d138acbe172b7921ab1dcb0",      "account.yuki": "sbx_fda58c5980_3",      "subject.yuki": "sandbox_user_3",      "calendar.yuki.primary": "calfda58c59803p",      "calendar.yuki.work": "calfda58c59803w",      "event.yuki.standup": "sb0d85f9ee0eb5fea7e3b578ae",      "event.yuki.sprint": "sbaf9251a02c8af1068cc68858",      "event.yuki.oneonone": "sbb07344b2de6eda72b6c9b954",      "event.yuki.productsync": "sb8b1e8b4e4d962529e224f9bf",      "event.yuki.design": "sb93f8a0abb4787660ab81c268",      "event.yuki.customer": "sb37a7074560f0071fae739d5f",      "event.yuki.lunch": "sb3d548bac3dfe50dc692b9b4d",      "event.yuki.dentist": "sbe7ea582766e506cdaf6d3578",      "event.yuki.focus": "sb08665ae27ce9f3a4091183d2",      "event.yuki.talk": "sbad20d94320f6a1de32100512",      "event.yuki.offsite": "sb9e1a98694ea3bf9b1db8a8dd",      "event.yuki.holiday": "sb3e01171d21ec26f595bb22a8",      "event.yuki.quarterly": "sb5eb8eb5dc4b140c1ba2c9ce7",      "event.yuki.board": "sb9a0396ea96846e4fd3b488b6",      "event.yuki.release": "sb425be99e9141e3eb8bbd32b7",      "event.yuki.oncall": "sb663fdac0ada858716992b4a3",      "event.yuki.retro": "sba7cb09b9032a32d980348453",      "event.yuki.hiring": "sbf1d965e6e6b9ea8f94a1d057",      "account.jordan": "sbx_fda58c5980_4",      "subject.jordan": "sandbox_user_4",      "calendar.jordan.primary": "calfda58c59804p",      "calendar.jordan.work": "calfda58c59804w",      "event.jordan.standup": "sbea6f284d687cb26782e8c636",      "event.jordan.sprint": "sb37bbff2a4693584e6f4d6c7e",      "event.jordan.oneonone": "sbecbda5d76824198f3e12ef7f",      "event.jordan.productsync": "sbf1d4b177a25621cc16590d08",      "event.jordan.design": "sb116b030984b5698d5e4c81ec",      "event.jordan.customer": "sb217c316443b0d8f2c67ff632",      "event.jordan.lunch": "sb532287296e9c7855a7b5e9da",      "event.jordan.dentist": "sb3c358ba3551037377d43b981",      "event.jordan.focus": "sb1c5c786e842cbee885e6a721",      "event.jordan.talk": "sb4b8a5518a89808de94fb57a0",      "event.jordan.offsite": "sb8b3352f72b90f105d8e84310",      "event.jordan.holiday": "sb97847c4c761dc2c34fce5f9b",      "event.jordan.quarterly": "sbbed21aa850958f40d0ddf638",      "event.jordan.board": "sb0cc16d90737f55624ce330b0",      "event.jordan.release": "sb4da4d05514f7c97665bfcdee",      "event.jordan.oncall": "sb28daed7655383de30552be76",      "event.jordan.retro": "sb88c16f88bc4751161369a112",      "event.jordan.hiring": "sb06d2b6b90745219bb1864b81",      "account.riley": "sbx_fda58c5980_5",      "subject.riley": "sandbox_user_5",      "calendar.riley.primary": "calfda58c59805p",      "calendar.riley.work": "calfda58c59805w",      "event.riley.standup": "sbeac72e2e596799aad8600049",      "event.riley.sprint": "sb1d91fcc56b10d3e962b3dc16",      "event.riley.oneonone": "sb5503d314463b2fc4568daf71",      "event.riley.productsync": "sb7ba69c6a96e48bf41d632aa9",      "event.riley.design": "sb7f567757501e6f8918a68ccf",      "event.riley.customer": "sbe5afcb8859a2d26117bada7f",      "event.riley.lunch": "sb10b1e81721cb49bbab0c4498",      "event.riley.dentist": "sbb67b9d59ef7c6160f31d5438",      "event.riley.focus": "sb719ce1d0462de81428df52db",      "event.riley.talk": "sb2f5479606451d712d0698f39",      "event.riley.offsite": "sb374b1313a775a9061957b191",      "event.riley.holiday": "sbb3b186f28c815491bd628c5b",      "event.riley.quarterly": "sb506918cbd1f078f6c7682ba2",      "event.riley.board": "sbe28ff8c800fe9e46ee632ed3",      "event.riley.release": "sb280ea76c6eeb1ebadeecfa5b",      "event.riley.oncall": "sb11c31def8bb4d99c166481e6",      "event.riley.retro": "sb34c492d642099ac9fbd7a680",      "event.riley.hiring": "sb0032a71b261cdfc1fbdd5968",      "event.avery.zoomcall": "sb16ba49792a79d2ce856e789a",      "account.google": "sbx_fda58c5980_google",      "account.outlook": "sbx_fda58c5980_outlook",      "account.zoom": "sbx_fda58c5980_zoom",      "calendar.google.primary": "avery.brooks@example.com",      "calendar.google.team": "c_fda58c5980team@group.calendar.google.com",      "calendar.google.holidays": "en.usa#holiday@group.v.calendar.google.com",      "calendar.outlook.primary": "AAMkAU662pGNAu0JgQ5Fpjf1wipv7j82pYQuBvDbbTPOq8h4AAA=",      "calendar.outlook.acme": "AAMkA-M9ePPI-lDjuHutrLL7ee-FjiW4n60cpd6GPnyDTv84AAA=",      "calendar.outlook.morgan": "AAMkAPZCx8r3fRaim7oP6DyRH-4h12pnbtU0iizh-r7n7VpQAAA=",      "attachment.google.agenda": "1tTOPj3dD9zJTxnuHOHkvShgQGzYdlWUb",      "attachment.outlook.agenda": "AAMkArXFqduOUNsr8qIMCtJ66XOMYtyB4ZLBHoqtmM72Np-gAAA=",      "permission.outlook.morgan": "AAMkAO3ALRxedE66VdRlJ7Mztds26zRxlvC0Kb-0ARjadAcQAAA=",      "meeting.zoom.standup": "97474246023",      "meeting.zoom.demo": "40824382962",      "event.google.invite": "sg4fb9224b7476cc20ab4a5c41",      "event.google.kickoff": "sg314c0fd5415a58a532cd018d",      "event.google.weekly": "sge228430fc2a09c03dd8c1801",      "event.google.focus": "sg6297ccf7345c268029ccb5fa",      "event.google.trip": "sg6ea8a09f4ce349fe4438c48c",      "event.google.office": "sgcd2d8976578edb2f608c814d",      "event.google.home": "sg69e86df5bfd6e93979271e83",      "event.outlook.review": "AAMkABPQiivgqLU9tm9fMz97PHOQGGb0wy-xR-Eg22SuOCP8AAA=",      "event.outlook.invite": "AAMkAaqP10JDPp4BdGjaZyg2dF63m6W8eIe6XhxRsmKdLG38AAA=",      "event.outlook.oneonone": "AAMkAfyVo0SAxuZUKe2fHy8vnD8hwmEI2TPen-4bOQRyI85YAAA=",      "event.outlook.lunch": "AAMkAmkT0JZAAD-QlweAroEZ60WkpCuHxOrvb1V8lA1M3khEAAA=",      "event.outlook.acme": "AAMkAXGIe3xE7fw-FQRwtA9eM3XR5OlTgW90xTZlDQyK9z1MAAA=",      "category.outlook.red": "2eb82094-ec40-4d5d-a8b8-15cf273998c1",      "category.outlook.orange": "945326ef-02ee-47a7-a625-8364f33d9abd",      "category.outlook.yellow": "d4c5c9cb-5502-42de-a335-3f8f85322a98",      "category.outlook.green": "109ef2a3-89fc-4525-a7b8-d4d3eddfec23",      "category.outlook.blue": "0eed55fa-f6a2-4cb2-a808-1ab178ff93b5",      "category.outlook.purple": "18d6d65c-6b1e-47ac-ac6f-5ae45fad5968",      "category.google.deepwork": "lbl41c7fe365963",      "category.google.travel": "lbld0ade325f932",      "group.outlook.mine": "AAMkAPtDnBoVMLgLIu-5ZykUH3m3F8jh-vhqP8YlJhgiZLHEAAA=",      "group.outlook.others": "AAMkAyCWrTohk9tAZoyL6-kuuLYadpDmD-3sFfQAb6CXpof0AAA=",      "group.outlook.clients": "AAMkAFDoRdCjiMqrQ0gUzJhGn7fWP7a-kYNGIymOmCmTrT7cAAA=",      "group.outlook.projects": "AAMkAYE1Kc3zrnSLkXx5fXHBEPOfQSybhu8nRccpNiIpXWVwAAA=",      "webhook.inbox": "whk_sbx671d37d5e9995de7b6be",      "webhookEvent.inbox": "evt_sbx0b0f2dbfa1198fcb366c",      "delivery.inbox": "del_sbxf61f198fc5d9f0072a38"    }  },  "provider": null,  "traceId": "trc_5f2a9c1e7b3d4a6f8e0c2b1d",  "meta": {}}

POST/v2/sandbox/reset

Reset the sandbox

Deletes everything in the sandbox and repopulates it with the sample accounts, calendars and events.

Sends the request to your sandbox, never to live data.

Headers

  • Name
    Idempotency-Key
    Type
    string
    Description

    A unique key that makes the request safe to retry. A retry with the same key returns the original response and does not make the change twice. Keys are kept for 24 hours.

Errors

Request

POST
/v2/sandbox/reset
curl -X POST 'https://api.pyas.io/v2/sandbox/reset' \  -H "x-api-key: $PYAS_API_KEY"

Response

200 OK
{  "success": true,  "data": {    "seededAt": "2026-11-14T20:00:24.721Z"  },  "provider": null,  "traceId": "trc_5f2a9c1e7b3d4a6f8e0c2b1d",  "meta": {}}

POST/v2/sandbox/simulate-change

Simulate an external change

Creates, updates or deletes an event the way someone outside your app would, for example in Google Calendar, Microsoft Outlook or another app. Use it to test how your app handles changes it didn't make. Pyas detects the change and sends webhooks as it would for a real account. The webhooks don't include request, because the change didn't come from one of your requests. created adds an event tomorrow at 16:00 UTC. updated renames an event and moves it 30 minutes later. deleted deletes the event. If you omit eventId, the API uses the next upcoming single event on the calendar.

In the sandbox: Then check for the webhooks in GET /v2/webhooks/deliveries (the sandbox inbox) or in the relay.

Sends the request to your sandbox, never to live data.

Headers

  • Name
    Idempotency-Key
    Type
    string
    Description

    A unique key that makes the request safe to retry. A retry with the same key returns the original response and does not make the change twice. Keys are kept for 24 hours.

Body

  • Name
    accountId
    Type
    string
    Required
    required
    Description

    A sandbox account. Use a virtual account, or the simulated Google or Outlook account.

  • Name
    change
    Type
    string
    Required
    required
    Description

    One of created, updated, deleted.

  • Name
    eventId
    Type
    string
    Description
  • Name
    calendarRef
    Type
    string
    Description

    Defaults to primary.

Errors

Request

POST
/v2/sandbox/simulate-change
curl -X POST 'https://api.pyas.io/v2/sandbox/simulate-change' \  -H "x-api-key: $PYAS_API_KEY" \  -H "content-type: application/json" \  -d '{  "accountId": "sbx_fda58c5980_google",  "change": "updated",  "eventId": "sg314c0fd5415a58a532cd018d"}'

Response

200 OK
{  "success": true,  "data": {    "change": "updated",    "event": {      "id": "sg314c0fd5415a58a532cd018d",      "iCalUID": "sg314c0fd5415a58a532cd018d@google.com",      "title": "Project Atlas kickoff (changed)",      "description": null,      "location": null,      "startsAt": "2026-11-15T19:30:00Z",      "endsAt": "2026-11-15T20:30:00Z",      "startsAtLocal": "2026-11-15T14:30:00-05:00",      "endsAtLocal": "2026-11-15T15:30:00-05:00",      "timezone": "America/New_York",      "isAllDay": false,      "status": "confirmed",      "visibility": null,      "attendees": [        {          "email": "casey.nguyen@example.com",          "name": "Casey Nguyen",          "response": "accepted",          "optional": false,          "isOrganizer": false        },        {          "email": "drew.okafor@example.com",          "name": "Drew Okafor",          "response": "needsAction",          "optional": false,          "isOrganizer": false        }      ],      "rooms": [],      "organizer": {        "email": "avery.brooks@example.com",        "name": "Avery Brooks"      },      "conferencing": {        "provider": "meet",        "joinUrl": "https://meet.google.com/slk-zsog-xml",        "meetingId": "slk-zsog-xml",        "passcode": null,        "dialIn": [          {            "label": "+1 555-0100",            "number": "+1-555-0100",            "pin": "478462722"          }        ]      },      "meetingUrl": "https://meet.google.com/slk-zsog-xml",      "recurrence": null,      "series": null,      "reminders": [],      "attachments": [        {          "url": "https://docs.google.com/document/d/1tTOPj3dD9zJTxnuHOHkvShgQGzYdlWUb/edit",          "title": "Kickoff agenda",          "mimeType": "application/vnd.google-apps.document"        }      ],      "showAs": "busy",      "eventType": "default",      "color": null,      "guests": {        "canModify": false,        "canInviteOthers": true,        "canSeeGuests": true,        "canProposeTimes": true      },      "importance": null,      "categories": [],      "responseRequested": null,      "autoDecline": null,      "doNotDisturb": null,      "workingLocation": null,      "birthday": null,      "source": null,      "endTimeUnspecified": null,      "privateCopy": null,      "createdAt": "2026-11-14T20:00:24.212Z",      "updatedAt": "2026-11-14T20:00:24.680Z",      "version": "\"2\"",      "provider": "google",      "providerRefs": {        "eventId": "sg314c0fd5415a58a532cd018d",        "calendarId": "avery.brooks@example.com",        "accountId": "sbx_fda58c5980_google"      },      "metadata": null    }  },  "provider": null,  "traceId": "trc_5f2a9c1e7b3d4a6f8e0c2b1d",  "meta": {}}

POST/v2/sandbox/simulate-meeting

Simulate a Zoom meeting event

Simulates a Zoom event for a meeting made with the simulated Zoom account, as Zoom would report it: the meeting of a sandbox event (send eventId), or one made with POST /v2/meetings (send meetingId, with the Zoom account as accountId). The meeting can start or end, a participant can join or leave, its recording can become ready, or it can be updated or deleted in Zoom. The matching webhook, such as meeting.started or recording.ready, is sent as it would be for a real Zoom account.

In the sandbox: Then check for the recording.ready webhook in GET /v2/webhooks/deliveries (the sandbox inbox) or in the relay.

Sends the request to your sandbox, never to live data.

Headers

  • Name
    Idempotency-Key
    Type
    string
    Description

    A unique key that makes the request safe to retry. A retry with the same key returns the original response and does not make the change twice. Keys are kept for 24 hours.

Body

  • Name
    accountId
    Type
    string
    Required
    required
    Description

    The calendar account the event is on. For a meeting made with POST /v2/meetings, the Zoom account.

  • Name
    eventId
    Type
    string
    Description

    An event with a Zoom meeting created by the sandbox's Zoom account.

  • Name
    meetingId
    Type
    string
    Description

    Instead of eventId: a meeting made with POST /v2/meetings and the sandbox's Zoom account.

  • Name
    what
    Type
    string
    Required
    required
    Description

    One of started, ended, participant_joined, participant_left, recording_ready, updated, deleted.

Errors

Request

POST
/v2/sandbox/simulate-meeting
curl -X POST 'https://api.pyas.io/v2/sandbox/simulate-meeting' \  -H "x-api-key: $PYAS_API_KEY" \  -H "content-type: application/json" \  -d '{  "accountId": "sbx_fda58c5980_1",  "eventId": "sb16ba49792a79d2ce856e789a",  "what": "recording_ready"}'

Response

200 OK
{  "success": true,  "data": {    "what": "recording_ready",    "meetingId": "67556028668",    "told": 1  },  "provider": null,  "traceId": "trc_5f2a9c1e7b3d4a6f8e0c2b1d",  "meta": {}}

POST/v2/sandbox/simulate-reply

Simulate an invitation response

Simulates an attendee of a sandbox event on a virtual calendar responding to its invitation by email, as their calendar app would. The response can be accepted, declined or tentative, with a comment and, optionally, a proposed alternative time. Pyas records the response on the attendee and sends invitation.replied and event.updated, as it would for a real reply.

In the sandbox: Then check for invitation.replied in GET /v2/webhooks/deliveries (the sandbox inbox), and check the attendee's response on the event.

Sends the request to your sandbox, never to live data.

Headers

  • Name
    Idempotency-Key
    Type
    string
    Description

    A unique key that makes the request safe to retry. A retry with the same key returns the original response and does not make the change twice. Keys are kept for 24 hours.

Body

  • Name
    accountId
    Type
    string
    Required
    required
    Description

    A virtual account in the sandbox.

  • Name
    eventId
    Type
    string
    Required
    required
    Description
  • Name
    email
    Type
    string
    Required
    required
    Description

    The email address of an attendee of the event.

  • Name
    response
    Type
    string
    Required
    required
    Description

    One of accepted, declined, tentative.

  • Name
    comment
    Type
    string
    Description
  • Name
    proposedTime
    Type
    object
    Description
  • Name
    proposedTime.startsAt
    Type
    string
    Required
    required
    Description
  • Name
    proposedTime.endsAt
    Type
    string
    Required
    required
    Description

Errors

Request

POST
/v2/sandbox/simulate-reply
curl -X POST 'https://api.pyas.io/v2/sandbox/simulate-reply' \  -H "x-api-key: $PYAS_API_KEY" \  -H "content-type: application/json" \  -d '{  "accountId": "sbx_fda58c5980_1",  "eventId": "sbff8ee84b7939a1d7a4943ff6",  "email": "teammate2.1@example.com",  "response": "tentative",  "comment": "Could we start at 3:30?",  "proposedTime": {    "startsAt": "2026-11-15T15:30:00Z",    "endsAt": "2026-11-15T16:30:00Z"  }}'

Response

200 OK
{  "success": true,  "data": {    "recorded": true,    "eventId": "sbff8ee84b7939a1d7a4943ff6"  },  "provider": null,  "traceId": "trc_5f2a9c1e7b3d4a6f8e0c2b1d",  "meta": {}}