Security Overview
How AirTA Sites protects agencies' sites and candidates' data: how it is built, the controls in place, and what isn't in place yet. Written to answer a security review.
In short
- Sites, the admin, the database and files all run and are stored in Tokyo.
- The database itself keeps each agency's data apart, and the application can't switch that off.
- Everything is encrypted in transit, including between our servers and the database.
- When we open your admin to help, it shows in your activity log.
- Daily encrypted backups. The latest restore test brought back all 133 tables with 0 errors.
- Names, email addresses and phone numbers are never sent to the AI.
This summary is a guide to the text below. The text is what applies.
About This DocumentLink to this section
1.1 AirTA Sites, a service of AirTA G.K., gives recruitment agencies their own careers website, an admin to run it, and AI agents that help with the work. This document covers that service: the agencies' public sites, the admin and everything behind them.
1.2 Each section names the controls it relies on. They come from one register, which also feeds the Trust Center at airtasites.jp/trust, and each shows its status as it stands today: 58 of 75 are live. The register was last checked line by line against the code on the date it shows (2026-11-03 for this version).
1.3 Our Terms commit us to security at least as strong as the Trust Center describes (Terms, Section 14). Only a control marked live counts toward that commitment; work in progress and planned work are shown so you can see where we are going, never as done.
How the Service Is BuiltLink to this section
2.1 One application serves every agency. It runs on Vercel in the Tokyo region; the database is PostgreSQL on Supabase, also in Tokyo; uploaded files are kept in Vercel Blob storage in Tokyo, with CVs and raw recordings in a separate private store. Email is sent through Resend from its Tokyo region, and the AI features use Anthropic's API.
2.2 Each agency's site answers on the agency's own domain. Our own domains can never be added as an agency's domain, so a site can't pass itself off as the platform.
2.3 Every company that handles data for the service is listed at airtasites.jp/subprocessors, with what it receives and where. The Suppliers section below explains how that list is kept complete.
- Hosted and stored in Tokyo
Sites and the admin run in Vercel's Tokyo region, the database is in Supabase's Tokyo region, and uploaded files, CVs and recordings are stored in Tokyo.
Live - Nothing sent to third parties by default
Visitor analytics are first-party, fonts are served from the site's own domain, and embedded videos and posts load only when a visitor chooses to play them.
Live
Keeping Agencies ApartLink to this section
3.1 The separation between agencies lives in the database, not only in the application. Every row of agency data carries the agency's id, row-level security limits every query to the agency the request is for, and the rule is forced, so it binds even the tables' owner.
3.2 The application connects through a restricted role that can't bypass that rule, can't delete an agency and can change only the current agency's own settings. A bug in our code therefore can't show one agency another's applicants: the database would refuse.
3.3 An automated test signs in as one agency and tries to reach another's data in every way the application could. It runs before every release, and a release can't go out if it fails.
- Row-level security on every agency table
Every row carries its agency's id, and the database refuses any query that isn't for the agency signed in. The rule is forced, so even the table owner is bound by it.
Live - The app can't switch the rules off
The application connects with a restricted database role that can't bypass row-level security, can't delete an agency, and can update only the agency's own settings row.
Live - Isolation tested before every release
An automated test acts as one agency and tries to read, write and change another's data, and checks that agents can't read names, emails or notes. Releases go out only through a gate that runs it.
Live - CVs in private storage, one-minute links
CVs are stored privately in Tokyo, in each agency's own folder. A file's address opens nothing on its own; each download is a one-minute link for a signed-in team member, and it is logged.
Live - Consultants' raw recordings kept private
Raw video and audio takes, and the files made from them, are stored privately. Everything that reads them, including transcription and the AI, gets a short-lived signed link. Only the finished, published video is public.
Live - Admin on its own address
Moves the admin to its own host, apart from agencies' public sites, so a page on one site can never share a browser origin with an admin.
Planned
EncryptionLink to this section
4.1 In transit: every page is served over HTTPS only, and the connection from our servers to the database is encrypted with its certificate checked, so it can't be read or redirected on the way.
4.2 On top of the storage our providers run, we encrypt the most sensitive values ourselves before they are stored: authenticator secrets, connected accounts' tokens and webhook addresses. Sign-in codes and session tokens are stored only as hashes, and backups are encrypted with AES-256 before they leave our hands.
- HTTPS only, with HSTS
Every page is served over HTTPS with a two-year Strict-Transport-Security header, and certificates renew automatically, on our domains and each agency's own.
Live - Encrypted, verified database connections
The application, migrations and every operational script connect to the database over TLS and check its certificate against Supabase's root, so a connection can't be read or redirected on the way.
Live - Database refuses unencrypted connections
Our own connections are already encrypted. This switches on Supabase's server-side setting so the database itself turns away any connection that isn't.
Due: November 2026
In progress - Database reachable by our servers only
Only the site's servers connect to the database. Its tables aren't exposed through Supabase's public data API: the public roles have no access to the schema the service uses.
Live - Stored secrets sealed with AES-256-GCM
Authenticator secrets, the tokens of a connected Google account and the addresses of webhooks you connect are encrypted before they're stored; a tampered value opens to nothing.
Live - Encrypted copies kept off-site
Each day's backups are encrypted with AES-256 and copied to separate cloud storage, and every copy is reopened after upload to prove it restores.
Live
Sign-In and AccessLink to this section
5.1 Your team signs in with a one-time code sent to their work email, and can add an authenticator app; an owner can require that for everyone. There are no passwords to reuse or leak.
5.2 Five roles decide what each person can open: owner, admin, editor, author, and viewer. An author changes only their own jobs and profile. Each admin page and download states the role it needs in code, and that rule is checked on every request, however the request is made.
- One-time sign-in codes, no passwords to steal
Team members sign in with a code sent to their work email. Codes are stored only as keyed hashes, expire, and lock after a few wrong tries, counted so that parallel guesses can't slip past the limit.
Live - Two-step verification, which owners can require
Members can add an authenticator app with ten recovery codes, and owners can require it for everyone. Each code works once, and a stolen session can't replace an authenticator that is already on.
Live - Five roles, checked on every page and download
Owner, admin, editor, author, and viewer; an author changes only their own jobs and profile. Each admin page and download names the role it needs, and a page's rule holds however the request is dressed up. An agency always keeps an owner.
Live - Sessions that can't be guessed or reused elsewhere
Sessions are 256 random bits, stored only as a hash, in cookies that scripts can't read and that belong to one agency. The Team screen shows how many browsers each member is signed in on, and can sign a member out everywhere.
Live - Single-use sign-in links and a fixed session limit
Today a team member's session lasts 14 days from their last visit and a sign-in link can be used again within its period. This makes links single-use and ends every session after a fixed time, however active.
Planned - Single sign-on with Microsoft or Google
Lets an agency's team sign in through its own Microsoft Entra ID or Google Workspace, under the agency's own policies.
Planned
Our Own AccessLink to this section
6.1 When we help inside your admin, we sign in as a member called "AirTA Sites support" that appears on your Team screen and that your owner can remove. Every page it opens and every file it downloads is recorded in your activity log under its own tab.
6.2 Work on an agency's data in the database goes through a single script that runs inside that agency's walls and writes its reason to the agency's activity log. Direct access to the database console is for incidents only, and each use is recorded in our incident log.
- Our access is a seat you can see and remove
When we help in your admin, we sign in as a named "AirTA Sites support" member on your Team screen, which your owner can remove. No one else can take that name.
Live - Every page we open is in your activity log
Each admin page the support seat opens and each file it downloads is recorded in your activity log, under its own Support tab. Changes it makes are recorded like any member's.
Live - Database work needs a reason, recorded first
Any work on an agency's data in the database goes through one script that runs inside that agency's walls and writes the reason to its activity log in the same transaction. It refuses without a real reason.
Live - An activity log no one can edit
The activity log of who changed what is append-only: the application's database role can add entries but can't change or delete them.
Live - Direct console access for incidents only
The written policy limits direct access to the database console to incidents, each one recorded in the incident log.
Live
Application SecurityLink to this section
7.1 Anything people type, upload or link to is treated as untrusted. Text is cleaned before any page or email shows it, files are judged by their contents rather than their names, and when the service fetches something from an address it was given, it makes sure the address is on the public internet.
7.2 Releases go out through one command that runs the type checks, the full test suite, lint, the isolation test and a check for known high or critical vulnerabilities in our dependencies, and stops at the first failure. Every run is recorded.
- Everything written is cleaned before it's shown
Text an agency or a visitor writes is cleaned before any page or email shows it: no raw HTML and no scripts.
Live - Security headers on every page
Framing, content sniffing, referrers and browser features are locked down on every response, no header names the software behind the site, and downloads and relayed images carry their own stricter sandbox.
Live - A script policy on every page
Adds a Content-Security-Policy that lets only the site's own scripts run, using a fresh value for each page, as a second line of defence behind the cleaning above.
Planned - Every CV a candidate sends is inspected
Files are judged by their bytes, not their names. Macros, scripts, embedded programs, remote templates, external links in spreadsheets and password-protected files are refused.
Live - The same inspection for CVs your team uploads
CVs your team adds in the admin will go through the same inspection as those candidates send.
Due: Before the first live agency's candidate data
In progress - Outside addresses fetched safely
When the service fetches a picture or page from an address someone gave it, it checks each connection lands on the public internet, never inside our network, follows redirects one by one, and caps size and time.
Live - Payment and email events verified
Messages from Stripe and Resend are accepted only with a valid signature, and a paid session grants credits only when it is ours and matches exactly.
Live - Spreadsheet exports can't carry formulas
Exports open in Excel with Japanese intact, and any cell that could run as a formula is neutralised.
Live - Every release passes the same checks
Releases go out through one command that runs type checks, the full test suite, lint, the isolation test and a check for known high or critical vulnerabilities, stops at the first failure, and records the result.
Live - A security check of everything we run, every day
Every day, every package that ships is checked against the public database of known vulnerabilities, and Node.js, Next.js, React and PostgreSQL against their support dates. Each finding gets the policy's deadline the day it is found, we are alerted, and the result is published on the status page.
Live - Development kept off the live database
Development and testing run on their own database, which holds only test agencies and sample data. The live database is never used to build or try features.
Live - Independent penetration test
A test of the web application and its interfaces by an outside firm, with its findings fixed and retested. Its summary will be in the security pack.
Due: When an agency's security review needs one
Planned
Abuse ProtectionLink to this section
8.1 Public forms and the site assistant are limited per visitor address across every agency's site, so one source can't flood an agency or run up its AI credits. Someone who reaches a limit is told, in their language, how long to wait.
- Every public form has a platform-wide limit
Applications, CV uploads, enquiries, alert sign-ups, sign-in codes and the site assistant are limited per address across every agency's site, and a visitor who hits one is told in their language how long to wait.
Live - No one can flood an inbox through a site
An email address typed into any form receives at most a handful of emails a day across all sites, and fewer for alert confirmations. Applications are always saved, even when the receipt is held back.
Live - Hidden traps for automated form filling
Public forms carry a hidden field people never see; a submission that fills it is answered quietly and goes nowhere.
Live - AI credits protected from draining
The site assistant is limited per visitor address and per agency, and each turn reserves its credit before the model is called, so parallel requests can't spend past the balance.
Live - Bot detection on public forms
Vercel BotID is running on public forms in observe mode. Once a week of results shows it doesn't turn away real candidates, it starts blocking.
Due: November 2026
In progress
Monitoring and IncidentsLink to this section
9.1 Server errors and failed scheduled jobs alert us as they happen, and a check every five minutes tests the database. airtasites.jp/status shows 90 days of these checks to anyone.
9.2 If candidates' data is leaked, lost or damaged, we tell the agency within 48 hours. How we respond, and how we support your report under Japan's personal information law, is set out at airtasites.jp/trust/incidents.
- Errors recorded and alerted, without personal data
Every server error is recorded with the route's pattern, never the real address, and the operator is alerted. Logs drop database values and mask emails, phone numbers and tokens.
Live - Scheduled jobs watched, missed nights caught
Every scheduled job records each run and reports failure loudly. A check every five minutes tests the database and notices a nightly job that didn't run.
Live - A public status page that leans against us
airtasites.jp/status shows 90 days of checks for the sites, email delivery and scheduled jobs. A check that didn't run counts as failed, and days before monitoring began show as no data, never green.
Live - Told within 48 hours of a breach
If a leak, loss or damage affects candidates' data, we tell the agency within 48 hours and help with its report to the Personal Information Protection Commission and its notices to the people affected. It is a term of the contract.
Live - A written incident response plan
Severity levels, who does what, the APPI reporting timeline, notice templates in English and Japanese, and a review after every incident.
Live
Backups and ContinuityLink to this section
10.1 The database is backed up in full every day, and an encrypted copy is kept with a separate provider. We restore a backup into a fresh database at least once a quarter and compare it with production table by table.
10.2 Recovery objectives, the risks we plan for and every restore test on record are in the continuity plan at airtasites.jp/trust/continuity.
- Daily backups, kept up to 190 days
The database is copied in full every day over a verified encrypted connection. Daily copies are kept 7 days, Monday copies 5 weeks and first-of-month copies 190 days, and each copy is checked to be complete before it is kept.
Live - Restores tested, not assumed
A backup is restored into a fresh database and compared with production table by table, at least once a quarter. The latest result is shown on this page.
Live - Point-in-time recovery
Turns on continuous database backup, so data can be restored to any moment rather than to the last daily copy: from up to 24 hours of loss to minutes.
Due: With the first paying agency
Planned - A second copy of uploaded files
Images, CVs and recordings are stored in Vercel Blob, apart from the database, and aren't in the daily database backup. This adds an encrypted copy of them alongside it.
Due: Before the first live agency's candidate data
Planned - A written continuity and recovery plan
Recovery objectives, and what we do about outages, data loss, a lost provider account, stolen credentials, a lost computer and our own unavailability, tested by the restore drills.
Live - A named person who can act if we can't
A trusted person, named in our internal plan, holds sealed instructions to reach every agency, keep the service running and help each agency take its data and domain elsewhere.
Due: November 2026
In progress
Candidates' DataLink to this section
11.1 Candidates' data belongs to the agency. We process it only to run the agency's site, on the agency's instructions, and never for ourselves or for AirTA. Applications are deleted on the schedule each agency sets, and deletions reach every backup within 190 days.
11.2 What we hold, where, for how long and how it leaves is set out at airtasites.jp/trust/data.
- Applications deleted on your schedule
Each agency sets how long applications are kept, by outcome, and they are deleted automatically when that time is up. The apply form's privacy notice states the period from the same setting, and a change never lengthens what an applicant was told.
Live - Registers kept only as long as the law requires
The job, job-seeker and fee registers keep what Japan's Employment Security Act requires, for two years after each record ends, even after an application is anonymised or a person asks for deletion. Then the nightly job deletes it. No AI agent can read them.
Due: December 2026
In progress - Deleted data leaves backups within 190 days
Backups are never edited, so deleted data remains in older copies until they expire. The longest-kept copy is 190 days old, so every deletion has reached every backup by then.
Live - One person's data, found and acted on
When a candidate asks to see or delete what an agency holds, Settings › Privacy finds everything about them in one place and acts on it.
Live - Nothing personal in notification emails
Emails to your team carry a link into the admin, never an applicant's name, contact details, CV or what they wrote.
Live - Export your content, settings and applications
Owners can download the site's content, settings and applications at any time, free.
Live - Full export and offboarding with a deletion record
Extends the export to every record and file an agency has, and adds an offboarding routine that deletes everything at the end of a contract and gives the agency a record of it.
Live - No personal data inside the deployed code
Removes the contact details of prospective agencies' staff from the reference data shipped with the application, so personal data lives only in the database, where deletion reaches it.
Due: Before the first live agency's candidate data
In progress
AI and Candidates' DataLink to this section
12.1 Each AI agent works at a data level the agency chooses, from public content up to work history with names and contact details removed. Applicants' details stay off until the agency's owner turns them on, and contact details are removed on our servers before any text is sent.
- Every agent works at a data level you choose
Agents work on public content, counts or redacted work history, at the level each one is given. Names, email addresses and phone numbers are never sent to the AI.
Live - Applicants' details off until your owner turns them on
Applicants' work history reaches the AI only for the Researcher and the Candidate Assistant, and only after your owner switches it on and confirms your privacy notice covers it.
Live - Contact details removed before anything reaches the AI
CVs lose names, contact lines, links, birth years and family details; visitors' messages and survey comments lose emails and phone numbers. This happens on our servers, before the text is sent.
Live - What the AI reads is never used to train it
The AI is reached through Anthropic's commercial service, whose terms exclude using what we send to train its models. Matching uses embeddings computed on our own servers.
Live - Recordings kept out of speech model training
Consultants' recordings go to ElevenLabs for captions. Its terms allow it to learn from what it receives unless the account opts out; this records our opt-out. Candidates' data never goes there.
Due: November 2026
In progress - Data levels enforced by database permissions
Most agents already read through a database role limited to their level. This moves the remaining few onto it too, so the level is a permission and not only a rule in the code.
Due: Before the first live agency's candidate data
In progress
SuppliersLink to this section
13.1 Every outside service our servers call is registered in the code and tied to a listed sub-processor, a service the agency connects itself, or public data. A new one fails our tests until it is listed, so the published list can't fall behind the code.
13.2 We review each sub-processor's security and breach notice terms, data location and published audits every year, and act on what the review finds.
- Every sub-processor listed, with 30 days' notice of a new one
airtasites.jp/subprocessors names each company, what it does, what it receives and where. We give 30 days' notice before adding one.
Live - The code can't reach an unlisted company
Every outside service the servers call is registered and tied to a listed sub-processor, a service the agency connects, or public data. A new one fails the tests until it is listed.
Live - Services you connect, listed apart
Your CRM, chat tools, webhooks, LINE, and the analytics and ad tags you add (Google Analytics, Tag Manager, ad pixels) are your own vendors, not ours. They are listed separately, and nothing goes to any of them until you connect or add it. Your site's privacy page names every tag you add.
Live - Suppliers reviewed every year
Each sub-processor's security terms, breach notice terms, data location and published audits are reviewed once a year and when a contract changes, and what the review finds is acted on.
Live
People, Devices and PolicyLink to this section
14.1 AirTA Sites is run by a small team. The rules for everyone with access, from two-step sign-in to patching deadlines, are in the information security policy at airtasites.jp/trust/policy.
- Work computers fully encrypted
The computers used to run the service have full-disk encryption on and lock their screens after five minutes.
Live - Two-step sign-in on every operator account
Two-step verification on every account that can reach the service: hosting, database, code, email and payments, with credentials kept in a password manager.
Due: November 2026
In progress - A written information security policy
Access control, patching deadlines (critical within 72 hours, high within 14 days), change management, suppliers, devices and confidentiality, reviewed every year.
Live - Cyber insurance
Insurance covering the costs of responding to a security incident.
Planned
What Isn't in Place YetLink to this section
15.1 Every control not yet live, with when it is due. We hold no third-party security attestation today, and no outside firm has yet tested the service; both are in the list below when they are planned.
Hosting and Data Location
Database refuses unencrypted connectionsOur own connections are already encrypted. This switches on Supabase's server-side setting so the database itself turns away any connection that isn't.
Due: November 2026
In progressApplication Security
The same inspection for CVs your team uploadsCVs your team adds in the admin will go through the same inspection as those candidates send.
Due: Before the first live agency's candidate data
In progressAbuse Protection
Bot detection on public formsVercel BotID is running on public forms in observe mode. Once a week of results shows it doesn't turn away real candidates, it starts blocking.
Due: November 2026
In progressBackups and Recovery
A named person who can act if we can'tA trusted person, named in our internal plan, holds sealed instructions to reach every agency, keep the service running and help each agency take its data and domain elsewhere.
Due: November 2026
In progressData Handling
Registers kept only as long as the law requiresThe job, job-seeker and fee registers keep what Japan's Employment Security Act requires, for two years after each record ends, even after an application is anonymised or a person asks for deletion. Then the nightly job deletes it. No AI agent can read them.
Due: December 2026
In progressData Handling
No personal data inside the deployed codeRemoves the contact details of prospective agencies' staff from the reference data shipped with the application, so personal data lives only in the database, where deletion reaches it.
Due: Before the first live agency's candidate data
In progressAI and Candidates' Data
Data levels enforced by database permissionsMost agents already read through a database role limited to their level. This moves the remaining few onto it too, so the level is a permission and not only a rule in the code.
Due: Before the first live agency's candidate data
In progressAI and Candidates' Data
Recordings kept out of speech model trainingConsultants' recordings go to ElevenLabs for captions. Its terms allow it to learn from what it receives unless the account opts out; this records our opt-out. Candidates' data never goes there.
Due: November 2026
In progressPeople, Devices and Policy
Two-step sign-in on every operator accountTwo-step verification on every account that can reach the service: hosting, database, code, email and payments, with credentials kept in a password manager.
Due: November 2026
In progressIsolation Between Agencies
Admin on its own addressMoves the admin to its own host, apart from agencies' public sites, so a page on one site can never share a browser origin with an admin.
PlannedSign-In and Access
Single-use sign-in links and a fixed session limitToday a team member's session lasts 14 days from their last visit and a sign-in link can be used again within its period. This makes links single-use and ends every session after a fixed time, however active.
PlannedSign-In and Access
Single sign-on with Microsoft or GoogleLets an agency's team sign in through its own Microsoft Entra ID or Google Workspace, under the agency's own policies.
PlannedApplication Security
A script policy on every pageAdds a Content-Security-Policy that lets only the site's own scripts run, using a fresh value for each page, as a second line of defence behind the cleaning above.
PlannedApplication Security
Independent penetration testA test of the web application and its interfaces by an outside firm, with its findings fixed and retested. Its summary will be in the security pack.
Due: When an agency's security review needs one
PlannedBackups and Recovery
Point-in-time recoveryTurns on continuous database backup, so data can be restored to any moment rather than to the last daily copy: from up to 24 hours of loss to minutes.
Due: With the first paying agency
PlannedBackups and Recovery
A second copy of uploaded filesImages, CVs and recordings are stored in Vercel Blob, apart from the database, and aren't in the daily database backup. This adds an encrypted copy of them alongside it.
Due: Before the first live agency's candidate data
PlannedPeople, Devices and Policy
Cyber insuranceInsurance covering the costs of responding to a security incident.
Planned
Asking for MoreLink to this section
16.1 We answer security questionnaires and send our written policies on request, before you sign and at any time after. Ask for the security pack at airtasites.jp/trust: our answers to standard security questions, these documents as PDF and our data processing terms. A person replies within one business day. Customers may also audit our handling of candidates' data once a year or after a breach (Terms, Section 14).
To report a security problem you have found, write to hello@airtasites.jp. We aim to reply within one business day.
This document describes the service as it stands on the date above. The register at airtasites.jp/trust is updated with the code, so where the two differ, the register is current.