API Docs
ingest jobs
api/ingest-jobs.md
Danh sách tài liệu

ingest-jobs 接口文档

用于将外部岗位数据写入最新岗位模型:

  • job_posts
  • job_post_contents
  • job_post_contacts(电话/邮箱,独立私有存储)
  • job_post_compensations
  • job_post_requirements
  • job_post_locations
  • job_post_work_types / job_post_visas / job_post_benefits / job_post_tags

1. 接口信息

  • 方法: POST
  • 地址: /functions/v1/ingest-jobs
  • 鉴权: HMAC 签名(verify_jwt = false
  • 时间容忍: 5 分钟(x-timestamp 与服务端当前时间差)

2. 请求头

Header必填说明
content-type固定 application/json
x-timestampUnix 毫秒时间戳(字符串)
x-signaturebase64url(HMAC_SHA256(secret, "${x-timestamp}.${rawBody}"))

3. 请求体格式

支持以下 3 种:

  • { "jobs": [ ... ] }
  • [ ... ]
  • 单个 job 对象 { ... }

4. Job 字段说明

先看 6 条关键规则:

  1. 幂等键是 source_channel + external_ref
    同一组合重复推送会更新同一条岗位;如果不传 external_ref,系统自动生成,可能导致重复岗位。

  2. titledescriptionregion_codesalary_minsalary_type_codework_type_codesoccupation_codescontact_phone/contact_email(二选一) 是核心字段。
    这些不满足会被判为 invalid

  3. 所有 *_code 都必须能在 taxonomy 中查到。
    比如 region_code 必须存在于 region 分类。

  4. 不再兼容旧字段。
    传入 visa_types/benefits/tags/korean_req/salary_display/salary_type/work_type 会直接返回错误。

  5. descriptionduties 不会被接口自动拆分、合并或去重。
    description 原样写入 job_post_contents.description_i18nduties 原样写入 job_post_contents.duties_i18n;若两者都传且内容重复,系统也会按两个字段分别保存。

  6. 联系方式会独立私有存储。
    contact_phone/contact_email 会写入 job_post_contacts(不在 job_post_contents 持久化);前端“立即联系”应按需调用 get_job_post_contact 获取。

字段中 i18n object 示例建议包含 4 国语言:{ "zh": "中文", "ko": "한국어", "vi": "Tiếng Việt", "ru": "Русский" }
所有 string / i18n object 字段传 string 时,都会先按 zh 文本处理,也就是转成 { "zh": "..." }
注意:文档里说的“补齐”不是自动翻译。当前只有 title 会在缺少 zh/ko/vi/ru 任一键时,用已有文本原样回填到这 4 个必填语言键中以通过校验;summarydescriptionduties 等其他 i18n 字段不会自动补齐,也不会自动翻译。

字段类型必填示例备注(更清晰)
external_refstring否(可不传)api-ansan-assembly-20260308-day-001可不传,接口会自动生成。若你希望“同一岗位更新而不是新增”,建议传稳定值。
source_channelstringapi来源渠道。manual=后台人工录入crawler=爬虫采集api=第三方推送seed=初始化/测试数据。默认 crawler
statusstringactive岗位状态。draft=草稿未发布active=招聘中paused=暂停招聘closed=招聘结束archived=归档留存。默认 active
visibilitystringpublic可见性。public=公开可见private=私有不可公开访问unlisted=不公开曝光(仅特定场景可见)。默认 public
publisher_typestringorganization发布者类型。organization=企业/机构发布individual=个人发布。默认 organization
poster_user_idUUID string条件必填550e8400-e29b-41d4-a716-446655440000publisher_type=individualsource_channel 不为 seed/crawler 时必填;必须是合法 UUID。
company_namestring / i18n object条件必填{ "zh": "安山汽车电子厂(直招)", "ko": "안산 자동차 전자공장(직영)", "vi": "Nha may dien tu o to Ansan (tuyen truc tiep)", "ru": "Завод автоэлектроники в Ансане (прямой набор)" }publisher_type=organization 时必填。
organization_slugstringansan-auto-electronics-direct组织唯一 slug;不传会根据公司名自动生成。
brand_namestringAnsan E-Mobility Plant品牌名。
country_codestringKR国家代码,默认 KR
titlestring / i18n object{ "zh": "电子零件装配/质检作业员(可当天面试)", "ko": "전자부품 조립·검사 사원(당일 면접 가능)", "vi": "Nhan vien lap rap/kiem tra linh kien dien tu (phong van trong ngay)", "ru": "Сборщик/контролер электронных компонентов (собеседование в день обращения)" }职位标题。传 string 时仅视为 zh 文本;系统会把同一段文本原样回填到 zh/ko/vi/ru 这 4 个键中以满足校验,不会自动翻译。若你需要真实多语言内容,请显式传完整 i18n object
summarystring / i18n object{ "zh": "韩企直招,提供宿舍与通勤车,可当天安排面试和试岗", "ko": "한국 기업 직영 채용, 기숙사/통근버스 제공, 당일 면접 및 시범근무 가능", "vi": "Tuyen truc tiep, co ky tuc xa va xe dua don, phong van va thu viec trong ngay", "ru": "Прямой набор, общежитие и шаттл, собеседование и пробная смена в тот же день" }摘要文本。
descriptionstring / i18n object{ "zh": "安山汽车电子工厂装配线岗位,主要负责连接器与线束预装。恒温车间站立作业,实行两班倒(白班/夜班),入职前提供半天安全培训与岗位示教。", "ko": "안산 자동차 전자공장 조립라인 포지션으로 커넥터/와이어 하네스 사전 조립을 담당합니다. 항온 작업장 입식 근무, 주야 2교대이며 입사 전 안전교육을 제공합니다.", "vi": "Vi tri day chuyen lap rap tai nha may dien tu o to Ansan, phu trach lap rap truoc bo noi va day dien. Lam dung trong xuong dieu hoa, xoay ca ngay-dem, duoc dao tao an toan truoc khi nhan viec.", "ru": "Позиция на линии сборки автоэлектроники в Ансане: предварительная сборка разъемов и жгутов. Работа стоя в климатизированном цехе, дневные/ночные смены, вводный инструктаж перед выходом." }岗位整体描述(背景/目标/工作环境/班次等),必填。
dutiesstring / i18n object{ "zh": "1) 按SOP完成零件装配与外观初检;2) 记录不良并与线长交接;3) 按节拍完成工位5S、物料点收和交班。", "ko": "1) SOP에 따라 부품 조립 및 외관 1차 검사 수행; 2) 불량 내역 기록 후 라인장 인계; 3) 공정 속도에 맞춰 5S/자재 확인/교대 인수인계 진행.", "vi": "1) Lap rap va kiem tra ngoai quan theo SOP; 2) Ghi nhan loi va ban giao cho truong chuyen; 3) Thuc hien 5S, kiem dem vat tu va ban giao ca theo nhip san xuat.", "ru": "1) Сборка и первичный визуальный контроль по SOP; 2) фиксация дефектов и передача мастеру линии; 3) выполнение 5S, прием материалов и передача смены по такту." }岗位职责清单(负责/执行/协同等动作)。建议条目化,便于检索与摘要。
working_hoursstring / i18n object{ "zh": "白班 08:30-17:30 / 夜班 20:30-05:30(通常加班2小时,休息共90分钟)", "ko": "주간 08:30-17:30 / 야간 20:30-05:30 (통상 연장 2시간, 총 휴게 90분)", "vi": "Ca ngay 08:30-17:30 / ca dem 20:30-05:30 (thuong tang ca 2 gio, nghi tong 90 phut)", "ru": "Дневная 08:30-17:30 / ночная 20:30-05:30 (обычно +2 часа переработки, перерывы 90 минут)" }工作时间说明。
location_notestring / i18n object{ "zh": "安山站2号口有班车10分钟直达,园区内配食堂、更衣室、休息区", "ko": "안산역 2번 출구 셔틀버스 10분, 단지 내 식당/탈의실/휴게공간 제공", "vi": "Tu cong so 2 ga Ansan co xe dua don 10 phut, trong khu co canteen, phong thay do va khu nghi", "ru": "От выхода 2 станции Ансан есть шаттл (10 минут), на территории столовая, раздевалки и зона отдыха" }地点补充说明。
contact_phonestring条件必填010-1234-5678联系电话。contact_phonecontact_email 至少传一个。
contact_emailstring条件必填hr@example.com联系邮箱。contact_phonecontact_email 至少传一个。
contact_notestring / i18n object{ "zh": "工作日 09:00-18:00 电话/微信同号;报名请备注签证类型、韩语等级和可到岗日期", "ko": "평일 09:00-18:00 전화 문의 가능; 지원 시 비자 유형/한국어 수준/출근 가능일 기재", "vi": "Lien he ngay thuong 09:00-18:00; khi dang ky vui long ghi loai visa, trinh do tieng Han va ngay co the di lam", "ru": "Связь по будням 09:00-18:00; при отклике укажите тип визы, уровень корейского и дату выхода" }联系补充说明(联系时段/备注模板),不是联系方式主体字段。
salary_type_codestring条件必填daily薪资周期 code;值必须存在于 taxonomy salary_type
salary_minnumber120000最低薪资,必须 >= 0
salary_maxnumber180000最高薪资。传了就必须 >=0>= salary_min
salary_currencystringKRW币种,默认 KRW
salary_display_textstring日结 12万~18万韩元(夜班/加班津贴另算)仅展示文案,不参与数值计算。
salary_is_negotiablebooleanfalse是否面议。未传时按 salary_type_code == negotiable 推断。
region_codestringgyeonggi地区 code,必须存在于 taxonomy region
address_linestring경기도 안산시 단원구 원시동 774-3 (안산스마트허브 5공단)详细地址。不传会尝试用 location_note 兜底。
latitudenumber37.3215纬度,范围 -90 ~ 90
longitudenumber126.8302经度,范围 -180 ~ 180
work_type_codesstring[]条件必填["long_term","daily"]用工方式 code 列表。至少 1 个且全部要在 taxonomy work_type 存在。
visa_codesstring[]["h2","f4","f2"]签证 code 列表;每个值都要在 taxonomy visa 存在。
benefit_codesstring[]["food_stay","shuttle","overtime_pay","night_pay","insurance"]福利 code 列表;每个值都要在 taxonomy benefit 存在。
tag_codesstring[]["factory","daily_pay","immediate_start","no_experience"]标签 code 列表;每个值都要在 taxonomy tag 存在。
occupation_codesstring[]["factory_assembly","svc_cleaning"]岗位分类 code 列表;至少 1 个且必须在 taxonomy occupation 存在。
korean_level_mininteger1韩语等级下限,范围 0~6
education_codestringhigh_school学历要求 code;传了就必须在 taxonomy education 存在。
experience_codestringnone经验要求 code;传了就必须在 taxonomy experience 存在。
requirement_notesstring / i18n object{ "zh": "可接受站班与重复性作业;需提供在韩合法居留证明;无色弱色盲。", "ko": "입식/반복 작업 가능자, 한국 내 합법 체류 증빙 필요, 색약/색맹 불가.", "vi": "Chap nhan lam dung va cong viec lap lai, can chung minh cu tru hop phap, khong mu mau.", "ru": "Готовность к работе стоя и повторяющимся операциям; требуется легальный статус пребывания; без нарушений цветоощущения." }其他要求备注。

descriptionduties 推荐写法:

  • description:写岗位上下文与范围,例如“韩企电子厂两班倒,主要在 SMT 产线作业,需要可长期站立。”
  • duties:写动作型职责,例如“按 SOP 装配、完成首件自检、与线长交接异常。”
  • description 必填;duties 选填。若来源数据无法区分,建议先保证 description 充分,再补充 duties 的动作项。

联系方式安全模型:

  • 入参侧:contact_phonecontact_email 二选一必填(可同时传)。
  • 存储侧:电话/邮箱写入 job_post_contacts,与 job_posts 一对一;不在 job_post_contents 中持久化。
  • 读取侧:用户端点击“立即联系”时,调用 RPC get_job_post_contact(p_job_post_id) 按需获取。
  • contact_note 仅用于补充说明(如联系时间、注意事项),不替代电话/邮箱字段。

Taxonomy 依赖字段(字段名 + 备注):

字段名对应 taxonomy 分类(code)备注
region_coderegion必填,单值。用于职位主地点区域。
salary_type_codesalary_type必填,单值。用于薪资结算周期(如 daily/weekly/monthly)。
work_type_codeswork_type必填,多值数组,至少 1 个。用于工作类型(如 daily/part_time)。
visa_codesvisa选填,多值数组。用于可接受签证类型。
benefit_codesbenefit选填,多值数组。用于福利标签。
tag_codestag选填,多值数组。用于业务标签。
occupation_codesoccupation必填,多值数组,至少 1 个。用于岗位分类。
education_codeeducation选填,单值。用于学历要求。
experience_codeexperience选填,单值。用于经验要求。

补充规则:

  • 上述 code 来自 public.taxonomy_items.code,并按所属 public.taxonomies.code 分类校验。
  • is_active = true 的 taxonomy item 可用。
  • 传入不存在/已停用 code 会返回 invalid(例如 region_code invalid: xxx)。

9 类 taxonomy 可用 code 与注释(当前):

  • 覆盖字段:region_codesalary_type_codework_type_codesvisa_codesbenefit_codestag_codesoccupation_codeseducation_codeexperience_code
  • 数据来源:supabase/migrations/02_seed_taxonomies.sql(初始化种子)+ supabase/migrations/17_job_occupations_and_bundle_update.sqlsupabase/migrations/21_expand_occupation_taxonomy.sql(岗位分类扩充);运行时仍以数据库中 is_active = truetaxonomy_items 为准。

region(地区,字段:region_code

code中文注释韩文注释越南文注释俄文注释
seoul首尔서울SeoulСеул
busan釜山부산BusanПусан
daegu大邱대구DaeguТэгу
incheon仁川인천IncheonИнчхон
gwangju光州광주GwangjuКванджу
daejeon大田대전DaejeonТэджон
ulsan蔚山울산UlsanУльсан
sejong世宗세종SejongСечжон
gyeonggi京畿경기GyeonggiКёнги
gangwon江原강원GangwonКанвон
chungbuk忠北충북ChungbukЧхунбук
chungnam忠南충남ChungnamЧхуннам
jeonbuk全北전북JeonbukЧонбук
jeonnam全南전남JeonnamЧоннам
gyeongbuk庆北경북GyeongbukКёнбук
gyeongnam庆南경남GyeongnamКённам
jeju济州제주JejuЧеджу

salary_type(薪资类型,字段:salary_type_code

code中文注释韩文注释越南文注释俄文注释
hourly时薪시급Luong gioПочасовая
daily日薪일급Luong ngayЕжедневная
weekly周薪주급Luong tuanЕженедельная
monthly月薪월급Luong thangЕжемесячная
yearly年薪연봉Luong namГодовая
negotiable面议협의Thuong luongДоговорная

work_type(工作类型,字段:work_type_codes

code中文注释韩文注释越南文注释俄文注释
long_term长期장기Dai hanДолгосрочная
short_term短期단기Ngan hanКраткосрочная
daily日结일당Luong ngayЕжедневная
part_time兼职아르바이트Ban thoi gianПодработка

visa(签证类型,字段:visa_codes

code中文注释韩文注释越南文注释俄文注释
f2F2F2F2F2
f4F4F4F4F4
f5F5F5F5F5
f6F6F6F6F6
h2H2H2H2H2
d2D2D2D2D2
d4D4D4D4D4

benefit(福利待遇,字段:benefit_codes

code中文注释韩文注释越南文注释俄文注释
food_stay包吃住숙식 제공Bao an oЖилье и питание
food包吃식사 제공Bao anПитание
insurance四大保险4대 보험4 bao hiem4 страховки
bonus奖金提成보너스ThuongБонус
annual_leave年假연차/휴가Nghi phep namОтпуск
shuttle通勤车통근버스Xe dua donШаттл
severance退职金퇴직금Tro cap thoi viecВыходное пособие
overtime_pay加班费연장수당Luong tang caСверхурочные
night_pay夜班津贴야간수당Phu cap ca demНочная надбавка
uniform制服유니폼Dong phucУниформа
housing包住기숙사 제공Bao oЖилье
meal_allowance餐补식대 지원Phu cap anКомпенсация питания
transport_allowance交通补贴교통비 지원Phu cap di laiТранспортная компенсация

tag(职位标签,字段:tag_codes

code中文注释韩文注释越南文注释俄文注释
office_job办公室사무직Van phongОфис
professional专业职位전문직Chuyen nghiepПрофессионал
career_growth晋升空间커리어 성장Tang tienКарьерный рост
visa_support签证支持비자 지원Ho tro visaВизовая поддержка
no_experience无需经验경력 무관Khong kinh nghiemБез опыта
daily_pay日结당일 지급Tra ngayОплата ежедневно
factory工厂공장Nha mayЗавод
night_shift夜班야간Ca demНочная смена
student_friendly留学生友好유학생Than thien sinh vienДля студентов
service服务业서비스Dich vuСервис
physical_labor体力劳动육체노동Lao dong tay chanФизический труд
high_salary高薪고액Luong caoВысокая зарплата
bilingual双语이중언어Song nguДвуязычный
remote远程可재택 가능Lam tu xaУдаленно
flexible时间灵活유연근무Linh hoatГибкий график
immediate_start可立即上岗즉시출근Di lam ngayСрочный выход

occupation(岗位分类,字段:occupation_codes

code中文注释韩文注释越南文注释俄文注释
factory_assembly组装与包装조립/포장Lap rap/Dong goiСборка/Упаковка
factory_machine机器操作/技工기계조작/기술Van hanh mayОператор машины
factory_qa质检与验货검사/검수Kiem hangИнспекция качества
factory_food食品加工식품가공Che bien thuc phamПищевое производство
factory_molding注塑/成型사출/성형Ep/tao hinhЛитье/формовка
factory_clean无尘室/洁净클린룸Phong sachЧистая комната
const_labor现场杂工현장잡부Phu hoРазнорабочий
const_skilled焊工/专业技工용접/전문기공Tho hanСварщик
const_interior室内装修인테리어Noi thatИнтерьер
const_scaffold脚手架비계Gian giaoЛеса
const_paint油漆/涂装도장SonПокраска
const_electric电工전기DienЭлектрик
const_plumber水暖배관Ong nuocСантехник
svc_kitchen后厨/洗碗주방/설거지Phu bep/Rua batКухня/Посудомойщик
svc_serving餐厅厅面홀서빙Phuc vuОфициант
svc_cleaning清扫/客房청소/룸메이드Don depУборка
svc_cafe咖啡/饮品카페/음료Ca phe/do uongКафе/Напитки
svc_retail便利店/零售편의점/소매Cua hangМагазин/Ритейл
svc_hotel酒店/前台/客房호텔/프론트/룸Khach sanОтель
svc_security保安/巡逻보안/경비Bao veОхрана
svc_childcare育儿/保姆육아/베이비시터Trong treНяня
logi_sorting分拣/搬运(二炮)상하차/분류Phan loaiСортировка
logi_warehouse仓库管理창고관리/전산KhoСклад
logi_rider外卖骑手/代驾배달라이더/대리Giao hangКурьер
logi_driver货车/司机화물/운전Tai xeВодитель
logi_forklift叉车/吊装지게차Xe nangПогрузчик
logi_last_mile快递/末端配送택배/라스트마일Giao nhanhДоставка
logi_inventory盘点/库存재고/피킹Kiem keИнвентарь
lang_trans翻译与口译번역/통역Bien phien dichПеревод
lang_ecommerce中韩电商/采购이커머스/구매Thuong mai dien tuЭлектронная коммерция
lang_support中韩客服/支持중한 고객지원Ho tro CN-KRПоддержка CN-KR
lang_guide导游/同声가이드/통역Huong danГид/Переводчик
lang_trade跨境电商/贸易무역/이커머스Thuong maiТорговля
prof_admin行政/财务/文秘사무/회계/경리Hanh chinhАдмин
prof_itIT/软件开发/设计개발/디자인IT/Thiet keIT/Дизайн
prof_hr人事/招聘인사/채용Nhan suHR/Подбор
prof_sales销售/BD영업/BDBan hangПродажи
prof_marketing市场/运营마케팅/운영MarketingМаркетинг
prof_design设计/美术디자인Thiet keДизайн
prof_customer客服/呼叫中心콜센터/CSCham soc KHКолл-центр
prof_pm产品/项目管理PM/기획Quan ly du anPM/Проект
prof_data数据/分析데이터/분석Du lieuАналитика
med_care看护与护工간병인Cham soc nguoi giaСиделка
med_nurse护士/护理간호Y taМедсестра
med_clinic诊所助理의원 보조Tro ly phong khamАссистент клиники
agri_farm农场/大棚농장/비닐하우스Nong trangФерма
agri_fishery渔业/水产수산/양식Thuy sanРыболовство
agri_livestock畜牧/养殖축산/사육Chan nuoiЖивотноводство
flex_day_worker日结/临时工일용직/단기Viec ngayПодработка/дневная
flex_event活动/会展행사/이벤트Su kienИвенты
flex_promo促销/路演프로모션Khuyen maiПромо
flex_dispatch派遣/替班파견/대체Phai cuЗамена/аутстафф

若需要最新列表,可通过接口拉取:/rest/v1/taxonomy_items?select=code,label_i18n&taxonomies.code=eq.occupation&is_active=eq.true

education(学历要求,字段:education_code

code中文注释韩文注释越南文注释俄文注释
none学历不限학력무관Khong yeu cau bang capОбразование не важно
high_school高中及以上고졸 이상Tren cap 3Среднее+
college大专及以上전문대 이상Cao dang+Среднее спец.+
bachelor本科及以上학사 이상Cu nhan+Бакалавр+
master硕士及以上석사 이상Thac si+Магистр+
phd博士박사Tien siДоктор наук

experience(经验要求,字段:experience_code

code中文注释韩文注释越南文注释俄文注释
none经验不限경력무관Khong can kinh nghiemБез опыта
newbie欢迎新手신입 환영Chao don nguoi moiДля новичков
1-3y1-3年1-3년1-3 nam1-3 года
3-5y3-5年3-5년3-5 nam3-5 лет
5y_plus5年以上5년 이상Tren 5 nam5+ лет
10y_plus10年以上10년 이상Tren 10 nam10+ лет

最小可用 payload(建议):

  • 至少包含:title + description + (contact_phonecontact_email) + region_code + salary_min + salary_type_code + work_type_codes + occupation_codes
{
  "jobs": [
    {
      "source_channel": "crawler",
      "publisher_type": "organization",
      "company_name": { "zh": "安山电子厂", "ko": "안산 전자공장", "vi": "Nha may dien tu Ansan", "ru": "Завод электроники Ансан" },
      "title": { "zh": "电子厂装配工", "ko": "전자공장 조립원", "vi": "Cong nhan lap rap nha may dien tu", "ru": "Сборщик на электронном заводе" },
      "description": { "zh": "负责电子部件装配与基础质检,白夜两班制。", "ko": "전자 부품 조립 및 기초 검사, 주야 2교대." },
      "contact_phone": "010-1234-5678",
      "region_code": "gyeonggi",
      "salary_min": 120000,
      "salary_type_code": "daily",
      "work_type_codes": ["daily"],
      "occupation_codes": ["factory_assembly"]
    }
  ]
}

全字段详细 payload(示例):

{
  "jobs": [
    {
      "external_ref": "api-ansan-assembly-20260308-day-001",
      "source_channel": "api",
      "status": "active",
      "visibility": "public",
      "publisher_type": "organization",
      "company_name": {
        "zh": "安山汽车电子厂(直招)",
        "ko": "안산 자동차 전자공장(직영)",
        "vi": "Nha may dien tu o to Ansan (tuyen truc tiep)",
        "ru": "Завод автоэлектроники в Ансане (прямой набор)"
      },
      "organization_slug": "ansan-auto-electronics-direct",
      "brand_name": "Ansan E-Mobility Plant",
      "country_code": "KR",
      "title": {
        "zh": "电子零件装配/质检作业员(可当天面试)",
        "ko": "전자부품 조립·검사 사원(당일 면접 가능)",
        "vi": "Nhan vien lap rap/kiem tra linh kien dien tu (phong van trong ngay)",
        "ru": "Сборщик/контролер электронных компонентов (собеседование в день обращения)"
      },
      "summary": {
        "zh": "韩企直招,提供宿舍与通勤车,可当天安排面试和试岗",
        "ko": "한국 기업 직영 채용, 기숙사/통근버스 제공, 당일 면접 및 시범근무 가능",
        "vi": "Tuyen truc tiep, co ky tuc xa va xe dua don, phong van va thu viec trong ngay",
        "ru": "Прямой набор, общежитие и шаттл, собеседование и пробная смена в тот же день"
      },
      "description": {
        "zh": "安山汽车电子工厂装配线岗位,主要负责连接器与线束预装。恒温车间站立作业,实行两班倒(白班/夜班),入职前提供半天安全培训与岗位示教。",
        "ko": "안산 자동차 전자공장 조립라인 포지션으로 커넥터/와이어 하네스 사전 조립을 담당합니다. 항온 작업장 입식 근무, 주야 2교대이며 입사 전 안전교육을 제공합니다.",
        "vi": "Vi tri day chuyen lap rap tai nha may dien tu o to Ansan, phu trach lap rap truoc bo noi va day dien. Lam dung trong xuong dieu hoa, xoay ca ngay-dem, duoc dao tao an toan truoc khi nhan viec.",
        "ru": "Позиция на линии сборки автоэлектроники в Ансане: предварительная сборка разъемов и жгутов. Работа стоя в климатизированном цехе, дневные/ночные смены, вводный инструктаж перед выходом."
      },
      "duties": {
        "zh": "1) 按SOP完成零件装配与外观初检;2) 记录不良并与线长交接;3) 按节拍完成工位5S、物料点收和交班。",
        "ko": "1) SOP에 따라 부품 조립 및 외관 1차 검사 수행; 2) 불량 내역 기록 후 라인장 인계; 3) 공정 속도에 맞춰 5S/자재 확인/교대 인수인계 진행.",
        "vi": "1) Lap rap va kiem tra ngoai quan theo SOP; 2) Ghi nhan loi va ban giao cho truong chuyen; 3) Thuc hien 5S, kiem dem vat tu va ban giao ca theo nhip san xuat.",
        "ru": "1) Сборка и первичный визуальный контроль по SOP; 2) фиксация дефектов и передача мастеру линии; 3) выполнение 5S, прием материалов и передача смены по такту."
      },
      "working_hours": {
        "zh": "白班 08:30-17:30 / 夜班 20:30-05:30(通常加班2小时,休息共90分钟)",
        "ko": "주간 08:30-17:30 / 야간 20:30-05:30 (통상 연장 2시간, 총 휴게 90분)",
        "vi": "Ca ngay 08:30-17:30 / ca dem 20:30-05:30 (thuong tang ca 2 gio, nghi tong 90 phut)",
        "ru": "Дневная 08:30-17:30 / ночная 20:30-05:30 (обычно +2 часа переработки, перерывы 90 минут)"
      },
      "location_note": {
        "zh": "安山站2号口有班车10分钟直达,园区内配食堂、更衣室、休息区",
        "ko": "안산역 2번 출구 셔틀버스 10분, 단지 내 식당/탈의실/휴게공간 제공",
        "vi": "Tu cong so 2 ga Ansan co xe dua don 10 phut, trong khu co canteen, phong thay do va khu nghi",
        "ru": "От выхода 2 станции Ансан есть шаттл (10 минут), на территории столовая, раздевалки и зона отдыха"
      },
      "contact_phone": "010-1234-5678",
      "contact_email": "demo.hr.contact+001@gmail.com",
      "contact_note": {
        "zh": "工作日 09:00-18:00 电话/微信同号;报名请备注签证类型、韩语等级和可到岗日期",
        "ko": "평일 09:00-18:00 전화 문의 가능; 지원 시 비자 유형/한국어 수준/출근 가능일 기재",
        "vi": "Lien he ngay thuong 09:00-18:00; khi dang ky vui long ghi loai visa, trinh do tieng Han va ngay co the di lam",
        "ru": "Связь по будням 09:00-18:00; при отклике укажите тип визы, уровень корейского и дату выхода"
      },
      "salary_type_code": "daily",
      "salary_min": 120000,
      "salary_max": 180000,
      "salary_currency": "KRW",
      "salary_display_text": "日结 12万~18万韩元(夜班/加班津贴另算)",
      "salary_is_negotiable": false,
      "region_code": "gyeonggi",
      "address_line": "경기도 안산시 단원구 원시동 774-3 (안산스마트허브 5공단)",
      "latitude": 37.3215,
      "longitude": 126.8302,
      "work_type_codes": ["long_term", "daily"],
      "visa_codes": ["h2", "f4", "f2"],
      "benefit_codes": ["food_stay", "shuttle", "overtime_pay", "night_pay", "insurance"],
      "tag_codes": ["factory", "daily_pay", "immediate_start", "no_experience"],
      "occupation_codes": ["factory_assembly"],
      "korean_level_min": 1,
      "education_code": "high_school",
      "experience_code": "none",
      "requirement_notes": {
        "zh": "可接受站班与重复性作业;需提供在韩合法居留证明;无色弱色盲。",
        "ko": "입식/반복 작업 가능자, 한국 내 합법 체류 증빙 필요, 색약/색맹 불가.",
        "vi": "Chap nhan lam dung va cong viec lap lai, can chung minh cu tru hop phap, khong mu mau.",
        "ru": "Готовность к работе стоя и повторяющимся операциям; требуется легальный статус пребывания; без нарушений цветоощущения."
      }
    }
  ]
}

5. 成功响应

{
  "ok": true,
  "received": 1,
  "accepted": 1,
  "invalidCount": 0,
  "invalid": [],
  "processed": [
    {
      "job_post_id": 8,
      "external_ref": "demo-001",
      "source_channel": "seed",
      "publisher_type": "organization",
      "status": "active"
    }
  ]
}
字段类型说明
okboolean是否全部成功(invalidCount == 0
receivednumber接收到的 job 数量
acceptednumber成功入库数量
invalidCountnumber失败数量
invalidstring[]每条失败原因(含下标)
processedobject[]成功条目摘要

6. 错误码

HTTP 状态码场景
400JSON 非法 / 没有可用 jobs payload
401缺少签名头 / 时间戳过期 / 签名错误
405POST 请求
500服务端异常(环境变量缺失或数据库错误)

7. 请求示例(Node.js)

import crypto from 'node:crypto'

const url = 'https://<project-ref>.supabase.co/functions/v1/ingest-jobs'
const secret = process.env.INGEST_JOBS_SECRET!
const timestamp = Date.now().toString()

const body = JSON.stringify({
  jobs: [
    {
      external_ref: 'api-ansan-assembly-20260308-day-001',
      source_channel: 'api',
      publisher_type: 'organization',
      company_name: { zh: '安山汽车电子厂(直招)', ko: '안산 자동차 전자공장(직영)', vi: 'Nha may dien tu o to Ansan (tuyen truc tiep)', ru: 'Завод автоэлектроники в Ансане (прямой набор)' },
      title: { zh: '电子零件装配/质检作业员(可当天面试)', ko: '전자부품 조립·검사 사원(당일 면접 가능)', vi: 'Nhan vien lap rap/kiem tra linh kien dien tu (phong van trong ngay)', ru: 'Сборщик/контролер электронных компонентов (собеседование в день обращения)' },
      summary: { zh: '韩企直招,提供宿舍与通勤车,可当天安排面试和试岗', ko: '한국 기업 직영 채용, 기숙사/통근버스 제공, 당일 면접 및 시범근무 가능', vi: 'Tuyen truc tiep, co ky tuc xa va xe dua don, phong van va thu viec trong ngay', ru: 'Прямой набор, общежитие и шаттл, собеседование и пробная смена в тот же день' },
      description: { zh: '安山汽车电子工厂装配线岗位,主要负责连接器与线束预装。恒温车间站立作业,实行两班倒,入职前提供安全培训。', ko: '안산 자동차 전자공장 조립라인 포지션, 항온 작업장 입식 근무, 주야 2교대, 입사 전 안전교육 제공.', vi: 'Vi tri day chuyen lap rap tai nha may dien tu o to Ansan, lam dung trong xuong dieu hoa, xoay ca ngay-dem.', ru: 'Позиция на линии сборки автоэлектроники в Ансане, работа стоя в климатизированном цехе, дневные/ночные смены.' },
      duties: { zh: '按SOP完成装配与初检,记录不良并交接,完成工位5S。', ko: 'SOP 기반 조립/1차 검사, 불량 기록 및 인계, 작업장 5S 수행.', vi: 'Lap rap va kiem tra theo SOP, ghi nhan loi va ban giao, thuc hien 5S.', ru: 'Сборка и первичный контроль по SOP, фиксация дефектов и передача, выполнение 5S.' },
      working_hours: { zh: '白班 08:30-17:30 / 夜班 20:30-05:30(含加班)', ko: '주간 08:30-17:30 / 야간 20:30-05:30', vi: 'Ca ngay 08:30-17:30 / ca dem 20:30-05:30', ru: 'Дневная 08:30-17:30 / ночная 20:30-05:30' },
      region_code: 'gyeonggi',
      address_line: '경기도 안산시 단원구 원시동 774-3',
      latitude: 37.3215,
      longitude: 126.8302,
      salary_min: 120000,
      salary_max: 180000,
      salary_type_code: 'daily',
      salary_currency: 'KRW',
      salary_display_text: '日结 12万~18万韩元(夜班/加班津贴另算)',
      salary_is_negotiable: false,
      work_type_codes: ['long_term', 'daily'],
      visa_codes: ['h2', 'f4', 'f2'],
      benefit_codes: ['food_stay', 'shuttle', 'overtime_pay', 'night_pay', 'insurance'],
      tag_codes: ['factory', 'daily_pay', 'immediate_start', 'no_experience'],
      occupation_codes: ['factory_assembly'],
      korean_level_min: 1,
      education_code: 'high_school',
      experience_code: 'none',
      requirement_notes: { zh: '可接受站班与重复性作业;需提供在韩合法居留证明。', ko: '입식/반복 작업 가능자, 합법 체류 증빙 필요.', vi: 'Chap nhan lam dung va cong viec lap lai, can chung minh cu tru hop phap.', ru: 'Готовность к работе стоя и повторяющимся операциям; требуется легальный статус пребывания.' },
      status: 'active',
      visibility: 'public'
    }
  ]
})

const signature = crypto
  .createHmac('sha256', secret)
  .update(`${timestamp}.${body}`)
  .digest('base64url')

const res = await fetch(url, {
  method: 'POST',
  headers: {
    'content-type': 'application/json',
    'x-timestamp': timestamp,
    'x-signature': signature
  },
  body
})

console.log(await res.json())

8. 请求示例(Python)

import base64
import hashlib
import hmac
import json
import os
import time

import requests

url = "https://<project-ref>.supabase.co/functions/v1/ingest-jobs"
secret = os.environ["INGEST_JOBS_SECRET"]
timestamp = str(int(time.time() * 1000))

payload = {
    "jobs": [
        {
            "external_ref": "api-ansan-assembly-20260308-day-001",
            "source_channel": "api",
            "publisher_type": "organization",
            "company_name": {
                "zh": "安山汽车电子厂(直招)",
                "ko": "안산 자동차 전자공장(직영)",
                "vi": "Nha may dien tu o to Ansan (tuyen truc tiep)",
                "ru": "Завод автоэлектроники в Ансане (прямой набор)",
            },
            "title": {
                "zh": "电子零件装配/质检作业员(可当天面试)",
                "ko": "전자부품 조립·검사 사원(당일 면접 가능)",
                "vi": "Nhan vien lap rap/kiem tra linh kien dien tu (phong van trong ngay)",
                "ru": "Сборщик/контролер электронных компонентов (собеседование в день обращения)",
            },
            "description": {
                "zh": "安山汽车电子工厂装配线岗位,主要负责连接器与线束预装。",
                "ko": "안산 자동차 전자공장 조립라인 포지션, 커넥터/와이어 하네스 조립 담당.",
                "vi": "Vi tri day chuyen lap rap tai nha may dien tu o to Ansan.",
                "ru": "Позиция на линии сборки автоэлектроники в Ансане.",
            },
            "duties": {
                "zh": "按SOP完成装配与初检,记录不良并交接。",
                "ko": "SOP 기반 조립/1차 검사, 불량 기록 및 인계.",
                "vi": "Lap rap va kiem tra theo SOP, ghi nhan loi va ban giao.",
                "ru": "Сборка и первичный контроль по SOP, фиксация дефектов и передача.",
            },
            "contact_phone": "010-1234-5678",
            "region_code": "gyeonggi",
            "salary_min": 120000,
            "salary_max": 180000,
            "salary_type_code": "daily",
            "work_type_codes": ["long_term", "daily"],
            "occupation_codes": ["factory_assembly"],
            "status": "active",
            "visibility": "public",
        }
    ]
}

body = json.dumps(payload, ensure_ascii=False, separators=(",", ":"))
raw = f"{timestamp}.{body}".encode("utf-8")
digest = hmac.new(secret.encode("utf-8"), raw, hashlib.sha256).digest()
signature = base64.urlsafe_b64encode(digest).decode("utf-8").rstrip("=")

resp = requests.post(
    url,
    headers={
        "content-type": "application/json",
        "x-timestamp": timestamp,
        "x-signature": signature,
    },
    data=body.encode("utf-8"),
    timeout=30,
)

print(resp.status_code)
print(resp.json())