Quick start
1. Create a key on your Account page (API keys). It starts with pk_live_ and is shown once.
2. Send it as a Bearer token. Read-only endpoints are GET with arguments in the query string; everything else is POST with a JSON body (POST also works for read endpoints).
curl "https://powerlmspro.com/api/v1/qr/list?limit=5" -H "Authorization: Bearer pk_live_..."
curl -X POST https://powerlmspro.com/api/v1/qr/create \
-H "Authorization: Bearer pk_live_..." -H "Content-Type: application/json" \
-d '{"name":"Front window","target_url":"https://example.com/menu"}'
3. Read the answer. Success is 200 {"ok":true,"text":"...","data":{...}}: text is a readable summary (Markdown), data the same thing as JSON. Lists carry total, count, offset, has_more and items.
401 {"ok":false,"error":"unauthorized","message":"Invalid API key. Create one on your Account page."}
400 {"ok":false,"error":"invalid_input","message":"...","issues":[{"path":"target_url","message":"Required"}]}
400 {"ok":false,"error":"tool_error","message":"This plan allows 3 codes and all are used. ..."}
404 {"ok":false,"error":"not_found","message":"..."}
429 {"ok":false,"error":"rate_limited","message":"...","retryAfter":3600} (also a Retry-After header, seconds)
Limits. 100 calls a day per key on free plans, 5,000 a day on any paid PowerKit Pro plan. Every call runs as you and keeps to your plan's limits, so a tool can answer with tool_error when a plan is full. Responses are never cached and the API sends no CORS headers: call it from a server, a script or the CLI, not from a browser page.
Any tool by name. POST /api/v1/call with {"name":"powerkit_qr_create","arguments":{...}} runs any endpoint below by its tool name. GET /api/v1/tools returns this whole reference as JSON (name, method, path, JSON Schema input, hints), which is what the CLI reads.
Command line
npm i -g powerkit-pro
powerkit login # paste your key once; it is kept in the system keychain
powerkit tools # every command, grouped by product
powerkit qr create --name "Flyer" --target-url https://example.com
powerkit booking list --limit 20 --json
powerkit import certs issue --csv people.csv # one call per row, headers map to flags
powerkit call powerkit_qr_stats --json '{"id":"..."}'
Endpoint names map to commands: powerkit_qr_create is powerkit qr create, and each argument is a flag (target_url is --target-url). --help on any command lists its flags with the descriptions below. Exit codes: 0 ok, 1 tool error, 2 usage, 3 not authorized, 4 rate limited. POWERKIT_API_KEY and POWERKIT_BASE_URL work in CI.
Zapier and Make
Use a Webhooks by Zapier (or Make HTTP) step: method POST, URL from the table below, header Authorization: Bearer pk_live_..., JSON body with the arguments. For lists, use GET with the arguments as query string parameters. Forms and waivers can also push each response to your own webhook URL from their settings on Pro and up, with no key needed.
Endpoints
- Account
- QR codes
- Business cards
- Proposals
- Booking pages
- QR menus
- Reviews
- Link pages
- Certificates
- Event programs
- Seating charts
- Forms
- Waivers
- Loyalty
- Waitlist
- Support and invites
- Other
Account
| Endpoint | Arguments |
|---|---|
GET/api/v1/meMy account (powerkit_me) Who is connected: name, email, time zone, admin flag, the plan on each PowerKit tool with its limits, unused event credits, and whether Google Calendar is connected. Call this first when you need to know what the account can do. | none |
GET/api/v1/list/productsList PowerKit products (powerkit_list_products) The fourteen PowerKit Pro tools with what each does, its public path, pricing and plan limits, plus the plan this account has on each. Use it to explain options or pick the right tool. | none |
GET/api/v1/my/appsMy Power User apps (powerkit_my_apps) Lists every app in the family the person can use with their Power User Pro Account (PowerKit Pro, Inkstand, FlipbookWow, Round Robin Pro, House Stack Pro, TrainHer Pro, Certified Trainer Pro), whether they use it yet, and their plan in each. Tools for apps they use appear in this connector with the app's name as a prefix. | none |
QR codes
| Endpoint | Arguments |
|---|---|
GET/api/v1/qr/listList QR codes (powerkit_qr_list) The dynamic QR codes on this account with where each points, total scans, folder and the URL printed in the code. Filter by a search word or a folder. | q? stringMatch on the name or the target link. folder? stringfolder limit? integer, default 50How many to return (1 to 200). offset? integer, default 0How many to skip, for the next page. |
POST/api/v1/qr/createCreate a QR code (powerkit_qr_create) Creates a dynamic QR code that points at a web address. The address can be changed later without reprinting. Counts against the plan's code limit. Returns the id, the URL printed in the code and where to download the SVG or PNG. | name stringA label only the owner sees, like "Front window flyer". target_url stringWhere a scan should go. https:// is added when missing. folder? stringOptional folder name to group codes. |
POST/api/v1/qr/update/targetChange where a QR code goes (powerkit_qr_update_target) Points an existing dynamic QR code at a new web address. Every printed copy follows at the next scan. | id stringThe id as returned by a list tool. target_url stringThe new destination. |
GET/api/v1/qr/statsQR code scan stats (powerkit_qr_stats) Scans for one QR code: total, last 7 days, by day, by device, by city and by country. The number of days of history depends on the plan (30 on Free). | id stringThe id as returned by a list tool. days? integerHow many days back. Capped by the plan's history window. |
Business cards
| Endpoint | Arguments |
|---|---|
GET/api/v1/card/listList business cards (powerkit_card_list) The digital business cards on this account with their public links, views, contact saves and lead counts. | limit? integer, default 50How many to return (1 to 200). offset? integer, default 0How many to skip, for the next page. |
POST/api/v1/card/createCreate a business card (powerkit_card_create) Creates a digital business card and returns its public link. Counts against the plan's card limit. Lead capture (a "share your info" form) only shows on Pro and Team. | full_name stringfull name title? stringJob title. company? stringcompany phone? stringphone email? stringwebsite? stringwebsite address? stringOffice address, shown with a Directions button. bio? stringbio links? arrayUp to 8 links such as LinkedIn or a booking page. lead_capture? boolean, default trueShow the "share your info" form on the card. |
GET/api/v1/card/leadsLeads from a business card (powerkit_card_leads) People who filled in the "share your info" form on a card: name, email, phone, note and when. Newest first. | card_id stringThe id as returned by a list tool. limit? integer, default 50How many to return (1 to 200). offset? integer, default 0How many to skip, for the next page. |
Proposals
| Endpoint | Arguments |
|---|---|
GET/api/v1/bid/listList proposals (powerkit_bid_list) Proposals (bids and quotes) on this account with client, status (draft, sent, viewed, approved, declined), total and share link. | status? string: draft | sent | viewed | approved | declinedstatus limit? integer, default 50How many to return (1 to 200). offset? integer, default 0How many to skip, for the next page. |
GET/api/v1/bid/getGet a proposal (powerkit_bid_get) One proposal in full: intro, packages, line items (with which are optional), discount, tax, deposit, terms, status history, totals, and every signer with who has signed and their own signing link. | id stringThe id as returned by a list tool. |
POST/api/v1/bid/createCreate a proposal (powerkit_bid_create) Creates a proposal as a draft with line items, optional packages (Good, Better, Best), discount, tax and terms. Prices are in dollars. Counts against the Free plan's monthly limit. Returns the id and the share link; use powerkit_bid_share_link to mark it sent. | title stringtitle client_name? stringclient name client_email? stringclient email client_company? stringclient company intro? stringOpening paragraph the client reads first. line_items? array, default []line items packages? arrayMutually exclusive options; the client picks one. discount? objectdiscount tax_rate? numberPercent, e.g. 7.5. deposit? objectDeposit asked for on approval. notes? stringTerms and conditions. other_signers? arrayAnyone besides the client who must also sign, like a spouse or partner. Approved only after everyone signs. require_initials? booleanAsk every signer for their initials too. valid_until? stringYYYY-MM-DD. Defaults to 30 days from now. |
POST/api/v1/bid/share/linkProposal share link (powerkit_bid_share_link) The public link a client opens to review, choose options and approve a proposal. Set mark_sent to move a draft to "sent" so the dashboard shows when the client opens it. | id stringThe id as returned by a list tool. mark_sent? boolean, default falseAlso mark a draft as sent. |
Booking pages
| Endpoint | Arguments |
|---|---|
GET/api/v1/booking/pagesList booking pages (powerkit_booking_pages) Booking pages on this account with their public links, time zones, services (ids, durations, prices) and upcoming booking counts. Service ids are needed for availability. | none |
GET/api/v1/booking/listList bookings (powerkit_booking_list) Appointments on this account. Defaults to upcoming confirmed bookings across every page; filter by page, date range or status (confirmed, pending_payment, cancelled, expired), or set upcoming=false for history. | page_id? stringThe id as returned by a list tool. upcoming? boolean, default trueOnly bookings that start from now on. from? stringEarliest date (in the page time zone). to? stringLatest date, inclusive. status? string: confirmed | pending_payment | cancelled | expiredstatus limit? integer, default 50How many to return (1 to 200). offset? integer, default 0How many to skip, for the next page. |
GET/api/v1/booking/availabilityOpen times on a date (powerkit_booking_availability) The start times a client could book for one service on one date, after hours, overrides, buffers, existing bookings and synced calendars. Times are in the page time zone. Get page and service ids from powerkit_booking_pages. | page_id stringThe id as returned by a list tool. service_id stringThe id as returned by a list tool. date stringA date as YYYY-MM-DD. |
POST/api/v1/booking/blockBlock time off (powerkit_booking_block) Marks the owner unavailable so nobody can book that time: a meeting, a day off, a vacation. Give a date (YYYY-MM-DD) with start_time and end_time (HH:MM, 24-hour, page time zone), or all_day true, or end_date for a stretch of days. Leave page_id out to block every booking page the owner has. Use powerkit_booking_blocks to list and powerkit_booking_unblock to remove. | page_id? stringBlock only this page. Omit for all pages. date stringA date as YYYY-MM-DD. end_date? stringLast day, for multi-day blocks. start_time? stringHH:MM, 24-hour, e.g. 14:00 end_time? stringHH:MM, 24-hour, e.g. 16:00 all_day? boolean, default falseall day reason? stringOnly the owner sees it, e.g. "Staff meeting". |
GET/api/v1/booking/blocksList blocked times (powerkit_booking_blocks) Upcoming times the owner blocked by hand (not bookings, not synced calendars). Pass page_id to see what applies to one page. | page_id? stringThe id as returned by a list tool. limit? integer, default 50How many to return (1 to 200). offset? integer, default 0How many to skip, for the next page. |
POST/api/v1/booking/unblockdestructiveRemove a blocked time (powerkit_booking_unblock) Removes a block created with powerkit_booking_block, opening that time up again. Get ids from powerkit_booking_blocks. | block_id stringThe id as returned by a list tool. |
POST/api/v1/booking/canceldestructiveCancel a booking (powerkit_booking_cancel) Cancels an appointment as the owner, in two steps. Step 1: call with page_id and booking_id only. Nothing is cancelled; it returns the booking (client, service, time) and a confirmation code. Show that to the person and get their approval. Step 2: once they approve, call again with confirm_code set to that code. Only then is the booking cancelled, the client emailed and the time opened up again. The code is tied to this one booking and expires after 10 to 20 minutes. Cannot be undone. | page_id stringThe id as returned by a list tool. booking_id stringThe id as returned by a list tool. confirm_code? stringUser confirmation. Leave empty for the preview. Set it to the code from the preview only after the person has approved cancelling that booking. |
QR menus
| Endpoint | Arguments |
|---|---|
GET/api/v1/menu/listList menus (powerkit_menu_list) QR menus on this account with restaurant name, public link, item count, views and whether each is live. | none |
GET/api/v1/menu/itemsMenu items (powerkit_menu_items) Every section and item on one menu with ids, prices, dietary tags, sold-out and hidden flags. | menu_id stringThe id as returned by a list tool. |
POST/api/v1/menu/update/itemUpdate a menu item (powerkit_menu_update_item) Changes the price, sold-out or hidden flag, name, description or price note of one item. Only the fields given change. Guests see it on the next load. Price is in dollars. | menu_id stringThe id as returned by a list tool. item_id stringThe id as returned by a list tool. price? numberNew price in dollars, e.g. 12.5. sold_out? booleantrue to 86 it, false to bring it back. hidden? booleanhidden name? stringname description? stringdescription price_note? stringShown instead of a price, like "market price". |
Reviews
| Endpoint | Arguments |
|---|---|
GET/api/v1/reviews/listList testimonials (powerkit_reviews_list) Testimonials collected by the review pages on this account, with status (pending, approved, hidden). Leave page_id out to see every page; pass status=pending to see what is waiting for approval. | page_id? stringThe id as returned by a list tool. status? string: pending | approved | hiddenstatus limit? integer, default 50How many to return (1 to 200). offset? integer, default 0How many to skip, for the next page. |
POST/api/v1/reviews/approveApprove or hide a testimonial (powerkit_reviews_approve) Moderates one testimonial: approve (shows on the wall and widget), hide, feature (approve and pin first) or unfeature. | page_id stringThe id as returned by a list tool. item_id stringThe id as returned by a list tool. action? string: approve | hide | feature | unfeature, default "approve"action |
Link pages
| Endpoint | Arguments |
|---|---|
GET/api/v1/links/pagesList link pages (powerkit_links_pages) Link-in-bio pages on this account with their public links, every button (id, title, URL, on or off) and social profiles. | none |
POST/api/v1/links/addAdd a link to a page (powerkit_links_add) Appends a button to a link page. Free allows unlimited links; the page itself caps at 100. Returns the new link. | page_id stringThe id as returned by a list tool. title? stringButton text. Defaults to the address. url stringurl icon? stringAn emoji shown before the title. |
GET/api/v1/links/statsLink page stats (powerkit_links_stats) Views and clicks for a link page over the last 30 days: totals, click-through rate, clicks by link, devices, cities, referrers. Click analytics need Pro; Free gets the view count only. | page_id stringThe id as returned by a list tool. days? integer, default 30days |
Certificates
| Endpoint | Arguments |
|---|---|
GET/api/v1/certs/templatesList certificate templates (powerkit_certs_templates) Certificate templates on this account (ids, names, titles, organization, signers, layout) and how many certificates can still be issued this month. | none |
GET/api/v1/certs/listList issued certificates (powerkit_certs_list) Certificates issued on this account, newest first, with verification links. Filter by template or search a recipient name. | template_id? stringThe id as returned by a list tool. q? stringPart of a recipient name or course. limit? integer, default 50How many to return (1 to 200). offset? integer, default 0How many to skip, for the next page. |
POST/api/v1/certs/issueIssue certificates (powerkit_certs_issue) Issues one certificate per recipient from a template. Each gets a unique verification code and a PDF link. Stops at the plan's monthly limit and says how many did not fit. Defaults (course, date, hours, custom) fill any recipient that leaves them blank. | template_id stringThe id as returned by a list tool. recipients arrayrecipients course? stringDefault course name. date? stringDefault date. hours? stringhours custom? stringcustom |
Event programs
| Endpoint | Arguments |
|---|---|
GET/api/v1/event/listList event programs (powerkit_event_list) Event programs on this account: when and where, how many schedule items, whether published (needs PowerEvent Pro, Business or the Suite) and the public link. | limit? integer, default 50How many to return (1 to 200). offset? integer, default 0How many to skip, for the next page. |
GET/api/v1/event/getGet an event program (powerkit_event_get) One program in full: details, the schedule (with ids and speakers), speakers, sponsors by tier, ads and info pages, plus the days of a multi-day event. | id stringThe id as returned by a list tool. |
POST/api/v1/event/add/sessionAdd a schedule item (powerkit_event_add_session) Appends a session to a program's schedule: title, a time label guests see (like "6:30 PM"), optional 24-hour start and end times for "happening now", location, description and speaker ids from powerkit_event_get. Guests see it immediately on a published program. | event_id stringThe id as returned by a list tool. title stringtitle time_label? stringFree text shown to guests, e.g. "6:30 PM" or "After dinner". start_time? stringHH:MM, 24-hour, event local time. end_time? stringend time day? stringFor multi-day events: which day. Defaults to the first day. description? stringdescription location? stringRoom or stage. speaker_ids? arrayspeaker ids |
Seating charts
| Endpoint | Arguments |
|---|---|
GET/api/v1/seat/chartsList seating charts (powerkit_seat_charts) Seating charts (events) on this account with date, venue, table count, how many guests are seated, the guest limit and the find-my-table link. | limit? integer, default 50How many to return (1 to 200). offset? integer, default 0How many to skip, for the next page. |
GET/api/v1/seat/tablesTables on a chart (powerkit_seat_tables) Every table on a seating chart with id, shape, capacity, how many guests are at it and who they are. | event_id stringThe id as returned by a list tool. |
GET/api/v1/seat/guestsGuests on a chart (powerkit_seat_guests) The guest list for a seating chart with ids, party, meal, notes, table and check-in. Search by name or show only unseated guests. | event_id stringThe id as returned by a list tool. q? stringPart of a guest or party name. unseated_only? boolean, default falseunseated only limit? integer, default 50How many to return (1 to 200). offset? integer, default 0How many to skip, for the next page. |
POST/api/v1/seat/add/guestsAdd guests to a chart (powerkit_seat_add_guests) Adds guests to a seating chart (unseated). Party groups people who should sit together. Stops at the plan's guest limit per chart (50 on Free, 500 on Pro, unlimited on Business) and says how many did not fit. | event_id stringThe id as returned by a list tool. guests arrayguests |
POST/api/v1/seat/assignSeat a guest (powerkit_seat_assign) Moves a guest to a table (or unseats them with no table_id). Refuses a table that is already full unless allow_over_capacity is true. | event_id stringThe id as returned by a list tool. guest_id stringThe id as returned by a list tool. table_id? stringLeave out to unseat. allow_over_capacity? boolean, default falseallow over capacity |
Forms
| Endpoint | Arguments |
|---|---|
GET/api/v1/forms/listList forms (powerkit_forms_list) PowerForms on this account: titles, public links, whether each is taking responses, and response counts. | none |
GET/api/v1/form/responsesForm responses (powerkit_form_responses) Responses to one form, newest first, with every answer. Pass the form id from powerkit_forms_list. | id stringThe id as returned by a list tool. limit? integer, default 50How many to return (1 to 200). offset? integer, default 0How many to skip, for the next page. |
Waivers
| Endpoint | Arguments |
|---|---|
GET/api/v1/waivers/listList waivers (powerkit_waivers_list) PowerWaivers on this account: titles, signing links, whether each is taking signatures, and how many have been signed. | none |
GET/api/v1/waiver/signaturesSigned waivers (powerkit_waiver_signatures) Signed copies of one waiver, newest first: who signed, for which participant, when, and whether it is still valid. | id stringThe id as returned by a list tool. limit? integer, default 50How many to return (1 to 200). offset? integer, default 0How many to skip, for the next page. |
GET/api/v1/waiver/checkCheck for a current waiver (powerkit_waiver_check) Looks up whether someone has signed a waiver that is still valid, by name, email or phone. Use it at check-in: "does Marcus Bell have a waiver on file?" | who stringName, email or phone. |
Loyalty
| Endpoint | Arguments |
|---|---|
GET/api/v1/loyalty/programsList loyalty programs (powerkit_loyalty_programs) PowerLoyalty programs on this account: type (punch card, visits, points, spend, tiers, milestones), the reward and what it takes, members, visits in the last 30 days, and the join link to print. | none |
GET/api/v1/loyalty/customersList loyalty customers (powerkit_loyalty_customers) Loyalty members, newest visit first, with each card's progress, visits and rewards waiting. Search by name or email. | search? stringPart of a name or email. limit? integer, default 50How many to return (1 to 200). offset? integer, default 0How many to skip, for the next page. |
POST/api/v1/loyalty/stampAdd a stamp (powerkit_loyalty_stamp) Adds a stamp (or the visit's points) to a customer's loyalty card, like staff adding one by hand. Respects the program's cooldown and daily limit, and unlocks the reward when the card fills up. Spend programs need the purchase amount. Pass the same idempotency_key on a retry and the stamp is not added twice. | customer stringCustomer name, email, customer id or the code on their card. program_id? stringProgram id from powerkit_loyalty_programs. Optional when the account has one live program. amount? numberSpend programs only: the purchase amount in US dollars. reason? stringWhy it was added by hand (kept in the audit log). idempotency_key? stringAny unique string for this stamp. Reusing it never stamps twice. |
GET/api/v1/loyalty/rewardsList rewards (powerkit_loyalty_rewards) Rewards customers have earned: ready to redeem, redeemed or expired, with the six-character code staff can type to redeem. | status? string: available | redeemed | expired | all, default "available"Which rewards. limit? integer, default 50How many to return (1 to 200). offset? integer, default 0How many to skip, for the next page. |
POST/api/v1/loyalty/redeemdestructiveRedeem a reward (powerkit_loyalty_redeem) Marks a customer's reward as used. It can only be redeemed once and cannot be undone, so confirm with the person first. Pass the reward id from powerkit_loyalty_rewards or the six-character code. | reward stringReward id or six-character reward code. |
GET/api/v1/loyalty/statsLoyalty stats (powerkit_loyalty_stats) How the loyalty program is doing: members, new members and visits over a period, rewards unlocked and redeemed, the repeat-visit rate and the top regulars. | days? integer, default 30How many days back. |
POST/api/v1/loyalty/create/programCreate a loyalty program (powerkit_loyalty_create_program) Creates a PowerLoyalty program that is live right away and returns its id, join link, join QR image links (PNG and SVG) and the stamp and kiosk screens. Types: punch (punch card), visits (visits), points (points), spend (spend), tiers (tiers), milestones (milestones). Change rules later with powerkit_loyalty_update_program and the look with powerkit_loyalty_update_design. | name stringProgram name customers see, like "Fade Club". reward? stringWhat a full card earns, like "A free haircut". Defaults by type. type? string: punch | visits | points | spend | tiers | milestones, default "punch"How customers earn: punch (punch card), visits (visits), points (points), spend (spend), tiers (tiers), milestones (milestones). threshold? integerStamps (punch, visits, milestones) or points (points, spend, tiers) needed for the reward. Default 10 stamps or 100 points. template? stringCard template key from powerkit_loyalty_templates, like "barber-pole". Default "paper-punch". points_per_visit? integerPoints each visit earns. Punch cards and visits: 1 (one stamp). Points and tiers: default 10. points_per_dollar? integerSpend programs only: points per US dollar. Default 1. business_name? stringBusiness name on every card. Only used when none is saved yet (see powerkit_loyalty_update_settings). |
GET/api/v1/loyalty/get/programGet a loyalty program (powerkit_loyalty_get_program) Everything about one program: type, reward and threshold, rules (cooldown, daily cap, reward expiry, what happens after a reward, tiers, milestones, promo days), terms, the full card design, stats, and links (join page, join QR PNG and SVG, stamp screen, kiosk, printable sign). | program_id? stringProgram id from powerkit_loyalty_programs. Optional when the account has one live program. |
POST/api/v1/loyalty/update/programUpdate loyalty rules and rewards (powerkit_loyalty_update_program) Changes a program's rules and rewards. Only the fields you pass change. tiers, milestones and promo replace the saved lists. Existing stamps and rewards are kept. | program_id stringProgram id from powerkit_loyalty_programs (the slug or exact name also work). name? stringProgram name. reward? stringWhat a full card earns. type? string: punch | visits | points | spend | tiers | milestonesHow customers earn: punch (punch card), visits (visits), points (points), spend (spend), tiers (tiers), milestones (milestones). threshold? integerStamps or points needed for the reward. points_per_visit? integerPoints per visit (1 for punch cards). points_per_dollar? integerSpend programs: points per US dollar. cooldown_minutes? integerMinimum minutes between two stamps for one customer. 0 turns it off. max_stamps_per_day? integerMost stamps one customer can get in a day. 0 means no limit. reward_expires_days? integerDays a reward stays valid. 0 means it never expires. after_reward? string: new_card | wait_for_redeemnew_card: a fresh card starts right away. wait_for_redeem: no stamps until the reward is redeemed. qr_seconds? integerHow often the stamp QR changes, 20 to 120 seconds. terms? stringProgram terms customers accept when they join. tiers? arrayTier levels by lifetime points (tiers programs). Replaces the saved list; [] removes them. milestones? arrayExtra one-time rewards at visit counts. Replaces the saved list; [] removes them. promo? objectDouble or triple stamp days. Replaces the saved promo. promo_off? booleantrue turns promo days off. |
POST/api/v1/loyalty/update/designUpdate the card design (powerkit_loyalty_update_design) Changes how the loyalty card looks: template, words, colors, layout, pattern, font, stamp shape and icon, animations, and the logo. Only the fields you pass change. logo_url must be a public https link to a PNG, JPG, WEBP, GIF or SVG under 5 MB; it is downloaded and stored like an upload. Valid values: powerkit_loyalty_design_options and powerkit_loyalty_templates. | program_id stringProgram id from powerkit_loyalty_programs (the slug or exact name also work). template? stringTemplate key from powerkit_loyalty_templates. Switching resets colors, layout, pattern, font and stamps to that template; title, instructions and logo stay. title? stringCard title. Empty string uses the program name. instructions? stringOne line customers see under the card. Empty string uses the template default. bg? stringBackground color, #RRGGBB. bg2? stringSecond background color (gradient), #RRGGBB. ink? stringText color, #RRGGBB. Keep it readable on bg. accent? stringStamp color, #RRGGBB. layout? string: grid | ticket | boarding | ring | bar | path | passport | stack | coins | pie | cup | member | sticker | chest | blankHow progress is drawn. See powerkit_loyalty_design_options. pattern? string: none | dots | stripes | diagonal | grid | waves | confetti | paper | kraft | guilloche | holo | checker | circles | bubbles | chevron | sunburst | linen | neon | marbleBackground pattern. font? string: archivo | serif | mono | script | rounded | condensed | slabTypeface. shape? string: circle | square | star | heart | hex | shield | drop | ticket | badge | diamondStamp shape. icon? string: bean | espresso | croissant | bread | pizza | burger | icecream | donut | boba | smoothie | citrus | sushi | taco | egg | coffee | fork | wine | cake | truck | pole | scissors | razor | comb | polish | lotus | hand | lash | brow | lipstick | drop | braid | crown | dumbbell | glove | yoga | run | bike | whistle | music | trophy | heart | bubbles | car | wrench | oil | tire | moto | bag | sneaker | shirt | gem | ring | book | flower | candle | plug | gift | tag | paw | house | leaf | apple | film | ticket | joystick | pins | lock | gamepad | mic | passport | camera | palette | brush | needle | washer | hanger | spray | broom | briefcase | chest | sparkle | coin | plane | star | check | bolt | smile | sun | stamp | diamond | key | cartStamp icon key. See powerkit_loyalty_design_options. anim? string: rubber | ink | bean | snip | burst | coin | diamond | heart | confetti | punch | fireworks | fill | check | flip | neon | trophy | gift | vip | pizza | scoopAnimation when a stamp is added. effect? string: confetti | fireworks | sparkle | coins | hearts | glow | bubblesCelebration when the card fills up. logo_url? stringhttps link to the logo image. Replaces the card logo. remove_logo? booleantrue removes the card logo; the stamp icon shows instead. |
POST/api/v1/loyalty/duplicate/programCopy a loyalty program (powerkit_loyalty_duplicate_program) Copies a program's design and rules into a new program. The copy starts paused with no members; resume it with powerkit_loyalty_resume_program. | program_id stringProgram id from powerkit_loyalty_programs (the slug or exact name also work). |
POST/api/v1/loyalty/pause/programPause a loyalty program (powerkit_loyalty_pause_program) Pauses a program: customers can still open their cards, but nobody can join or get stamped until it is resumed. | program_id stringProgram id from powerkit_loyalty_programs (the slug or exact name also work). |
POST/api/v1/loyalty/resume/programResume a loyalty program (powerkit_loyalty_resume_program) Turns a paused program back on so customers can join and get stamped. | program_id stringProgram id from powerkit_loyalty_programs (the slug or exact name also work). |
POST/api/v1/loyalty/delete/programdestructiveDelete a loyalty program (powerkit_loyalty_delete_program) Permanently deletes a program with its cards, stamp history and rewards. It cannot be undone. Ask the person first and only pass confirm: true after they say yes. Customers keep their cards in other programs. To stop it for now, use powerkit_loyalty_pause_program instead. | program_id stringThe program id from powerkit_loyalty_programs. confirm? booleanMust be true. Set it only after the person confirmed the delete. |
POST/api/v1/loyalty/join/qrStyle the join QR (powerkit_loyalty_join_qr) Customizes the join QR code (the one customers scan to join) with the same options as the PowerQR designer, and returns PNG and SVG download links. Pass no style fields to just get the links and current style. The PNG uses the colors with square dots; the SVG has every option, including the logo or icon. | program_id? stringProgram id from powerkit_loyalty_programs. Optional when the account has one live program. fg? stringDot color, #RRGGBB. Keep it dark on a light background. eye? stringCorner (eye) color, #RRGGBB. bg? stringBackground color, #RRGGBB, or "transparent". modules? string: square | rounded | dots | tiny | stars | diamonds | hearts | classy | plus | bars | linesDot shape: square, rounded, dots, tiny, stars, diamonds, hearts, classy, plus, bars, lines. eyes? string: square | rounded | circle | leafCorner shape: square, rounded, circle, leaf. center? string: logo | brand | icon | noneMiddle of the code: logo (the logo_url image), brand (the account logo), icon (see icon) or none. icon? string: star | heart | bullseye | check | sun | palm | golf | basketball | football | soccer | trophy | dumbbell | bank | dollar | house | key | car | truck | wrench | fork | coffee | pizza | wine | cake | music | ticket | camera | phone | mail | chat | calendar | clock | pin | globe | wifi | bag | cart | tag | percent | gift | crown | gem | ring | paw | tooth | medical | leaf | scissors | grad | book | church | briefcase | user | smile | bolt | tree | snowflakeBuilt-in icon for the middle when center is icon. logo_url? stringhttps link to a logo for the middle (PNG, JPG, WEBP, GIF or SVG, under 5 MB). reset? booleantrue goes back to the default style. |
GET/api/v1/loyalty/templatesList card templates (powerkit_loyalty_templates) The 100 loyalty card templates with key, name, category and default look (layout, colors, pattern, font, stamp shape, icon, animations). Filter by category: classic, food, beauty, fitness, auto, retail, fun, services, premium. Pass a key to powerkit_loyalty_create_program or powerkit_loyalty_update_design. | category? string: classic | food | beauty | fitness | auto | retail | fun | services | premiumOnly this category. search? stringPart of a name or key, like "barber". limit? integer, default 100How many to return (1 to 200). offset? integer, default 0How many to skip, for the next page. |
GET/api/v1/loyalty/design/optionsCard design options (powerkit_loyalty_design_options) Every valid value for the card design (layout, pattern, font, stamp shape, stamp icon, stamp animation, completion effect), the template categories, the program types and the join QR options (dot shapes, corner shapes, center icons). | none |
GET/api/v1/loyalty/get/settingsLoyalty business settings (powerkit_loyalty_get_settings) The business details shown on every card and in loyalty emails (name, phone, reply email, address, website, logo) and whether a kiosk PIN is set. | none |
POST/api/v1/loyalty/update/settingsUpdate loyalty business settings (powerkit_loyalty_update_settings) Changes the business details on every card and in loyalty emails. Only the fields you pass change. logo_url must be a public https link to a PNG, JPG, WEBP, GIF or SVG under 5 MB. | business_name? stringBusiness name at the top of every card. phone? stringPhone number. email? stringWhere customer replies to loyalty emails go. Empty uses the account email. address? stringStreet address, shown on cards and in email footers. website? stringWebsite. https:// is added when missing. logo_url? stringhttps link to the business logo (used in emails and the kiosk). remove_logo? booleantrue removes the business logo. |
POST/api/v1/loyalty/set/kiosk/pinSet the kiosk PIN (powerkit_loyalty_set_kiosk_pin) Sets the PIN staff type to leave kiosk mode on a counter tablet (4 to 8 digits), or removes it. Kiosk mode is on the Business plan. | pin? stringThe new PIN, 4 to 8 digits. remove? booleantrue removes the PIN. |
POST/api/v1/loyalty/enroll/customerAdd a loyalty customer (powerkit_loyalty_enroll_customer) Adds a customer to a program by name and email (or adds a known customer to another program) and emails them the link to their card. A new customer counts against the plan's customer limit. Marketing email stays off unless the customer told the business they want it; then pass marketing_opt_in: true. Account emails (welcome, rewards) always go. | name stringCustomer's name. email stringCustomer's email. Their card link goes here. program_id? stringProgram id from powerkit_loyalty_programs. Optional when the account has one live program. starting_stamps? integerStamps (or points) carried over from a paper card. Logged as a correction. send_welcome? boolean, default trueEmail them the welcome message with their card link. marketing_opt_in? boolean, default falsetrue only if the customer asked for offers and news by email. Never assume it. |
GET/api/v1/loyalty/get/customerGet a loyalty customer (powerkit_loyalty_get_customer) One customer's details: email consent, every card with progress, visits and tier, rewards (with codes for the ones ready to redeem) and recent activity. | customer stringCustomer name, email, customer id or the code on their card. |
POST/api/v1/loyalty/send/card/linkEmail a customer their card link (powerkit_loyalty_send_card_link) Emails a customer the private link to their loyalty card, for example when they lost it or changed phones. | customer stringCustomer name, email, customer id or card code. |
POST/api/v1/loyalty/adjustCorrect stamps or points (powerkit_loyalty_adjust) Adds or removes stamps or points on a customer's card by hand, with a reason kept in the audit log. Use a positive number to add and a negative one to remove. It is a correction, not a visit, so cooldowns do not apply. A full card still unlocks its reward. | customer stringCustomer name, email, customer id or card code. program_id? stringProgram id from powerkit_loyalty_programs. Optional when the account has one live program. stamps integerHow many stamps (punch, visits, milestones) or points (other types) to add; negative removes. reason stringWhy, for the audit log, like "Moved from paper card". idempotency_key? stringAny unique string. Reusing it never applies the correction twice. |
POST/api/v1/loyalty/delete/customerdestructiveDelete a customer's data (powerkit_loyalty_delete_customer) Removes a customer's name and email and closes their cards (their stamp history stays without personal details). Use it when a customer asks to be forgotten. It cannot be undone: ask the person first and pass confirm: true only after they say yes. | customer stringCustomer email or customer id. confirm? booleanMust be true. Set it only after the person confirmed. |
GET/api/v1/loyalty/activityLoyalty activity and ledger (powerkit_loyalty_activity) The audit log (who joined, stamps by hand, corrections, redemptions, refused or unusual scans, settings changes) or the stamp ledger (every stamp, correction and reward, with points and source). Newest first. | kind? string: audit | ledger, default "audit"audit: what happened and who did it. ledger: every points entry. program_id? stringLedger only: one program. customer? stringLedger only: one customer (name, email, id or card code). flagged_only? boolean, default falseAudit only: just the unusual activity. limit? integer, default 50How many to return (1 to 200). offset? integer, default 0How many to skip, for the next page. |
GET/api/v1/loyalty/staff/listList loyalty staff (powerkit_loyalty_staff_list) Staff logins (staff and managers) and kiosk devices, with the plan's staff limit. Kiosk devices include their link. Roles: staff stamps cards and redeems rewards; manager also corrects points and exports. | none |
POST/api/v1/loyalty/staff/addAdd a staff member (powerkit_loyalty_staff_add) Adds a staff login and emails them a private sign-in link (no PowerKit account needed). Counts against the plan's staff limit (Free 1, Pro 3, Business 10). Roles: staff (stamps and redeems) or manager (also corrections and exports). | name stringTheir name. email stringWhere the sign-in link goes. role? string: staff | manager, default "staff"staff or manager. |
POST/api/v1/loyalty/staff/set/roleChange a staff role (powerkit_loyalty_staff_set_role) Changes a staff member between staff and manager. It applies on their next tap; their sign-in link keeps working. | staff_id stringStaff id from powerkit_loyalty_staff_list. role string: staff | managerstaff or manager. |
POST/api/v1/loyalty/staff/removedestructiveRemove a staff member or kiosk (powerkit_loyalty_staff_remove) Removes a staff login or kiosk device. Their link stops working right away. Confirm with the person first. | staff_id stringStaff or kiosk id from powerkit_loyalty_staff_list. |
POST/api/v1/loyalty/staff/send/linkResend a staff sign-in link (powerkit_loyalty_staff_send_link) Emails a staff member their private sign-in link again. | staff_id stringStaff id from powerkit_loyalty_staff_list. |
POST/api/v1/loyalty/kiosk/addAdd a kiosk device (powerkit_loyalty_kiosk_add) Creates a kiosk link that turns a counter tablet into a self-serve stamp station for one program. Business plan; not for spend programs. Returns the link to open on the tablet. Set a PIN with powerkit_loyalty_set_kiosk_pin. | program_id stringProgram id from powerkit_loyalty_programs (the slug or exact name also work). name? stringDevice name, like "Front counter iPad". |
GET/api/v1/loyalty/email/templatesList loyalty emails (powerkit_loyalty_email_templates) The loyalty email templates: account emails (go to every member) and marketing emails (only to customers who opted in, with an unsubscribe link). Shows on or off, whether it was customized, whether this plan can edit it, and sends in the last 30 days. | none |
GET/api/v1/loyalty/email/getGet a loyalty email (powerkit_loyalty_email_get) One loyalty email: subject, body with {{merge_tags}}, on or off, and a preview with the sample customer Maria. | key string: welcome | card_ready | stamp_added | reward_unlocked | reward_redeemed | program_changes | halfway | one_left | miss_you | winback | birthday | anniversary | double_day | weekend_bonus | vip | new_reward | reward_reminder | limited_promo | thank_youEmail key from powerkit_loyalty_email_templates. |
POST/api/v1/loyalty/email/updateEdit a loyalty email (powerkit_loyalty_email_update) Changes a loyalty email's subject and body, turns it on or off, or resets it to the original text. Body: plain text, blank line between paragraphs, merge tags like {{first_name}}, {{reward}}, {{stamps}}; a button to the card is added for you. Free edits the welcome and reward emails; Pro edits more; Business edits all. Any plan can turn an email on or off. | key string: welcome | card_ready | stamp_added | reward_unlocked | reward_redeemed | program_changes | halfway | one_left | miss_you | winback | birthday | anniversary | double_day | weekend_bonus | vip | new_reward | reward_reminder | limited_promo | thank_youEmail key from powerkit_loyalty_email_templates. subject? stringNew subject line. body? stringNew message text. enabled? booleantrue sends this email, false stops it. reset? booleantrue goes back to the original subject and text. |
POST/api/v1/loyalty/email/testSend a test email (powerkit_loyalty_email_test) Sends the account owner a test of a loyalty email with the sample customer Maria. Pass subject and body to test a draft before saving it. | key string: welcome | card_ready | stamp_added | reward_unlocked | reward_redeemed | program_changes | halfway | one_left | miss_you | winback | birthday | anniversary | double_day | weekend_bonus | vip | new_reward | reward_reminder | limited_promo | thank_youEmail key. subject? stringDraft subject to test. body? stringDraft body to test. |
GET/api/v1/loyalty/campaignsList loyalty campaigns (powerkit_loyalty_campaigns) The automated campaigns (Business plan) with when each one sends and whether it is on, plus one-off sends that are scheduled or done. Campaign timing is fixed by its trigger (for example 14, 30 or 60 days without a visit); use powerkit_loyalty_email_schedule to pick a time for a one-off send. | none |
POST/api/v1/loyalty/campaigns/setTurn campaigns on or off (powerkit_loyalty_campaigns_set) Turns automated campaigns on or off (Business plan). Triggers: no_visit_14, no_visit_30, no_visit_60, halfway, one_left, unredeemed, birthday, anniversary, vip, promo_day. Campaigns only email customers who opted in, at most once per occasion. | enable? arrayTriggers to turn on. disable? arrayTriggers to turn off. |
POST/api/v1/loyalty/email/scheduleSchedule a one-off email (powerkit_loyalty_email_schedule) Sends a marketing email (or "program_changes", which goes to every member) to a program's members now or at a set time. Pro and Business. Marketing emails skip anyone who has not opted in. Emails: program_changes, halfway, one_left, miss_you, winback, birthday, anniversary, double_day, weekend_bonus, vip, new_reward, reward_reminder, limited_promo, thank_you. | key string: program_changes | halfway | one_left | miss_you | winback | birthday | anniversary | double_day | weekend_bonus | vip | new_reward | reward_reminder | limited_promo | thank_youWhich email. program_id? stringOnly members of this program. Leave out for every program. send_at? stringWhen, as YYYY-MM-DDTHH:MM in the account time zone (or an ISO time with Z). Leave out to send in the next few minutes. |
POST/api/v1/loyalty/email/cancelCancel a scheduled email (powerkit_loyalty_email_cancel) Cancels a one-off send that has not gone out yet. Ids come from powerkit_loyalty_campaigns. | send_id stringThe one-off send id. |
Waitlist
| Endpoint | Arguments |
|---|---|
GET/api/v1/waitlist/overviewWaitlist overview (powerkit_waitlist_overview) Every PowerWaitlist location right now: how many are waiting and being served, staff available, the round robin rule, whether check-in is open, the delay, today's numbers and the public check-in link. | none |
GET/api/v1/waitlist/queueList the waitlist (powerkit_waitlist_queue) Customers in line at a location, in order, with ticket number, status, place in line, approximate wait, service and staff. which=active (default) is everyone waiting, called or in service; which=today adds finished visits. | location? stringLocation id, name or link name. Optional when the account has one location. which? string: active | today, default "active"active or today. limit? integer, default 50How many to return (1 to 200). offset? integer, default 0How many to skip, for the next page. |
GET/api/v1/waitlist/entryOne customer in line (powerkit_waitlist_entry) Everything about one check-in: details, place in line, times, the timeline of actions and the emails and texts sent. | customer stringThe customer: check-in id, ticket number today (like 24 or "024") or their name. location? stringLocation id, name or link name. Optional when the account has one location. |
GET/api/v1/waitlist/staffList waitlist staff (powerkit_waitlist_staff) Staff at each location with their availability (available, break, offline), who they are serving, how many are waiting for them, the services they do, their weight for weighted round robin and role. | location? stringLocation id, name or link name. Optional when the account has one location. |
GET/api/v1/waitlist/servicesList waitlist services (powerkit_waitlist_services) Services customers can pick, with the minutes used for wait estimates and whether each is offered. | none |
GET/api/v1/waitlist/statsWaitlist reports (powerkit_waitlist_stats) Check-ins, customers served, average, median and longest wait, average service time, no-show rate, cancellations, peak hours, most requested services, staff utilization and the fairness table (served, assignments, skips, manual overrides) for a period. Repeat-customer numbers are estimates. | days? integer, default 7How many days back. location? stringLocation id, name or link name. Optional when the account has one location. |
GET/api/v1/waitlist/settingsWaitlist settings and options (powerkit_waitlist_settings) Current settings (business name, theme, welcome, instructions, labels, kiosk idle reset, almost-next threshold, automatic no-show minutes, retention) plus the themes, round robin strategies and kiosk modes you can choose from. | none |
GET/api/v1/waitlist/templatesWaitlist email and text templates (powerkit_waitlist_templates) The nine customer emails and eight text messages, whether each is on, and their current wording with merge tags like {{first_name}}, {{number}}, {{wait}}, {{staff}}, {{service}} and {{status_link}}. | none |
GET/api/v1/waitlist/twilio/statusText message (Twilio) status (powerkit_waitlist_twilio_status) Whether the merchant's own Twilio account is connected and working, the sender, the last error and the webhook URLs to paste into Twilio. Never returns secrets: keys show their last four characters at most. Saving credentials is done in the dashboard (Notifications), not here. | none |
GET/api/v1/waitlist/qrWaitlist QR codes (powerkit_waitlist_qr) The QR codes for a location: business check-in, find-my-place (status recovery), appointment check-in, one per staff member and one per service, with the link each opens and the styled SVG to download. | location? stringLocation id, name or link name. Optional when the account has one location. |
GET/api/v1/waitlist/kiosksKiosk devices (powerkit_waitlist_kiosks) Kiosk tablets set up for the waitlist: name, location, mode (interactive, QR display, queue board or hybrid) and when each was last used. Kiosk links are not listed; copy them in the dashboard or make a new one with powerkit_waitlist_kiosk_create. | none |
GET/api/v1/waitlist/activityWaitlist activity log (powerkit_waitlist_activity) The audit log: check-ins, calls, skips, reassignments (manual overrides), transfers, setting changes and failed kiosk PINs, newest first, with who did each. | limit? integer, default 50How many to return (1 to 200). offset? integer, default 0How many to skip, for the next page. |
GET/api/v1/waitlist/notificationsWaitlist delivery log (powerkit_waitlist_notifications) Emails and texts sent to customers with their delivery status and any error in plain language (for example a Twilio trial account, A2P 10DLC or an opted-out number). | limit? integer, default 50How many to return (1 to 200). offset? integer, default 0How many to skip, for the next page. |
POST/api/v1/waitlist/check/inCheck a customer in (powerkit_waitlist_check_in) Adds a customer to the line, like the front desk. Optional: service, a specific staff member (otherwise first available and round robin), priority, notes, phone and email. Set text_consent only when the customer agreed to text updates. Pass idempotency_key so a retry never adds them twice. | name stringname location? stringLocation id, name or link name. Optional when the account has one location. phone? stringphone email? stringservice? stringService name or id. staff? stringStaff name or id. Leave out for first available. priority? string: normal | priority | urgent, default "normal"priority notes? stringnotes text_consent? boolean, default falseTrue only if the customer agreed to texts about this visit. idempotency_key? stringAny unique string. Retrying with the same key never acts twice. |
POST/api/v1/waitlist/call/nextCall the next customer (powerkit_waitlist_call_next) Calls the next customer for a staff member: their own line first, then the shared first-available line (unless a manager assigns), by priority and arrival. Two calls at once never get the same customer. Sends the "it's your turn" email or text. | staff stringStaff name or id. location? stringLocation id, name or link name. Optional when the account has one location. idempotency_key? stringAny unique string. Retrying with the same key never acts twice. |
POST/api/v1/waitlist/callCall a specific customer (powerkit_waitlist_call) Calls one waiting customer now (out of order if needed), optionally for a named staff member. | customer stringThe customer: check-in id, ticket number today (like 24 or "024") or their name. staff? stringstaff location? stringLocation id, name or link name. Optional when the account has one location. idempotency_key? stringAny unique string. Retrying with the same key never acts twice. |
POST/api/v1/waitlist/startStart service (powerkit_waitlist_start) Marks a called (or waiting) customer as in service. | customer stringThe customer: check-in id, ticket number today (like 24 or "024") or their name. staff? stringstaff location? stringLocation id, name or link name. Optional when the account has one location. idempotency_key? stringAny unique string. Retrying with the same key never acts twice. |
POST/api/v1/waitlist/completeComplete service (powerkit_waitlist_complete) Marks a customer as done. Sends the optional thank-you email and frees the staff member for the next walk-in. | customer stringThe customer: check-in id, ticket number today (like 24 or "024") or their name. location? stringLocation id, name or link name. Optional when the account has one location. idempotency_key? stringAny unique string. Retrying with the same key never acts twice. |
POST/api/v1/waitlist/skipSkip a customer (powerkit_waitlist_skip) Puts a waiting or called customer back in line just behind the next person, so they are called again soon. Counted in fairness reports. | customer stringThe customer: check-in id, ticket number today (like 24 or "024") or their name. location? stringLocation id, name or link name. Optional when the account has one location. idempotency_key? stringAny unique string. Retrying with the same key never acts twice. |
POST/api/v1/waitlist/no/showdestructiveMark a no show (powerkit_waitlist_no_show) Marks a customer as a no show and takes them out of line (they get a "we missed you" text if they opted in). Ask the person first and pass confirm: true. | customer stringThe customer: check-in id, ticket number today (like 24 or "024") or their name. location? stringLocation id, name or link name. Optional when the account has one location. confirm? booleanMust be true. Ask the person before calling this. |
POST/api/v1/waitlist/canceldestructiveCancel a check-in (powerkit_waitlist_cancel) Cancels a customer's check-in and removes them from the line. Ask the person first and pass confirm: true. | customer stringThe customer: check-in id, ticket number today (like 24 or "024") or their name. location? stringLocation id, name or link name. Optional when the account has one location. confirm? booleanMust be true. Ask the person before calling this. |
POST/api/v1/waitlist/requeuePut a customer back in line (powerkit_waitlist_requeue) Undoes a no show or cancellation: the customer is waiting again in their original spot. | customer stringThe customer: check-in id, ticket number today (like 24 or "024") or their name. location? stringLocation id, name or link name. Optional when the account has one location. |
POST/api/v1/waitlist/reassignReassign a customer (powerkit_waitlist_reassign) Moves a customer to another staff member, or back to the first-available line (leave staff out). Keeps their place by arrival time and is logged as a manual override. | customer stringThe customer: check-in id, ticket number today (like 24 or "024") or their name. staff? stringStaff name or id; leave out for the first-available line. location? stringLocation id, name or link name. Optional when the account has one location. |
POST/api/v1/waitlist/transferTransfer to another location (powerkit_waitlist_transfer) Moves a customer to another location's line (Business plan with more than one location). They keep their original arrival time and get a new number there. | customer stringThe customer: check-in id, ticket number today (like 24 or "024") or their name. to_location stringLocation id or name. location? stringLocation id, name or link name. Optional when the account has one location. |
POST/api/v1/waitlist/update/entryEdit a customer in line (powerkit_waitlist_update_entry) Changes a check-in's name, phone, email, service, notes or priority (normal, priority, urgent). | customer stringThe customer: check-in id, ticket number today (like 24 or "024") or their name. location? stringLocation id, name or link name. Optional when the account has one location. name? stringname phone? stringphone email? stringservice? stringService name or id, or "none". notes? stringnotes priority? string: normal | priority | urgentpriority |
POST/api/v1/waitlist/send/textText one customer (powerkit_waitlist_send_text) Sends a short operational text about this visit to one customer who agreed to texts, through the merchant's own Twilio. Never for marketing. | customer stringThe customer: check-in id, ticket number today (like 24 or "024") or their name. message stringmessage location? stringLocation id, name or link name. Optional when the account has one location. |
POST/api/v1/waitlist/queue/statusOpen, pause or close check-in (powerkit_waitlist_queue_status) Opens check-in, pauses it (no new check-ins for now) or closes it for the day, for a location's line or one staff member's line. Everyone already in line is still served. Closing needs confirm: true. | status string: open | paused | closedstatus location? stringLocation id, name or link name. Optional when the account has one location. staff? stringOnly this person's line. confirm? booleanMust be true. Ask the person before calling this. |
POST/api/v1/waitlist/announce/delayAnnounce a delay (powerkit_waitlist_announce_delay) Tells everyone waiting at a location that you are running late (emails and texts, once each) and adds the delay to wait estimates. minutes: 0 clears it. | minutes integerminutes location? stringLocation id, name or link name. Optional when the account has one location. |
POST/api/v1/waitlist/staff/statusSet staff availability (powerkit_waitlist_staff_status) Marks a staff member available, on a break (optionally for some minutes, then back automatically) or offline. Going offline sends their first-available walk-ins back to the shared line; people who asked for them by name keep their place. | staff stringstaff status string: available | break | offlinestatus minutes? integerBreak length. location? stringLocation id, name or link name. Optional when the account has one location. |
POST/api/v1/waitlist/location/saveCreate or update a location (powerkit_waitlist_location_save) Creates a waitlist location (with its check-in link and shared line) or updates one: name, time zone, address and opening hours. Hours look like {"mon":"09:00-18:00","sun":"closed"}; leave hours out to take check-ins whenever check-in is open. | location? stringLeave out to create a new location. name? stringname timezone? stringIANA time zone, like America/New_York. address? stringaddress hours? objectDay (mon..sun) to "HH:MM-HH:MM" or "closed". always_open? booleanalways open |
POST/api/v1/waitlist/location/archivedestructiveArchive a location (powerkit_waitlist_location_archive) Archives a location: its check-in link stops working; history is kept. Refused while anyone is still in line there. Ask the person first and pass confirm: true. | location stringlocation confirm? booleanMust be true. Ask the person before calling this. |
POST/api/v1/waitlist/service/saveCreate or update a service (powerkit_waitlist_service_save) Adds a service customers can pick, or changes one: name, minutes (the starting wait estimate), description, whether it is offered, and which location (leave out for every location). | service? stringLeave out to create. name? stringname minutes? integerminutes description? stringdescription offered? booleanoffered location? stringLocation id, name or link name. Optional when the account has one location. |
POST/api/v1/waitlist/service/deletedestructiveDelete a service (powerkit_waitlist_service_delete) Deletes a service. Past visits keep their history. Ask the person first and pass confirm: true. | service stringservice confirm? booleanMust be true. Ask the person before calling this. |
POST/api/v1/waitlist/staff/saveAdd or update a staff member (powerkit_waitlist_staff_save) Adds a staff member (respecting the plan's staff limit) or updates one: name, email for their private sign-in link, role (staff or manager), weight for weighted round robin, short bio, location, and the services they do (empty list means every service). New staff with an email get their sign-in link by email. | staff? stringLeave out to add someone. name? stringname email? stringrole? string: staff | managerrole weight? integerweight bio? stringbio location? stringLocation id, name or link name. Optional when the account has one location. services? arrayService names or ids this person does. |
POST/api/v1/waitlist/staff/removedestructiveRemove a staff member (powerkit_waitlist_staff_remove) Removes a staff member: their sign-in link stops working, and customers waiting for them move to the first-available line with their place kept. Ask the person first and pass confirm: true. | staff stringstaff confirm? booleanMust be true. Ask the person before calling this. |
POST/api/v1/waitlist/staff/send/linkEmail a staff sign-in link (powerkit_waitlist_staff_send_link) Emails a staff member their private sign-in link for their own queue on their phone. Set new_link true to also sign them out everywhere and make a fresh link (if the old one was shared). | staff stringstaff new_link? boolean, default falsenew link |
POST/api/v1/waitlist/strategySet the round robin rule (powerkit_waitlist_strategy) Chooses how first-available walk-ins are shared at a location: next_available, strict (rotation), least_busy, shortest_wait, weighted, service (skills first) or manager (nobody auto-assigned). Free has next_available and strict; the rest need Pro. | strategy string: next_available | strict | least_busy | shortest_wait | weighted | service | managerstrategy location? stringLocation id, name or link name. Optional when the account has one location. |
POST/api/v1/waitlist/settings/updateUpdate waitlist settings (powerkit_waitlist_settings_update) Changes settings: business name, theme (a key from powerkit_waitlist_settings, or custom with colors on Pro), welcome message, status page instructions, what staff and services are called, kiosk idle reset seconds, when to send "almost next", automatic no-show minutes, whether to ask for phone and email, and how long contact details are kept. | business? stringbusiness theme? stringtheme welcome? stringwelcome instructions? stringinstructions staff_label? stringstaff label service_label? stringservice label idle_seconds? integeridle seconds near_count? integernear count noshow_minutes? integernoshow minutes ask_phone? booleanask phone ask_email? booleanask email allow_leave? booleanallow leave retention_days? integerretention days custom_colors? objectFor theme "custom" (Pro and Business). Colors as #RRGGBB. |
POST/api/v1/waitlist/kiosk/pinSet or remove the kiosk PIN (powerkit_waitlist_kiosk_pin) Sets the 4 to 8 digit PIN needed to exit kiosk mode, or removes it (clear: true). The PIN is stored hashed. | pin? stringpin clear? boolean, default falseclear |
POST/api/v1/waitlist/kiosk/createMake a kiosk link (powerkit_waitlist_kiosk_create) Makes a kiosk link for a tablet or TV at a location: interactive check-in, QR display, queue board (numbers only) or hybrid. Anyone with the link can use that screen, so give it only to the device; remove it any time with powerkit_waitlist_kiosk_remove. | name stringname mode? string: interactive | qr | board | hybrid, default "hybrid"mode location? stringLocation id, name or link name. Optional when the account has one location. |
POST/api/v1/waitlist/kiosk/removedestructiveRemove a kiosk (powerkit_waitlist_kiosk_remove) Switches a kiosk link off: that tablet stops working right away. Ask the person first and pass confirm: true. | kiosk stringKiosk id or name. confirm? booleanMust be true. Ask the person before calling this. |
POST/api/v1/waitlist/template/updateEdit an email or text template (powerkit_waitlist_template_update) Turns a customer email or text on or off, or changes its wording (email wording needs Pro). Use merge tags like {{first_name}}, {{business}}, {{number}}, {{position}}, {{wait}}, {{staff}}, {{service}}, {{status_link}} and {{delay}}. Keys come from powerkit_waitlist_templates. | key stringkey subject? stringsubject body? stringbody on? booleanon |
POST/api/v1/waitlist/template/testSend a test email (powerkit_waitlist_template_test) Sends one email template, filled with sample details, to an address (the account's own email by default). | key stringkey to? stringto |
POST/api/v1/waitlist/twilio/toggleTurn text messages on or off (powerkit_waitlist_twilio_toggle) Turns customer texts on or off without touching the saved Twilio credentials. Connecting Twilio (entering keys) is done in the dashboard so secrets never pass through a chat. | on booleanon |
POST/api/v1/waitlist/twilio/testSend a test text (powerkit_waitlist_twilio_test) Sends a test text through the merchant's own Twilio to a phone number and reports what Twilio said, in plain language. | to stringto |
POST/api/v1/waitlist/qr/styleStyle a waitlist QR code (powerkit_waitlist_qr_style) Changes the look of one waitlist QR code: dot color, corner color, background, dot style, corner style and an optional built-in icon in the middle. Types and keys come from powerkit_waitlist_qr. A low-contrast combination is refused so the code always scans. | type string: business | status | appointment | staff | servicetype key? stringStaff or service id for those types. location? stringLocation id, name or link name. Optional when the account has one location. color? stringcolor corner_color? stringcorner color background? stringbackground dots? string: square | rounded | dots | tiny | stars | diamonds | hearts | classy | plus | bars | linesdots corners? string: square | rounded | circle | leafcorners icon? stringA built-in icon (star, heart, bullseye, check, sun, palm, golf, basketball, football, soccer, trophy, dumbbell...) or "none". |
Support and invites
| Endpoint | Arguments |
|---|---|
GET/api/v1/invite/linkMy invite link (powerkit_invite_link) The invite-a-friend link and code for this account, with how many friends joined, how many went paid and how many free months were earned. Both sides get a free month when an invited friend starts a paid plan, up to 12 a year. | none |
GET/api/v1/support/ticketsMy support tickets (powerkit_support_tickets) The support tickets on this account, newest first. Pass ticket_id to read one ticket with its whole message thread. | ticket_id? stringRead this ticket and its messages instead of listing. |
POST/api/v1/support/openOpen a support ticket (powerkit_support_open) Opens a support ticket with PowerKit Pro from this account. The team answers by email and on the Help page. Use when the person asks for help the tools cannot give. | subject stringA short subject. message stringWhat happened and what they expected. product? string: account | learn | form | book | waitlist | loyalty | qr | link | card | review | quote | waiver | menu | cert | program | seatWhich tool it is about (a product key, or "account" for login and billing). Leave out for a general question. |
Other
| Endpoint | Arguments |
|---|---|
GET/api/v1/learn/coursesList courses (powerkit_learn_courses) PowerLMS courses on this account with status, price, enrolled and completed counts, students waiting to pay, and the public course page link. | limit? integer, default 50How many to return (1 to 200). offset? integer, default 0How many to skip, for the next page. |
GET/api/v1/learn/course/getGet a course (powerkit_learn_course_get) One course in full: details, the curriculum in order (sections and lessons with ids and types), upcoming classes, and sales. | course_id stringThe id as returned by a list tool. |
POST/api/v1/learn/course/createCreate a course (powerkit_learn_course_create) Creates a course with an optional price, outcomes and a first set of lessons. It starts as a draft unless publish is true (publishing needs at least one lesson, and a paid course needs a way to pay set up in the dashboard). Returns the course page link. | title stringtitle subtitle? stringsubtitle description? stringdescription outcomes? arrayWhat students will be able to do, one per item. format? string: self | cohort | hybrid, default "self"format price? numberPrice in US dollars. 0 or empty for free. lessons? arraylessons publish? boolean, default falsepublish |
POST/api/v1/learn/lesson/addAdd a lesson (powerkit_learn_lesson_add) Adds a lesson to the end of a course: video (YouTube, Vimeo or Loom link), reading text, embed, quiz, live class or in-person class. | course_id stringThe id as returned by a list tool. title stringtitle kind? string: video | text | file | embed | quiz | assignment | scorm | live | inperson, default "text"kind body? stringbody video_url? stringvideo url drip_days? integer, default 0drip days |
GET/api/v1/learn/studentsList students in a course (powerkit_learn_students) Students in a course with status (active, completed, waiting for payment), payment method, the reference code for manual payments, lessons done and classes attended. | course_id stringThe id as returned by a list tool. status? string: pending_payment | active | completed | refunded | expired | cancelledstatus limit? integer, default 50How many to return (1 to 200). offset? integer, default 0How many to skip, for the next page. |
GET/api/v1/learn/gradebookCourse gradebook (powerkit_learn_gradebook) Every active or finished student in a course with their best quiz scores, assignment grades, SCORM results, lessons done and classes attended. | course_id stringThe id as returned by a list tool. limit? integer, default 50How many to return (1 to 200). offset? integer, default 0How many to skip, for the next page. |
GET/api/v1/learn/membersList all-access members (powerkit_learn_members) People on the instructor's monthly all-access membership (every published course), with status (Active, Payment failed, Cancelled), monthly price and start date. | status? string: active | past_due | cancelledstatus limit? integer, default 50How many to return (1 to 200). offset? integer, default 0How many to skip, for the next page. |
POST/api/v1/learn/enrollEnroll students (powerkit_learn_enroll) Adds students to a course by name and email and emails each one a welcome link (students without a password are asked to choose one). Set paid to count the course price as a sale (for people who paid you directly or a sponsor). | course_id stringThe id as returned by a list tool. students arraystudents paid? boolean, default falsepaid |
POST/api/v1/learn/mark/paidMark a student paid (powerkit_learn_mark_paid) Confirms a cash, Zelle or $cashtag payment for an enrollment that is waiting for payment, opens the course for the student and emails them a link to the course. Use the enrollment id or the reference code the student put in their payment note. | course_id stringThe id as returned by a list tool. enrollment_id? stringenrollment id reference? stringThe code like L7K2QX shown to the student. |
POST/api/v1/learn/class/scheduleSchedule classes (powerkit_learn_class_schedule) Schedules a live or in-person class for a course, optionally repeating weekly. Google Meet links are made automatically when the account has Google Calendar connected; for Zoom or another service pass the link; for in person pass the room or address. Times are in the account's time zone. | course_id stringThe id as returned by a list tool. title? stringtitle starts stringLocal start time, YYYY-MM-DDTHH:MM. minutes? integer, default 60minutes provider? string: meet | zoom | link | room, default "meet"provider join_url? stringjoin url location? stringlocation repeat_weeks? integer, default 1repeat weeks |
GET/api/v1/learn/salesCourse sales (powerkit_learn_sales) PowerLMS sales on this account: total, the last 30 days, by payment method, and by course. | none |
GET/api/v1/learn/roster/listMember roster (powerkit_learn_roster_list) Lists the member roster of this account's school: the people who may take its members-only courses. Shows whether each membership is current. Filter with search (name or email) and current_only. | search? stringsearch current_only? boolean, default falsecurrent only limit? integer, default 50How many to return (1 to 200). offset? integer, default 0How many to skip, for the next page. |
POST/api/v1/learn/roster/addAdd to the member roster (powerkit_learn_roster_add) Adds or updates people on this school's member roster (who may take members-only courses). Each member needs an email; name, status (default Active), level and member_through (YYYY-MM-DD, the last day of membership) are optional. Set full_list to true when this is the whole member list: anyone added earlier through the connector or API who is not in it is marked Lapsed. | members arraymembers full_list? boolean, default falsefull list |
POST/api/v1/learn/roster/removedestructiveRemove from the member roster (powerkit_learn_roster_remove) Removes people from this school's member roster by email. Courses they already enrolled in stay open to them. | emails arrayemails |
POST/api/v1/learn/course/buildBuild a whole course (powerkit_learn_course_build) Builds a complete PowerLMS course in one call: details, modules (sections), lessons with text, photos and videos, quizzes (multiple choice, true/false, select all, fill in the blank, short answer), a final test, an optional certificate and publishing. Use this when someone describes a course they want: agree on the outline with them first, then call this once with every module, lesson and question, and edit afterwards with the smaller course tools. Every question is checked before anything is saved, so a mistake creates nothing. Quizzes need questions, or students can never finish the course. Lesson text: blank lines separate blocks. Special blocks: "## Heading", "> Callout note", lines that start with "- " for bullets, "" for a photo with an optional next line "Credit: ..." under it, and "@video https://youtu.be/..." for an extra YouTube or Vimeo video inside the text. **bold** works inside a paragraph and links are clickable. | title stringCourse title. subtitle? stringOne line under the title on the course page. description? stringWhat the course is about, for the course page. outcomes? arrayWhat students will be able to do, one per item. instructor_name? stringShown on the course page. Defaults to the account name. instructor_bio? stringA short bio for the course page. price? numberUS dollars. 0 or empty for free. cover_image_url? stringA wide image: an https link (it is downloaded and saved to the account) or a /files/... path already on this account. cert_hours? stringHours printed on the certificate, for example "3". format? string: self | cohort | hybrid, default "self"self (at their own pace), cohort (live classes on a schedule) or hybrid. quiz_pass? integer, default 70Percent needed to pass each quiz. certificate? boolean, default trueIssue a certificate automatically when a student finishes (on plans with certificates). discussion? boolean, default trueTurn on the course discussion board and live chat. modules arrayEvery module in order, each with its lessons. Put a final test in its own last module. publish? boolean, default falsePublish right away. Leave false so the person can review the draft first. visibility? string: public | members | staff, default "public"Who can take the course: public (anyone), members (people on this school's member roster) or staff (this school's own team, hidden from the website). auto_assign? string: none | admin | staff | instructor, default "none"Onboarding: give the course automatically to every member of this school's team with that role once it is published. |
POST/api/v1/learn/course/updateUpdate a course (powerkit_learn_course_update) Changes a course's details: title, subtitle, description, outcomes, instructor, price, cover image, quiz pass mark, certificate hours, discussion board, certificate on or off, and who can take it (public, members only or staff only). Only the fields you send change. | course_id stringThe id as returned by a list tool. title? stringNew course title. subtitle? stringOne line under the title on the course page. description? stringWhat the course is about, for the course page. outcomes? arrayWhat students will be able to do, one per item. instructor_name? stringShown on the course page. Defaults to the account name. instructor_bio? stringA short bio for the course page. price? numberUS dollars. 0 or empty for free. cover_image_url? stringA wide image: an https link (it is downloaded and saved to the account) or a /files/... path already on this account. cert_hours? stringHours printed on the certificate, for example "3". quiz_pass? integerPercent needed to pass each quiz. discussion? booleanCourse discussion board and live chat on or off. certificate? booleanIssue a certificate when a student finishes (on plans with certificates). auto_assign? string: none | admin | staff | instructorOnboarding: give the course automatically to every member of this school's team with that role (admin covers super admins), now (once the course is published) and when people join or change role. none turns it off. Usually paired with visibility staff. visibility? string: public | members | staffWho can take the course: public (anyone), members (people on this school's member roster whose membership is current) or staff (this school's own team, hidden from the website). |
POST/api/v1/learn/module/addAdd a module (powerkit_learn_module_add) Adds a module (section) at the end of a course, optionally with its lessons and quiz questions. Returns the module id, which powerkit_learn_lesson_update can move lessons into. | course_id stringThe id as returned by a list tool. title stringModule name. lessons? arrayLessons to add to the new module, in order. |
GET/api/v1/learn/lesson/getRead a lesson (powerkit_learn_lesson_get) One lesson in full: its text, video link, settings and, for quizzes, every question with its choices, right answer and id. | lesson_id stringThe id as returned by a list tool. |
POST/api/v1/learn/lesson/updateUpdate a lesson (powerkit_learn_lesson_update) Changes a lesson's title, type, text, video, length, free preview, drip days, quiz tries or module. Only the fields you send change. Lesson text: blank lines separate blocks. Special blocks: "## Heading", "> Callout note", lines that start with "- " for bullets, "" for a photo with an optional next line "Credit: ..." under it, and "@video https://youtu.be/..." for an extra YouTube or Vimeo video inside the text. **bold** works inside a paragraph and links are clickable. | lesson_id stringThe id as returned by a list tool. title? stringNew lesson title. kind? string: video | text | file | embed | quiz | assignment | scorm | live | inpersonNew lesson type: text, video, quiz, assignment, embed, live, inperson, scorm. body? stringThe full new lesson text (it replaces the old text). video_url? stringYouTube, Vimeo or Loom link. An empty string removes it. minutes? integerAbout how long the lesson takes. preview? booleanTrue lets anyone open the lesson from the course page before enrolling. drip_days? integerDays after enrolling before the lesson opens. 0 = right away. attempts? integerQuizzes: tries allowed, 0 = unlimited. module_id? stringMove the lesson to the end of this module (ids from powerkit_learn_course_get, as section ids). |
POST/api/v1/learn/questions/addAdd quiz questions (powerkit_learn_questions_add) Adds questions to the end of a quiz lesson: multiple_choice, true_false, select_all, fill_blank or short_answer (the instructor grades written answers). Questions with a problem are skipped and listed. | lesson_id stringThe id as returned by a list tool. questions arrayThe questions to add, in order. |
POST/api/v1/learn/question/deletedestructiveDelete a quiz question (powerkit_learn_question_delete) Removes one question from a quiz (question ids come from powerkit_learn_lesson_get). | question_id stringThe id as returned by a list tool. |
POST/api/v1/learn/lesson/deletedestructiveDelete a lesson (powerkit_learn_lesson_delete) Deletes a lesson and its quiz questions, in two steps. Step 1: call with lesson_id only. Nothing is deleted; it returns the lesson and a confirmation code. Show that to the person and get their approval. Step 2: once they approve, call again with confirm_code set to that code. Students lose their progress on the lesson. Cannot be undone. | lesson_id stringThe id as returned by a list tool. confirm_code? stringUser confirmation. Leave empty for the preview. Set it to the code from the preview only after the person has approved deleting that lesson. |
POST/api/v1/learn/course/publishPublish or unpublish a course (powerkit_learn_course_publish) Publishes a course (its course page opens for enrollment) or takes it back to draft. Publishing checks that the course has lessons, every quiz has questions and a paid course has a way to pay. | course_id stringThe id as returned by a list tool. publish? boolean, default trueTrue publishes, false takes the course back to draft. |
Questions or a tool you need that is not here: support@powerkitpro.com.